Appendix B: 关键类型定义速查

10 个核心类型的精简速查。每个类型只列出最重要的 5-8 个字段,并说明「为什么需要这个字段」。完整定义请查阅对应模块。


B.1 Tool

位置: 工具核心接口模块

整个工具系统的核心接口。Bash、Read、Edit、MCP 工具、AgentTool 等都实现此接口。

核心字段类型为什么需要
namestring (readonly)工具的唯一标识,API 调用和权限规则都按此名匹配
inputSchemaZod schema (readonly)定义输入格式,用于 API 传输时的 JSON Schema 转换和运行时校验
call()(args, context, canUseTool, parentMessage, onProgress?) => Promise<ToolResult>执行工具的核心方法;接收解析后的输入和完整上下文
checkPermissions()(input, context) => Promise<PermissionResult>工具专属权限逻辑;返回 allow/deny/ask/passthrough 四种行为
isConcurrencySafe()(input) => boolean决定能否与其他工具并行执行;默认 false (fail-closed 原则)
isReadOnly()(input) => boolean权限系统用此区分只读/写入操作;plan 模式只允许只读工具
maxResultSizeCharsnumber超出此阈值的结果会持久化到磁盘而非内联在消息中
description()(input, options) => Promise<string>生成发送给模型的工具描述;可根据权限上下文动态调整

设计要点: 泛型 Tool<Input, Output, P> 提供端到端类型安全。工具构建辅助函数为未显式定义的方法填充 fail-closed 默认值(如 isConcurrencySafe 默认返回 false)。


B.2 ToolUseContext

位置: 工具核心接口模块

每次工具调用的上下文对象,封装工具执行所需的一切环境信息。

核心字段类型为什么需要
options嵌套对象查询级别配置 (模型、工具列表、MCP 连接等),一次查询内不变
getAppState() / setAppState()函数读写全局应用状态;子 Agent 的 setAppState 可能被 no-op 替换
setAppStateForTasks?函数解决子 Agent 的 setAppState 被替换后无法注册后台任务的问题;总是指向根 Store
readFileStateFileStateCache (LRU)文件内容缓存,避免重复读取同一文件
messagesMessage[]当前消息历史,工具可以读取上下文
abortControllerAbortController中止控制器,用户中断时取消正在进行的工具调用
agentId? / agentType?标识类型仅子 Agent 设置;Hook 用此区分主线程和子 Agent 调用
contentReplacementState?对象工具结果 token 预算管理;fork 子 Agent 会克隆父级状态以共享 cache 决策

设计要点: 这个类型很大(40+ 字段),因为它是工具执行的唯一上下文通道。可选字段 (?) 表示仅在特定场景下存在(如 agentId 仅子 Agent 设置,UI 相关回调仅交互模式提供)。


B.3 ToolResult

位置: 工具核心接口模块

工具 call() 方法的返回类型,封装执行结果及副作用。

核心字段类型为什么需要
dataT (泛型)工具的实际输出数据,类型由 Tool 泛型参数决定
newMessages?Message[]工具可在执行中向对话注入额外消息 (如附件消息)
contextModifier?(ctx) => ToolUseContext让工具修改后续调用的上下文 (如 Bash 切换工作目录);仅非并发安全工具生效
mcpMeta?{ _meta?, structuredContent? }MCP 协议元数据,透传给 SDK 消费者

设计要点: contextModifier 是一个精巧的设计 -- 它让 Bash 工具的 cd 命令可以影响后续工具调用的工作目录,但限制为非并发工具,避免竞态条件。


B.4 Message

位置: 消息类型定义模块

消息系统使用判别联合(Discriminated Union),以 type 字段区分 5 种消息类型。

核心字段类型为什么需要
type'user' | 'assistant' | 'system' | 'progress' | 'attachment'判别联合的标签字段
uuid / timestampUUID / string唯一标识 + 时序追踪,支持会话恢复和消息引用
UserMessage.toolUseResult?{ toolUseID, toolName, output }将工具结果与用户消息关联,实现 API 格式与内部格式互转
UserMessage.isCompactSummary?boolean标记压缩摘要消息,compact 流程用此保留边界
AssistantMessage.costUSD?number单次调用费用追踪
AssistantMessage.usage?token 统计输入/输出/缓存 token 计数,用于上下文窗口管理
SystemMessage.formatstring系统消息子类型标识 (14 种),纯 UI 消息,API 发送前被过滤

设计要点: SystemMessage 有 14 种子类型 (informational / API error / compact boundary / agent killed / ...),但它们都是纯 UI 消息 -- 消息规范化函数会在发送给 API 前全部剥离。


B.5 AppState

位置: 应用状态定义模块

全局应用状态。外层用 DeepImmutable 包裹确保不可变性,通过 useSyncExternalStore 实现切片订阅。

核心字段类型为什么需要
settings设置类型用户/项目/策略设置的合并结果
toolPermissionContext权限上下文类型权限上下文:当前模式、允许/拒绝规则、附加工作目录
tasks{ [taskId]: TaskState }所有活跃后台任务的统一管理
mcp嵌套对象集中管理 MCP 连接、工具、命令和资源
plugins嵌套对象插件系统状态 (已启用/已禁用/错误/安装状态)
agentDefinitionsAgent 定义结果类型去重后的 Agent 定义列表 + 加载失败记录
speculation推测状态类型推测执行状态 (idle / active),支持投机性预计算
mainLoopModel模型设置类型主循环使用的模型

设计要点: DeepImmutable 包裹只覆盖纯数据字段。包含函数类型的字段 (如 tasks、mcp) 排除在外。这是 TypeScript 不可变性的实用折中。


B.6 HookEvent

位置: Hook 类型定义模块

Hook 系统的事件类型,允许在工具调用的各个生命周期阶段插入自定义逻辑。

核心字段类型为什么需要
HookEvent16 种事件联合覆盖从 SessionStart 到 PostToolUse 的完整生命周期
callback(input, toolUseID, abort, ...) => Promise<HookJSONOutput>Hook 的实际执行逻辑
timeout?number防止 Hook 无限阻塞
matcher?string匹配条件,如 "Bash(git *)" 只对特定工具+参数触发
permissionBehavior?'allow' | 'deny' | 'ask' | 'passthrough'Hook 可以直接做出权限决策,优先级最高
updatedInput?Record<string, unknown>Hook 可以修改工具的输入参数
additionalContext?string注入到模型上下文的额外信息

16 种 Hook 事件: PreToolUse / PostToolUse / PostToolUseFailure / UserPromptSubmit / SessionStart / Setup / SubagentStart / PermissionDenied / PermissionRequest / Notification / Elicitation / ElicitationResult / CwdChanged / FileChanged / WorktreeCreate


B.7 MCPServerConfig

位置: MCP 类型定义模块

MCP 服务器连接配置,支持 6 种传输协议。

核心字段类型为什么需要
type'stdio' | 'sse' | 'http' | 'ws' | 'sdk' | ...判别联合标签,决定使用哪种传输协议
command / argsstring / string[]stdio 模式的启动命令和参数
urlstringsse/http/ws 模式的端点 URL
oauth?嵌套对象OAuth 认证配置 (clientId, callbackPort 等)
scope配置作用域类型配置来源 (local/user/project/enterprise/...)

连接状态: connected / failed / needsAuth / pending / disabled。已连接状态包含 capabilities (服务器能力声明) 和 cleanup (断开清理回调)。


B.8 Task

位置: 任务系统模块

后台任务系统,统一管理所有类型的异步工作。

核心字段类型为什么需要
TaskType7 种联合local_bash / local_agent / remote_agent / in_process_teammate / local_workflow / monitor_mcp / dream
TaskStatus5 种联合pending / running / completed / failed / killed
idstring带类型前缀的唯一 ID
outputFilestring输出文件路径,用于进程间通信
kill()(taskId, setAppState) => Promise<void>终止任务的统一接口

ID 生成规则: 类型前缀 + 8 位随机字符。36^8 约 2.8 万亿种组合,足以抵抗暴力猜测。


B.9 PermissionResult

位置: 权限类型定义模块

权限系统的核心决策类型。

核心字段类型为什么需要
behavior'allow' | 'deny' | 'ask' | 'passthrough'四种决策行为;passthrough 表示交给通用权限逻辑处理
updatedInput?Inputallow/ask 决策可以修改工具输入 (如路径规范化)
messagestringdeny/ask 时的原因说明 / 权限请求消息
decisionReason判别联合记录决策原因:命中规则 / 权限模式 / Hook / 分类器等 11 种
suggestions?PermissionUpdate[]建议的权限规则更新,UI 可一键应用
pendingClassifierCheck?对象异步分类器正在检查中,UI 先显示再等结果

PermissionMode (7 种): default (逐个询问) / plan (只读) / acceptEdits (允许编辑) / bypassPermissions (全放行) / dontAsk (静默拒绝) / auto (LLM 分类器判定) / bubble (向父级传递)


B.10 AgentDefinition

位置: Agent 定义加载模块

Agent 定义描述了一个可被调用的子 Agent 的完整配置。

核心字段类型为什么需要
agentTypestring唯一标识名,同名 Agent 按优先级覆盖
whenToUsestring使用场景描述,供模型判断何时调用此 Agent
tools? / disallowedTools?string[]工具白名单/黑名单,限制 Agent 能力范围
model?string使用的模型 (或 'inherit' 继承父级)
permissionMode?PermissionModeAgent 专属权限模式
isolation?'worktree' | 'remote'隔离模式:独立 git 工作树或远程执行
source'built-in' | SettingSource | 'plugin'来源,决定覆盖优先级
getSystemPrompt函数获取系统提示词;内置 Agent 支持动态生成

覆盖优先级 (高 -> 低): policySettings > flagSettings > projectSettings > userSettings > plugin > built-in