# 子代理

::: tip 版本说明
子代理从 1.11.0 起提供。
:::

子代理是由主会话派生出的独立工作会话。当你面临耗时较长的调研、多模块并行审查或架构对比等复杂任务时，可以让 AI 派发子代理并行处理，**不阻塞当前主对话**。

子代理拥有自己独立的上下文与工具能力。派发后它会在后台独立工作，你可以留在主会话继续讨论，也能随时点进子会话查看实时进度、补充提问或手动暂停。

有合适的子代理且部分工作可以独立完成时，AI 会主动分发这部分任务，同时继续推进主线，负责协调、核验和整合结果。简单或紧密耦合的任务由主会话直接完成，不必把所有工作都派给子代理。

子代理分为两种：
- **默认通用子代理**：自动继承父会话的模型配置与全部可用工具；
- **自定义子代理**：支持自由指定模型、工具白名单/黑名单以及专属提示词。

## 使用方法

在主会话中直接向 AI 提出派发需求即可，例如：

- 「派个子代理去审查 `app/build.gradle.kts`，把潜在问题列出来」
- 「同时派两个子代理，一个调研数据库迁移方案，一个调研 UI 组件库选型」
- 「派一个只读调研子代理查清当前的登录与鉴权流程」

AI 在派发前会弹窗向你确认授权；获得同意后子代理将在后台启动，主会话随即恢复空闲，可继续接收你的其它指令。

## 侧边栏中的位置与管理

侧边栏会话列表清晰展示了主会话与子代理的父子归属关系：

- **展开与收起**：派生过子代理的会话，行尾会显示子代理数量与展开折叠箭头。点击箭头可展开查看其下属的所有子代理；
- **状态指示**：正在运行中的子代理会显示绿色的运行状态指示灯；
- **独立交互**：点击子代理即可切换进入其会话页，界面与常规会话完全一致，可独立对话、暂停或重新生成；
- **会话操作**：长按子代理项可进行重命名、导出与删除；删除主会话时，其名下的所有子代理会随之一同清理。

## 上下文与信息传递

::: tip 上下文独立与双向同步
子代理拥有独立上下文，默认通过派发说明获取主会话的任务背景，保证轻量与专注：

- **任务派发**：AI 在派发子代理时，会提炼明确目标与完成标准、关键文件路径、已核实的背景、用户约束、可改动的范围以及期望产出，打包作为初始指令交给子代理。如果你在主会话中手动指示派发，也建议交代清楚关键背景与期望产出；
- **结果汇总**：子代理的最终报告应完整写明结论、依据、改动文件、验证结果与未完成项，让主会话仅凭最终报告即可理解结果。子代理执行完毕后，主会话会自动收到完成通知，通知里**直接带上结果摘要与本次改动过的文件**，主会话按摘要为你汇总；需要完整报告或核对细节时才会再读取一次子代理的最终产出。若主会话当时正在调用其它工具，卡片下方会提示子代理已就绪，并在当前操作后自动跟进处理；
- **全流程追溯**：主会话通常只读取子代理的最终结论，如果你想查看子代理完整的工具调用日志、推导轨迹或中间输出，直接在侧边栏点击进入该子会话即可查看全部详情。
- **专属卡片**：派发子代理时，聊天流里显示的是对标网络搜索风格的结构化任务卡片，而不是普通工具记录——顶部概览标注「子代理任务」总数与「已派发」状态，下方按序号（01, 02...）清晰列出每个派出的子代理角色、运行模型档位（或继承）、初始任务描述与回退提示，单任务派发与批量多任务派发均可工整呈现。点击任意任务卡片即可直接进入对应子会话；子代理的执行细节与完成汇总则由后续主会话通知与回复承接，避免派发卡片杂乱臃肿。
:::

## 与主会话的双向通讯

子代理与主会话之间支持双向异步通讯，互不阻塞：

- **主会话 → 子代理**：主会话可以在已授权的任务范围内向子代理追加消息（补充指令、调整分工、纠偏，或对已有结果继续追问），**可反复发送**。运行中的子代理会在下一轮操作里收到该消息；已完成或暂停的子代理会被重新唤醒并继续工作；
- **子代理 → 主会话**：子代理在运行中可以主动向主会话汇报关键进展、求助，或提交需要协调、决策的事项。主会话会收到一条系统通知，并可直接回复。

这些消息在界面上以轻量提示条呈现，不占用普通聊天气泡；主会话忙碌时消息会在当前操作结束后自动跟进处理，空闲时则立即触发新一轮。

## 自动派发与手动指定

主会话 AI 了解当前所有可用的子代理及其擅长领域：

- **自动匹配**：当你的需求与某个子代理的用途描述（`description`）相符时，AI 会主动选用该专属子代理；
- **手动指定**：你也可以在指令中明确指定，例如「使用 Explore 子代理检索所有网络请求的入口」。

## 内置子代理：Explore

初次启动时，系统会自动在全局目录释放内置的 **Explore** 只读探索子代理（位于 `~/.muse/agents/explore.md`），开箱即用。

它的核心用途是只读的代码库探索与逻辑梳理：
- **纯只读安全**：仅开放了代码与文件检索工具（`readFile`、`list`、`search`、`websearch`、`webfetch`、`loadSkill`），**不包含任何写文件与执行终端命令的工具**，不会对项目造成改动，也不需要频繁弹窗授权；
- **模型定制**：默认继承当前会话的模型。如果想为它配置更经济的模型，只需在 `explore.md` 中填入对应的 `provider` 与 `model`。若希望由 AI 按任务难度自动挑模型，改用「设置 → 默认模型 → 子代理模型档位」配置轻量/均衡/强力三档，派发时 AI 会自己选档（定义里写死了 `model` 的优先，档位不生效）；
- **持久保留**：此文件仅在首次不存在时释放，你所做的个性化修改在 App 升级时均会完整保留。

## 自定义子代理

创建自定义子代理有两种方式，效果完全等价（App 内保存后写出的就是同一份 `.md` 文件）：

- **在 App 内新建**（推荐）：「设置 → 子代理」右上角的「＋」，填表单即可，模型可以直接从已配置的供应商里选；
- **手写定义文件**：自行把 Markdown 文件放进对应目录，适合从其它项目拿现成定义或用 git 管理。

两个可选目录：

- **全局配置**：`~/.muse/agents/<name>.md`，所有项目共享，升级不丢失。跟随执行环境：本地模式下是容器内 `/root/.muse/agents/`（映射至手机 App 私有目录），远程模式下指**服务器**上的 `~/.muse/agents/`，读写经由 SSH 完成；
- **项目级配置**：`<项目工作区>/.muse/agents/<name>.md`，仅对当前工作区生效，可随代码库一同提交到版本控制中。远程模式下这里指的是**服务器上**的工作区，读写经由 SSH 完成。

同名定义时项目级优先。文件由顶部的 YAML 配置（frontmatter）与正文提示词组成：

```markdown
---
name: researcher
description: 只读代码与技术调研：广泛检索代码、查阅网络资料并汇总结论，不修改文件
provider: DeepSeek
model: deepseek-reasoner
reasoningEffort: high
mode: plan
tools: [readFile, list, search, websearch, webfetch]
disallowedTools: [Bash, terminal]
inject: [base, projectRules]
---
你是资深代码调研专家。请先使用 search 定位入口，再用 readFile 深入核实。
输出结论时请务必标注准确的 `文件路径:行号` 引用；未核实推断需如实注明。
```

### 配置项说明

| 字段 | 是否必填 | 说明 |
| --- | --- | --- |
| `name` | 否 | 子代理标识名称，省略时取文件名 |
| `description` | 建议填写 | 简述适用场景与专长，主会话 AI 依据此描述判断何时选用该子代理 |
| `provider` | 否 | AI 供应商名称，省略时继承父会话配置 |
| `model` | 否 | 模型名称，省略时继承父会话配置 |
| `reasoningEffort` | 否 | 思考强度：`none` / `minimal` / `low` / `medium` / `high` / `xhigh` / `max` |
| `mode` | 否 | 默认运行模式：`build` / `plan` / `auto`，省略时继承父会话当前模式。**只能比父会话更严、不能更宽**：主会话处于 PLAN 时，写 `build` / `auto` 也只会以 `plan` 运行 |
| `tools` | 否 | 工具白名单。**省略时代表开放全部可用工具** |
| `disallowedTools` | 否 | 工具黑名单，优先级高于白名单，支持 `mcp__*` 前缀通配 |
| `inject` | 否 | 注入的系统规则片段，详见下表 |

### inject 规则片段

| 取值 | 含义 |
| --- | --- |
| `base` | 子代理专用轻量基线：包含工具使用规范与路径约定，轻量且省 token |
| `mainRules` | 完整通用规则：与主会话保持完全一致的行为准则与规则基线 |
| `skills` | 技能支持：注入可用技能清单，允许子代理加载并执行项目技能 |
| `memory` | 记忆支持：注入全局与项目长期记忆摘要，见 [记忆与项目规则](https://aicode.murk.top/md/guide/memory.md) |
| `projectRules` | 项目规则：注入全局（`~/.muse`）与工作区内的 `AGENTS.md` 或 `CLAUDE.md` 约束，见 [记忆与项目规则](https://aicode.murk.top/md/guide/memory.md) |

`base` 与 `mainRules` 是同一套规则的简版与完整版，**正常只选一个**。两个同时开启不会报错，但会把相互重叠的规则文本注入两遍，徒增上下文占用。

若省略 `inject` 字段，默认等同于 `[base, skills, memory, projectRules]`。如果填写 `inject: [none]`，则仅使用你在 Markdown 正文中编写的提示词。

## 在设置中管理

进入「设置 → 子代理」，可以按「当前项目 / 全局」分组浏览所有已识别的子代理。

- **新建**：点右上角的「＋」。表单里可以填名称与用途描述、选作用域（当前项目 / 全局）、从已配置的供应商中**选定模型与思考强度**、勾选工具白名单与黑名单、开关要注入的提示词片段，最后写 agent 提示词正文；
- **编辑**：点击进入某个子代理的详情页，再点右上角的铅笔图标。修改名称会连带重命名它的定义文件；
- **启用 / 禁用**：详情页顶部的开关。禁用后它不再出现在主会话 AI 的可派发清单里，AI 也无法再指名派发它，但定义文件保留，已在运行的子会话也不受影响；
- **能力标注**：主会话看到的可派发清单里，每个子代理后面都标着「文件读取 / 文件修改 / 执行命令」三项能力（由你在详情页里勾选的工具白名单、黑名单推导），AI 据此派活——不会把修改任务派给只读子代理，也不会让没有命令能力的子代理去跑构建或验证命令；计划模式下后两项会额外标注「否（PLAN 只读）」，说明是当前模式所限，而不是子代理本身的配置；
- **删除**：列表里左滑条目，会删掉对应的 `.md` 定义文件，不可恢复。

### 批量操作

列表右上角的「多选」按钮（方框带勾的图标）可以一次处理多个子代理：

1. 点「多选」进入多选模式，每行左侧出现勾选框，整行点击即勾选；「当前项目 / 全局」两个分组共用一份选中集合。
2. 顶部操作条提供「启用 / 停用 / 删除」与「全选 / 取消全选」，最右「×」或系统返回键退出多选。
3. 「全选」包含折叠起来的那个分组。
4. 删除会弹确认框；确认后逐条删除定义文件，期间显示「正在删除…」，完成后列表刷新并退出多选。远程模式下删除走 SSH，条目多时请等提示消失再离开页面。

多选模式下不能点击进入详情页，也不能左滑删除单条。

新建和编辑时，表单会避让软键盘；提示词正文较长时可以上下滚动，继续编辑末尾内容。

启停状态存在 `agents.json`，与技能的停用名单同一套约定：全局名单位于当前执行环境的 `~/.muse/agents.json`，本地模式保存在手机 App 私有目录，远程模式保存在服务器上；两者独立，不会自动迁移或同步。项目级名单在本地模式位于 `<工作区>/.muse/agents.json`，远程模式仍保存在手机 App 私有目录，按服务器和工作区隔离。两级取并集，任一作用域禁用即生效。

在 App 中切换启停状态后列表会刷新。本地模式下手工修改定义或名单，列表几秒内自动刷新；远程模式下不会监听服务器上的文件变化，手工修改后需退出并重新进入设置页刷新列表。

## 运行机制与限制

- **并发上限**：系统最多支持 **5 个子代理同时运行**，超出时需等待已有任务完成或手动暂停；
- **防嵌套**：子代理不能再派生下一级子代理；
- **双向通讯**：主会话可随时向运行中或已完成的子代理追加消息（可重复发送），子代理运行中也能主动向主会话汇报或求助；消息异步送达、互不阻塞。
- **默认模式**：子代理默认继承派发它时主会话的模式。在计划（PLAN）模式下派出的子代理同样只能只读探索——此时主会话看到的清单会把「文件修改 / 执行命令」标成「否（PLAN 只读）」，派发返回里也会带同样的提醒，避免派出去才发现做不了；在自动（AUTO）模式下也和主会话一样不再逐次弹窗。自定义子代理可用 `mode` 字段把权限**收窄**（例如给只读子代理固定 `mode: plan`，让它无论何时被派发都保持只读），但不能放宽到超过父会话——这样 PLAN 模式不会被「派个子代理去改」绕过；
- **授权管控**：子代理与主会话遵循相同的工具授权安全机制。如果子代理尝试执行写文件或系统命令，同样会触发授权确认弹窗（弹窗会清晰标明来源于哪个子代理）；
- **你手动停止也会告知主会话**：在子会话里点停止、或直接删掉一个正在运行的子代理时，主会话会收到一条「已被手动终止」的通知（而不是执行失败），AI 不会自行重新派发；并发名额也会立即释放；
- **生命周期**：删除父会话时，其包含的所有子代理会话将一并级联清理；
- **定义改动的生效时机**：新增、改名或修改子代理定义后，已打开的会话仍沿用开场时的清单，**新开一个会话**才能让 AI 看到改动。
