現(xiàn)調(diào)度、信號(hào)監(jiān)聽(tīng)與后臺(tái)任務(wù)如何協(xié)同工作的完整指南)
PilotDeck Always-on 源碼解析發(fā)現(xiàn)調(diào)度、信號(hào)監(jiān)聽(tīng)與后臺(tái)任務(wù)如何協(xié)同工作的完整指南【免費(fèi)下載鏈接】PilotDeckTask-oriented AI Agent productivity platform項(xiàng)目地址: https://gitcode.com/OpenBMB/PilotDeck如果你用過(guò)PilotDeck的 Always-on 功能會(huì)發(fā)現(xiàn)它能在你不在場(chǎng)時(shí)自動(dòng)發(fā)現(xiàn)改進(jìn)點(diǎn)、開(kāi)工執(zhí)行并產(chǎn)出報(bào)告。本文帶你深入 PilotDeck 后臺(tái)任務(wù)Always-on源碼一次講清「發(fā)現(xiàn)調(diào)度、信號(hào)監(jiān)聽(tīng)與后臺(tái)任務(wù)」三者如何協(xié)同工作幫助你快速讀懂這套「項(xiàng)目自動(dòng)駕駛」機(jī)制。在 PilotDeck 的 Web 界面里左側(cè)文件面板與右側(cè)助手面板共同構(gòu)成你與項(xiàng)目交互的主界面而 Always-on 正是依托這套運(yùn)行時(shí)在后臺(tái)默默運(yùn)轉(zhuǎn)Always-on 是什么一條自動(dòng)運(yùn)轉(zhuǎn)的后臺(tái)任務(wù)循環(huán)Always-on常駐是 PilotDeck 的「任務(wù)導(dǎo)向 AI Agent」能力的一部分它按固定節(jié)奏審視一個(gè)項(xiàng)目發(fā)現(xiàn)值得改進(jìn)的點(diǎn)生成Plan準(zhǔn)備一個(gè)隔離的工作區(qū)Workspace讓 Agent 自動(dòng)執(zhí)行Execution最后產(chǎn)出報(bào)告Report并可申請(qǐng)落地Apply。整個(gè)過(guò)程無(wú)需人工盯著且?guī)в幸徽组l門、冷卻與預(yù)算保護(hù)避免失控。一句話概括這條后臺(tái)任務(wù)流水線定時(shí) tick → 過(guò)閘門 → 搶鎖 → 發(fā)現(xiàn)計(jì)劃 → 隔離工作區(qū) → 自動(dòng)執(zhí)行 → 寫報(bào)告 → 可選落地模塊目錄結(jié)構(gòu)快速定位關(guān)鍵源碼Always-on 的源碼集中在src/always-on/按職責(zé)分層非常清晰src/always-on/runtime/DiscoveryScheduler.ts —— 發(fā)現(xiàn)調(diào)度器定時(shí)觸發(fā) 休眠恢復(fù)src/always-on/runtime/SignalWatcher.ts —— 信號(hào)監(jiān)聽(tīng)器感知項(xiàng)目文件變化src/always-on/runtime/DiscoveryGates.ts —— 閘門判定邏輯src/always-on/runtime/DiscoveryFire.ts —— 發(fā)現(xiàn)執(zhí)行引擎五階段流水線的核心src/always-on/runtime/AlwaysOnRuntime.ts —— 單項(xiàng)目運(yùn)行時(shí)生命周期 Ownersrc/always-on/runtime/AlwaysOnManager.ts —— 多項(xiàng)目協(xié)調(diào)器src/always-on/config/parseAlwaysOnConfig.ts —— 配置解析與默認(rèn)值src/always-on/workspace/GitWorktreeProvider.ts / SnapshotCopyProvider.ts —— 兩種工作區(qū)隔離策略src/always-on/storage/ —— 狀態(tài)、計(jì)劃、周期、報(bào)告、事件存儲(chǔ)多項(xiàng)目時(shí)由AlwaysOnManager統(tǒng)一協(xié)調(diào)它為每個(gè)啟用的項(xiàng)目各建一個(gè)AlwaysOnRuntime同時(shí)共享同一套運(yùn)行上下文注冊(cè)表、會(huì)話配置覆蓋和工具集保證工具按會(huì)話鍵跨項(xiàng)目可查、Gateway 只看到一組工具定義。參見(jiàn) AlwaysOnManager 構(gòu)造邏輯。發(fā)現(xiàn)調(diào)度DiscoveryScheduler 如何定時(shí)觸發(fā)調(diào)度器是整個(gè)后臺(tái)任務(wù)的「心跳」。它維護(hù)一個(gè)定時(shí)器按配置的tickIntervalMinutes默認(rèn) 5 分鐘反復(fù)tick()每次 tick 先讀取狀態(tài)、列出新鮮的通道租約、檢查鎖然后交給閘門判定。閘門通過(guò)則搶鎖并觸發(fā)DiscoveryFire.run()。一次 tick 執(zhí)行完才會(huì)排下一次避免重疊。關(guān)鍵方法是scheduleNextTick與tick。啟動(dòng)時(shí)還會(huì)調(diào)用maybeRestoreDormancy若上次處于「休眠」?fàn)顟B(tài)就直接掛起信號(hào)監(jiān)聽(tīng)等待喚醒。信號(hào)監(jiān)聽(tīng)SignalWatcher 如何感知項(xiàng)目變化當(dāng)項(xiàng)目「安靜無(wú)變化」時(shí)調(diào)度器會(huì)進(jìn)入休眠避免空轉(zhuǎn)。此時(shí)SignalWatcher登場(chǎng)它用fs.watch({ recursive: true })遞歸監(jiān)聽(tīng)項(xiàng)目目錄配合2 秒去抖等文件活動(dòng)平息后只觸發(fā)一次信號(hào)從而把調(diào)度器「叫醒」。它有兩個(gè)精巧細(xì)節(jié)忽略無(wú)關(guān)路徑內(nèi)置 ignore-glob 會(huì)過(guò)濾掉.git/、node_modules/、.pilotdeck/以及 Always-on 自身的狀態(tài)目錄防止自我觸發(fā)自我激勵(lì)。輕量 glob 轉(zhuǎn)正則內(nèi)置compileGlob支持**/、*、?等 gitignore 風(fēng)格語(yǔ)法。收到信號(hào)后的處理見(jiàn)handleSignal清除休眠標(biāo)記、停掉監(jiān)聽(tīng)器、重置定時(shí)器讓下一次 tick 盡快到來(lái)。信號(hào)監(jiān)聽(tīng)的入口是ensureDormancyWatcher。平臺(tái)差異提示macOS/Windows 原生支持遞歸監(jiān)聽(tīng)Linux 僅掛載根目錄深層變更可能被漏掉后續(xù)可疊加輪詢兜底。五道閘門DiscoveryGates 攔截邏輯每次 tick 都會(huì)調(diào)用純函數(shù)evaluateAlwaysOnDiscoveryGates按固定順序判定第一個(gè)不通過(guò)的閘門勝出順序閘門原因含義1project_disabled該項(xiàng)目未啟用 Always-on2project_missing項(xiàng)目目錄不存在3dormant_no_signal處于休眠且無(wú)信號(hào)喚醒4agent_busy用戶會(huì)話正在跑或存在忙碌租約5recent_user_msg最近幾分鐘內(nèi)有用戶消息先讓位6cooldown距上次完成尚在冷卻期7daily_budget今日?qǐng)?zhí)行次數(shù)已達(dá)預(yù)算上限8lock_busy已有實(shí)例持有發(fā)現(xiàn)鎖全部通過(guò)后才放行另外在調(diào)度器里還會(huì)檢查cycle_full當(dāng)前工作周期計(jì)劃數(shù)已達(dá)上限作為補(bǔ)充攔截見(jiàn) tick 內(nèi) cycle_full 判定。這套「反向信號(hào)」設(shè)計(jì)讓租約列表只在「存在忙碌/近期租約」時(shí)阻擋空列表永遠(yuǎn)不阻擋。五階段流水線從發(fā)現(xiàn)到落地的 DiscoveryFire真正干活的是DiscoveryFire每個(gè)階段都通過(guò) Gateway 的submitTurn/closeSession與 Agent 會(huì)話交互行為等同于普通通道適配器。五個(gè)階段各有獨(dú)立會(huì)話鍵見(jiàn) 通道定義發(fā)現(xiàn)Discovery匯總最近聊天記錄摘要 已有計(jì)劃讓 Agent 調(diào)用計(jì)劃工具產(chǎn)出至多一個(gè)新計(jì)劃。入口見(jiàn)run。工作區(qū)Workspace通過(guò)ensureActiveWorkCycle準(zhǔn)備/復(fù)用隔離工作區(qū)。執(zhí)行Execution在工作區(qū)里讓 Agent 按計(jì)劃自動(dòng)改代碼并注入deny 規(guī)則禁止git push/git remote見(jiàn)ALWAYS_ON_EXECUTION_DENY_RULES。報(bào)告Report產(chǎn)出 Markdown 報(bào)告失敗時(shí)自動(dòng)降級(jí)寫兜底報(bào)告。落地Apply可選階段生成 diff 并申請(qǐng)把改動(dòng)應(yīng)用到真實(shí)項(xiàng)目。每個(gè)階段都會(huì)emitEvent寫入事件存儲(chǔ)并上報(bào)遙測(cè)保證全程可追溯。無(wú)人值守會(huì)話還會(huì)統(tǒng)一排除交互類工具canPrompt: false。工作區(qū)隔離Git Worktree 與快照兩種策略后臺(tái)任務(wù)絕不能直接污染你的工作目錄。WorkspaceProviderRegistry注冊(cè)了兩套策略Git WorktreeGitWorktreeProvider在獨(dú)立 worktree/分支上改代碼天然隔離??煺諒?fù)制SnapshotCopyProvider復(fù)制一份項(xiàng)目快照上限默認(rèn) 1 GiB后操作。ensureActiveWorkCycle是「單活動(dòng)周期 單工作區(qū)」的唯一事實(shí)來(lái)源已有活動(dòng)周期且工作區(qū)還在磁盤上就復(fù)用否則新建。見(jiàn) ensureActiveWorkCycle。存儲(chǔ)層與事件追蹤如何保證可追溯所有狀態(tài)都以文件形式落盤在項(xiàng)目下便于審查DiscoveryStateStore —— 休眠/上次完成時(shí)間/當(dāng)日次數(shù)DiscoveryPlanStore —— 計(jì)劃索引與 MarkdownWorkCycleStore —— 工作周期DiscoveryReportStore —— 報(bào)告AlwaysOnEventStore —— 階段事件流左側(cè)文件面板里這些狀態(tài)目錄清晰可見(jiàn)配合右側(cè)助手即可核對(duì)后臺(tái)任務(wù)每一步配置項(xiàng)速查關(guān)鍵默認(rèn)值一覽默認(rèn)配置由defaultAlwaysOnConfig給出trigger各字段含義如下字段默認(rèn)值作用tickIntervalMinutes5定時(shí)觸發(fā)間隔分鐘最小 1 分鐘cooldownMinutes60兩次執(zhí)行間冷卻dailyBudget4每日?qǐng)?zhí)行次數(shù)預(yù)算heartbeatStaleSeconds90租約心跳過(guò)期秒數(shù)recentUserMsgMinutes5近期用戶消息讓位窗口preferChannelweb優(yōu)先使用的通道其他常量DEFAULT_MAX_PLANS_PER_CYCLE 3每周期最多計(jì)劃數(shù)、DEFAULT_SNAPSHOT_MAX_BYTES 1 GiB快照上限、DEFAULT_IGNORE_GLOBS監(jiān)聽(tīng)忽略目錄。小結(jié)三者如何協(xié)同發(fā)現(xiàn)調(diào)度DiscoveryScheduler負(fù)責(zé)「什么時(shí)候干」——定時(shí) tick、休眠、搶鎖。信號(hào)監(jiān)聽(tīng)SignalWatcher負(fù)責(zé)「要不要提前干」——項(xiàng)目一變就把調(diào)度器喚醒。后臺(tái)任務(wù)DiscoveryFire 閘門 工作區(qū)負(fù)責(zé)「怎么干、干多少」——五階段流水線 多道保護(hù)。三者層層配合讓 PilotDeck 的 Always-on 既能主動(dòng)發(fā)現(xiàn)改進(jìn)點(diǎn)又始終受預(yù)算、冷卻與鎖的約束真正做到「無(wú)人值守也安全」。想動(dòng)手驗(yàn)證可從 src/always-on/runtime/DiscoveryScheduler.ts 的tick()單步執(zhí)行入手是最直觀的入口。【免費(fèi)下載鏈接】PilotDeckTask-oriented AI Agent productivity platform項(xiàng)目地址: https://gitcode.com/OpenBMB/PilotDeck創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考