@wolido/async-subagent-isolation 1.6.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  你的 AI agent 在长会话后开始“失忆”、输出质量下降,甚至擅自修改文件?这是上下文爆炸(context explosion)、上下文腐烂(context rot)与上下文污染(context pollution)的典型症状。**async-subagent-isolation** 是 [Pi Agent](https://github.com/earendil-works/pi) 的扩展,也是 [subagent-isolation](https://github.com/Wolido/subagent-isolation)(同步版)的**异步演进**,用子 agent 进程隔离解决这些问题。
17
17
 
18
- 核心约束不变:**主 agent 不能碰代码**。没有 `write`、没有 `edit`、没有 `bash`,只有 `read`、`grep`、`find`、`ls` 四个只读工具,外加一个 `subagent` 委派工具;修改文件、跑命令、执行逻辑的工作全部交给子 agent。两个核心卖点由此成立。一是 **skill 级的提示词隔离**:每个子 agent 跑在独立的 `pi` 进程里,有自己的 agent 定义文件(如 `coder.md`)和 skill 白名单,不继承主 agent 的提示词与 skills,主 agent 的 skill 一个都进不来。二是**分工模型**:主 agent 只做拆分、调度与验收,coder 写代码、writer 写文档、reviewer 评审,每个子 agent 只拿自己领域的那段上下文。关键区别在**异步**:TUI 模式下派发后**立即返回回执**(`已派出 <agent>. taskId: <taskId>`),子 agent 在后台运行,完成后结果以 **[subagent-result] 系统通知**推回对话;主 agent 不被阻塞,可以并行派发多个任务、继续做其他工作。
18
+ 核心约束不变:**主 agent 不能碰代码**。没有 `write`、没有 `edit`、没有 `bash`,只有 `read`、`grep`、`find`、`ls` 四个只读工具,外加一个 `subagent` 委派工具;修改文件、跑命令、执行逻辑的工作全部交给子 agent。两个核心卖点由此成立。一是 **skill 级的提示词隔离**:每个子 agent 跑在独立的 `pi` 进程里,有自己的 agent 定义文件(如 `coder.md`)和 skill 白名单,不继承主 agent 的提示词与 skills,主 agent 的 skill 一个都进不来。二是**分工模型**:主 agent 只做拆分、调度与验收,coder 写代码、writer 写文档、reviewer 评审,每个子 agent 只拿自己领域的那段上下文。关键区别在**异步**:TUI 模式下派发后**立即返回回执**(`Dispatched <agent>. taskId: <taskId>`),子 agent 在后台运行,完成后结果以 **[subagent-result] 系统通知**推回对话;主 agent 不被阻塞,可以并行派发多个任务、继续做其他工作。
19
19
 
20
20
  ---
21
21
 
@@ -173,7 +173,7 @@ async-subagent-isolation 做的是强制且完全的隔离:
173
173
  TUI 模式下 `subagent` **立即返回派发回执**,不阻塞:
174
174
 
175
175
  ```
176
- 已派出 coder. taskId: 01912345-6789-7abc-8def-0123456789ab
176
+ Dispatched coder. taskId: 01912345-6789-7abc-8def-0123456789ab
177
177
  ```
178
178
 
179
179
  `taskId` 就是 session ID,之后可复用来继续同一任务。**回执不是结果**——不要臆造结果。
@@ -204,7 +204,7 @@ TUI 模式下 `subagent` **立即返回派发回执**,不阻塞:
204
204
 
205
205
  ```
206
206
  主 agent 派发 subagent
207
- 立即返回回执(已派出 <agent>. taskId: <id>)
207
+ 立即返回回执(Dispatched <agent>. taskId: <id>)
208
208
 
209
209
  子 agent 在后台独立进程运行(进度 widget 实时显示)
210
210
 
@@ -235,19 +235,19 @@ TUI 模式下 `subagent` **立即返回派发回执**,不阻塞:
235
235
  | `/subagent-cancel <taskId>` | 取消单个运行中的后台任务(不带参数时弹出运行中任务的交互选择列表,Enter 取消所选) |
236
236
  | `/subagent-cancel-all` | 一键取消全部运行中的后台任务 |
237
237
  | `/subagent-result <taskId>` | 全屏查看某任务的完整返回(不带参数时弹出最近 5 个已结束任务的交互选择列表) |
238
- | `/subagent-config [agent]` | 唯一的交互式配置入口:agent 选择菜单直接标注每个 agent 的生效 model/thinking,可编辑 description/tools/skills/body/model/thinking 六字段(name 只读)并管理可用 model 列表(带参数直进指定 agent) |
238
+ | `/subagent-config [agent]` | 唯一的交互式配置入口:agent 选择菜单直接标注每个 agent 的生效 model/thinking,可编辑 description/tools/skills/body/model & thinking 五字段(name 只读)并管理可用 model 列表(带参数直进指定 agent) |
239
239
 
240
240
  ---
241
241
 
242
242
  ## 示例 agents
243
243
 
244
- 仓库 [`examples/pi/agent/agents/`](https://github.com/Wolido/subagent-isolation/tree/main/examples/pi/agent/agents) 提供三个可直接参考的 agent:
244
+ 仓库 [`examples/pi/agent/agents/`](https://github.com/Wolido/async-subagent-isolation/tree/main/examples/pi/agent/agents) 提供三个可直接参考的 agent:
245
245
 
246
246
  | Agent | 作用 | 可用工具 | 加载的 skill |
247
247
  |-------|------|----------|-------------|
248
- | [`coder`](https://github.com/Wolido/subagent-isolation/blob/main/examples/pi/agent/agents/coder.md) | 写代码、改代码、跑验证 | `read, write, edit, bash, grep, find, ls` | `systematic-debugging` |
249
- | [`reviewer`](https://github.com/Wolido/subagent-isolation/blob/main/examples/pi/agent/agents/reviewer.md) | 只读评审,输出可操作的反馈 | `read, grep, find, ls` | _(无)_ |
250
- | [`writer`](https://github.com/Wolido/subagent-isolation/blob/main/examples/pi/agent/agents/writer.md) | 写文档、改 README、生成 commit message | `read, write, edit, grep, find, ls` | `writing-clearly-and-concisely` |
248
+ | [`coder`](https://github.com/Wolido/async-subagent-isolation/blob/main/examples/pi/agent/agents/coder.md) | 写代码、改代码、跑验证 | `read, write, edit, bash, grep, find, ls` | `systematic-debugging` |
249
+ | [`reviewer`](https://github.com/Wolido/async-subagent-isolation/blob/main/examples/pi/agent/agents/reviewer.md) | 只读评审,输出可操作的反馈 | `read, grep, find, ls` | _(无)_ |
250
+ | [`writer`](https://github.com/Wolido/async-subagent-isolation/blob/main/examples/pi/agent/agents/writer.md) | 写文档、改 README、生成 commit message | `read, write, edit, grep, find, ls` | `writing-clearly-and-concisely` |
251
251
 
252
252
  复制到 `~/.pi/agent/agents/`(用户级)或 `.pi/agents/`(项目级,同名时 project 覆盖 user)即可使用,可按需修改或新建。修改或新建 agent 文件后运行 `/reload`,刷新注入主 agent 提示词的子 agent 清单(见“配置管理”一节)。
253
253
 
@@ -269,7 +269,7 @@ TUI 模式下 `subagent` **立即返回派发回执**,不阻塞:
269
269
 
270
270
  文件放在 `~/.pi/agent/subagent-isolation.json`(用户级)或 `.pi/subagent-isolation.json`(项目级,覆盖用户级同名 key)。三种覆盖格式的完整示例见 `examples/pi/agent/subagent-isolation.json`。
271
271
 
272
- **进程内存级临时覆盖。** 多个 pi 窗口共享同一份 `subagent-isolation.json` 时,某窗口工作过程中可以用 `/subagent-config` 把某个 subagent 的 model/thinking 临时写入 `this process`:覆盖只存在当前进程的内存里,不落盘、不写文件,进程退出或 `/reload` 后消失,其它窗口不受影响。优先级链为进程内存层 > 项目级 json > 用户级 json > frontmatter,整 key 遮蔽语义与文件层级一致——内存层 entry 存在时整体遮蔽低层同 key entry。`$models` 列表不受影响,仍是文件级(写入目标只有 user/project)。
272
+ **进程内存级临时覆盖。** 多个 pi 窗口共享同一份 `subagent-isolation.json` 时,某窗口工作过程中可以用 `/subagent-config` 把某个 subagent 的 model/thinking 临时写入 `this process`:覆盖只存在当前进程的内存里,不落盘、不写文件,进程退出或 `/reload` 后消失,其它窗口不受影响。优先级链为进程内存层 > 项目级 json > 用户级 json > frontmatter,整 key 遮蔽语义与文件层级一致——内存层 entry 存在时整体遮蔽低层同 key entry。进程覆盖生效时,`/subagent-config` 的菜单标注会在总览行尾附 `[saved: ...]` 片段显示配置文件里的原值(见下节)。`$models` 列表不受影响,仍是文件级(写入目标只有 user/project)。
273
273
 
274
274
  顶层 `$models` 数组是可选的可用 model 列表(`$` 前缀避免与 agent 名冲突):配置 model 覆盖时从列表中选择,列表为空或未配置时回退自由输入。项目级 `$models` 是合法数组时整体遮蔽用户级列表,写 `"$models": []` 可显式清空。无需手写 JSON:`/subagent-config` 提供列表管理入口(见下节)。
275
275
 
@@ -281,8 +281,8 @@ thinking 等级、优先级与合并规则详见 [ADVANCED.md](ADVANCED.md)。
281
281
 
282
282
  TUI 模式下用 `/subagent-config` 统一管理子 agent 配置,全程交互,不用手动编辑文件:
283
283
 
284
- 1. 选择 agent:列表逐项带来源标记 `(user)` / `(project)`,并直接标注生效 model/thinking(格式 `<name> (<source>) — <model> (<thinking>)`,未配置显示 `(未配置)`;生效值按整 key 合并语义计算——进程内存 entry 遮蔽项目级/用户级同 key entry,项目级 entry 遮蔽用户级同 key entry,entry 内未配字段回退 frontmatter,与派发实际使用一致);末尾固定一项 `Manage available model list ($models)`,进入可用 model 列表管理(查看当前列表及来源、添加、删除,写入目标可选用户级/项目级)。一个 agent 都没有时列表只剩该入口,`$models` 照常可管理。
285
- 2. 选择字段编辑:选中 agent 后直接进入字段选择,字段选项自带当前值标注(无详情通知,信息获取靠菜单标注)。可编辑 `description`、`tools`、`skills`、`body`、`model`、`thinking` 六个字段;`name` 是只读身份标识,不在其中。
284
+ 1. 选择 agent:列表逐项带来源标记 `(user)` / `(project)`,并直接标注生效 model/thinking(格式 `<name> (<source>) — <model> (<thinking>)`,未配置显示 `not set`;该 agent 存在进程级覆盖时行尾追加 `(process)` 标识并附 `[saved: <model> (<source>) / <thinking> (<source>)]` 片段(显示配置文件中的低层原值,槽位无值显示 `not set`);生效值按整 key 合并语义计算——进程内存 entry 遮蔽项目级/用户级同 key entry,项目级 entry 遮蔽用户级同 key entry,entry 内未配字段回退 frontmatter,与派发实际使用一致);末尾固定一项 `Manage available model list ($models)`,进入可用 model 列表管理(查看当前列表及来源、添加、删除,写入目标可选用户级/项目级)。一个 agent 都没有时列表只剩该入口,`$models` 照常可管理。
285
+ 2. 选择字段编辑:选中 agent 后直接进入字段选择,字段选项自带当前值标注(无详情通知,信息获取靠菜单标注)。可编辑 `description`、`tools`、`skills`、`body`、`model & thinking` 五个字段(model 与 thinking 合并为一个编辑项,一次写入两字段);`name` 是只读身份标识,不在其中。
286
286
 
287
287
  各字段的编辑方式:
288
288
 
@@ -291,15 +291,17 @@ TUI 模式下用 `/subagent-config` 统一管理子 agent 配置,全程交互
291
291
  | `description` | 单行输入,输入框预填当前值;改后需 `/reload` 才刷新注入清单 |
292
292
  | `tools` / `skills` | 逗号分隔输入;输入空串即从 frontmatter 移除该 key |
293
293
  | `body` | 在外部编辑器中编辑(`$EDITOR`,未设置回退 `$VISUAL`,再回退 vi);取消、未改动、改完全空白都不写盘 |
294
- | `model` / `thinking` | 写入目标三选一:`this process`(进程内存,不落盘,进程退出或 `/reload` 后消失)/ `user` / `project`;`thinking` pi 官方 7 个等级中选择,`$models` 列表非空时 `model` 从列表选择、为空时自由输入(预填当前生效值);另有 `clear model (reset to frontmatter)` / `clear thinking (reset to frontmatter)` 选项清除覆盖,清除后按整 key 合并重算生效值并反馈(内存层清除回退到文件配置;双层级配置下回退到另一级 json 或保持不变) |
294
+ | `model & thinking` | 合并为一个编辑项:进入子流程先选动作——`edit model & thinking`(标注当前生效值与各自来源)/ `clear model & thinking (reset to frontmatter)`;edit 分支依次为 model 值步(`$models` 列表非空时从列表选择、为空时自由输入并预填生效值)→ thinking 值步(官方 7 级 + `not set` 选项,当前生效标 (current))→ 写入目标(`this process` / `user` / `project`)→ 一次写入两字段;clear 分支选写入目标后整条覆盖清除,反馈 model thinking 各自回退值 |
295
295
 
296
296
  `name` 是只读身份标识,不可编辑。
297
297
 
298
- 生效时机(reload 语义):改 `description` 后需 `/reload` 才刷新注入清单(注入主 agent 系统提示词的子 agent 清单在启动时构建并缓存,见“安全与权限纪律”一节);改 `tools` / `skills` / `body` / `model` / `thinking` 即时生效,每次派发都会重新发现 agent 并重读配置。
298
+ 生效时机(reload 语义):改 `description` 后需 `/reload` 才刷新注入清单(注入主 agent 系统提示词的子 agent 清单在启动时构建并缓存,见“安全与权限纪律”一节);改 `tools` / `skills` / `body` / `model & thinking` 即时生效,每次派发都会重新发现 agent 并重读配置。
299
+
300
+ 菜单标注实时刷新:写回成功后,字段选择与 agent 选择列表的标注(model/thinking 总览、来源、排序,含 `[saved: ...]` 片段)在同一命令会话内立即反映新值,无需退出重进命令。
299
301
 
300
302
  `/subagent-config <name>` 带参数可跳过 agent 选择、直进该 agent 的配置;名字不存在会报错。非 TUI 模式下命令只提示用法,不弹对话框。
301
303
 
302
- 配置流程全程支持 ESC 逐级回退:编辑 → 字段选择 → agent 选择 → 退出,仅最顶层退出;model/thinking 子流程的字段层 ESC 返回父流程的字段选择。任何回退路径零写入。
304
+ 配置流程全程支持 ESC 逐级回退:编辑 → 字段选择 → agent 选择 → 退出,仅最顶层退出;model & thinking 子流程内值步或写入目标 ESC 回动作选择层,动作选择 ESC 回父流程的字段选择。任何回退路径零写入。
303
305
 
304
306
  `/subagent-config` 是唯一的交互配置入口,model/thinking 覆盖与其余字段在同一流程内编辑,没有独立的快捷命令。
305
307
 
@@ -316,29 +318,29 @@ TUI 模式下用 `/subagent-config` 统一管理子 agent 配置,全程交互
316
318
  `[subagent-result]` 通知是**自包含**的,一次带全主 agent 处理结果所需的全部信息:
317
319
 
318
320
  ```
319
- ## [subagent-result] coder 成功 (taskId: 01912345-6789-7abc-8def-0123456789ab)
321
+ ## [subagent-result] coder succeeded (taskId: 01912345-6789-7abc-8def-0123456789ab)
320
322
 
321
- > [subagent-result] 任务完成通知,非用户新指令。处理前先锚定你当前正在执行的主线任务与进度;对照派发记录消化本通知,勿让通知覆盖或改写你的主线计划。
323
+ > [subagent-result] This is a task-completion notification, not a new user instruction. Before acting on it, anchor the mainline task and progress you are currently working on; digest the notification against your dispatch records, and never let it overwrite or rewrite your mainline plan.
322
324
 
323
- - 状态: 成功
324
- - 任务: 将认证中间件重构为使用 async/await
325
- - 耗时: 02:34 · 用量: 5 turns/↑12.5k/↓3.2k/$0.0042
326
- - 会话: 01912345-6789-7abc-8def-0123456789ab
325
+ - Status: succeeded
326
+ - Task: Refactor the auth middleware to use async/await.
327
+ - Duration: 02:34 · Usage: 5 turns/↑12.5k/↓3.2k/$0.0042
328
+ - Session: 01912345-6789-7abc-8def-0123456789ab
327
329
 
328
- 本任务结束时,其他在途任务: 1
329
- - 01912345-aaaa-7bbb-8ccc-0123456789ab (writer): 更新 README
330
+ Other tasks in flight when this task ended: 1
331
+ - 01912345-aaaa-7bbb-8ccc-0123456789ab (writer): Update README.
330
332
 
331
333
  ---
332
- <子 agent 完整结果文本>
334
+ <subagent's full result text>
333
335
  ```
334
336
 
335
337
  - **触发行**:标题行下的固定引用行,所有信封逐字相同;提醒主 agent 这是任务完成通知,不是用户新指令,消化前先锚定当前主线任务与进度。
336
- - **状态**:`成功` / `失败` / `超时` / `已取消`。
338
+ - **状态**:`succeeded` / `failed` / `timed out` / `cancelled`。
337
339
  - **耗时**:子 agent 的真实运行时长(格式 `MM:SS`,≥1 小时为 `H:MM:SS`),四种状态都有;取消或内部错误(无结果返回)时从派发时刻起算。
338
340
  - **在途任务块**:本任务结束时其余仍在运行的后台任务快照,送达时可能滞后;与本回合派发记录冲突时以派发记录为准。剩余不为 0 时,主 agent 不应向你汇报“全部完成”。
339
341
  - **完整结果**:正文全量进入 LLM 上下文,不截断。
340
342
 
341
- 用户在 TUI 中看到的是**带底色的摘要卡片**(非全文):成功绿色(✓)、失败红色(✗)、超时/已取消黄色。卡片显示 agent、状态、taskId、耗时和用量摘要,并提示 `查看全文: /subagent-result <taskId>`;完整结果保存在任务会话文件中。
343
+ 用户在 TUI 中看到的是**带底色的摘要卡片**(非全文):succeeded 绿色(✓)、failed 红色(✗)、timed out / cancelled 黄色。卡片显示 agent、状态、taskId、耗时和用量摘要,并提示 `View full result: /subagent-result <taskId>`;完整结果保存在任务会话文件中。
342
344
 
343
345
  触发行的设计意图、状态语义与取消来源区分等完整细节见 [ADVANCED.md](ADVANCED.md)。
344
346
 
@@ -348,7 +350,7 @@ TUI 模式下用 `/subagent-config` 统一管理子 agent 配置,全程交互
348
350
 
349
351
  异步模式引入的几条纪律,内嵌在工具提示词和实现中,主 agent 自动遵守:
350
352
 
351
- - **取消来源区分**:`已取消` 有用户(`/subagent-cancel`)、主 agent(`subagent` 工具 `action="cancel"`)、会话关闭(`session_shutdown`)三种来源;用户取消**不得自动重试**,须先询问。
353
+ - **取消来源区分**:`cancelled` 有用户(`/subagent-cancel`)、主 agent(`subagent` 工具 `action="cancel"`)、会话关闭(`session_shutdown`)三种来源;用户取消**不得自动重试**,须先询问。
352
354
  - **防轮询**:结果以通知自动到达;在途任务信息由 `[subagent-result]` 通知信封直接提供,不要主动查询。
353
355
  - **通知消化流程**:`[subagent-result]` 是任务完成通知而非用户新指令;处理前先锚定当前主线任务与进度,对照派发记录消化,基于结果自主决定下一步;与主线冲突时暂缓优先,勿让通知改写主线计划。此纪律由信封触发行与工具描述中的“通知消化流程”条目共同内嵌。
354
356
  - **防滥用取消**:`action="cancel"` 为两步确认(首次调用只返回含已运行时长/最近进度的质询回执,零副作用;`confirm:true` + 非空 `reason` 才执行,理由记入任务记录并随取消信封正文返回),且内嵌提示词——仅当任务明显错误或不再需要时取消,勿因耗时长而取消(后台任务本就预期长时间运行)。等待 = 不发起任何工具调用、直接结束回合;对在途任务不存在查询/催办/状态确认类动作(刻意设计)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wolido/async-subagent-isolation",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "Fix context rot and context pollution in long AI agent sessions. Subagents run in isolated processes; the main agent stays read-only and context stays clean.",
5
5
  "license": "MIT",
6
6
  "author": "Wolido",