
这是 Warp 源码深度解析系列的第四篇。AI Agent 是 Warp 的第二大模块(389 文件),本文将深入 Action-Result 解耦模式、MCP 协议集成、代码库索引、Skills 系统和 Computer Use。
一、AI Agent 架构
Warp 的 AI Agent 系统分两层:
-
crates/ai/(70 文件) --- AI Agent 原语:Action 定义、代码索引、Skill 解析 -
app/src/ai/(389 文件) --- 产品级 AI 功能:Agent 管理、MCP 集成、对话持久化、UI 渲染┌──────────────────────────────────────────────────────────────┐
│ app/src/ai/ (389 files) │
│ ┌─────────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ agent/ │ │ mcp/ │ │ blocklist/ │ │
│ │ (32 files) │ │ (22 files) │ │ (148 files!) │ │
│ │ Agent Core │ │ MCP Protocol │ │ Agent View+Model │ │
│ └──────┬───────┘ └──────┬───────┘ └───────────────────┘ │
│ │ │ │
│ ┌──────┴──────────────────┴───────────────────────────┐ │
│ │ agent_sdk/(60) │ skills/(16) │ agent_management/(14)│ │
│ │ Agent SDK │ Skill 加载 │ Agent 生命周期 │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘┌──────────────────────────────────────────────────────────────┐
│ crates/ai/ (70 files) │
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ agent/ │ │ index/ │ │ skills/ │ │
│ │ Action+Result│ │ 代码索引 │ │ Skill 解析+加载 │ │
│ └──────────────┘ └──────────────┘ └───────────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ diff_validation│ │ project_context│ │
│ │ Diff 校验 │ │ 项目上下文 │ │
│ └──────────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────────────┘
二、Action-Result 解耦模式
2.1 核心思想
Agent 不直接执行操作,而是通过 Action 请求,由宿主环境执行并返回结果。
这确保了:
- 安全性 --- 危险操作(如删除文件)可以被宿主拦截
- 可控性 --- 用户可以审核每个 Action
- 可测试性 --- Action 可以被 mock
2.2 AIAgentActionType --- 30+ 种 Action
rust
#[derive(Debug, Clone, Eq, PartialEq, EnumDiscriminants)]
pub enum AIAgentActionType {
// Shell 操作
RequestCommandOutput { command, is_read_only, is_risky, wait_until_completion, uses_pager, rationale, citations },
WriteToLongRunningShellCommand { block_id, input, mode },
// 文件操作
ReadFiles(ReadFilesRequest),
UploadArtifact(UploadArtifactRequest),
RequestFileEdits { file_edits, title },
// 搜索操作
SearchCodebase(SearchCodebaseRequest),
Grep { queries, path },
FileGlob { patterns, path },
FileGlobV2 { patterns, search_dir },
// MCP 操作
ReadMCPResource { server_id, name, uri },
CallMCPTool { ... },
// 交互操作
AskUserQuestion { ... },
// 文档操作
CreateDocuments { ... },
EditDocuments { ... },
ReadDocuments { ... },
// 协作操作
SendMessageToAgent { ... },
StartAgent { ... },
// 计算机操作
UseComputer { ... },
// 代码审查
InsertReviewComments { ... },
// 更多...
}
2.3 ActionResult --- 每种 Action 的返回类型
| 类型 | 用途 |
|---|---|
ReadFilesResult |
文件读取结果 |
ReadShellCommandOutputResult |
Shell 命令输出 |
SearchCodebaseResult |
代码搜索结果 |
CallMCPToolResult |
MCP 工具调用结果 |
RequestFileEditsResult |
文件编辑请求结果 |
UseComputerResult |
Computer Use 结果 |
AskUserQuestionResult |
用户问答结果 |
StartAgentResult / StartAgentVersion |
子 Agent 启动 |
FileGlobResult / FileGlobV2Result |
文件匹配结果 |
2.4 Citation 系统
crates/ai/src/agent/citation.rs --- 引用追踪,记录 Agent 回答中每条声明的来源文件和行号,确保 AI 回答可追溯。
三、MCP 协议集成
3.1 什么是 MCP?
MCP (Model Context Protocol) 是 Anthropic 提出的标准化协议,让 AI Agent 能够调用外部工具。Warp 是最早集成 MCP 的终端应用之一。
3.2 模块结构
app/src/ai/mcp/ (22 文件):
| 组件 | 职责 |
|---|---|
mod.rs |
入口 + MCPProvider 枚举 + 配置文件路径 |
manager.rs |
MCP Server 生命周期管理 |
templatable_manager.rs |
模板化 MCP Server 管理 |
file_based_manager.rs |
基于文件的 MCP 配置管理 |
file_mcp_watcher.rs |
MCP 配置文件变更监听 |
3.3 多 Provider 支持
rust
pub(crate) fn home_config_file_path(provider: MCPProvider) -> Option<PathBuf> {
match provider {
MCPProvider::Warp => warp_core::paths::warp_home_mcp_config_file_path(),
_ => dirs::home_dir().map(|home_dir| home_dir.join(provider.home_config_path())),
}
}
Warp 支持从多个来源加载 MCP 配置:
- Warp 自有配置
- Claude Desktop 的
.claude/目录 - 其他 MCP 客户端配置
3.4 Warp Drive MCP 同步
MCP Server 配置可通过 Warp Drive 云同步,实现跨设备配置共享:
设备 A 添加 MCP Server
→ Warp Drive 同步队列
→ 云端存储
→ 设备 B 下行同步
→ 自动加载新 MCP Server
3.5 Agent 调用 MCP
Agent 通过两种 Action 调用 MCP:
ReadMCPResource--- 读取 MCP 资源CallMCPTool--- 调用 MCP 工具(传入 server_id + 工具名 + 参数)
四、代码库索引
4.1 模块结构
crates/ai/src/index/ (32 文件) --- 代码索引与语义搜索:
代码文件
│
├─ file_outline → Outline + Symbol(函数/类/变量定义)
│
├─ repo_metadata → 目录树 + 文件元数据
│ ├─ DirectoryEntry --- 目录条目
│ ├─ Entry --- 文件/目录统一表示
│ ├─ FileId --- 文件唯一标识
│ └─ FileMetadata --- 文件元数据
│
└─ full_source_code_embedding --- 全文嵌入(向量搜索)
4.2 线程池设计
rust
const MAX_PARALLEL_THREADS: usize = 2;
fn create_thread_pool() -> Option<rayon::ThreadPool> {
let num_threads = available_parallelism()
.map(|p| (p.get() / 2).clamp(1, MAX_PARALLEL_THREADS))
.unwrap_or(MAX_PARALLEL_THREADS);
rayon::ThreadPoolBuilder::new()
.thread_name(|i| format!("warp-code-indexing-{i}"))
.num_threads(num_threads)
.build()
.ok()
}
设计考量:
- 最多 2 个线程 --- 索引不应抢占主线程资源
- rayon 线程池 --- 数据并行,适合文件扫描
- 命名线程 --- 便于调试和监控
4.3 上下文选择
crates/ai/src/agent/file_locations.rs + app/src/ai/get_relevant_files/ --- 根据用户查询选择最相关的文件,控制 Token 预算。
五、Agent SDK
app/src/ai/agent_sdk/ (60 文件) --- Agent 开发 SDK:
| 能力 | 描述 |
|---|---|
| Agent 生命周期 | 创建、执行、销毁 |
| 对话构建 | 消息组装、上下文注入 |
| Token 预算控制 | 上下文窗口管理 |
| 工具注册与执行 | Action → 宿主执行 → Result |
SDK 让 Warp 可以灵活地创建不同类型的 Agent:
- Coding Agent --- 代码编写、调试
- Review Agent --- 代码审查
- Ambient Agent --- 后台运行(安全扫描、性能分析)
六、Skills 系统
6.1 Skill 是什么?
Skill 是 Markdown 格式的提示词模板,注入 Agent 上下文后指导其行为。类似于 Claude 的 CLAUDE.md、Cursor 的 .cursorrules。
6.2 多目录加载
Skill 从 4 个目录加载,按优先级排序:
| Provider | 路径 | 说明 |
|---|---|---|
| Project | .agents/skills/ |
项目级 Skill(最高优先级) |
| Warp | .warp/skills/ |
Warp 配置级 Skill |
| Claude | .claude/skills/ |
Claude 兼容 Skill |
| Codex | .codex/skills/ |
Codex 兼容 Skill |
多目录设计让 Warp 兼容了不同 AI 工具的 Skill 生态。
6.3 内置 Skill
resources/ 目录下有 92 个 .md 文件,包含:
| Skill | 用途 |
|---|---|
add-feature-flag |
添加 Feature Flag |
remove-feature-flag |
移除 Feature Flag |
add-telemetry |
添加遥测 |
create-pr |
创建 PR |
review-pr |
代码审查 |
fix-errors |
修复错误 |
implement-specs |
实现规格 |
rust-unit-tests |
Rust 单元测试 |
warp-integration-test |
Warp 集成测试 |
warp-ui-guidelines |
Warp UI 指南 |
write-product-spec |
写产品规格 |
write-tech-spec |
写技术规格 |
这些 Skill 是 Warp 团队的开发工作流结晶------每添加一个 Feature Flag 都有标准流程,每个 PR 都有审查清单。
6.4 Skill 加载流程
Skill Provider 目录
→ 文件扫描
→ Markdown 解析 (parse_skill)
→ Skill 索引
→ Agent 匹配(根据当前任务选择相关 Skill)
→ 注入 Agent 上下文
七、Agent 管理与生命周期
7.1 Agent Management
app/src/ai/agent_management/ (14 文件):
- Agent 创建/销毁
- 多 Agent 协作
- Agent 配置(模型选择、温度等)
7.2 Ambient Agents
app/src/ai/ambient_agents/ --- 后台 Agent:
- 不需要用户显式触发
- 在后台持续运行
- 示例:代码审查 Agent、安全扫描 Agent
7.3 Agent Events
app/src/ai/agent_events/ --- Agent 事件流:
- 对话状态变更
- Action 执行进度
- 错误恢复
- Token 使用统计
八、Computer Use
crates/computer_use/ (28 文件) --- Computer Use 工具:
rust
// AIAgentActionType 中的 Computer Use 变体
RequestComputerUse { ... },
UseComputer { ... },
支持 Agent 通过截图和鼠标/键盘操作与 GUI 交互:
Agent 需要 GUI 操作
→ RequestComputerUse (请求截图)
→ 截图返回给 Agent
→ Agent 分析截图,决定操作
→ UseComputer (点击/输入/滚动)
→ 再次截图验证
九、对话持久化与恢复
app/src/ai/agent_conversations_model.rs--- 对话持久化app/src/ai/restored_conversations.rs--- 对话恢复
支持:
- 对话创建/加载
- 对话历史存储
- 跨会话恢复(关掉终端后重新打开继续对话)
十、Blocklist:Agent UI 核心
app/src/ai/blocklist/ 是 AI 模块中最大的子目录(148 文件),负责 Agent 对话的完整 UI 渲染:
| 渲染组件 | 职责 |
|---|---|
| 消息气泡 | Agent/用户消息展示 |
| 代码块渲染 | 语法高亮的代码展示 |
| 工具调用展示 | Action 执行过程 |
| Diff 预览 | 文件编辑的 diff 视图 |
| 文件编辑确认 | 用户确认/拒绝编辑 |
| 思考过程展示 | Agent 的 chain-of-thought |
| 错误状态展示 | Action 失败时的错误 UI |
148 个文件只为了渲染 Agent 对话------这体现了 Warp 对 AI 交互体验的极致追求。
十一、关键设计模式
| 模式 | 实现 | 价值 |
|---|---|---|
| Action-Result 解耦 | AIAgentActionType + AIAgentActionResultType |
安全可控,Agent 不直接执行 |
| MCP 协议标准化 | CallMCPTool / ReadMCPResource |
统一第三方工具集成 |
| 多 Provider Skill | 4 个 Skill 搜索目录 | 兼容不同 AI 工具生态 |
| 索引线程池 | rayon + 2 线程上限 | 索引不阻塞主线程 |
| Citation 追踪 | AIAgentCitation |
每个 AI 声明有源文件引用 |
| Cloud MCP Sync | WarpDriveMCPServer | MCP 配置跨设备同步 |
| Computer Use | 截图+鼠标/键盘 | Agent 可操作 GUI |
十二、与其他 AI Agent 框架对比
| 特性 | Warp Agent | Claude Code | Cursor | GitHub Copilot |
|---|---|---|---|---|
| 集成方式 | 终端原生 | CLI | IDE 插件 | IDE 插件 |
| Action 系统 | 30+ 种 | 工具调用 | 内置 | 内置 |
| MCP 支持 | 原生 | 原生 | 部分 | 无 |
| Skill 系统 | 4 目录加载 | CLAUDE.md | .cursorrules | 无 |
| Computer Use | 支持 | 支持 | 部分 | 无 |
| 代码索引 | 内置 rayon | 内置 | 内置 | 服务端 |
| 文件编辑 | 请求+确认 | 直接 | 直接 | 建议 |
| 多 Agent | 支持(子Agent) | 不支持 | 不支持 | 不支持 |
Warp 的独特价值在于:AI Agent 和终端工作流深度融合------Agent 可以直接执行 Shell 命令、读取终端输出、编辑文件,而不需要离开终端环境。
系列索引: