三月初的时候我就逆向了claude并进行了分析 有了下面文章
- 内容介绍
- 文章标签
- 相关推荐
文章如左:https://www.cdxiaodong.life/article/31d0f0c5-b87c-8043-84a2-d47565f6f9e5
不过确实因为是逆向的 相比开源的版本,在重点的分流、多代理调度等功能上没有分析到
下面是最新版本我比较感兴趣的部分
flowchart TD
A["CLI 入口<br/>entrypoints/cli.tsx"] --> B{"参数分流"}
B -->|--version| V["直接输出版本"]
B -->|remote-control / bridge| RC["bridgeMain()<br/>远程控制模式"]
B -->|daemon| D["daemonMain()<br/>守护进程模式"]
B -->|ps / logs / attach / kill / --bg| BG["后台会话管理"]
B -->|默认完整 CLI| M["main.tsx"]
M --> M1["初始化启动优化<br/>profiler / keychain / MDM"]
M1 --> M2["initBuiltinPlugins()<br/>initBundledSkills()"]
M2 --> M3["getTools(toolPermissionContext)"]
M3 --> S["setup.ts<br/>setup(...)"]
M3 --> C["getCommands(cwd)"]
M3 --> AG["getAgentDefinitionsWithOverrides(cwd)"]
S --> S1["switchSession()"]
S1 --> S2["startUdsMessaging()"]
S2 --> S3["setCwd(cwd)"]
S3 --> S4["captureHooksConfigSnapshot()"]
S4 --> S5["initializeFileChangedWatcher()"]
S5 --> S6{"worktreeEnabled?"}
S6 -->|yes| S7["createWorktreeForSession()<br/>可选 tmux"]
S6 -->|no| M4["继续启动"]
C --> M4
AG --> M4
S7 --> M4
M4 --> QE["QueryEngine.ts<br/>submitMessage(...)"]
QE --> QE1["fetchSystemPromptParts()"]
QE1 --> QE2["组装 systemPrompt / userContext / systemContext"]
QE2 --> Q["query.ts<br/>query() / queryLoop()"]
Q --> Q1["buildQueryConfig()"]
Q1 --> Q2["memory / skill prefetch"]
Q2 --> Q3["compact / snip / microcompact"]
Q3 --> Q4["调用模型并流式接收 assistantMessages"]
Q4 --> Q5{"assistant 是否产生 tool_use?"}
Q5 -->|否| Q6["输出最终消息并结束"]
Q5 -->|是| T["runTools(...) / StreamingToolExecutor"]
T --> T1{"是否调用 AgentTool?"}
T1 -->|否| T2["tool_result 回填消息"]
T2 --> Q
T1 -->|是| AT["AgentTool.tsx<br/>AgentTool.call(...)"]
AT --> AT1["解析参数<br/>subagent_type / run_in_background / isolation / cwd"]
AT1 --> AT2{"team_name + name?"}
AT2 -->|是| TEAM["spawnTeammate()"]
AT2 -->|否| AT3["选择 selectedAgent"]
AT3 --> AT4{"isolation"}
AT4 -->|remote| REM["teleportToRemote()<br/>remote_launched"]
AT4 -->|worktree| W["createAgentWorktree()"]
AT4 -->|none| AT5["直接继续"]
W --> AT5
TEAM --> T2
REM --> T2
AT5 --> AT6["assembleToolPool()<br/>生成 workerTools"]
AT6 --> AT7["计算 shouldRunAsync"]
AT7 --> RA["runAgent.ts<br/>runAgent(...)"]
RA --> RA1["initializeAgentMcpServers()"]
RA1 --> RA2["createSubagentContext()"]
RA2 --> RA3["recordSidechainTranscript()<br/>writeAgentMetadata()"]
RA3 --> RA4["子代理再次进入 query(...)"]
RA4 --> QSUB["子代理 queryLoop"]
QSUB --> QSUB2["自己的工具调用 / 推理 / 结果"]
QSUB2 --> RA5["清理 MCP / hooks / cache / transcript 映射"]
RA5 --> T2
多代理同步 / 异步 / worktree / remote
flowchart TD
A["主代理在 queryLoop 中调用 AgentTool"] --> B["AgentTool.call(...)<br/>解析参数:<br/>subagent_type / run_in_background / isolation / cwd"]
B --> C["选择 selectedAgent"]
C --> D["检查权限 / MCP 依赖 / agent 定义"]
D --> E{"isolation 是什么?"}
E -->|remote| R1["Remote 模式"]
E -->|worktree| W1["Worktree 模式"]
E -->|未设置| N1["普通本地模式"]
R1 --> R2["checkRemoteAgentEligibility()"]
R2 --> R3["teleportToRemote()"]
R3 --> R4["registerRemoteAgentTask()"]
R4 --> R5["返回 remote_launched"]
R5 --> END1["主代理拿到远程任务句柄<br/>不在本地直接跑 queryLoop"]
W1 --> W2["createAgentWorktree()"]
W2 --> W3["得到独立 worktreePath"]
W3 --> P1["继续构造 runAgentParams"]
N1 --> P1["继续构造 runAgentParams"]
P1 --> P2["assembleToolPool()<br/>为子代理生成独立工具池"]
P2 --> P3["决定 shouldRunAsync"]
P3 --> J{"shouldRunAsync?"}
J -->|否| S1["同步子代理"]
J -->|是| A1["异步子代理"]
S1 --> S2["runAgent(...)"]
S2 --> S3["createSubagentContext()<br/>通常共享部分父状态"]
S3 --> S4["当前调用栈内直接进入子 queryLoop"]
S4 --> S5["子代理完成后把结果返回给父代理"]
S5 --> S6["如果是 worktree:<br/>检查是否有改动"]
S6 --> S7{"worktree 有改动?"}
S7 -->|否| S8["removeAgentWorktree()<br/>自动清理"]
S7 -->|是| S9["保留 worktree 供后续查看/接管"]
S8 --> END2["同步结果回到父代理"]
S9 --> END2
A1 --> A2["registerAsyncAgent()"]
A2 --> A3["创建独立 abortController / taskId / outputFile"]
A3 --> A4["后台启动 runAsyncAgentLifecycle(...)"]
A4 --> A5["内部仍然调用 runAgent(...)"]
A5 --> A6["子代理在后台进入自己的 queryLoop"]
A6 --> A7["主代理立即收到 async_launched"]
A7 --> A8["后续通过任务输出 / 通知 / SendMessage 跟踪"]
A8 --> A9["如果是 worktree:<br/>完成后再决定清理或保留"]
A9 --> END3["后台任务与主代理解耦运行"]
classDef remote fill:#ffe8e8,stroke:#d44,stroke-width:1px;
classDef worktree fill:#e8f4ff,stroke:#3b82f6,stroke-width:1px;
classDef async fill:#fff7e6,stroke:#d97706,stroke-width:1px;
classDef sync fill:#eafbea,stroke:#16a34a,stroke-width:1px;
class R1,R2,R3,R4,R5 remote;
class W1,W2,W3,S6,S7,S8,S9 worktree;
class A1,A2,A3,A4,A5,A6,A7,A8,A9 async;
class S1,S2,S3,S4,S5 sync;
网友解答:
--【壹】--:
很多人都有做分析吧 只不过太细节的东西逆不干净
文章如左:https://www.cdxiaodong.life/article/31d0f0c5-b87c-8043-84a2-d47565f6f9e5
不过确实因为是逆向的 相比开源的版本,在重点的分流、多代理调度等功能上没有分析到
下面是最新版本我比较感兴趣的部分
flowchart TD
A["CLI 入口<br/>entrypoints/cli.tsx"] --> B{"参数分流"}
B -->|--version| V["直接输出版本"]
B -->|remote-control / bridge| RC["bridgeMain()<br/>远程控制模式"]
B -->|daemon| D["daemonMain()<br/>守护进程模式"]
B -->|ps / logs / attach / kill / --bg| BG["后台会话管理"]
B -->|默认完整 CLI| M["main.tsx"]
M --> M1["初始化启动优化<br/>profiler / keychain / MDM"]
M1 --> M2["initBuiltinPlugins()<br/>initBundledSkills()"]
M2 --> M3["getTools(toolPermissionContext)"]
M3 --> S["setup.ts<br/>setup(...)"]
M3 --> C["getCommands(cwd)"]
M3 --> AG["getAgentDefinitionsWithOverrides(cwd)"]
S --> S1["switchSession()"]
S1 --> S2["startUdsMessaging()"]
S2 --> S3["setCwd(cwd)"]
S3 --> S4["captureHooksConfigSnapshot()"]
S4 --> S5["initializeFileChangedWatcher()"]
S5 --> S6{"worktreeEnabled?"}
S6 -->|yes| S7["createWorktreeForSession()<br/>可选 tmux"]
S6 -->|no| M4["继续启动"]
C --> M4
AG --> M4
S7 --> M4
M4 --> QE["QueryEngine.ts<br/>submitMessage(...)"]
QE --> QE1["fetchSystemPromptParts()"]
QE1 --> QE2["组装 systemPrompt / userContext / systemContext"]
QE2 --> Q["query.ts<br/>query() / queryLoop()"]
Q --> Q1["buildQueryConfig()"]
Q1 --> Q2["memory / skill prefetch"]
Q2 --> Q3["compact / snip / microcompact"]
Q3 --> Q4["调用模型并流式接收 assistantMessages"]
Q4 --> Q5{"assistant 是否产生 tool_use?"}
Q5 -->|否| Q6["输出最终消息并结束"]
Q5 -->|是| T["runTools(...) / StreamingToolExecutor"]
T --> T1{"是否调用 AgentTool?"}
T1 -->|否| T2["tool_result 回填消息"]
T2 --> Q
T1 -->|是| AT["AgentTool.tsx<br/>AgentTool.call(...)"]
AT --> AT1["解析参数<br/>subagent_type / run_in_background / isolation / cwd"]
AT1 --> AT2{"team_name + name?"}
AT2 -->|是| TEAM["spawnTeammate()"]
AT2 -->|否| AT3["选择 selectedAgent"]
AT3 --> AT4{"isolation"}
AT4 -->|remote| REM["teleportToRemote()<br/>remote_launched"]
AT4 -->|worktree| W["createAgentWorktree()"]
AT4 -->|none| AT5["直接继续"]
W --> AT5
TEAM --> T2
REM --> T2
AT5 --> AT6["assembleToolPool()<br/>生成 workerTools"]
AT6 --> AT7["计算 shouldRunAsync"]
AT7 --> RA["runAgent.ts<br/>runAgent(...)"]
RA --> RA1["initializeAgentMcpServers()"]
RA1 --> RA2["createSubagentContext()"]
RA2 --> RA3["recordSidechainTranscript()<br/>writeAgentMetadata()"]
RA3 --> RA4["子代理再次进入 query(...)"]
RA4 --> QSUB["子代理 queryLoop"]
QSUB --> QSUB2["自己的工具调用 / 推理 / 结果"]
QSUB2 --> RA5["清理 MCP / hooks / cache / transcript 映射"]
RA5 --> T2
多代理同步 / 异步 / worktree / remote
flowchart TD
A["主代理在 queryLoop 中调用 AgentTool"] --> B["AgentTool.call(...)<br/>解析参数:<br/>subagent_type / run_in_background / isolation / cwd"]
B --> C["选择 selectedAgent"]
C --> D["检查权限 / MCP 依赖 / agent 定义"]
D --> E{"isolation 是什么?"}
E -->|remote| R1["Remote 模式"]
E -->|worktree| W1["Worktree 模式"]
E -->|未设置| N1["普通本地模式"]
R1 --> R2["checkRemoteAgentEligibility()"]
R2 --> R3["teleportToRemote()"]
R3 --> R4["registerRemoteAgentTask()"]
R4 --> R5["返回 remote_launched"]
R5 --> END1["主代理拿到远程任务句柄<br/>不在本地直接跑 queryLoop"]
W1 --> W2["createAgentWorktree()"]
W2 --> W3["得到独立 worktreePath"]
W3 --> P1["继续构造 runAgentParams"]
N1 --> P1["继续构造 runAgentParams"]
P1 --> P2["assembleToolPool()<br/>为子代理生成独立工具池"]
P2 --> P3["决定 shouldRunAsync"]
P3 --> J{"shouldRunAsync?"}
J -->|否| S1["同步子代理"]
J -->|是| A1["异步子代理"]
S1 --> S2["runAgent(...)"]
S2 --> S3["createSubagentContext()<br/>通常共享部分父状态"]
S3 --> S4["当前调用栈内直接进入子 queryLoop"]
S4 --> S5["子代理完成后把结果返回给父代理"]
S5 --> S6["如果是 worktree:<br/>检查是否有改动"]
S6 --> S7{"worktree 有改动?"}
S7 -->|否| S8["removeAgentWorktree()<br/>自动清理"]
S7 -->|是| S9["保留 worktree 供后续查看/接管"]
S8 --> END2["同步结果回到父代理"]
S9 --> END2
A1 --> A2["registerAsyncAgent()"]
A2 --> A3["创建独立 abortController / taskId / outputFile"]
A3 --> A4["后台启动 runAsyncAgentLifecycle(...)"]
A4 --> A5["内部仍然调用 runAgent(...)"]
A5 --> A6["子代理在后台进入自己的 queryLoop"]
A6 --> A7["主代理立即收到 async_launched"]
A7 --> A8["后续通过任务输出 / 通知 / SendMessage 跟踪"]
A8 --> A9["如果是 worktree:<br/>完成后再决定清理或保留"]
A9 --> END3["后台任务与主代理解耦运行"]
classDef remote fill:#ffe8e8,stroke:#d44,stroke-width:1px;
classDef worktree fill:#e8f4ff,stroke:#3b82f6,stroke-width:1px;
classDef async fill:#fff7e6,stroke:#d97706,stroke-width:1px;
classDef sync fill:#eafbea,stroke:#16a34a,stroke-width:1px;
class R1,R2,R3,R4,R5 remote;
class W1,W2,W3,S6,S7,S8,S9 worktree;
class A1,A2,A3,A4,A5,A6,A7,A8,A9 async;
class S1,S2,S3,S4,S5 sync;
网友解答:
--【壹】--:
很多人都有做分析吧 只不过太细节的东西逆不干净

