背景
目前 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 仍在執行中:
- 讀取 temp log file 的最後 2000~4000 chars
- 往 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>
- 若 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
待討論
- Log tail 的長度應該是多少?(2000?4000?可配置?)
- Notification 的 XML 格式應該長什麼樣?
- 是否需要「只在 log 有變化時才通知」(避免空通知汙染 context)?
- 是否需要一個
stopCommand 來取消 polling(例如 /stop bg-task-id)?
- 與
run_in_background 的 system prompt 描述是否需要更新?
相關
- 本次 auto-resume 實作:SessionManager 的 idle state wake-up 機制
- 涉及檔案:
packages/core/src/tools/bash-handler.ts — startBackgroundShellCommand()
packages/core/src/common/tool-types.ts — BackgroundProcessCompletion type
packages/core/src/session.ts — addBackgroundProcessCompletionMessage()
packages/core/src/prompt.ts — bash tool definition
背景
目前
bashtool 的run_in_background: true只能:onBackgroundProcessComplete發送 completion system message對於
npm run dev、CI pipeline 等 long-running commands,LLM 在 process 執行期間完全看不到 intermediate log output,只能手動用readtool polling log file。缺口
run_in_background: trueonBackgroundProcessComplete(但 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> 0(不上限,但建議不要低於 1)行為
每
tail_every_minutes分鐘,若 process 仍在執行中:生命週期
startBackgroundShellCommand中,若tail_every_minutes設定,註冊setIntervalchild.on("close")中清除 interval;在dispose()/killLiveProcesses()中清除completed→ auto-resume 會自動重啟 agent loop待討論
stopCommand來取消 polling(例如/stop bg-task-id)?run_in_background的 system prompt 描述是否需要更新?相關
packages/core/src/tools/bash-handler.ts—startBackgroundShellCommand()packages/core/src/common/tool-types.ts—BackgroundProcessCompletiontypepackages/core/src/session.ts—addBackgroundProcessCompletionMessage()packages/core/src/prompt.ts— bash tool definition