LazyBoy2/docs/CLI-FLOW.md

64 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 通用 CLI 流程
> 瀏覽器工作面更新:預設改為 Docker 共用 Chromium以下 owner-local profile 說明僅適用 `LAZYBOY_BROWSER_SURFACE=local`。目前路由與差異見 [SURFACES.md](SURFACES.md)。
本文描述原本的單 session 模式。多主 agent、背景任務、獨立聊天與常駐服務見 [TEAM](TEAM.md)。
## Codex 參考
2026-09-13 查阅使用者指定的 [codex-rs](https://github.com/openai/codex/tree/main/codex-rs)
- [session/turn.rs](https://github.com/openai/codex/blob/main/codex-rs/core/src/session/turn.rs):依後續工具工作與待處理輸入繼續回合,分開對待 commentary 與最後訊息,等待工具結果。
- [plan_spec.rs](https://github.com/openai/codex/blob/main/codex-rs/core/src/tools/handlers/plan_spec.rs)`update_plan` 的步驟與狀態,最多一步 `in_progress`
- [request_user_input.rs](https://github.com/openai/codex/blob/main/codex-rs/core/src/tools/handlers/request_user_input.rs):透過 session 請求使用者資訊並將答案交回工具流程。
- [unified_exec.rs](https://github.com/openai/codex/blob/main/codex-rs/core/src/tools/handlers/unified_exec.rs):命令執行與後續 stdin增量輸出分開處理。
本專案採用這些控制概念,不依賴 Codex crate也未複製完整 harness。瀏覽器擴充、literal search 與 unique text edit 是針對本專案需要的實作。`main` 連結會持續變動。
## 開場到交付
1. 讀取 session、恢復缺少結果的工具紀錄、更新內建指令加入使用者目標。先前未回答的問題在續跑時重新呈現。
2. 長任務先簡述;文字與工具同一回覆時,先顯示文字再執行。`report_progress` 也可單獨發送進度並繼續;簡單問答不要求計畫。
3. 複雜任务列三至五步。`update_plan` 保存 `pending / in_progress / completed`;調整步驟文字/順序需解釋,最多一步進行中。
4. 每個工具前保存意圖,執行後保存結果。讀取新結果與插話,再向模型請求下一步。已存在計畫與命令狀態以 runtime context 提供給模型。
5. `report_blocked` 在有互動輸入時提供替代路線並等待選擇,回傳 replan 時繼續原 session選擇停止或沒有互動輸入才結束為 blocked。完成工具必須獨立呼叫存在未完成計畫活動命令時要求模型修正完成宣告仍需實際驗證證據。普通文字在已知工作尚未結束時不能直接結束回合。
6. 明確記錄最後 verdict 與訊息、保存 session再由 CLI 輸出結果。`run` 與 `agent` 使用同一核心流程。
## 插話、人工作答與中斷
只有一個 stdin reader。閒置時排隊的輸入是各自的新任務執行中輸入是補充問題呈現後新輸入是答案。選項可輸入編號也可自由回答。`request_user_input`、confirm 與 handoff 必須單獨成批,不會先執行尚未取得答案的後續操作。
插話不取消正在進行的工具;在該工具結果返回後,尚未執行的同批呼叫補上 skipped 結果,再加入新使用者訊息重新判斷。已執行的效果不撤回。
Ctrl-C 或 `/stop` 取消模型/工具/人工等待。命令以 process group 清理;瀏覽器請求被取消時關閉該 helper下一次可重啟。REPL 保持可輸入,`run` 退出 130。強制中止程序後checkpoint 中未完成的呼叫標示 unknown代理必須觀察現況不可假設失敗等於沒有發生也不可自動重播。
## 停止與預算
回合模型對齊 Grok Bot`send_message` 是唯一對使用者的聲音;普通 assistant 文字是內心獨白。有工具就繼續;**沒有 tool call 就結束**`answer`)。`report_done` 仍可選、仍會停止。問人的工具必須單獨一批。
| verdict | 意義 | `run` 退出碼 |
| --- | --- | --- |
| `answer` | 無工具回應;內容以最後一次 `send_message` 為準 | 0 |
| `waiting` | 等你下一句話,或背景工作完成後喚醒 | 0 |
| `done` | 模型呼叫了可選的 `report_done` | 0 |
| `blocked` | `report_blocked` 或相同工具+結果重複三次 | 1 |
| `budget_exhausted` | 本回合模型步數上限用完,不能當成完成 | 1 |
| `failed` | API、回覆協定、context 或 runtime 錯誤 | 1 |
| `cancelled` | 使用者停止本回合 | 130 |
預設最多 5000 步;每 12 步顯示本機進度。相同工具與結果第 2 次先提醒,第 3 次 `blocked`。成功的 `write_stdin` / `await_command` / `browser_wait` 重置該判定。`exec_command` 預設等待 30 秒後背景化。空模型回覆最多重試 3 次。做了事卻沒有 `send_message` 會先提醒再結束。
`lazyboy web``:8787``LAZYBOY_WEB_PORT`)提供 Grok Bot 風格對話網頁與 PWA。手機與電腦同一 Wi-Fi 時,用終端機印出的 LAN URL 開啟SafariChrome「加入主畫面」即可全螢幕當 app。`/novnc` 同源代理 Docker 桌面,所以手機不必直連 6080。
`spawn_subagent` 立刻返回。父回合若在子 agent 或背景命令仍在跑時以無工具結束runtime 會等它完成、灌入 revival 訊息、再請模型繼續;不要用 `check_subagent` 輪詢完成。子 agent 不能再派子 agent。`LAZYBOY_SUBAGENT_MAX_ROUNDS` 預設 128。`kind=computerUse` 把桌面點擊交給子 agent`computer`screenshot/click/move/drag/type/key/scroll/waitxdotool `DISPLAY=:1`);同一時間只能有一個 computerUse。父層只有唯讀 `screenshot`。人類登入仍走 `request_box_help`
HTTP 連線期限 15 秒、單次請求 180 秒helper 回應期限 60 秒;網頁條件等待最多 30 秒命令預設最多十分鐘legacy shell 為 30 秒。等待時每 20 秒顯示實際階段與經過時間,不呼叫模型製造更新。
## 保存與工具邊界
Session 使用新增欄位的 serde defaults 相容舊資料。計畫、待回答問題、活動命令與瀏覽器 URL 均進入 checkpoint。單一 session 模式使用自己的 browser profilenamed-agent 模式改用任務 owner 的固定 profile 與獨占使用權,正常工具回覆後保存登入狀態;重啟後重新觀察 DOM。操作中途崩潰可能留下未知外部狀態不能保證逐操作原子性。
大型工具回覆與完整命令 stdout/stderr 放在工作區 `.lazyboy-output/`;模型看到片段與讀取路徑。`read_file` 以行分段。Context 裁切只處理請求副本,不刪磁碟對話;保留所有使用者限制和系統指令,超出上限時清楚停止。這不是模型式語意壓縮。
檔案與上下載工具檢查工作區和 symlink`edit_file` 要求唯一 exact match。Shell 仍有本機使用者權限,沒有 OS sandbox目前命令 I/O 是 pipe沒有 PTY。網頁搜尋走既有瀏覽器不增加服務金鑰。