Skip to content
系列
20 篇文章

Rivumi 架構拆解

沿著一次 coding-agent 任務的實際路徑拆解 Rivumi:從 TUI、disposable workspace、prompt 與兩條 runtime lane,走到工具權限、state/event lifecycle、MCP、subagents、SDK/IDE,最後把同一套邊界延伸到 Cloudflare 遠端執行。每篇只追一條 data flow、failure boundary 與測試證據。

Rivumi 架構地圖:一次 coding-agent 任務如何穿過 workspace、runtime、tools 與 events

Rivumi 把 coding-agent 任務拆成可追蹤的邊界:native runtime 的副作用經過 Rivumi tools、permission 與 sandbox;external runtime 保留自己的 loop 與工具,再把 patch 交回 Rivumi 稽核。這篇是規劃中 20 篇系列的入口地圖。

Rivumi 的 TUI 與 CLI:一次 run 在終端機上怎麼被看見

Rivumi 的 TUI 與 plain CLI 是同一套 runtime 的兩種使用者介面。CLI 先依 TTY 與旗標選擇呈現方式,runner 再送出事件;TUI 把事件投影成 thinking、tool、approval、verification 與終態。使用者能從畫面分辨 native 與 external runtime,但 UI 不替底層能力背書。

Rivumi 的 disposable workspace 與 run bundle:原始 repo 為什麼不會被直接修改

Rivumi 先把指定的完整 Git commit 複製到 run directory 裡的 detached-HEAD workspace,再讓 runtime 修改與驗證。原始 repo、執行 workspace 與 run artifacts 因此有清楚邊界;這能提供 source isolation 與 audit bundle,但不等於 OS sandbox。

Rivumi 的 prompt、instruction precedence 與 explicit memory:模型最後看見了什麼

Rivumi 先在應用程式層解析 user 與 root-to-leaf 專案 instructions,再把 runtime、skills、workspace 與最近 20 筆 explicit memory 放進具名 prompt sections。這套流程可追蹤、可 reload,但不是 semantic memory,也不會把 repo 文字升格成 system authority。

Rivumi 的 provider-neutral native loop:一次 model turn 如何走到驗證終態

Rivumi 的 native lane 由 AgentRunner 掌握狀態轉移:準備 workspace、送出 model request、執行 tool calls、寫回 observations,模型沒有再呼叫工具時才進入 verification。step、wall time、重複動作、token 與取消條件都能先於模型宣告終止 run;provider adapter 的協定翻譯留給下一篇。

Rivumi 的 ModelProvider 多閘道:多個 protocol 共用一個 canonical contract

Rivumi 把 OpenAI-compatible、Responses、Anthropic、Gemini、Workers AI、scripted 與 experimental Codex OAuth adapter 收斂成同一個 `ModelProvider` contract。Codex OAuth transport 讀 SSE,但仍在 adapter 內累積成一次性的 canonical `ModelTurn`;AgentRunner 不直接消費 token delta。

Rivumi 的 model roles、fallback、cache hints 與 estimated cost

Rivumi 用靜態 model role catalog 提供候選順序,只對 retryable provider error 重試與 fallback;cache 是 provider hint 加 trace,cost 是靜態價表估算。三者都留下訊號,但都不是即時營運路由或帳單。

Rivumi 的 ExternalCodingRunner:為什麼 Codex/Claude Code CLI 是外部 runtime,不是 ModelProvider

`ExternalCodingRunner` 是 Rivumi 的第二條 runtime lane:外部 coding CLI 擁有自己的 model loop 與 credential,Rivumi 只交付任務與 disposable clone,再把回傳 patch 當成不受信任輸入,重跑 path audit、verification 與 source invariant。它是有明確 capability boundary 的 handoff,不是另一種 `ModelProvider`。

Rivumi 的工具隔離:path allowlist、argv 嚴格化、process group 與 credential-free subprocess

這篇只拆 Rivumi 的 tool executor 如何把一次呼叫安全落地:`SafePathPolicy` 限制 path 並阻擋 symlink escape,`VerificationCommand` 固定 argv 且使用 `shell=False`,subprocess 只拿清理過的 env,寫入走 read-version hash 與 atomic replace,timeout 會終止整個 process group。權限決策、OS sandbox 與 tool program 各留給後續專篇。

Rivumi 的 permission layering:危險命令如何落到 allow、ask 或 deny

Rivumi 先套不可繞過的 critical floor,再評估 user/org/project deny,最後才看 allow。dangerous mode 只自動放行 read/modify,execute 仍經過命令分類與 approval;這是 authority policy,不是 OS sandbox。

Rivumi 的 local OS sandbox:macOS、bubblewrap 與 Landlock 如何 fail closed

Rivumi 可把指定的 local command/verification 包進 macOS sandbox-exec、Linux bubblewrap 或 Landlock/seccomp。需要的 backend 不存在時以 exit 126 停止,不直接裸跑;但這個範圍不涵蓋 external CLI、MCP/LSP 或整個 Rivumi process。

Rivumi 的 tool programs、transactions 與 safe concurrency

Rivumi 只平行執行同時標成 read-only、concurrency-safe 與 READ effect 的 tool call;tool_program 提供有界的 read-only repeat/branch,tool_transaction 則對可能碰到的 workspace files 做 snapshot 與失敗 rollback。它不是外部副作用的通用交易系統。

Rivumi 的 state-first event journaling:為什麼 manifest commit 跟 JSONL append 之間的 crash 要靠 state 修

Rivumi 同時維護 append-only 的 `events.jsonl` 與原子替換的 `session.json`,用 sequence reconciliation 判斷 crash 後能否安全續跑。這份 event contract 現在也支援 deterministic replay、JSON replay、從指定 sequence 建立 fork seed,以及在不重放副作用的前提下建立新 workspace;遇到停在 `tool.started` 或 `verification.started` 的不確定狀態仍然 hard fail。

Rivumi 的 context pressure、compaction 與 workspace reinjection

Rivumi 在 85% context pressure 附近啟動兩種不同流程:native loop 可做一次 bounded deterministic summary fallback;支援原生 compaction 的 conversation runtime 則在完成 turn 後壓縮並回報 lifecycle。兩條路徑都會在下一次請求重新注入 workspace snapshot。

Rivumi 的 Native MCP:transport、authorization 與 approval 邊界

Rivumi 只有在明確 allowlist 後才載入專案 MCP server,將 stdio 或 Streamable HTTP 能力投影到既有 ToolExecutor,再沿用 hook、approval、timeout 與 cleanup 邊界。

Rivumi 的 Skills、Blocking Hooks 與 Plugin Packages

Rivumi 把 skills 當成有界的 repository-local guidance、把 hooks 當成 opt-in 且只能否決的 host commands,再用 local plugin manifest 封裝 skill 與 hook;三者的權限完全不同。

Rivumi 的 Subagent Scheduling 與 Parent-owned Transactions

Rivumi 把每次 subagent dispatch 正規化成最多四個節點的 dependency waves,讓同 wave 的唯讀 child 在隔離 workspace 平行分析,再由 parent 重新走 hook、approval 與 transaction 執行修改。

Embedding Rivumi:SDK、ConversationController 與 WebSocket Boundary

Rivumi 用 0.x typed SDK facade 暴露 bounded run 與 conversation contracts;WebSocket attach 只包住一個預先建立、由 controller 擁有的 runtime session,沒有 conversation-ID resume 或多 client routing。

Rivumi 的 IDE/LSP Context:Diagnostics、Open Files 與 VS Code Bridge

Rivumi 將最多 200 筆 diagnostics 與 32 個 visible files 正規化成有界、repository-local、且不受信任的 context;VS Code 與 managed LSP 目前只提供訊號,沒有 completion、rename、code action 或完整 IDE RPC。

Rivumi 的 Cloudflare 遠端執行:Worker、Sandbox、Capability DO 與 durable RunSession

Rivumi 的舊同步 M6 路徑曾完成一次真實 deployed coding run;目前已擴成帶 RunSession、SSE、approval、cancel 與 artifact 的 async control plane,但新增路徑尚未 live revalidate。Sandbox 只拿分 audience 的短效 HMAC capability,provider credential 留在 Worker;現有證據不等於 production traffic 或 SLO。