Skip to content

feat: log polling for long-running background bash commands #248

Description

@hn12404988

背景

目前 bash tool 的 run_in_background: true 只能:

  • 啟動時回傳 task ID + log 檔路徑
  • process exit 時透過 onBackgroundProcessComplete 發送 completion system message

對於 npm run dev、CI pipeline 等 long-running commands,LLM 在 process 執行期間完全看不到 intermediate log output,只能手動用 read tool polling log file。

缺口

需求 現況
啟動 long-running process run_in_background: true
即時看到 log ❌ LLM 看不到 streaming output
等待特定 pattern(如 "ready") ❌ 只能手動 polling
Process exit 通知 onBackgroundProcessComplete(但 dev server 通常不 exit)

討論結論

經過討論,我們認為不應該走 real-time streaming(實作複雜度高),而是應該走 週期性 log tail injection:讓 background bash 命令每 N 分鐘自動往 session 注入一條 system message,包含該 task 最近的 log tail。

相關 auto-resume 機制(詳見另一個 issue/PR)會確保即使 agent 在 idle 狀態,這些週期性 notification 也能觸發 agent 繼續處理。

建議設計

新參數:tail_every_minutes

在 bash tool definition 中新增 optional field:

{
  "command": "...",
  "run_in_background": true,
  "tail_every_minutes": 5
}
屬性
名稱 tail_every_minutes
型別 optional number
範圍 > 0(不上限,但建議不要低於 1)
預設 不傳 = 不啟用 polling(只有 completion notification)

行為

tail_every_minutes 分鐘,若 process 仍在執行中:

  1. 讀取 temp log file 的最後 2000~4000 chars
  2. 往 session 中 append 一條 system message:
<background_task_poll taskId="bash-xxx" command="npm run dev" runningMs="...">
<log_tail>
... last N chars of log ...
</log_tail>
</background_task_poll>
  1. 若 agent 處於 idle 狀態 → auto-resume 機制自然接手,LLM 會看到新訊息並決定是否行動

生命週期

  • Timer 啟用:在 startBackgroundShellCommand 中,若 tail_every_minutes 設定,註冊 setInterval
  • Timer 清除:在 child.on("close") 中清除 interval;在 dispose() / killLiveProcesses() 中清除
  • 與 auto-resume 的協作:poll system message 被 append 後,若 session status 為 completed → auto-resume 會自動重啟 agent loop

待討論

  1. Log tail 的長度應該是多少?(2000?4000?可配置?)
  2. Notification 的 XML 格式應該長什麼樣?
  3. 是否需要「只在 log 有變化時才通知」(避免空通知汙染 context)?
  4. 是否需要一個 stopCommand 來取消 polling(例如 /stop bg-task-id)?
  5. run_in_background 的 system prompt 描述是否需要更新?

相關

  • 本次 auto-resume 實作:SessionManager 的 idle state wake-up 機制
  • 涉及檔案:
    • packages/core/src/tools/bash-handler.tsstartBackgroundShellCommand()
    • packages/core/src/common/tool-types.tsBackgroundProcessCompletion type
    • packages/core/src/session.tsaddBackgroundProcessCompletionMessage()
    • packages/core/src/prompt.ts — bash tool definition

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions