架構
Agenvoy 整體如何組合的高階視角。各模組圖表、序列流程與 tool-dispatch 狀態機請跳至各主題專頁。
概覽
graph TB
subgraph Entry["Entry · cmd/app"]
App["agen · TUI + daemon<br/>agen stop · update · --daemon<br/>--enable-claude-code<br/>non-TTY stdin · MCP server"]
Web["Web dashboard · page/<br/>embedded in the binary<br/>served at 127.0.0.1:17989/"]
end
subgraph Engine["Engine · internal/agents/exec"]
Run["exec.Prepare · exec.Start<br/>skill match → named skill → ResolveAgent<br/>session model · dispatcher · tiers · priority"]
Execute["exec.Execute · ≤256 iterations<br/>3-pass parallel tool calls"]
Sub["ExecWithSubagent<br/>in-process · ≤3 concurrent"]
Compact["compact · threshold → tool history<br/>→ old history → trim fallback"]
end
subgraph Pending["Pending · internal/runtime"]
Reg["Prefix-routed listener registry<br/>per-entry buffered=1 reply ch<br/>TUI cli- · web chat- · Telegram tg- · Discord dc-"]
end
subgraph Providers["go-llm-router v0.8.2 · 13 provider entries + compat<br/>+ claude-code (internal/agents/claudeCode)"]
P["OpenAI · Codex · Claude · Gemini<br/>Grok · Grok (xAI) · Copilot · DeepSeek<br/>Mistral · NVIDIA · Ollama Cloud · OpenRouter<br/>Cloudflare · + any OpenAI-compatible endpoint<br/>Claude Code · local claude CLI, opt-in"]
end
subgraph Tools["Tool Subsystem · internal/tools"]
T["find_files · read_files · edit_file · file_history<br/>search_web · fetch_page · http_request<br/>subagents · schedules · run_skill · ask_user<br/>chat_history · error_history · find_tools<br/>run_command · reasoning_guide · write_result · html_template"]
MCP["MCP · internal/runtime/mcp<br/>client + server · go-sdk"]
Adapter["toolAdapter · internal/runtime<br/>script_* · api_* · ext_*"]
end
subgraph Security["Security · go-pkg/sandbox"]
S["bwrap (Linux) / sandbox-exec (macOS)<br/>filesystem.Policy · DeniedMap"]
end
subgraph Session["Session · internal/session"]
SL["history.json · summary.json<br/>action.log · pending/<br/>fsnotify watch"]
end
subgraph Memory["Memory · SQLite + ToriiDB"]
M["history.db · session · message_meta<br/>messages + FTS5 · action_history<br/>file_history · usage + tool call ids<br/>db_0..db_3 · error_memory 90d TTL"]
end
subgraph Kura["KuraDB · 使用者自行註冊的 MCP server"]
K["kura mcp<br/>mcp.json 中的一筆設定<br/>mcp__kura__list_rag · mcp__kura__search_rag"]
end
App --> Run
Web --> Run
Run --> Execute
Execute -->|subagents| Sub
Sub --> Execute
Execute --> Compact
Execute -->|Send| Providers
Execute -->|tool calls| Tools
Tools --> MCP
Tools --> Adapter
Tools --> Security
Tools -.->|mcp__kura__*<br/>未註冊該伺服器時完全不存在| Kura
Execute <-->|confirm/ask| Pending
Sub <-->|subagent ask_user| Pending
Execute <--> Memory
Execute <--> Session
橫切原則
- OS-native sandbox 優於 Go 側 filter — 安全 policy 在 OS 邊界強制執行;新限制放進
go-pkg/sandbox,不進 agenvoy caller - Prompt 即 policy — permission mode、敏感操作與 system-prompt 保護住在
configs/prompts/;新增類別意味編輯 prompt,而非 engine - subagent 走 in-process 而非 HTTP —
subagents(mode=invoke)直接呼叫exec.Execute,共用同一組 provider client、sandbox、pending registry 與 memory 層;AllowAll與WorkDir透過 ctx 流動 - read tool 扇出、write tool 序列化 — 並行為 opt-in,且同時要求「無副作用」與「上游允許並行」
- 每個關注點一層 config — provider 憑證在 OS keychain、已註冊 model、優先序、tier 與 limits 在
config.json、MCP 在mcp.json、session 設定與 persona 在 SQLitesession表;每位 tool 作者/使用者最多動一個地方 - 單一 HTTP 介面 — TUI、瀏覽器儀表板、聊天通道與外部呼叫端全部經由同一個
127.0.0.1:17989daemon;儀表板為內嵌而非外部託管,因此沒有第二個來源需要同步 - 廠商程式碼留在上游 — provider adapter 已移至
go-llm-router、MCP 協定改用官方 go-sdk;修正應進上游模組,而非在本地加 shim