CC源码剖析 #13 · Task 执行引擎:从创建到完成的完整流程

基于 2026-03-31 公开的源码快照,~512,000 行代码


一、Task 系统定位

Task 是 Claude Code 的后台任务执行单元——允许 Agent 派生子任务并行工作,结果汇总到主会话。

主会话(Main REPL)
    │
    ├─→ TaskCreateTool → 创建后台任务
    │       │
    │       ▼
    │   ┌──────────┐
    │   │  Task    │ ← 后台运行
    │   └────┬─────┘
    │        │
    │        │ task-notification
    │        ▼
    └────── Agent 结果汇总

二、Task 类型体系

文件:src/tasks/types.ts

2.1 Task 类型列表

1
2
3
4
5
6
7
8
export type TaskState =
  | LocalShellTaskState      // 本地 Shell 任务
  | LocalAgentTaskState     // 本地 Agent 任务
  | RemoteAgentTaskState    // 远程 Agent 任务
  | InProcessTeammateTaskState  // 进程内队友任务
  | LocalWorkflowTaskState  // 本地工作流任务
  | MonitorMcpTaskState     // MCP 监控任务
  | DreamTaskState          // 背景做梦任务

2.2 Task 状态

1
2
3
4
5
6
7
type TaskStatus =
  | 'pending'    // 等待执行
  | 'running'    // 执行中
  | 'completed'  // 完成
  | 'failed'     // 失败
  | 'killed'     // 被停止
  | 'paused'     // 暂停

2.3 后台任务判断

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 判断任务是否显示在后台任务指示器
export function isBackgroundTask(task: TaskState): boolean {
  if (task.status !== 'running' && task.status !== 'pending') {
    return false
  }
  // 前台任务(isBackgrounded === false)不显示
  if ('isBackgrounded' in task && task.isBackgrounded === false) {
    return false
  }
  return true
}

三、Task 创建

3.1 TaskCreateTool

文件:src/tools/TaskCreateTool/TaskCreateTool.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 创建新任务
const TaskCreateTool = {
  inputSchema: z.object({
    prompt: z.string(),        // 任务描述
    taskType: z.enum([...]).default('agent'),
    agentType?: string,        // Agent 类型
    background?: boolean,      // 是否后台运行
  }),

  async call(args, context, canUseTool) {
    // 1. 验证参数
    // 2. 创建 Task 实例
    // 3. 如果 background=true,设为后台任务
    // 4. 返回 taskId
  }
}

3.2 Task 类型决定

taskType执行方式说明
shellLocalShellTask执行 shell 命令
agentLocalAgentTask本地 Agent
remote_agentRemoteAgentTask远程 Agent
teammateInProcessTeammateTask队友(进程内)
workflowLocalWorkflowTask工作流
monitorMonitorMcpTaskMCP 监控

四、Task 执行引擎

4.1 LocalAgentTask

文件:src/tasks/LocalAgentTask/LocalAgentTask.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
interface LocalAgentTaskState {
  taskId: string
  status: TaskStatus
  agentId: string
  prompt: string
  model?: string
  tools: string[]
  isBackgrounded: boolean
  createdAt: number
  startedAt?: number
  completedAt?: number
  result?: string
  error?: string
}

4.2 Agent 执行流程

1
2
3
4
5
6
7
async function runLocalAgentTask(task: LocalAgentTaskState): Promise<void> {
  // 1. 初始化 Agent 上下文
  // 2. 设置系统提示
  // 3. 注入任务 prompt
  // 4. 执行 Tool Call 循环
  // 5. 返回结果或错误
}

4.3 In-Process Teammate Task

文件:src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 进程内队友任务
// 与主会话共享内存
// 通过 mailbox 通信

interface InProcessTeammateTaskState {
  taskId: string
  status: TaskStatus
  teammateId: string
  mailbox: Mailbox
  // 共享消息队列
}

五、Task 状态管理

5.1 TaskStore

1
2
3
4
5
6
7
8
// 全局任务存储
interface TaskStore {
  tasks: Map<string, TaskState>
  addTask(task: TaskState): void
  updateTask(taskId: string, update: Partial<TaskState>): void
  removeTask(taskId: string): void
  getTask(taskId: string): TaskState | undefined
}

5.2 状态持久化

1
2
3
4
5
// 任务状态保存到会话存储
// 恢复时可以重建任务

saveTaskState(taskId: string, state: TaskState): void
loadTaskState(taskId: string): TaskState | undefined

六、Task 生命周期事件

6.1 状态变更事件

1
2
3
4
5
6
7
8
9
// 状态变更回调
onTaskStatusChange((taskId, oldStatus, newStatus) => {
  // taskId 创建的任务状态变更
})

// 可能的事件序列:
// pending → running → completed
// pending → running → failed
// running → killed

6.2 结果回调

1
2
3
4
5
6
7
8
// 任务完成时的回调
onTaskComplete((taskId, result) => {
  // 处理任务结果
})

onTaskFailure((taskId, error) => {
  // 处理任务失败
})

七、Task 停止

文件:src/tasks/stopTask.ts

7.1 TaskStopTool

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const TaskStopTool = {
  inputSchema: z.object({
    taskId: z.string(),
    reason: z.string().optional(),
  }),

  async call(args, context, canUseTool) {
    // 1. 查找任务
    // 2. 发送停止信号
    // 3. 等待任务清理
    // 4. 更新状态为 killed
  }
}

7.2 停止机制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 任务可以在任意时刻检查停止信号
// 响应 interrupt 信号

class Task {
  private abortController: AbortController

  async stop(): Promise<void> {
    this.abortController.abort()
  }

  isStopped(): boolean {
    return this.abortController.signal.aborted
  }
}

八、Task 结果传递

8.1 结果格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 任务结果通过 task-notification 传递
interface TaskNotification {
  type: 'task-notification'
  taskId: string
  status: 'completed' | 'failed' | 'killed'
  summary: string
  result?: string
  usage?: {
    total_tokens: number
    tool_uses: number
    duration_ms: number
  }
}

8.2 消息注入

1
2
3
4
// 任务结果注入到主会话消息流
// 作为 user-role message 到达(区分于人类消息)

injectTaskNotification(taskId: string, result: TaskNotification): void

九、Task 列表 UI

文件:src/components/TaskListV2.tsx

9.1 任务列表组件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 显示所有后台任务
// 状态、进度、结果

const TaskListV2: React.FC = () => {
  const tasks = useTasksV2WithCollapseEffect()

  return (
    <Box>
      {tasks.map(task => (
        <TaskItem key={task.taskId} task={task} />
      ))}
    </Box>
  )
}

9.2 任务项显示

┌────────────────────────────────────────┐
│ 🔄 Task Name              [停止] [展开] │
│    状态: 运行中                    │
│    进度: 3/10 工具调用              │
└────────────────────────────────────────┘

十、Task 与其他模块的关系

TaskCreateTool
  │
  ├─→ LocalAgentTask / RemoteAgentTask
  │       │
  │       ├─→ QueryEngine(Tool Call 循环)
  │       ├─→ Coordinator(多 Agent 编排)
  │       └─→ Message 系統(结果传递)
  │
  └─→ TaskListV2(UI 显示)

下一步

下一篇:14 - Hook 系统:生命周期拦截点,深入 Hook 类型定义、生命周期拦截与扩展点机制。


Claude Code 源码研究系列 · 2026 · skyseraph

SkySeraph
SkySeraph
AI for All & All for AI
留言 Comments