外部集成能力
Vim 模式、语音输入、GitHub 集成、遥测系统、Git 操作、Shell 工具链、深链协议、Chrome 集成、Computer Use 等外部接口的总成
职责概述
解决的问题:CC 不只是一个终端聊天工具——它还需要执行 Shell 命令、操作 Git 仓库、连接浏览器做 GUI 自动化、处理语音输入、生成深度链接。这些"和外部世界交互"的能力需要一个统一的集成层来管理。
应用场景:① 执行用户系统上的 Shell 命令(编译、测试、部署)② 解析 Git 仓库状态(当前分支、未提交变更)③ 通过浏览器扩展操作网页(自动化测试)④ 语音输入转文字 ⑤ claude-cli:// 链接从 IDE 跳转到终端 ⑥ Vim 模式的键盘映射和状态管理。
一句话理解:就像 CC 的"手脚"——大脑(模型)想干什么,都通过这一层和外部世界交互。
架构设计
外部接口全景图
vim/types.ts
vim/transitions.ts
用户输入框
Vim 键绑定
processUserInput/
Rust enigo
Swift SCContent
截图 / 键鼠 / App 管理
computerUse/
mcpServer.ts
claudeInChrome/
Native Messaging
WebSocket Bridge
或 Unix Socket
claude-cli://
协议注册
核心数据流
1. Vim 模式按键处理流程
dtransitions.ts:59 — 根据 CommandState.type 路由到 fromIdle()fromIdle() 识别 d 为 operator,返回 { next: { type: 'operator', op: 'delete', count: 1 } }w,进入 fromOperator()executeOperatorMotion('delete', 'w', 1, ctx) — 计算范围,删除文本,记录变更2. 遥测数据流
startInteractionSpan(prompt)startLLMRequestSpan() / endLLMRequestSpan() 记录 TTFT、token 用量startToolSpan() / endToolSpan()3. Git 文件系统缓存流程
getCachedBranch() → GitFileWatcher.get()resolveGitDir() 处理 worktree/submodule 的 gitdir: 指针readGitHead() 解析 ref: refs/heads/branch 或裸 SHAfs.watchFile 监听 HEAD / config / refs 变化,标记脏数据关键类型与接口
Vim 状态机核心类型 (vim/types.ts)
// vim/types.ts:49-76 — Vim 状态联合类型
export type VimState =
| { mode: 'INSERT'; insertedText: string }
| { mode: 'NORMAL'; command: CommandState }
// NORMAL 模式下的命令状态机
export type CommandState =
| { type: 'idle' }
| { type: 'count'; digits: string }
| { type: 'operator'; op: Operator; count: number }
| { type: 'operatorCount'; op: Operator; count: number; digits: string }
| { type: 'operatorFind'; op: Operator; count: number; find: FindType }
| { type: 'operatorTextObj'; op: Operator; count: number; scope: TextObjScope }
| { type: 'find'; find: FindType; count: number }
| { type: 'g'; count: number }
| { type: 'operatorG'; op: Operator; count: number }
| { type: 'replace'; count: number }
| { type: 'indent'; dir: '>' | '<'; count: number }
Shell Provider 接口 (utils/shell/shellProvider.ts)
// utils/shell/shellProvider.ts:1-33
export type ShellProvider = {
type: ShellType
shellPath: string
detached: boolean
buildExecCommand(command: string, opts: {
id: number | string
sandboxTmpDir?: string
useSandbox: boolean
}): Promise<{ commandString: string; cwdFilePath: string }>
getSpawnArgs(commandString: string): string[]
getEnvironmentOverrides(command: string): Promise<Record<string, string>>
}
遥测 Span 类型 (utils/telemetry/sessionTracing.ts)
// utils/telemetry/sessionTracing.ts:49-56
type SpanType =
| 'interaction' // 用户请求 → Claude 响应的完整周期
| 'llm_request' // API 调用
| 'tool' // 工具调用
| 'tool.blocked_on_user' // 等待用户权限决策
| 'tool.execution' // 工具实际执行
| 'hook' // Hook 执行
Computer Use 执行器接口 (utils/computerUse/executor.ts)
// utils/computerUse/executor.ts:259-262
export function createCliExecutor(opts: {
getMouseAnimationEnabled: () => boolean
getHideBeforeActionEnabled: () => boolean
}): ComputerExecutor
// 返回的对象实现截图、键鼠控制、App 管理、剪贴板等能力
Deep Link 解析结果 (utils/deepLink/parseDeepLink.ts)
// utils/deepLink/parseDeepLink.ts:25-29
export type DeepLinkAction = {
query?: string // 预填充提示词(不自动提交)
cwd?: string // 工作目录(绝对路径)
repo?: string // GitHub owner/name slug
}
设计模式与亮点
1. 类型驱动状态机(Vim)
Vim 模式的核心是 TypeScript 联合类型编码的状态机。CommandState 的每个变体精确描述该状态下可用的数据,transition() 的 switch 必须穷尽所有分支——编译器保证了不会遗漏状态。这是"类型即文档"的典范实践。
2. 零子进程 Git 状态读取
utils/git/gitFilesystem.ts 完全通过文件系统操作(readFile、stat、watchFile)读取 Git 状态,避免为每个状态查询启动 git 子进程。GitFileWatcher 类使用脏标记 + 延迟重算模式:fs.watchFile 回调仅标记脏数据,下次 get() 调用时才真正重读。这对高频轮询场景(如终端状态栏显示当前分支)至关重要。
3. 双通道遥测架构
遥测系统同时维护两条独立通道:OpenTelemetry(用于生产环境指标/日志/链路追踪导出)和 Perfetto(用于内部性能分析,生成 Chrome Trace JSON 可视化)。两者共享同一个 SpanContext 管理器,但 Perfetto 不依赖 OTel 初始化——即使 OTel 未配置,Perfetto 追踪仍可工作。
4. 深链安全纵深防御
parseDeepLink.ts 对深链参数实施多层安全检查:URL 解码 → Unicode 净化 → 控制字符拒绝(containsControlChars)→ 长度上限(query 5000 字符、cwd 4096 字符)→ 路径遍历检测 → repo slug 正则白名单。最终在 terminalLauncher.ts 使用单引号 Shell 转义,将注入边界推到终端层。
5. Computer Use 的终端代理模式
CLI 模式下的 Computer Use 没有 Electron 窗口,因此引入了终端代理概念:getTerminalBundleId() 检测运行的终端模拟器(通过 __CFBundleIdentifier 或 fallback 表),将其从截图排除列表、隐藏操作、激活顺序中剥离——确保终端窗口不会"自拍"到截图中,也不会被意外隐藏。
6. Chrome 集成的双传输路径
Claude in Chrome 支持两种通信方式:Native Messaging(通过 Unix Socket / Windows Named Pipe,适用于本地安装)和 WebSocket Bridge(通过 wss://bridge.claudeusercontent.com,适用于远程和 CCR 会话)。Bridge URL 的选择由 feature flag + 用户类型决定,ant 用户始终走 Bridge。
types.ts 文件头注释即为完整的状态转移图——类型定义就是活的架构文档。这种模式在大型项目中可大幅降低沟通成本。
开发者实践指南
如何添加新的 Vim 操作符
- 在
vim/types.ts的Operator类型中添加新变体 - 在
vim/operators.ts中实现executeXxx()函数,遵循OperatorContext接口 - 在
vim/transitions.ts的handleNormalInput()或对应状态处理函数中添加路由 - 在
RecordedChange类型中添加对应的 dot-repeat 记录
如何扩展遥测数据
- 在
utils/telemetry/events.ts中通过logOTelEvent()记录自定义事件 - 如需新的 Span 类型,在
sessionTracing.ts的SpanType联合中添加 - 确保所有 string 属性通过
redactIfDisabled()处理敏感内容
如何添加新的浏览器支持(Chrome 集成)
- 在
utils/claudeInChrome/common.ts的CHROMIUM_BROWSERS中添加新浏览器配置 - 配置三平台路径:macOS (.app bundle)、Linux (二进制名)、Windows (注册表键)
- 将浏览器 ID 加入
BROWSER_DETECTION_ORDER数组
utils/git/gitFilesystem.ts 中的 isSafeRefName() 是安全边界——所有从 .git 文件读取的分支名必须通过此验证才能用于 Shell 命令拼接。新增 Git 操作时切勿跳过此检查。
架构师决策指南
设计权衡
零子进程 vs 功能完整性
gitFilesystem.ts 牺牲了对某些 Git 特性的支持(如 shallow clone 信息需要额外检查、不支持 worktree 的 per-worktree config),换取了零延迟和零 CPU 开销。对于需要完整 Git 功能的场景,仍需回退到 git 子进程。
Perfetto vs OTel 的职责划分
Perfetto 用于 Ant 内部的详细性能调试(sub-span 嵌套、agent 层级、retry 可视化),OTel 用于面向客户的标准化可观测性。Perfetto 的事件上限为 100K 条(约 30MB),通过 evictOldestEvents() 半批量淘汰,适合长时间运行的 cron 会话。
扩展性考量
- Shell Provider 抽象:
ShellProvider接口统一了 Bash 和 PowerShell,新增 Shell 类型只需实现该接口。但当前ShellType是硬编码的'bash' | 'powershell',添加 zsh/fish 需扩展此联合类型。 - Computer Use 跨平台:
createCliExecutor()目前仅支持 macOS(依赖@ant/computer-use-input的 Rust/enigo 和 Swift 模块)。Linux/Windows 支持需要平台特定的 input 模块。 - 遥测的 WeakRef 策略:
sessionTracing.ts使用WeakRef<SpanContext>管理 active spans,配合strongSpansMap 为非 ALS 管理的 span 保留强引用。这避免了 span 泄漏,但需要 30 分钟 TTL 的清理间隔作为安全网。
性能关键路径
GitFileWatcher 的 WATCH_INTERVAL_MS 在生产环境为 1000ms(测试环境 10ms),watchFile 轮询间隔是 Git 状态栏更新的主要延迟来源。resolveGitDir() 的缓存是永久的(不设 TTL),因为 .git 路径在会话生命周期内不会变化。
◈ 可视化处理拓扑图
Phase 1 — Shell 命令执行管线
每次 Bash 工具调用都会走这条管线:Shell Provider 选择 → 环境快照恢复 → 命令构建 → 子进程执行。
Phase 2 — 外部能力并行分支
Git 状态监控、遥测 Span、深链协议、Vim 状态机是四条并行的外部能力路径。
Phase 3 — GUI 自动化与浏览器集成
直到任务完成
⇉ 核心处理流程详解
Claude Code 的外部集成层涵盖了从用户输入捕获到 Shell 命令执行的完整链路。以 Shell 命令执行 为例,这是最高频的外部交互路径——每次 Bash 工具调用都会完整走一遍以下流程。同时以 深链协议解析 和 Git 状态监控 展示外部集成的安全纵深与零开销设计。
resolveDefaultShell() 检测当前平台的默认 Shell,然后创建对应的 ShellProvider 实例。Bash 走 bashProvider.ts:58 的 createBashShellProvider(),PowerShell 走 powershellProvider.ts。Provider 接口定义了 buildExecCommand、getSpawnArgs、getEnvironmentOverrides 三个核心方法 — shellProvider.ts:5-33bashProvider.ts:77-198 的 buildExecCommand() 先检查环境快照文件是否存活(快照在 tmpdir 清理时可能丢失),存活则 source 恢复环境变量;否则回退到 login shell 的 -l 模式。然后将命令写入临时 cwd 文件,构建包含 cd + command + pwd 的完整执行脚本。防御性改写 Windows CMD 风格的 2>nul 为 POSIX 兼容形式 — bashProvider.ts:123-126claude-cli:// URI 时,parseDeepLink.ts:84-153 执行六层安全检查:协议归一化 → URL 解析 → 主机名白名单(仅允许 open)→ 控制字符拒绝(L121-123)→ 长度上限(query 5000/L70, cwd 4096/L77)→ repo slug 正则白名单(L132)。拒绝而非截断,防止语义篡改 — parseDeepLink.ts:84-153transitions.ts 的状态转移表。根据 CommandState 的当前变体(idle/operator/count/find/g/replace/indent 等),将按键路由到对应的处理函数。类型定义本身就是状态转移图 — vim/types.ts:8-26。操作符(d/c/y)等待后续 motion 或 text-object,构成双键组合 — vim/transitions.ts:1-7GitFileWatcher 在 gitFilesystem.ts:333 启动时通过 fs.watchFile 监控 .git/HEAD、.git/config 和当前分支的 ref 文件。文件变更仅标记脏数据(L440-444 的 invalidate()),延迟到下次 get() 调用时才真正重读。支持 worktree:分支 ref 和 config 在 commonDir 而非 gitDir — gitFilesystem.ts:353-380sessionTracing.ts 管理 Span 的完整生命周期:startInteractionSpan(L176) → startLLMRequestSpan(L274) → startToolSpan(L466) → startToolExecutionSpan(L626) → 逐级 end。使用 AsyncLocalStorage 维护 Span 层级关系,WeakRef<SpanContext> 防止 span 泄漏,配合 30 分钟 TTL 清理间隔作为安全网 — sessionTracing.ts:100-120executor.ts:259 的 createCliExecutor() 构建 GUI 自动化执行器。关键设计:CLI 模式没有 Electron 窗口,需要检测终端模拟器(通过 __CFBundleIdentifier)将其从截图排除。截图 → 鼠标动画移动(ease-out-cubic L217-255)→ 点击/输入 → 截图验证,构成完整的 GUI 操作循环 — executor.ts:259-645wss://bridge.claudeusercontent.com)。Bridge URL 由 feature flag + 用户类型决定。Chrome 扩展通过 chromeNativeHost.ts 注册原生消息主机 — chromeNativeHost.tsbuildExecCommand;深链解析器用六层检查实现纵深防御;Git 监控用脏标记 + 延迟重算将文件系统轮询的开销降到最低。三者共同确保了外部交互的安全性、一致性和性能。★ 设计精华
1. 类型驱动状态机——编译器即测试
Vim 模式的 CommandState 使用 TypeScript 联合类型精确编码每个状态可用的数据。transitions.ts 中的 switch 必须穷尽所有分支,TypeScript 编译器保证了不会遗漏状态。这意味着添加新的 Vim 操作符或状态时,编译错误会立即指出遗漏的地方。
// vim/types.ts:8-26 — 状态转移图即是类型定义
// idle ──[d/c/y]──► operator ──[motion]──► execute
// ──[1-9]────► count ──[ia]────► operatorTextObj
// ──[fFtT]───► find ──[fFtT]──► operatorFind
2. 零子进程 Git 状态——文件系统即数据库
GitFileWatcher 完全通过 fs.watchFile + readFile 读取 Git 状态,避免了每次查询启动 git 子进程。脏标记 + 延迟重算模式(dirty flag + lazy recomputation)使得高频轮询(1000ms 间隔)的实际 I/O 仅在状态真正变化时发生。
// gitFilesystem.ts:440-444 + 463-485
private invalidate(): void {
for (const entry of this.cache.values()) {
entry.dirty = true // 仅标记,不重读
}
}
async get<T>(key: string, compute: () => Promise<T>): Promise<T> {
// dirty 在 compute 前清除;如果 compute 期间再次变更,dirty 会被重设
if (existing) { existing.dirty = false }
const value = await compute()
if (entry && !entry.dirty) { entry.value = value } // 防止覆盖新脏数据
}
3. 深链六层安全纵深——拒绝优于截断
parseDeepLink.ts 对深链参数实施六层检查。设计原则是"拒绝而非截断"——一个 5001 字符的 query 被整体拒绝,而不是截断到 5000 字符,因为截断会改变语义(可能将恶意指令从 prompt 末尾移到可见区域外)。
// parseDeepLink.ts:84-153 — 六层检查
// L86-96: 协议归一化(claude-cli: → claude-cli://)
// L98-107: URL 解析 + hostname 白名单
// L114-118: cwd 绝对路径校验
// L121-123: 控制字符拒绝(containsControlChars)
// L124-128: 长度上限(query 5000, cwd 4096)
// L132: repo slug 正则白名单
terminalLauncher.ts 使用单引号 Shell 转义,将注入边界推到终端层。4. Computer Use 终端代理——自反性排除
CLI 模式的 Computer Use 面临一个独特问题:终端窗口本身会出现在截图中("自拍"问题)。withoutTerminal() 函数(L283-286)从截图允许列表中排除终端 Bundle ID,确保 Claude 看到的是目标应用而非自己的终端窗口。
// executor.ts:283-286
const withoutTerminal = (allowed: readonly string[]): string[] =>
allowed.filter(id => id !== terminalBundleId)
// terminalBundleId 通过 __CFBundleIdentifier 或 fallback 表检测
◈ Agent 实践借鉴 — 客服 Agent 外部集成设计
一、场景映射:客服 agent 的真实外部集成挑战
客服 agent 对接的外部渠道比 Claude Code 的开发者工具更碎片化:电话(语音 IVR)需要 ASR/TTS 实时转写,在线聊天通过 WebSocket 长连接推送,邮件走 IMAP/SMTP 且正文是 HTML,微信/钉钉走开放 API 且消息类型五花八门(图片/语音/位置/小程序卡片),短信则是简单的 HTTP API。Claude Code 的 Vim 状态机对应的是"多轮对话状态机",Git 状态缓存对应的是"CRM 系统在线状态检测",OTel 遥测对应的是"SLA 监控与全链路追踪"。
二、借鉴 CC + 客服改造
实践 1:多渠道消息适配器(借鉴 Shell Provider 抽象)
CC 的 ShellProvider 用统一接口屏蔽 Bash/PowerShell 差异。客服场景同理——用统一的消息适配器屏蔽渠道差异,上层只处理标准化消息。
// 借鉴 shellProvider.ts 的 Provider 抽象模式
interface ChannelAdapter {
channelType: 'phone' | 'chat' | 'email' | 'wechat' | 'sms'
// 接收渠道原始消息,转换为统一格式
normalizeMessage(raw: unknown): Promise<NormalizedMessage>
// 将 agent 回复转换为渠道特定格式并发送
sendMessage(reply: AgentReply): Promise<SendResult>
// 检测渠道是否在线(类似 GitFileWatcher 的状态检测)
healthCheck(): Promise<ChannelHealth>
}
interface NormalizedMessage {
sessionId: string
tenantId: string
contentType: 'text' | 'image' | 'voice_url' | 'rich_card'
content: string // 文本内容或 URL
metadata: Record<string, unknown> // 渠道特有字段(如邮件的 subject)
timestamp: number
}
// 微信适配器示例:处理图片/语音/文本等不同消息类型
class WeChatAdapter implements ChannelAdapter {
channelType = 'wechat' as const
async normalizeMessage(raw: WeChatMessage): Promise<NormalizedMessage> {
switch (raw.MsgType) {
case 'text':
return { contentType: 'text', content: raw.Content, ... }
case 'image':
return { contentType: 'image', content: raw.PicUrl, ... }
case 'voice':
// 需要调用微信的语音转文字 API
const text = await this.asrConvert(raw.Recognition)
return { contentType: 'text', content: text, ... }
default:
return { contentType: 'text', content: '[不支持的消息类型]', ... }
}
}
}
实践 2:多轮对话状态机(借鉴 Vim 类型驱动状态机)
CC 用联合类型编码 Vim 的每个命令状态,编译器保证不遗漏分支。客服的多轮对话也可以用同样方式建模——等待客户输入、确认意图、执行操作、等待结果,每个状态携带不同的上下文数据。
// 借鉴 vim/types.ts 的联合类型状态机
type ConversationPhase =
| { phase: 'waiting_input'; lastReply: string }
| { phase: 'clarifying'; intent: string; questions: string[] }
| { phase: 'confirming'; intent: string; action: PendingAction }
| { phase: 'executing'; action: PendingAction; startTime: number }
| { phase: 'waiting_result'; action: PendingAction; estimatedWait: number }
| { phase: 'completed'; action: PendingAction; result: ActionResult }
function handleCustomerMessage(
state: ConversationPhase, msg: NormalizedMessage,
): ConversationPhase {
switch (state.phase) {
case 'waiting_input':
return classifyIntent(msg) // → clarifying 或 confirming
case 'clarifying':
// 编译器强制处理所有分支,不会遗漏
return resolveClarification(state, msg)
case 'confirming':
if (msg.content === 'yes' || msg.content === '确认')
return { phase: 'executing', action: state.action, startTime: Date.now() }
if (msg.content === 'no' || msg.content === '取消')
return { phase: 'waiting_input', lastReply: '好的,已取消操作' }
return { ...state, phase: 'confirming' } // 未识别,重新确认
case 'executing':
return state // 执行中不接受新输入
// ... 编译器保证每个 phase 都被处理
}
}
实践 3:渠道健康检测 + 自动降级(借鉴 GitFileWatcher 脏标记模式)
CC 的 GitFileWatcher 用脏标记 + 延迟重算避免频繁 I/O。客服场景也需要高效检测渠道状态——微信 API 挂了切短信,语音服务不可用降级为纯文字。
// 借鉴 GitFileWatcher 的脏标记 + 延迟检测模式
class ChannelHealthMonitor {
private channelStatus = new Map<string, { healthy: boolean; lastCheck: number; dirty: boolean }>()
// 定时标记脏(类似 fs.watchFile 回调),不立即检测
scheduleCheck(channelType: string): void {
const entry = this.channelStatus.get(channelType)
if (entry) entry.dirty = true
}
// 实际发送前才检测(类似 get() 的延迟重算)
async ensureHealthy(channelType: string): Promise<boolean> {
const entry = this.channelStatus.get(channelType)
if (!entry) return false
if (!entry.dirty && Date.now() - entry.lastCheck < 30000) {
return entry.healthy // 30 秒内复用缓存
}
const adapter = this.getAdapter(channelType)
entry.healthy = await adapter.healthCheck()
entry.lastCheck = Date.now()
entry.dirty = false
return entry.healthy
}
// 发送消息时自动降级
async sendWithFallback(reply: AgentReply, channels: string[]): Promise<SendResult> {
for (const channel of channels) {
if (await this.ensureHealthy(channel)) {
return this.getAdapter(channel).sendMessage(reply)
}
console.warn(`渠道 ${channel} 不可用,尝试下一个`)
}
// 全部降级后走短信兜底
return this.getAdapter('sms').sendMessage(reply)
}
}
三、落地清单
- 类型驱动状态机——多轮对话状态用联合类型编码,编译器防遗漏分支(Vim 的核心收益在客服场景同样适用)
- 多渠道统一适配器——Shell Provider 的 Provider 抽象模式,屏蔽渠道差异,上层只处理 NormalizedMessage
- 渠道健康检测 + 降级——脏标记延迟检测模式,避免每次发送前都做 HTTP 健康检查
- 零子进程优化——客服场景通过 HTTP API 检测系统状态,不需要本地文件系统读取
- Vim 状态机本身——客服不需要编辑器操作,只需借鉴"联合类型编码状态"的思路
- Chrome Native Messaging——客服场景不需要浏览器扩展集成
四、常见坑
- 微信/钉钉消息格式差异大——同一条回复在不同渠道需要不同的渲染方式(微信不支持 HTML 表格,钉钉不支持 Markdown),适配器的
sendMessage必须做内容降级,而非只改传输协议。 - 对话状态机遗漏"客户中途取消"分支——CC 用穷尽类型检查防遗漏,客服场景最容易被忽略的分支是"客户在执行阶段突然说'算了'"。必须为每个非终态都处理 cancel 事件。
- 渠道降级策略不一致——微信挂了切短信,但短信没有图片能力;邮件挂了切在线客服,但客服可能不在线。降级策略必须考虑目标渠道的能力边界,而不能简单转发。
- ASR 转写延迟导致状态超时——电话渠道的语音识别可能耗时 2-5 秒,状态机的超时阈值必须按渠道设置,不能用统一值。
代码索引
| 文件 | 行数 | 说明 |
|---|---|---|
vim/types.ts | ~200 | Vim 状态机类型定义、常量、工厂函数 |
vim/motions.ts | ~83 | 光标移动纯函数(h/j/k/w/b/e/$ 等) |
vim/operators.ts | ~557 | 操作符执行(d/c/y/x/r/J/p/>> 等) |
vim/transitions.ts | ~491 | 状态转移表——按键到状态变更/操作的映射 |
vim/textObjects.ts | ~187 | 文本对象查找(iw/aw/i"/a( 等) |
voice/voiceModeEnabled.ts | ~55 | 语音模式功能开关(GrowthBook + OAuth 双重门控) |
utils/github/ghAuthStatus.ts | ~30 | gh CLI 安装与认证状态检测 |
utils/telemetry/instrumentation.ts | ~826 | OTel 初始化:Tracer/Meter/Logger Provider 配置、导出器选择 |
utils/telemetry/sessionTracing.ts | ~928 | 会话级 Span 管理:interaction/LLM/tool/hook 生命周期 |
utils/telemetry/perfettoTracing.ts | ~1121 | Perfetto Chrome Trace 事件生成与文件写入 |
utils/telemetry/events.ts | ~76 | OTel Log Record 事件发射器 |
utils/git/gitFilesystem.ts | ~700 | 零子进程 Git 状态读取 + GitFileWatcher 缓存 |
utils/shell/shellProvider.ts | ~33 | Shell Provider 接口定义 |
utils/bash/parser.ts | ~大文件 | Bash 命令 AST 解析器 |
utils/computerUse/executor.ts | ~659 | CLI Computer Use 执行器(截图/键鼠/App/剪贴板) |
utils/computerUse/mcpServer.ts | ~107 | Computer Use MCP Server 入口 |
utils/deepLink/parseDeepLink.ts | ~171 | 深链 URI 解析与安全校验 |
utils/deepLink/registerProtocol.ts | ~349 | 跨平台 URI 协议注册(macOS/Linux/Windows) |
utils/claudeInChrome/mcpServer.ts | ~294 | Chrome 集成 MCP Server + Bridge 配置 |
utils/claudeInChrome/common.ts | ~541 | 7 种 Chromium 浏览器配置与检测 |
utils/swarm/spawnUtils.ts | ~80+ | Agent 协作中 teammate 进程生成与 CLI flag 继承 |