PilotDeck Always-on 源码解析发现调度、信号监听与后台任务如何协同工作的完整指南【免费下载链接】PilotDeckTask-oriented AI Agent productivity platform项目地址: https://gitcode.com/OpenBMB/PilotDeck如果你用过PilotDeck的 Always-on 功能会发现它能在你不在场时自动发现改进点、开工执行并产出报告。本文带你深入 PilotDeck 后台任务Always-on源码一次讲清「发现调度、信号监听与后台任务」三者如何协同工作帮助你快速读懂这套「项目自动驾驶」机制。在 PilotDeck 的 Web 界面里左侧文件面板与右侧助手面板共同构成你与项目交互的主界面而 Always-on 正是依托这套运行时在后台默默运转Always-on 是什么一条自动运转的后台任务循环Always-on常驻是 PilotDeck 的「任务导向 AI Agent」能力的一部分它按固定节奏审视一个项目发现值得改进的点生成Plan准备一个隔离的工作区Workspace让 Agent 自动执行Execution最后产出报告Report并可申请落地Apply。整个过程无需人工盯着且带有一整套闸门、冷却与预算保护避免失控。一句话概括这条后台任务流水线定时 tick → 过闸门 → 抢锁 → 发现计划 → 隔离工作区 → 自动执行 → 写报告 → 可选落地模块目录结构快速定位关键源码Always-on 的源码集中在src/always-on/按职责分层非常清晰src/always-on/runtime/DiscoveryScheduler.ts —— 发现调度器定时触发 休眠恢复src/always-on/runtime/SignalWatcher.ts —— 信号监听器感知项目文件变化src/always-on/runtime/DiscoveryGates.ts —— 闸门判定逻辑src/always-on/runtime/DiscoveryFire.ts —— 发现执行引擎五阶段流水线的核心src/always-on/runtime/AlwaysOnRuntime.ts —— 单项目运行时生命周期 Ownersrc/always-on/runtime/AlwaysOnManager.ts —— 多项目协调器src/always-on/config/parseAlwaysOnConfig.ts —— 配置解析与默认值src/always-on/workspace/GitWorktreeProvider.ts / SnapshotCopyProvider.ts —— 两种工作区隔离策略src/always-on/storage/ —— 状态、计划、周期、报告、事件存储多项目时由AlwaysOnManager统一协调它为每个启用的项目各建一个AlwaysOnRuntime同时共享同一套运行上下文注册表、会话配置覆盖和工具集保证工具按会话键跨项目可查、Gateway 只看到一组工具定义。参见 AlwaysOnManager 构造逻辑。发现调度DiscoveryScheduler 如何定时触发调度器是整个后台任务的「心跳」。它维护一个定时器按配置的tickIntervalMinutes默认 5 分钟反复tick()每次 tick 先读取状态、列出新鲜的通道租约、检查锁然后交给闸门判定。闸门通过则抢锁并触发DiscoveryFire.run()。一次 tick 执行完才会排下一次避免重叠。关键方法是scheduleNextTick与tick。启动时还会调用maybeRestoreDormancy若上次处于「休眠」状态就直接挂起信号监听等待唤醒。信号监听SignalWatcher 如何感知项目变化当项目「安静无变化」时调度器会进入休眠避免空转。此时SignalWatcher登场它用fs.watch({ recursive: true })递归监听项目目录配合2 秒去抖等文件活动平息后只触发一次信号从而把调度器「叫醒」。它有两个精巧细节忽略无关路径内置 ignore-glob 会过滤掉.git/、node_modules/、.pilotdeck/以及 Always-on 自身的状态目录防止自我触发自我激励。轻量 glob 转正则内置compileGlob支持**/、*、?等 gitignore 风格语法。收到信号后的处理见handleSignal清除休眠标记、停掉监听器、重置定时器让下一次 tick 尽快到来。信号监听的入口是ensureDormancyWatcher。平台差异提示macOS/Windows 原生支持递归监听Linux 仅挂载根目录深层变更可能被漏掉后续可叠加轮询兜底。五道闸门DiscoveryGates 拦截逻辑每次 tick 都会调用纯函数evaluateAlwaysOnDiscoveryGates按固定顺序判定第一个不通过的闸门胜出顺序闸门原因含义1project_disabled该项目未启用 Always-on2project_missing项目目录不存在3dormant_no_signal处于休眠且无信号唤醒4agent_busy用户会话正在跑或存在忙碌租约5recent_user_msg最近几分钟内有用户消息先让位6cooldown距上次完成尚在冷却期7daily_budget今日执行次数已达预算上限8lock_busy已有实例持有发现锁全部通过后才放行另外在调度器里还会检查cycle_full当前工作周期计划数已达上限作为补充拦截见 tick 内 cycle_full 判定。这套「反向信号」设计让租约列表只在「存在忙碌/近期租约」时阻挡空列表永远不阻挡。五阶段流水线从发现到落地的 DiscoveryFire真正干活的是DiscoveryFire每个阶段都通过 Gateway 的submitTurn/closeSession与 Agent 会话交互行为等同于普通通道适配器。五个阶段各有独立会话键见 通道定义发现Discovery汇总最近聊天记录摘要 已有计划让 Agent 调用计划工具产出至多一个新计划。入口见run。工作区Workspace通过ensureActiveWorkCycle准备/复用隔离工作区。执行Execution在工作区里让 Agent 按计划自动改代码并注入deny 规则禁止git push/git remote见ALWAYS_ON_EXECUTION_DENY_RULES。报告Report产出 Markdown 报告失败时自动降级写兜底报告。落地Apply可选阶段生成 diff 并申请把改动应用到真实项目。每个阶段都会emitEvent写入事件存储并上报遥测保证全程可追溯。无人值守会话还会统一排除交互类工具canPrompt: false。工作区隔离Git Worktree 与快照两种策略后台任务绝不能直接污染你的工作目录。WorkspaceProviderRegistry注册了两套策略Git WorktreeGitWorktreeProvider在独立 worktree/分支上改代码天然隔离。快照复制SnapshotCopyProvider复制一份项目快照上限默认 1 GiB后操作。ensureActiveWorkCycle是「单活动周期 单工作区」的唯一事实来源已有活动周期且工作区还在磁盘上就复用否则新建。见 ensureActiveWorkCycle。存储层与事件追踪如何保证可追溯所有状态都以文件形式落盘在项目下便于审查DiscoveryStateStore —— 休眠/上次完成时间/当日次数DiscoveryPlanStore —— 计划索引与 MarkdownWorkCycleStore —— 工作周期DiscoveryReportStore —— 报告AlwaysOnEventStore —— 阶段事件流左侧文件面板里这些状态目录清晰可见配合右侧助手即可核对后台任务每一步配置项速查关键默认值一览默认配置由defaultAlwaysOnConfig给出trigger各字段含义如下字段默认值作用tickIntervalMinutes5定时触发间隔分钟最小 1 分钟cooldownMinutes60两次执行间冷却dailyBudget4每日执行次数预算heartbeatStaleSeconds90租约心跳过期秒数recentUserMsgMinutes5近期用户消息让位窗口preferChannelweb优先使用的通道其他常量DEFAULT_MAX_PLANS_PER_CYCLE 3每周期最多计划数、DEFAULT_SNAPSHOT_MAX_BYTES 1 GiB快照上限、DEFAULT_IGNORE_GLOBS监听忽略目录。小结三者如何协同发现调度DiscoveryScheduler负责「什么时候干」——定时 tick、休眠、抢锁。信号监听SignalWatcher负责「要不要提前干」——项目一变就把调度器唤醒。后台任务DiscoveryFire 闸门 工作区负责「怎么干、干多少」——五阶段流水线 多道保护。三者层层配合让 PilotDeck 的 Always-on 既能主动发现改进点又始终受预算、冷却与锁的约束真正做到「无人值守也安全」。想动手验证可从 src/always-on/runtime/DiscoveryScheduler.ts 的tick()单步执行入手是最直观的入口。【免费下载链接】PilotDeckTask-oriented AI Agent productivity platform项目地址: https://gitcode.com/OpenBMB/PilotDeck创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
