# 消息构建器

> 源码：`packages/clawteam-gateway/src/routing/router.ts` 中的 `build*` 方法

TaskRouter 根据不同场景构建不同格式的 prompt 发送到 OpenClaw session。所有消息都是纯文本，供 LLM 解析和执行。

---

## 构建器一览

| 方法 | 用途 | 目标 session |
|------|------|-------------|
| `buildNewTaskMessage()` | 新任务 | main |
| `buildSubTaskMessage()` | 子任务 | 已有 sub-session |
| `buildFallbackMessage()` | 降级路由 | main |
| `buildTaskContextMessagePrompt()` | DM 转发（有 taskId） | sub-session 或 main |
| `buildDirectMessagePrompt()` | DM 转发（无 taskId） | main |

---

## `buildNewTaskMessage(task)`

新任务到达时发送到 main session，指示 LLM spawn sub-session 执行。

**标题**：`[ClawTeam Task Received]`

**内容结构**：

```
[ClawTeam Task Received]

Task ID: <taskId>
From Bot: <fromBotId>
Type: new
Capability: <capability>
Priority: <priority>

Step 1: Spawn a sub-session:
  sessions_spawn with params:
    task: "ClawTeam executor task. Task ID: <taskId>."
    _clawteam_role: "executor"
    _clawteam_taskId: "<taskId>"
    _clawteam_from_bot_id: "<fromBotId>"

  The plugin will auto-inject execution context and auto-track the session.
  No need to call accept or track-session manually.

Step 2: Send task details to the sub-session via sessions_send:
  - Task prompt / instructions
  - Capability and parameters (if any)
```

**关键设计**：
- spawn 的 `task` 参数只是简短标识，插件 `before_tool_call` 会 prepend `task_system_prompt.md` 模板
- 插件 `after_tool_call` 自动调用 `/gateway/track-session` 完成 accept + start + notify
- main session 不需要手动执行任何 curl 命令

---

## `buildSubTaskMessage(task)`

子任务发送到已有 session（通过 `targetSessionKey` 或 `parentTaskId` 定位）。

**标题**：`[ClawTeam Sub-Task]`

**内容结构**：

```
[ClawTeam Sub-Task]

Task ID: <taskId>
Parent Task: <parentTaskId>
Capability: <capability>

Instructions: <prompt>

This sub-task has been auto-accepted by the gateway.

Information gathering:
  1. Task-related info → DM delegator bot:
     curl -s -X POST <gatewayUrl>/gateway/messages/send ...
  2. Executor-specific info → /need-human-input:
     curl -s -X POST <gatewayUrl>/gateway/tasks/<taskId>/need-human-input ...

Complete using:
  curl -s -X POST <gatewayUrl>/gateway/tasks/<taskId>/complete ...
```

---

## `buildFallbackMessage(task)`

目标 session 已死且无法恢复时，降级到 main session 重新 spawn。

**标题**：`[ClawTeam <type> Task — Session Expired Fallback]`

**内容结构**：
- 与 `buildNewTaskMessage` 格式相同（插件 spawn 流程）
- 额外包含 parent task context（如果有 parentTaskId，从 API 获取 parent result）
- main session 视为新任务处理

---

## `buildTaskContextMessagePrompt(message, task)`

带 taskId 的 DM 转发到对应 sub-session。

**标题**：`[ClawTeam Message — Task Context]`

**内容结构**：

```
[ClawTeam Message — Task Context]

Task ID: <taskId>
Task Status: <status>
Capability: <capability>

Message from <senderBotId>:
<content>

Reply using:
  curl -s -X POST <gatewayUrl>/gateway/messages/send \
    -H 'Content-Type: application/json' \
    -d '{"toBotId":"<senderBotId>","taskId":"<taskId>","content":"YOUR_REPLY"}'
```

**特殊处理**：
- 终态任务（completed/failed/cancelled）不提供回复模板
- 如果 sub-session 不存在，降级到 main session

---

## `buildDirectMessagePrompt(message)`

无 taskId 的普通 DM 发送到 main session。

**标题**：`[ClawTeam Message Received]`

**内容结构**：

```
[ClawTeam Message Received]

From: <senderBotId>
Message ID: <messageId>

<content>

Reply using:
  curl -s -X POST <gatewayUrl>/gateway/messages/send \
    -H 'Content-Type: application/json' \
    -d '{"toBotId":"<senderBotId>","content":"YOUR_REPLY"}'
```
