源码反编译地址
系统架构图
┌─────────────────────────────────────────────────────────────────────────────────┐
│ CLI 入口层 (Entrypoints) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ src/entrypoints/cli.tsx │
│ ├── Runtime Polyfill (feature(), MACRO) │
│ ├── 快速路径分发 (--version, --daemon, --bridge, etc.) │
│ └── 加载 main.tsx │
│ │
│ src/main.tsx (~234KB) │
│ ├── Commander.js CLI 定义 │
│ ├── 参数解析 & 配置初始化 │
│ ├── 认证/权限/会话初始化 │
│ └── 启动 REPL 或 Pipe 模式 │
└─────────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│ UI 渲染层 (Ink/React) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ src/screens/REPL.tsx (~5000+ 行) │
│ ├── 主交互界面 │
│ ├── 消息显示 & 输入处理 │
│ ├── 工具权限确认 UI │
│ └── 快捷键 & Vim 模式 │
│ │
│ src/ink/ (自定义 Ink 框架) │
│ ├── React Reconciler │
│ ├── Terminal I/O │
│ └── Hooks (useInput, useTerminalSize, etc.) │
│ │
│ src/components/ │
│ ├── Messages.tsx / MessageRow.tsx (消息渲染) │
│ ├── PromptInput/ (用户输入) │
│ ├── permissions/ (权限 UI) │
│ └── Spinner.tsx, Dialog 等 │
└─────────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 核心引擎层 (Query Engine) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ src/QueryEngine.ts (~1300 行) │
│ ├── 对话状态管理 │
│ ├── 消息队列 & 上下文构建 │
│ ├── Token 追踪 & 自动压缩 │
│ └── 文件历史快照 & 归因 │
│ │
│ src/query.ts (~1700 行) │
│ ├── API 请求循环 │
│ ├── 流式响应处理 │
│ ├── 工具调用编排 │
│ └── 错误恢复 & 重试 │
└─────────────────────────────────────────────────────────────────────────────────┘
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
│ API 通信层 │ │ 工具系统层 │ │ 服务层 │
├───────────────────────┤ ├───────────────────────┤ ├───────────────────────┤
│ src/services/api/ │ │ src/Tool.ts │ │ src/services/ │
│ ├── claude.ts (核心) │ │ (工具接口定义) │ │ ├── mcp/ (MCP协议) │
│ ├── providers: │ │ │ │ ├── oauth/ │
│ │ ├── Anthropic │ │ src/tools.ts │ │ ├── plugins/ │
│ │ ├── Bedrock │ │ (工具注册表) │ │ ├── compact/ │
│ │ ├── Vertex │ │ │ │ ├── lsp/ │
│ │ └── Azure │ │ src/tools/ │ │ ├── analytics/ │
│ └── errors.ts │ │ ├── BashTool/ │ │ └── policyLimits/ │
│ │ │ ├── FileEditTool/ │ │ │
│ │ │ ├── FileReadTool/ │ │ │
│ │ │ ├── AgentTool/ │ │ │
│ │ │ ├── WebFetchTool/ │ │ │
│ │ │ └── ... (50+ 工具) │ │ │
└───────────────────────┘ └───────────────────────┘ └───────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 状态管理层 (State) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ src/state/AppStateStore.ts │
│ ├── AppState 类型定义 │
│ ├── 消息列表、工具权限、MCP 连接 │
│ └── 会话配置、模型设置 │
│ │
│ src/state/store.ts (Zustand-style store) │
│ src/bootstrap/state.ts (模块级单例状态) │
└─────────────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 基础设施层 (Utils & Types) │
├─────────────────────────────────────────────────────────────────────────────────┤
│ src/utils/ │ src/types/ │
│ ├── model/ (模型选择) │ ├── message.ts (消息类型) │
│ ├── permissions/ (权限系统) │ ├── permissions.ts │
│ ├── auth.ts (认证) │ ├── hooks.ts │
│ ├── config.ts (配置) │ └── global.d.ts │
│ ├── git.ts │ │
│ ├── messages.ts │ src/constants/ │
│ └── claudemd.ts │ └── prompts.ts (系统提示) │
└─────────────────────────────────────────────────────────────────────────────────┘
数据流图
用户输入
│
▼
┌──────────────┐
│ PromptInput │ ◄─── 历史命令、自动补全
└──────┬───────┘
│
▼
┌──────────────┐ ┌──────────────┐
│ 斜杠命令? │────►│ Commands │──► 本地执行
└──────┬───────┘ └──────────────┘
│ 否
▼
┌──────────────┐ ┌──────────────┐
│ QueryEngine │────►│ context.ts │──► 构建上下文
└──────┬───────┘ └──────────────┘ (git status, CLAUDE.md, memory)
│
▼
┌──────────────┐ ┌──────────────┐
│ query.ts │────►│ API Client │──► Claude API
└──────┬───────┘ └──────────────┘ (流式响应)
│
▼
┌──────────────┐
│ 响应解析 │
│ ├─ 文本块 │──► 渲染到终端
│ ├─ 思考块 │──► 显示思考过程
│ └─ 工具调用 │
└──────┬───────┘
│
▼
┌──────────────┐ ┌──────────────┐
│ 工具权限检查 │────►│PermissionUI │──► 用户确认
└──────┬───────┘ └──────────────┘
│ 允许
▼
┌──────────────┐
│ 工具执行 │
│ ├─ Bash │──► Shell 命令
│ ├─ Edit │──► 文件修改
│ ├─ Read │──► 文件读取
│ ├─ Agent │──► 子代理
│ └─ MCP │──► 外部工具
└──────┬───────┘
│
▼
┌──────────────┐
│ 工具结果 │──► 追加到消息
└──────┬───────┘
│
▼
循环回 query.ts (直到无更多工具调用)
核心模块详解
1. 入口层
| 文件 | 职责 |
|---|
cli.tsx | 真正入口,注入 polyfill,分发快速路径 |
main.tsx | Commander.js CLI,参数解析,初始化流程 |
replLauncher.tsx | 启动 REPL 屏幕 |
2. UI 层
| 模块 | 职责 |
|---|
screens/REPL.tsx | 主交互界面,消息渲染,输入处理 |
ink/ | 自定义 Ink 框架,终端渲染 |
components/ | React 组件库 |
hooks/ | React Hooks |
3. 核心引擎
| 文件 | 职责 |
|---|
QueryEngine.ts | 高层会话管理器 |
query.ts | API 调用循环,工具执行 |
Tool.ts | 工具接口定义 |
tools.ts | 工具注册表 |
4. 工具系统
src/tools/
├── BashTool/ # Shell 执行
├── FileReadTool/ # 文件读取 (支持 PDF、图片、Notebook)
├── FileEditTool/ # 文件编辑 (字符串替换)
├── FileWriteTool/ # 文件创建/覆写
├── GlobTool/ # 文件搜索
├── GrepTool/ # 内容搜索
├── AgentTool/ # 子代理派生
├── WebFetchTool/ # URL 抓取
├── WebSearchTool/ # 网页搜索
├── AskUserQuestionTool/ # 用户交互
├── SkillTool/ # 斜杠命令
├── EnterPlanModeTool/ # 计划模式
├── TaskCreateTool/ # 任务管理 (Todo v2)
├── SendMessageTool/ # 消息发送
└── ... (50+ 工具)
5. 服务层
| 模块 | 职责 |
|---|
services/api/ | API 客户端 (Anthropic/Bedrock/Vertex/Azure) |
services/mcp/ | MCP 协议实现 |
services/oauth/ | OAuth 认证 |
services/plugins/ | 插件系统 |
services/compact/ | 对话压缩 |
services/lsp/ | LSP 集成 |
6. 状态管理
src/state/
├── AppStateStore.ts # AppState 类型定义
├── store.ts # Zustand-style store
└── onChangeAppState.ts
src/bootstrap/state.ts # 模块级单例
├── sessionId
├── cwd
├── projectRoot
├── tokenCounts
└── ...
关键流程
启动流程
cli.tsx
│
├─► --version → 输出版本,退出
├─► --daemon → daemon/main.js
├─► --bridge → bridge/bridgeMain.js
│
└─► main.tsx
│
├─► enableConfigs() → 加载配置
├─► initSinks() → 初始化分析
├─► init() → 信任对话框、遥测
│
└─► launchRepl() 或 runPipeMode()
API 调用流程
query()
│
├─► getSystemPrompt() → 构建系统提示
├─► normalizeMessagesForAPI() → 格式化消息
│
├─► claude.messages.create() → 发送请求
│ └─► 流式处理响应
│
├─► 遇到 tool_use → StreamingToolExecutor
│ ├─► 权限检查
│ ├─► tool.call()
│ └─► 记录结果
│
└─► 循环直到 stop_reason != "tool_use"
工具执行流程
StreamingToolExecutor
│
├─► findToolByName()
├─► 权限检查 (canUseTool)
│ ├─► 已允许 → 执行
│ ├─► 需确认 → PermissionRequest UI
│ └─► 拒绝 → 返回错误
│
├─► tool.call(input, context)
│ └─► 返回 ToolResultBlockParam
│
└─► 追加到消息列表
包结构 (packages/)
packages/
├── color-diff-napi/ # ✅ 完整实现 (语法高亮 diff)
├── audio-capture-napi/ # ❌ stub
├── image-processor-napi/ # ❌ stub
├── modifiers-napi/ # ❌ stub
├── url-handler-napi/ # ❌ stub
└── @ant/
├── claude-for-chrome-mcp/ # ❌ stub
├── computer-use-mcp/ # ❌ stub
├── computer-use-input/ # ❌ stub
└── computer-use-swift/ # ❌ stub
Feature Flags 系统
const feature = (_name: string) => false;
这意味着以下功能被禁用:
- KAIROS (自主 Agent)
- VOICE_MODE (语音)
- BRIDGE_MODE (远程控制)
- DAEMON (守护进程)
- 等等…
技术栈
| 层次 | 技术 |
|---|
| 运行时 | Bun |
| UI 框架 | React + Ink (终端渲染) |
| CLI 框架 | Commander.js |
| API 客户端 | @anthropic-ai/sdk |
| 状态管理 | Zustand-style |
| 类型系统 | TypeScript + Zod |
| 构建 | Bun bundler |
所有评论(0)