AnyBot/docs/plan-2026-11-improvements.md

203 lines
19 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.

# 改進總計畫:產品面+操控鏈路(2026-11)
> 依據:對本 repo 的程式碼審查(`src/providers.rs`、`src/computer.rs`、`src/cloudbox.rs`、
> `src/agent.rs`、`src/marks.rs`、`src/remote.rs`、`src/model.rs`、`deploy/server/`、
> `deploy/test/`、`.gitea/workflows/release.yml`),2026-11 競品調查(OpenClaw 394k★、
> browser-use 120k★、UI-TARS-Desktop 39.6k★、Khoj 38k★、Letta 25k★、Leon 17.6k★),
> 以及 `bench/computer-use/README.md` 的量測資料(模型思考佔一題總時間約 90%:746/824 秒)。
>
> 狀態:全部未動工。每一項都附「做什麼、動哪裡、怎麼算做完」。
> 順序是建議值,可按能力調整;標 ⛓ 的項有相依。
---
## 總覽:三條工作軌
| 軌 | 目標 | 項目 |
|---|---|---|
| P(產品/分發) | 讓别人能用、敢用、想貢獻 | P1–P8 |
| S(安全) | 把「Bot 動我電腦」變成可信系統 | S1–S5(S1 是 P5 的前件) |
| C(操控鏈路) | 更精確、更少來回、更便宜 | C1–C9、H1–H4 |
**全案最高 CP 值的前五件:C1(prompt cache)、S1(docker.sock)、P1(授權)、C2(AX 直寫)、P2(英文 README+demo)。**
---
# 軌 P:產品與分發
## P1. 授權條款 ⛓(社群/貢獻的前件) ✅ 2026-11:Apache-2.0(LICENSE+Cargo.toml+README 授權節)
- 加 `LICENSE`(建議 **Apache-2.0**,與依賴的 agent-desktop-core 一致)+ `Cargo.toml` 加 `license = "Apache-2.0"`。
- `relay/Cargo.toml` 同步。
- ✅ 完成標準:`cargo publish --dry-run` 通過;README 有「授權」章節。
## P2. 英文入口+視覺化 demo ⛓(依賴 P1) ✅ 2026-11:README.en.md(含對 OpenClaw/OpenHands/Khoj/UI-TARS 定位表)+docs/en/ 四份;GIF 錄製指引在 docs/demo/,影像待補
- `README.md` 保留繁中,新增 `README.en.md`(或英文在前)+ `docs/en/`(至少 architecture、install、multi-device 翻譯)。
- README 開頭加:一句話定位、**GIF/短片**(computer-use 全自動完成「填表+送單」一鏡)、vs OpenClaw / OpenHands / Khoj / UI-TARS 的對比表(多機大腦/手腳、Box 沙盒+VNC 接手、AX 編號+批次+快速模型、一鍵自架伺服器+HTTPS——這四項競品都沒整套)。
- `docs/protocol.md` 出英文版(開放第三方用戶端)。
- ✅ 完成標準:README 首屏 10 秒內看懂「它跟別的有什麼不同」,有一段 60 秒內的真機影片。
## P3. 逆向工程註解整併(法務風險) ✅ 2026-11:反編譯註解全數改為行為規格;逆向文件移出 repo;驗收 grep=0
- 全 repo 的註解大量引用 `main-core.cjs @727949`、`main-app.cjs`、`CUGrokBotService` 等行號級逆向參考,公開 repo 對 xAI 資產留下行號地圖,法務與公關都難看。
- 做法:把這類註解改寫為**行為規格**(「原版在 macOS 10.14+ 用 UNUserNotificationCenter,授權狀態 0..4 對應 …」),刪去檔案名+偏移量;`GROK_BOT_FEATURES.md`、`GROK_BOT_TOKENS.md`、`ORIGINAL_FEATURES.md` 移出主 repo(內部文件/附件),程式內引用改指向 `docs/specs/` 下的行為規格。
- 重點檔:`src/notify.rs`、`src/axread.rs`、`src/policy.rs`、`src/computer.rs`、`src/app.rs` 開頭註解區塊。
- ✅ 完成標準:`grep -rn "main-core\|main-app\|@0x\|CUGrokBot" src/ deploy/` 為空。
## P4. 資料層:`state.json` → SQLite ⛓(P6、D1 的前件) 🔶 第一步 2026-11:`src/store.rs`(WAL)把 oplog 鏡射成可查詢稽核庫(30 天),稽核分頁改讀它;state.json 維持真相來源,第二著隨 P6 記憶表一起搬
- 現況:全部狀態在一个 `state.json`(`src/model.rs:457`);多裝置同步+例行任務+長聊天長期必遇併發遺失、檔案肥大、無 schema 遷移。
- 做法:`rusqlite`(已 bundle)新增 `src/db.rs`;聊天/訊息/oplog/例行任務/快照索引進 SQLite(WAL),`state.json` 只留設定與 Bot 定義;寫入採「遷移+雙寫→讀切換→去 JSON」三步,附 `state.json` 一鍵匯入與回退。
- schema 帶 `user_version`,之後所有加欄位都走遷移。
- ✅ 完成標準:10 萬則訊息的 Bot 開啟 <1s;兩端同時寫聊天不互刪(整合測試);`make doctor` 會驗 DB 完整性。
## P5. 安全敘事公開化 ⛓(依賴 S1–S3)
- README/docs 加 `SECURITY.md`+威脅模型章節:哪些金鑰存哪裡(vault 的 AES-GCM+keychain)、relay 只存雜湊、box 的隔離層(gVisor)、docker.sock 收斂後的能力面、prompt injection 的防線(見 S3)、「Bot 動過我電腦什麼」的稽核面(A1)。
- ✅ 完成標準: SECURITY.md + `security@` 通報管道 + GitHub/Gitea security advisory 開啟。
## P6. 記憶升級:第二個大腦(依賴 P4) ✅ 2026-11 完成
- **第一步**:SQLite memories+FTS5(trigram;中文二字窗計分)top-14 進 prompt(不再全量注入);每回合自動寫事件行(問→答)跨月可查;remember/forget/UI 同步索引
- **第二步**:本機 embedding(Ollama `/api/embed`,模型自動偵測 bge-m3/nomic…;無 Ollama=純關鍵字照常運作);記憶檢索改混合式(FTS+二字窗+cosine,RRF 合併);**文件書架**:設定可加資料夾(預設 文件),md/txt/csv/程式碼切塊入 SQLite+FTS、mtime 增量、刪除即除名;新工具 `search_documents`(唯讀免核准);背景執行緒慢活,回合永不等 embedding;設定 › 一般:語意搜尋開關+資料夾清單
- 現況:`src/memory.rs` 每 Bot 200 條×500 字,無 embedding、無檢索——對照 Letta/Khoj 是最明顯短板。
- 做法:
1. 離線 embedding:優先本機(Ollama 路徑已有;小模型如 bge-m3/qwen3-embedding),雲端 provider 当備援。
2. 向量進 SQLite(`vec`/FTS5 混合檢索即可,40k 行規模不需要專庫)。
3. 记忆分层:bot 事實(現行)/使用者偏好(跨 Bot 共用)/事件日誌(從 oplog 自動摘取);每回合以語意檢索注入 top-k,取代全量注入。
4. 文件索引(Khoj 式):選定資料夾+box 的 `~/Documents` 增量索引,供「我上個月那份報表」類問題。
- ✅ 完成標準:跨月對話「我上次說的那個…」檢索命中;記憶上限取消;離線可用。
## P7. 技能生態(MCP 已有,加 registry)
- `teach`(示範→技能)與 `replay_skill` 是好底子;缺分發面。
- 做法:技能檔式(Markdown+front matter,相容 skills 慣例)、一鍵從 repo/網址安裝、內建範例包(每日彙報、瀏覽器表單、照片整理…);`docs/` 加「寫技能」指南。
- ✅ 完成標準:第三方可發「AnyBot 技能」repo 並被人一行安裝。
## P8. 平台與工程衛生 ✅ 2026-11:.gitea/workflows/ci.yml(build/test/relay;bench 維持人工閘門)
- **Windows**:Cargo 已編 `agent-desktop-windows`,先出「手腳/螢幕」角色的 Windows 版(install 腳本+facts+x11 對應層),桌面全功能二期。
- **CI**:加 `cargo clippy -- -D warnings`、`cargo fmt --check`、`deploy/test/remote_e2e.py` 進 CI、relay 協議整合測試;`bench/computer-use` 8 題在 Linux runner(Docker-in-Docker/gVisor 已具備)每晚跑,結果寫入 repo(`bench/results/`)做回歸閘門。
- **遥測**:opt-in 崩潰/成功率回報(自架 relay endpoint,遵守 SECURITY.md 敘事)。
- ✅ 完成標準:CI 紅灯可擋合併;每晚 bench 有連圖。
---
# 軌 S:安全
## S1. 移除大腦容器的 `docker.sock` 全權 ⛓(P5 前件,最高優先) ✅ 2026-11:docker-socket-proxy 過濾層(兩份 compose);DOCKER_SOCKET 支援 rootless
- 現況:`deploy/server/docker-compose.yml` 讓大腦掛 `/var/run/docker.sock`=大腦被攻破即宿主淪陷。
- 做法:`docker-socket-proxy`(只放行 containers create/start/stop/exec_resize、volumes inspect);或長期:rootless Docker+systemd socket activation。Box 執行加 gVisor(bench 已用)。
- ✅ 完成標準:大腦容器內 `docker ps` 只剩 box 一個容器可見;`make doctor` 驗 proxy 端點清單。
## S2. Relay 加 2FA+登入韌性 ✅ 2026-11:TOTP(RFC 6238 向量測)+8 個一次性恢復碼;argon2id(舊雜湊可登入);一頁登出全部裝置;lockout 以 IP+帳號計;手機端第二步行動。驗收「停用純密碼」=2FA 開著即成
- `docs/protocol.md`:加 TOTP(`/relay/2fa/enroll|verify`)與復原碼;密碼雜湊改 memory-hard(argon2id;`httpd::check_password` 現況要確認);鎖定策略(8 次/5 分)加 IP+帳號雙維度。
- 手機端 PWA 存 session 的提醒文案與「裝置清單+一頁登出」。
- ✅ 完成標準:可關密碼-only;竊得 session 可被單一裝置清單踢除。
## S3. Prompt injection 防線 ✅ 2026-11:敏感詞控件點擊每問(直接模式亦同、無放行符);截圖塗黑卡號/OTP;讀进来的內容 `<untrusted>` 包夾+系統提示;keep_to_chosen 補測試;紅隊集 R1–R7 進 bench(`--tasks R1..R7`,手動閘門——CI 沒有模型金鑰與 box)
1. 瀏覽器/畫面的敏感動作白名單:送出付款、發訊息、刪除、對外發文 → 一律詢問(policy 規則層,非模型自決);網站來源(`browser_open` 的域)進政策判定。
2. 截圖遮罩:vault 已存卡號/密碼,截圖進模型前對照螢幕上可偵測的卡號/OTP 樣式做遮罩(正則+框選重繪)。
3. `keep_to_chosen`(B26 那類參數改寫)補整合測試,禁模型改寫 `computer`/vault 目標。
4. 注入標記:來自網頁/文件/螢幕文字的內文,進歷史時加包夾標記(防「請忽略之前指令」)。
- ✅ 完成標準:注入紅隊集(10+ 題)在 bench 跑,成功外洩/成功送出為 0;紅隊集進 CI。
## S4. Egress 代理收斂 ✅ 2026-11:egress 只綁 loopback+偵測到的 docker bridge(docker0/br-<hex>/gwbridge)
- 現況:Linux 綁 `0.0.0.0`+`allowed_peer`(`src/egress.rs:26`)。
- 改:綁 docker bridge 網段(172.17.0.1/16 之類,啟動時探測)+開機自癒;加子網變動測試;連線計數進 oplog 可在 UI 看。
- ✅ 完成標準:`ss -ltnp` 顯示只綁 bridge;子網變動整合測試通過。
## S5. 稽核時間軸(信任面版,產品級賣點) ✅ 2026-11:oplog 加時間戳+`timeline()`;手機「對話詳細資訊 › 稽核」分頁(問模型/工具參數/狀態/插話/停止,進行中即時顯示)
- `oplog.rs` 已有底:做成一級 UI——時間軸+每步截圖/參數/結果+來源(哪個 Bot、哪個模型路由)+敏感動作的核准記錄;可匯出。競品全無此完整度,這是「敢讓 Bot 動手」的差異點。
- ✅ 完成標準:任何一次 box 操作可在 UI 還原全过程;手機端可看。
---
# 軌 C:操控鏈路(更精確、更少來回)
> 量測前提(bench 已證):模型回合佔 90% 時間,環境端 0.7–3.5s/步。
> 所以「少花 token/回合」>「壓環境延遲」。C1 先做。
## C1. Prompt caching(全案最高 CP 值) ✅ 2026-11:Anthropic 三斷點+CACHE_STATS;前綴穩定約束寫進 agent.rs 迴圈前註解
- 現況:`src/providers.rs` 全無 `cache_control`;每步重送 system+facts+~40 工具 schema+截圖。
- 做法:
1. Anthropic 系:system、tools、facts 段落、歷史末兩條加 `cache_control: ephemeral`;OpenAI 相容:確保前綴穩定(tools 排序固定、facts 位置固定、描述不動)。
2. `facts::for_turn` 改在開回合算好後凍結進 request(現況每步可能因快取過期而變文→破 cache)。
3. 工具清單在回合內不変(`quick_tools` 目前每步重組→改成快回合級常數)。
- ✅ 完成標準:Anthropic 路徑 `cache_read_input_tokens` >70%;bench 總時間/成本下降 ≥15%(列進 results.json 欄位)。
- ✅ 已驗證(2026-11):facts 於回合開始加入(loop 外)、tools 每回合建一次、quick_tools 為確定性映射→回合內前綴穩定;以 `agent.rs` 迴圈前註解固定此約束。
## C2. AX 直寫操作(精確度根治)⛓(H1、C3 前件) ✅ 2026-11:axwrite(AXPress/AXValue)+act() 像素路徑退回;darwin type-check 過;待 Mac CI+bench 驗收
- 現況:agent-desktop 唯讀;所有動作=滑鼠座標+鍵(`computer.rs`、`cloudbox.rs` xdotool)。
- 做法:新模組 `src/axwrite.rs`:
- macOS:`AXUIElementPerformAction(kAXPress)`、`AXUIElementSetAttributeValue(kAXValue/SelectedText)`;選單項 AXPress 不須滑鼠。
- Linux/AT-SPI:`Action.DoAction`、`EditableText.SetContents`/`SetTextContents`(box 內 a11y 助手擴充)。
- 手腳端:`remote::run_on_device` 加 `ax_act` 指令。
- 保留現行座標路徑当後備(AX 不可用時自動降級,並在結果註明走了哪條)。
- 效益:打字進欄=1 呼叫(消掉 click+全選替換邊角case);被遮擋/其他桌面視窗可操作;快速模型不再對編號點錯(消掉 bench 記錄的這整類失敗)。
- ✅ 完成標準:T3/T8 與 lxappearance 題步數 −30% 以上;「編號點錯」在 v12 bench 歸零。
## C3. 高層語意工具 ✅ 2026-11:`menu_click`/`fill_form`/`wait_for` 進 `computer` 工具(AX);batch 每步 `expect` 斷言(失敗即停+附截圖)。紅隊/多選單 App 的 bench 加題待 Mac 驗證
- `menu_click("檔案","新視窗")`:走 AX 選單樹(`app_menu_controls` 已會讀),3 回合→1。
- `fill_form(fields:[{name,value}])`:AX SetValue 逐欄填,1 回合+1 截圖。
- `wait_for(what, timeout)`:文字/元素出現或消失+逾時(box 的 `SETTLE_SH` 探測通用化);消掉截圖輪詢。
- batch 每步加 `expect` 斷言:失敗點自動帶截圖+原因回傳。
- ✅ 完成標準:T8 填表 ≤2 回合;新增 2 題 bench(多選單 App、長表單)步數達標。
## C4. 控制樹 diff 回傳 ✅ 2026-11:每次截圖附「+/- 控件變化」(multiset diff,macOS+box 都有);快速模型每步少讀整張清單。token −40% 的對照組數據待量
- 每步回傳:控制清單變化(新增/消失/值變)+(僅主模型/審查步)截圖;`marks::fingerprint` 材料現成。
- 效益:每步少送一張 ~1.5k tokens 的圖→上下文膨脹慢 3 倍、摘要頻率降、TTFT 降。
- ✅ 完成標準:「分開跑」模式每回合 token −40%,成功率不降(bench 對照組)。
## C5. 環境端小錢
- Mac:`screencapture` 與 AX 讀取並行(省 ~0.3s/步)。
- 遠端路:截圖改 WebP(同品質 −25% 位元組,image crate 已支援編碼);手腳端先縮到 1024 再過網;AX 讀取與截圖並行後併入同回覆。
- ✅ 完成標準:T7/T8 遠端題总時間 −10%。
## C6. 意圖優先於 GUI(facts → 意圖登記表)
- 常見操作(音量、亮度、Wi-Fi、鎖屏、時區、截圖、App 內建指令)登記 CLI/AppleScript/Shortcuts/dbus 捷徑,系統指示明令「有捷徑先捷徑,GUI 是後備」;bench T1 已證指令路 9 步 vs GUI 2 分鐘。
- ✅ 完成標準:8 題中指令路佔 5 題以上、總步數 −25%。
## C7. 迴路保護從字串比對改狀態碼 ✅ 2026-11:noop 偵測改機器標籤 `[[noop]]`(`computer::NOOP_TAG`),控制流不再匹配中文句子;合同測試釘住「句子可改、標籤不能跑掉」
- 現況:`agent.rs:1144` 用 `output.contains("畫面和上一步完全一樣")` 判 noop——脆。
- 改:工具結果尾部機器欄位 `[status: ok|noop|blocked|needs_human]`,迴路偵測(`agent.rs:1095-1144`、卡住偵測)讀欄位不讀散文;聊天 UI 仍顯示人話。
- ✅ 完成標準:無字串比對迴路邏輯(單元測試反推)。
## C8. 技能重播擴張(接 P7)
- `teach` 示範錄影→`replay_skill` 已有(時區題 9 步 49s→4 步 15s)。加:重播失敗自動截圖交還模型、示範可直接錄人的真實操作(box 端事件記錄)、技能進 registry 可分享。
- ✅ 完成標準:使用者示範一次→第二次同任務 ≤5 步零模型。
## C9. Windows 操控面(接 P8)— 🚧 2026-11:引擎已落地(`src/win.rs`:SendInput 滑鼠/鍵盤+GDI 截圖+前景視窗,mac code→VK 對照表;控制樹走 agent-desktop-windows;intents 在 Windows 明確降級為 GUI)。待實機驗證:多螢幕/高 DPI 座標、UIA 編號點擊、中文輸入。
- UIA(agent-desktop-windows)讀取+`SendInput`;`x11.rs/wl.rs` 對應 `win.rs`;facts/意圖表 Windows 版。
- ✅ 完成標準:Windows 手腳可被大腦派畫面步(bench T2/T5 移植版)。
---
# 軌 H:Harness 收斂(借 pi-bolt 的「少而熟」,不抄它的「純通用」)
> 判定:在 GUI 域,AnyBot 的 harness(圖剪枝、noop 偵測、重複攔截、StepPlan、核准閘、
> bench 驅動)比 pi-bolt 對等物更完整;落後點只在**工具數量與每步 token 成本**。
## H1. 12 個 `computer_use_*` → 1 個 `computer` 工具(action enum)⛓(依賴 C2) ✅ 2026-11:單一 computer 工具(action enum),模型輸出邊界展開回內部名;遠端 limb 免更新
- 採 Anthropic computer tool/OpenAI CUA 的公版形狀:`{action: screenshot|zoom|click|type|key|scroll|move|drag|batch|open_app|menu|fill_form|wait_for, ...}`。模型對這形狀有訓練先驗;schema token 減半;消掉「選錯工具/換路由」失敗類。
- 過渡:保留舊名 1 個大版本(內部轉發到新工具),系統指示同步改。
- ✅ 完成標準:工具 schema token −50%;快速模型工具選擇錯誤在 bench 歸零。
## H2. 瀏覽器 18 個 `browser_*` → ≤6 個(read/open/act/extract/upload/download 級別)。
- ✅ 完成標準:全工具清單/請求 ≤15 個。
## H3. 描述瘦身:教學移入 system
- 工具 description 只留參數語義;使用時機(「Use it when…/Do not…」)集中進 system 的「工具使用規則」章(被 C1 cache 覆蓋)。
- ✅ 完成標準:tools 序列化 token −60%,效果由 C1 指標連測。
## H4. 雙軌結果(人話+機器欄位)= C7,保留人話是產品決策(pi 無此需求,不要抄掉)。
---
## 執行順序建議(里程碑)
| 里程碑 | 內容 | 驗證 |
|---|---|---|
| M1(第 1–2 週) | P1 授權、P3 註解整併、S1 docker.sock、C1 prompt cache | 紅隊 grep 乾淨;cache_read>70%;bench 成本 −15% |
| M2(第 3–5 週) | C2 AX 直寫、H1/H3 工具收斂+瘦身、S4 egress、P8 CI | v12 bench:步數 −30%、編號點錯歸零 |
| M3(第 6–8 週) | C3 高層工具、C4 diff、C7 狀態碼、S3 injection 防線+紅隊進 CI | T8 ≤2 回合;紅隊洩漏 0 |
| M4(第 9–12 週) ✅ | P2 英文+demo、S2 2FA、S5 稽核時間軸、P4 SQLite(第一步) | 2026-11 完成;demo 影像、bench 夜間回歸(需機器)待補 |
| M4.5 ✅ | 手機 2FA/裝置清單、H2 瀏覽器單一新工具(25→2 schema)、H3(輕)、P6 記憶+事件日誌+本機 embedding+文件書架(全部完成) | 2026-11 完成 |
| M5(第 13 週起) | P6 記憶/RAG、P7 技能 registry、C6 意圖表、C5 小錢、C8 重播、C9 Windows | Khoj/Letta 對照測試;技能安裝量開始計量 |
每階段結束以 `bench/computer-use` 固定題組+新增題(多選單 App、長表單、注入紅隊)做前後對照,結果續寫進 `bench/computer-use/README.md` 的版本記錄。