personal-bot 0.1.1 → 0.2.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.
@@ -7,10 +7,12 @@
7
7
  | 工作区 AGENTS.md、areas/、projects/、knowledge/ 等 | 用户资料、任务定义与证据 |
8
8
  | 工作区 providers/<id>/GUIDE.md | 提供方使用说明 |
9
9
  | 工作区 .pi/settings.json、.pi/mcp.json | Pi 原生项目配置 |
10
- | 当前 Pi agent dir 的 pbot/subagents/ | Personal Bot 子会话记录 |
10
+ | Pi 原生 sessions/ 或原生配置指定的目录 | 主会话与子会话的 JSONL 对话,由 Pi 管理 |
11
+ | 当前 Pi agent dir 的 pbot/subagents/ | Personal Bot 子进程控制记录与原生会话引用 |
12
+ | 当前 Pi agent dir 的 pbot/teams/ | 团队资料、批次与公共原文 |
11
13
  | 用户级 pbot/python/.venv | 共享 Python 环境 |
12
14
 
13
- Pi 管理主会话与配置。Personal Bot 的工作区资料是普通文件,没有私有启用状态或工作区格式版本。详细目录用途见[项目 README](../README.md#工作区资料),Python 路径见 [Python 说明](../python/README.md)。
15
+ Pi 管理主会话、子会话对话与配置。Personal Bot 的工作区资料是普通文件,没有私有启用状态或工作区格式版本。详细目录用途见[项目 README](../README.md#工作区资料),Python 路径见 [Python 说明](../python/README.md)。
14
16
 
15
17
  ## 资料准备
16
18
 
@@ -27,14 +29,33 @@ Pi 管理主会话与配置。Personal Bot 的工作区资料是普通文件,
27
29
  | inbox | 父侧消息 |
28
30
  | status | 子侧活动与接收标记 |
29
31
  | completions | 周期结果引用 |
30
- | session.jsonl | Pi 原生对话 |
32
+ | session-ref.json | 原生会话文件的绝对路径;首次输入前为 null,不保存对话副本 |
33
+ | team-ready.json | 子入口当前 generation 的团队接入/工具就绪标记,不是存储版本 |
31
34
 
32
- 父侧写控制记录,子侧写状态和完成事件,交付收据进入父 Pi 会话。通信顺序与恢复规则见[专家协作](agent-collaboration.md)。
35
+ 父侧写控制记录,子侧写状态、会话引用和完成事件,交付收据进入父 Pi 会话。通信顺序与恢复规则见[专家协作](agent-collaboration.md)。
36
+
37
+ 新 agent 以 agentId 作为原生 session ID,通过 `--session-id` 由 Pi 创建。默认文件位于当前 Pi agent dir 的 `sessions/<Pi 编码的 cwd>/<时间戳>_<sessionId>.jsonl`;遵循子进程的原生环境变量与 settings,不自行编码目录或生成文件名。父会话一次性的 `--session-dir` 参数不会自动传给子进程。
38
+
39
+ Pi 对没有用户或助手消息的会话延迟落盘。`session-ref.json` 初始为 `{ "file": null }`;子入口在领取请求或接受人工输入前固定 Pi 返回的实际路径,已存在的原生文件在载入时固定引用。固定后不清空、不改指向;它是恢复定位信息,不是输入已落盘、模型已读或执行完成的证明。
40
+
41
+ 恢复已绑定会话使用 `--session <绝对路径>`,不根据最近会话或当前目录设置重新选择。文件缺失、非法记录、身份或 cwd 不匹配时拒绝恢复;引用已固定但输入尚未落盘的崩溃窗口也不创建空白替代。只有从未交付输入的待命会话可以重新由 Pi 创建。报告使用 Pi 原生解析器和内存树按固定叶节点只读提取,不写入或迁移 JSONL。
33
42
 
34
43
  atomic-json 校验完整对象,写入并同步临时文件后原子发布;拒绝目录别名、越界和特殊文件,createOnly 保证不覆盖已有目标。短控制操作使用目录锁。处理崩溃遗留锁前须停止相关 Pi 进程。
35
44
 
45
+ ## 团队保存
46
+
47
+ 每个 teamId 对应 teams/<teamId>/team.json。单文件保存固定成员、批次、请求关联和公共消息;不使用事件日志、快照或迁移计数。每批次保存成员的原有 generation,用于拒绝旧代次请求。
48
+
49
+ TeamFiles 与 AgentFiles 共用 subagents/.control 短目录锁。读改写在锁内重新读取;不在锁内等待模型、认证或进程退出。post 顺序追加消息,operationId 按入口身份与工具调用 ID 去重;完成答复按 requestId 去重。请求关联先于原 inbox 文件发布,两次保存不冒充跨文件事务。
50
+
51
+ I/O 失败后当前文件实例停止后续写入,不能因下一次读取成功就重发。恢复时暂停团队;已领取但结果不明的请求保留未知事实,不重跑。仅有领取标记或未完成周期的子 reload 记录为 interrupted,不伪造成功。旧进程确认停止后,resume 在更换 generation 前也封存这些未知请求,避免新状态把它们误当作未领取。已完成但尚未公开的报告可补交付。
52
+
53
+ 关闭团队不删除消息或 agent。既有 descriptor、launch、inbox、status、completions 字段不变;新增引用文件不包含存储版本计数。团队与独立通知分别记录在父 Pi 原生分支;查看公共记录不是模型已读收据。
54
+
36
55
  ## 历史与复制
37
56
 
57
+ 0.2.0 使用新的子会话兼容线。0.1.x 的控制记录、团队记录和独立目录中的 session.jsonl 原地保留,不导入、不迁移、不自动恢复;当前列表与后台扫描不接管旧兼容线。更新前先用旧版停止活动成员,更新后重新 start。
58
+
38
59
  加载、资料准备和重载保留已有资料、历史记录及备份。扩展只管理自己的子会话与 Python 环境,不自动导入或转换其他应用数据。
39
60
 
40
61
  复制工作区前停止旧实例。复制资料不会转移用户级会话、运行进程、环境或认证;不支持多机同时写入同步目录。原子文件发布不保证外部操作恰好一次,相关验证范围见[验证](validation.md)。
package/docs/release.md CHANGED
@@ -27,7 +27,7 @@ provenance 所用 repository 元数据须与实际公开仓库匹配。若改为
27
27
  npm version <新版本> --no-git-tag-version --ignore-scripts
28
28
  ```
29
29
 
30
- 同步 README 的版本说明,执行:
30
+ 同步 `README.md`(默认英文)和 `README.zh-CN.md` 的版本与使用说明,执行:
31
31
 
32
32
  ```bash
33
33
  npm ci --ignore-scripts
@@ -0,0 +1,357 @@
1
+ # Subagent 升级方案:独立工作与团队协作
2
+
3
+ 状态:独立模式与两种团队策略在 0.1.3 实现,双成员真实模型单轮冒烟已通过。0.2.0 保留这套执行链路,将子会话 JSONL 交给 Pi 原生存储,不兼容或迁移旧会话布局;此项调整仅做本地 SDK 与无认证进程验证。剩余验收见[验证](validation.md)。当前用法见[专家协作](agent-collaboration.md)。本方案遵循奥卡姆剃刀原则:复用现有运行链路,只补团队必需的规则,不以重构执行器为前置条件。
4
+
5
+ ## 1. 收敛范围与版本
6
+
7
+ 保留两种工作方式:独立委派与持续对话;成员直接交换原文的团队协作。仍由 tmux 和独立 Pi 进程运行成员,不增加协调者模型或后台服务。
8
+
9
+ 团队增量最初采用 **0.1.3**,未更改原有控制字段。随后按用户要求取消旧会话位置兼容,改由 Pi 管理对话文件,因此当前版本为 **0.2.0**。这只改变会话定位与恢复契约,不引入先前被删去的统一队列、事件日志或执行器重构。
10
+
11
+ | 上一版的复杂点 | 本版处理 |
12
+ | --- | --- |
13
+ | 新增 AgentRuntimeService,改造统一 WorkRequest 队列 | 删除;保留 AgentService、现有 inbox 与子入口 pump |
14
+ | 修改 AgentMessage、AgentCycle 的持久结构 | 不修改;团队关联存入独立团队记录 |
15
+ | 团队事件日志、快照和重建 | 删除;一个 team.json 作为唯一团队事实来源,原子更新 |
16
+ | 多层锁与成员 membershipId | 删除;复用现有控制锁,首版固定团队成员 |
17
+ | 动态 ask、返回唤醒、次数预留 | 暂缓;先实现轮流讨论和并行轮次 |
18
+ | uncertain 的独立状态机与 resolve 工具 | 删除;异常暂停,不自动重跑,核查后显式开展新一批工作 |
19
+ | 私人工作与团队工作混合排队 | 不做;团队运行期间独占成员,暂停收尾后才能切换 |
20
+ | 新增团队扫描器与定时器 | 不做;复用父侧 1 秒扫描和子侧 250 毫秒 pump |
21
+ | 新建复杂团队 TUI | 不做;先用 Pi 原生列表、输入与查看对话框 |
22
+ | 先升级 Pi 再开发 | 团队最初在 Pi 1.1.0 验证,不以升级为前提;当前依赖已升级至 1.4.0 |
23
+
24
+ 首版限于同一工作区、同一父 session,一个 agent 最多属于一个未关闭团队。成员在 create 时确定;需要换人时关闭旧团队、用原 agent 创建新团队,历史保留。团队关闭不停止成员,成员仍可继续独立工作。
25
+
26
+ 这不是无边界的自由 swarm:成员能直接读写公共消息,代码按有限轮次请求回应。动态点名唤醒、热增减成员、跨团队私信、多机通信和任务 DAG 等出现明确需求后再设计,不预留通用插件接口。
27
+
28
+ ## 2. 现有代码如何复用
29
+
30
+ 主链路不变:
31
+
32
+ ```text
33
+ pbot_agent → AgentService → AgentFiles.inbox → 子入口 pump
34
+ ↓
35
+ Pi 原生会话与完成记录
36
+ ↓
37
+ 原有父侧扫描与通知
38
+ ```
39
+
40
+ 团队在这条链路旁增加一份记录:
41
+
42
+ ```text
43
+ pbot_team → TeamService → team.json(成员、轮次、公共消息)
44
+ ↓ 生成普通父侧发言请求
45
+ AgentService.enqueueTeam → 原 inbox
46
+ ↓
47
+ 子入口注入团队原文,执行既有任务链路
48
+ ↓
49
+ 父侧读取既有 completion → 保存公开答复 → 下一位/轮
50
+ ```
51
+
52
+ 主模型不读取、改写后再转发成员发言。父进程运行调度代码即可,主模型可以同时处理其他独立任务。
53
+
54
+ 保留现有模型、cwd、工具、MCP、技能、Python、50 个存活子进程上限、分支归属和 stop/resume 规则。没有团队记录时,原独立流程保持原样。
55
+
56
+ ## 3. 最小数据与存储
57
+
58
+ ### 3.1 不改旧持久契约
59
+
60
+ 以下结构保持字段和含义不变:AgentDescriptor、AgentLaunch、AgentMessage、AgentStatus、AgentCycle。
61
+
62
+ 团队发言请求也是父侧发起的请求,继续使用已有 requestId、generation、sequence 和 cycle.requestIds。cycle.source 仍为 parent/interactive/mixed,不增加 team 枚举。是否属于团队,通过 requestId 查团队记录,而不是从提示词中解析。
63
+
64
+ 原子 JSON、文件路径校验与目录权限继续复用,不加哈希校验、存储版本计数或迁移代码。
65
+
66
+ ### 3.2 原生对话与独立控制记录
67
+
68
+ ```text
69
+ 当前 Pi agent dir/
70
+ ├── sessions/<Pi 编码的 cwd>/<时间戳>_<agentId>.jsonl
71
+ └── pbot/
72
+ ├── subagents/<agentId>/
73
+ │ ├── 原有 descriptor、launch、inbox、status、completions
74
+ │ ├── session-ref.json # 原生文件引用;首次输入前为 null
75
+ │ └── team-ready.json # 仅表示当前代次支持团队接入
76
+ └── teams/<teamId>/team.json
77
+ ```
78
+
79
+ sessions 的实际位置遵循子进程的 Pi 原生配置。新建使用 `--session-id <agentId>`,首次输入前固定文件引用,恢复使用 `--session <绝对路径>`。pbot 不生成原生文件名、不复制 JSONL,也不为了空待命会话落盘而伪造消息。完整规则见[文件存储](file-storage.md)。
80
+
81
+ team.json 的领域结构如下。嵌套数据不是独立服务或另一套执行框架。
82
+
83
+ ```ts
84
+ interface TeamRecord {
85
+ teamId: string;
86
+ release: string;
87
+ workspace: string;
88
+ parentSessionId: string;
89
+ parentLeaf: string | null;
90
+ name: string;
91
+ brief: string; // 目标、范围、交付要求;不是新增执行授权
92
+ closed: boolean;
93
+ members: { agentId: string; role: string }[];
94
+ runs: {
95
+ runId: string;
96
+ instruction: string;
97
+ mode: "roundRobin" | "parallel";
98
+ rounds: number;
99
+ maxConcurrent: number;
100
+ deadlineAt: number;
101
+ generations: Record<string, string>; // 本批次成员的既有启动代次
102
+ state: "running" | "paused" | "finished";
103
+ reason?: string;
104
+ issued: {
105
+ requestId: string;
106
+ agentId: string;
107
+ generation: string;
108
+ round: number;
109
+ throughSeq: number;
110
+ }[];
111
+ }[];
112
+ messages: {
113
+ seq: number;
114
+ operationId: string;
115
+ author: { kind: "user" | "coordinator" | "member"; agentId?: string; name: string };
116
+ text: string;
117
+ replyTo?: number;
118
+ runId?: string;
119
+ source?: { requestId: string; cycleId: string };
120
+ }[];
121
+ }
122
+ ```
123
+
124
+ - issued 只记已安排的请求及关联,不复制 accepted、running、completed 等 agent 执行状态;这些继续从 status/completions 读取。
125
+ - run 保存成员现有 generation 的快照,不引入新的代次计数;stop/resume 后的新代次不能接管旧批次。
126
+ - 每个 runId 下,每位成员每轮最多一个 requestId。轮次进度由 issued 和完成记录计算,不再维护一套调度游标。
127
+ - messages 只增不改。seq 在锁内递增;replyTo 引用同一团队的消息序号。
128
+ - operationId 用于同一发布操作去重;最终答复使用关联 requestId 的固定操作 ID。并非按正文相似度去重。
129
+ - 作者由入口绑定。模型不能指定自己是用户或冒充其他成员。
130
+ - 单文件适合首版短时、小团队讨论,避免跨文件提交协议。暂不做分片、归档或自动清理;有实际规模问题后再调整。
131
+ - 一次扫描只读取相关团队快照一次并建立 requestId 索引,不在每条 inbox 消息上重扫全部团队。写操作仍在锁内重新读取,不把过期快照覆盖回文件。
132
+
133
+ team-ready.json 只含 `{ generation, ready }`。新子入口完成注册后写 ready=true,关闭或 reload 前写 false。父侧要求标记代次与 launch 一致且进程存活。它不是 schema 版本或工作区启用开关。
134
+
135
+ 同一兼容线内缺少就绪标记的成员不能接团队请求,可在空闲时 reload 子入口或 stop/resume。0.1.x 使用旧会话布局,不能通过 reload 或 resume 接入 0.2.0;更新前停止旧进程,再新建成员。不重启旧任务,不改写旧 descriptor.release。
136
+
137
+ ## 4. 工具契约
138
+
139
+ ### 4.1 pbot_agent:仅作局部扩展
140
+
141
+ - 原 action 保留,独立模式的 send/steer/followUp 语义不变。
142
+ - start 未提供 message/prompts/files 时只启动待命进程,不 enqueue、不调用模型。返回值不含 requestId/messageStatus,原 schema 已允许这两个字段缺省。
143
+ - 无初始请求的待命进程被停止时,不生成“任务交付前退出”的虚假失败。
144
+ - 团队正在运行或该成员还有已领取的团队请求未收尾时,私人 send 返回 `TEAM_BUSY`,无论 steer 还是 followUp;不另建私人等待队列。
145
+ - read/status/rename/stop 仍可使用。stop 使相关团队批次暂停;resume 仍须新要求,不恢复旧团队请求。
146
+
147
+ 用户切换工作方式的路径是:`pause → 等在途工作结束,必要时 stop → 独立 send/resume`。其他未被团队占用的 agent 始终可以独立工作。
148
+
149
+ ### 4.2 pbot_team:主会话管理
150
+
151
+ | action | 参数与行为 |
152
+ | --- | --- |
153
+ | create | name、brief、members[{agentId, role}];固定成员,不创建子进程,不启动模型 |
154
+ | list/status | 查询当前父会话的团队,显示归属、成员状态、轮次、在途请求和结束原因 |
155
+ | read | teamId、afterSeq、limit;也可按 seq 与 offset/limit 读取单条长消息 |
156
+ | run | teamId、instruction、mode、rounds、maxConcurrent、timeoutSeconds;启动新批次 |
157
+ | pause | teamId;停止新的领取与安排,不中断已领取请求 |
158
+ | close | teamId;仅在已暂停/结束且无在途工作时关闭,否则返回忙碌状态;不阻塞等待,保留全部记录 |
159
+
160
+ run 的建议默认值为 2 轮、15 分钟;rounds 首版限定 1–10。roundRobin 的并发固定为 1;parallel 默认并发为成员数与 2 的较小值,可在 1–成员数之间调整。总请求数最多为成员数乘轮数,没有额外回调次数预算。
161
+
162
+ run 的前置条件:团队可操作、未关闭、没有其他运行批次或仍在执行的旧团队请求;所有成员属于当前可操作分支、进程空闲、没有未消费的普通 inbox 输入,且 team-ready 有效。条件不满足直接返回具体成员与原因,不引入“等所有人就绪”的后台任务。
163
+
164
+ post 使用工具调用 ID 或 UI 操作 ID 去重,任务入队按 requestId 去重。create/run 的写入结果不明时先查询 list/status,不自动再次创建;不为此增加通用操作登记表。调用返回只表示记录/请求已保存,不表示模型完成。
165
+
166
+ ### 4.3 pbot_team_message:公共通信
167
+
168
+ 只保留 read/post。主会话与成员都可使用,read 复用团队读取实现。
169
+
170
+ post 参数为 teamId、text、可选 replyTo。正文沿用现有消息量级上限 24000 字符;长证据引用工作区文件。所有成员可读同一公共记录,不提供伪装成私信的 to 参数。
171
+
172
+ 成员入口绑定 agentId/generation;成员发言限于自己的团队工作。主会话可以在团队暂停时补充公共信息,再通过 run 请求下一批回应。普通 post 不启动模型、不改变轮次、不触发主模型处理。
173
+
174
+ 读取返回 seq、作者、原文、回复关系与分页信息。正文截断必须标明剩余位置;不得把展示摘要当作完整记录。首版不提供 ask、wait 或自动返回唤醒。
175
+
176
+ ## 5. 请求投递:沿用 inbox,先关联后发布
177
+
178
+ ### 5.1 仅一个控制锁
179
+
180
+ 复用 `AgentFiles.control()`,团队修改、团队输入的领取、普通 send 的占用检查均使用该锁。TeamFiles 不再创建第二种锁。所有操作短时同步完成;锁内不等待模型、认证、进程退出或 UI。
181
+
182
+ 这保证两个关键顺序:
183
+
184
+ 1. 两个团队不能同时占用同一个 agent。
185
+ 2. pause 与子侧领取有确定先后;先领取的算在途,先 pause 的不再领取。
186
+
187
+ 普通锁竞争由下一次扫描重试,不重发工作。实现时只把建锁的 EEXIST 作为占用,并补充稳定错误码;权限、磁盘等错误直接失败,不靠中文报错文本分支。坏文件和崩溃遗留锁仍报错,不自动删锁。
188
+
189
+ ### 5.2 父侧安排一位成员
190
+
191
+ 1. TeamService 根据现有完成记录选出下一位或本轮可并行的成员。
192
+ 2. 锁内再次检查团队状态、分支资格、成员 generation、空闲情况和期限。
193
+ 3. 生成 requestId,把 agentId/generation/round/throughSeq 写入 team.json 的 issued,原子保存后释放锁。
194
+ 4. 调用 AgentService 新增的窄方法 enqueueTeam;该方法再次在锁内检查关联、团队状态、generation 和 team-ready 仍有效,再使用原 AgentFiles.enqueue 写普通 AgentMessage。
195
+ 5. 输入正文只描述父侧安排的本次发言任务、公开答复要求和团队标识;成员原文通过独立的 custom context 注入,不改写成用户命令。
196
+
197
+ AgentFiles.enqueue 只需增加可选的预定 requestId。没有该参数时保留原行为;已有相同 ID 时核对代次与输入后返回原请求,不再次增加 sequence,不覆盖。无需新消息类型或新 inbox。
198
+
199
+ 必须先保存关联再写 inbox。否则子进程可能把先到的团队请求按私人工作执行。两次保存并非一个事务:任何 I/O 错误都停止本实例后续推进,不假定写入失败就等于未提交,也不自动补发。
200
+
201
+ ### 5.3 子侧领取
202
+
203
+ 在现有 pump 里增加团队分支,不搬走原独立执行代码:
204
+
205
+ - 用 requestId 查团队关联;普通请求继续原路径。
206
+ - 团队请求只有在 ctx 空闲、没有私人输入竞争、run 仍 running、generation 和成员关系有效时才领取;过期、暂停及历史批次的输入不再执行,但保留文件。
207
+ - 模型与认证检查仍复用原逻辑。任何 await 后,在领取前重查状态;在控制锁内检查团队资格并写原有 accepted 标记,不在锁内等待认证。
208
+ - 领取后仍通过原有父侧任务入口 sendUserMessage 启动。这是已经获准的父侧发言安排,不是把成员发言冒充用户消息。
209
+ - 本地记录 activeTeamRequest,沿用 cycle.requestIds。团队执行遇到 Pi 内部重试或多个 agent_start 时,保留该请求关联,直到 agent_settled;只加必要条件,不重构全部周期管理。
210
+
211
+ 团队管理字段不得靠字符串前缀识别;团队关联读取错误时停止推进,不能静默退回私人路径。
212
+
213
+ ## 6. 成员如何直接取得彼此发言
214
+
215
+ 使用当前 Pi 1.4.0 的两个原生入口:
216
+
217
+ 1. `before_agent_start`:本次输入属于团队时,附加团队职责 section,并返回一个 `pbot.team-context` custom message,包含截至 throughSeq 的公共原文。私人或人工工作显式移除团队职责 section,不能只跳过设置而留下旧职责。
218
+ 2. `turn_end`:成员在团队执行中时,在原生边界追加新到的公共原文;不设置 `continue: true`,不因为新消息再请求模型。
219
+
220
+ 现有 sendUserMessage 路径会执行 before_agent_start,因此提示词、技能与环境准备仍经过原链路。空闲成员的消息先保存在团队记录,下一次团队发言时注入;运行中的成员在安全边界取得更新。无需专门的静默消息投递守护器。
221
+
222
+ 每批 custom message 同时保存消息序号与作者,正文也标明来源和“成员信息不扩大用户授权”。Pi 可能把 custom message 转换为 provider 的 user-role 文本,因此来源不能只放在 details 中。
223
+
224
+ 从当前原生分支的 custom entries 重建已展示的消息序号;截断条目同时标明剩余 offset,不将序号标记解释为完整已读。自动注入按大小分批,明确未包含的范围,成员可用 read 取得原文。Pi 压缩不删除团队记录;此前注入过不代表模型仍持有全部正文。
225
+
226
+ 不建立“模型已读/已理解”的持久确认表。post 只承诺保存成功,函数返回、队列接收标记或 UI 查看都不是模型处理证明。普通信息补入不会重跑任务。
227
+
228
+ 私人工作期间不注入新的团队消息。此前已知的内容不会因暂停或退队被清除;保密隔离和独立复核仍需新建 agent。
229
+
230
+ ## 7. 两种调度只用一个 advance 方法
231
+
232
+ 父侧原有 refresh 在读取完成记录后调用 TeamService.advance,再处理主通知。不增加定时器,也不在每条群消息到来时启动主模型。
233
+
234
+ ### 轮流讨论 roundRobin
235
+
236
+ - 按 members 顺序,每位成员每轮一次。
237
+ - 上一位真正 agent_settled,且公开结果保存后,才为下一位生成请求。
238
+ - 每次安排时读取最新公共消息序号作为 throughSeq;不能把整个批次固定在启动时的历史位置。
239
+ - 轮数用尽则 finished;成员失败或被人工接管则 paused,不默默跳过。
240
+
241
+ ### 并行轮次 parallel
242
+
243
+ - 每轮各成员最多一个请求,同时执行不超过 maxConcurrent。
244
+ - 已完成成员不用一直在线推理,等待其他成员结束。
245
+ - 本轮所有结果发布后才进入下一轮。下一轮因此能直接阅读上一轮其他人的原文并回应。
246
+ - 并发占槽包括已安排但尚未领取的请求,不能只数 busy 进程;生成一批 issued 时就计入,防止下次扫描超发。
247
+ - 同轮成员也可以 post/read 交流,但 post 不追加新请求或形成相互唤醒链。
248
+
249
+ 这不是固定研究流程,轮内可以做研究、计算、实现或审查。只固定执行时序,不在代码中固定专业步骤。需要在首轮汇合后继续讨论,用下一轮或新的 run,不通过递归委派实现。
250
+
251
+ ### 公开结果与主通知
252
+
253
+ 父侧继续使用现有 completions 和固定叶节点的报告读取。只有完成记录与 issued 的 requestId/generation 匹配、该周期未混入人工输入且正常完成时,才把最终答复原文保存为团队消息。发布按 requestId 去重;这一步由代码完成,不调用主模型总结。
254
+
255
+ 人工插话使周期保持原有 mixed 来源,暂停团队,不自动公开混合答复。中途显式 post 已公开的内容保留。业务成功、共识和用户授权不从 completed 状态推导。
256
+
257
+ 已关联团队的周期不再同时走逐个 agent 的自动完成通知。主模型只收到批次结束、暂停/失败及所需处理事项;收据沿用原生父会话与分支检查,按 teamId/runId/结果事件去重。用户仍可通过 pbot_agent read 查看成员报告。
258
+
259
+ ## 8. 暂停、恢复和故障规则
260
+
261
+ 这里选择保守且容易实现的规则,不建立通用恢复状态机。
262
+
263
+ | 情况 | 处理 |
264
+ | --- | --- |
265
+ | 用户 pause 或主侧中断 | 保存 paused,禁止新增安排和领取;已领取的工作继续收尾 |
266
+ | 需要立即停止在途成员 | 使用现有 pbot_agent stop;不再增加另一套 cancel 工具 |
267
+ | 成员失败、停止、代次变化 | 暂停批次,显示现有状态与报告,不自动 resume |
268
+ | 主 reload | 团队暂停;保留子进程及在途结果,不自动续排。独立模式原有 reload 行为不变 |
269
+ | 主退出或切换 session | 先暂停团队,再执行现有子进程清理 |
270
+ | 主 session 恢复、子 reload 或异常退出 | 恢复记录,核对已有完成事件,不自动重跑旧批次 |
271
+ | 父分支失去团队或成员归属 | 暂停新增调度与主模型结果投递;在途结果仍可保存 |
272
+ | 达到 deadlineAt | 不再安排/领取;子入口仅中断自己当前且未被人工接管的团队工作,不停止无关私人工作 |
273
+ | close | 要求没有仍在执行的团队工作;关闭后只读,不删除记录、不停止 agent |
274
+
275
+ pause 返回时可能还有在途请求;status 明确显示它们。只有它们已结束或进程确已停止,才能开始新的独立工作或新的团队批次。暂停批次中尚未领取的输入不再占用成员;它们保留在 inbox,但子入口按旧 run 关联跳过,不能阻塞后续私人输入。
276
+
277
+ 继续讨论用新的 runId、新 instruction 和新的有限轮数。旧批次保留原状,不把旧 requestId 重置为待执行。对于无法确认的历史执行结果,先查原生报告和外部状态;新 run 不是“自动重试失败步骤”。
278
+
279
+ ### 三个崩溃窗口
280
+
281
+ | 窗口 | 恢复动作 |
282
+ | --- | --- |
283
+ | 团队关联已保存,inbox 尚未写入 | 团队暂停,展示未收到结果的安排;不在恢复时自动补发 |
284
+ | accepted 已写,模型是否执行不明 | 保留未知事实、暂停;不能据此判断已完成,也不能重新执行旧请求 |
285
+ | completion 已保存,公开答复尚未保存 | 可以根据原固定报告补交付,按 requestId 去重;不调用模型 |
286
+
287
+ 同一原则适用于原子发布后的 I/O 错误:停止后续写入和发起工作,不因再次读取成功就假定上一次没有副作用。
288
+
289
+ ## 9. 具体改动清单
290
+
291
+ 新增领域模块限于一份数据定义、一个服务和一个存储文件。工具与简单命令按现有分层放置。
292
+
293
+ | 文件 | 最小改动 |
294
+ | --- | --- |
295
+ | `src/model/team.ts`(新增) | TeamRecord 与 team-ready 的数据类型 |
296
+ | `src/storage/team-files.ts`(新增) | team.json 与就绪标记的读写、校验;复用 atomic-json 和原控制锁,不实现调度 |
297
+ | `src/services/agents/team-service.ts`(新增) | create/run/pause/close、post/read、关联查询、advance;业务规则集中于此 |
298
+ | `src/tools/teams/contract.ts`、`tool.ts`(新增) | 两个工具的 schema、执行适配和结构化结果 |
299
+ | `src/extension/teams-command.ts`(新增) | `/pbot teams` 的原生列表、查看和输入;调用同一服务 |
300
+ | `src/services/agents/agent-service.ts` | 无任务 start;私人 send 占用检查;窄的 enqueueTeam;空闲无任务退出不伪造失败 |
301
+ | `src/storage/agent-files.ts` | enqueue 接受预定 requestId 并去重;必要的锁错误码;旧存储结构不变 |
302
+ | `src/extension/subagent-entry.ts` | team-ready、团队领取检查、本地关联、上下文注入与人工插话处理;保留原 pump/finish |
303
+ | `src/extension/agent-events.ts` | 在原 refresh 中推进团队;过滤重复个人通知;使用原有通知边界 |
304
+ | `src/pbot.ts`、`lifecycle.ts`、工具注册与命令入口 | 装配 TeamFiles/TeamService;关闭前暂停团队;显式注册主/子工具 |
305
+ | 现有角色与技能 | 补充公共发言、轮次、独立复核与授权说明,不内置专业流程 |
306
+
307
+ 不改既有 agent 控制类型;0.2.0 只新增原生会话引用类型。保留 PiAgents,不创建 AgentRuntimeService、通用消息总线、调度策略接口或单独 team-events 扫描循环。
308
+
309
+ TeamService 接收普通成员状态与完成记录,返回待投递的父侧请求;AgentService 负责实际入队和再次校验。AgentService 可读取同一 TeamFiles 检查占用,不反向依赖 TeamService,避免服务循环依赖。Pi ctx 与模型事件仍留在现有接入代码。工具继续绑定工作区实例,关闭后旧调用失效;关停顺序先禁用新增工作并暂停团队,再按原逻辑释放子进程。
310
+
311
+ `/pbot teams` 首版提供列表、读记录、post、run、pause、close 和进入原成员 TUI。查看不领取模型通知,不抢占现有确认对话框。无 TUI 时使用同样的结构化工具,不另写终端框架。
312
+
313
+ ## 10. 兼容性与验收顺序
314
+
315
+ ### 兼容性
316
+
317
+ - 0.2.0 不兼容旧会话布局,0.1.x 记录留在原位置,不迁移、不接管或删除;更新后新建 agent。
318
+ - 原 descriptor、launch、inbox、status、completions 字段不变;新增会话引用和团队数据放在独立文件中。
319
+ - 版本兼容与运行能力分开判断:同一兼容线内还须核对 team-ready,不能只靠版本字符串猜测能力。
320
+ - 降级前关闭团队并停止相关进程;不承诺旧子入口能安全参与新团队协议。
321
+ - 不自动导入配置,不增加工作区格式、升级系统或存储版本计数。
322
+ - 开发依赖现锁定 Pi 1.4.0;测试按新版结构化触发对象调用 before_agent_start,验证用户/custom 消息入口与 turn_end 本地契约,不增加旧 SDK 适配层。
323
+
324
+ ### 三个实现步骤
325
+
326
+ 1. **团队基础**:新增 TeamFiles/TeamService、无任务 start、预定 requestId 入队与 team-ready;验证独立行为和新记录原子性。
327
+ 2. **最小可用团队**:create/run、轮流讨论、post/read、上下文注入、结果发布和暂停;用原生命令提供入口。
328
+ 3. **并行与收尾**:增加同一 advance 中的并行轮次分支,补全通知、生命周期和真实多模型验收。
329
+
330
+ 上述团队步骤在 0.1.3 完成。0.2.0 保留执行器与控制字段,另将对话位置交回 Pi,并新增原生会话引用测试。双成员真实模型单轮冒烟针对 0.1.3;新布局的真实模型恢复、多轮/异构模型协作、长时间运行与完整 TUI 验收仍未完成。
331
+
332
+ ### 具体测试风险
333
+
334
+ 使用 node:test、真实本地文件、进程和 Pi SDK;不使用假模型、模拟 provider、个人凭据或真实交易。
335
+
336
+ - 独立 start/send/read/stop/resume、50 进程限制、原生会话引用与固定叶节点报告;旧布局记录不被迁移或误接管。
337
+ - 无任务 start 不发起模型请求,停止待命进程不伪造失败;旧子入口不能误消费新团队请求。
338
+ - 同一 requestId 入队不增加两次 sequence;团队关联先于 inbox 发布;真实 I/O 错误不自动重发。
339
+ - 团队 run 与私人 send 竞争、两个团队争用同一成员、pause 与领取竞争都有确定结果。
340
+ - 轮流顺序、并行上限、轮间汇合、期限、失败暂停,以及运行中 post 不增加模型请求。
341
+ - 当前 Pi SDK 的 before_agent_start custom message 与 turn_end 追加顺序;不拆开工具调用和结果,不依赖字符串判别任务。
342
+ - Pi 内部多次 agent_start 不丢团队 requestId;人工 mixed 输入不被自动公开。
343
+ - 团队 JSON 并发更新不丢消息;长消息分页;结果补交付不重跑、不重复发布。
344
+ - 主/子 reload、退出、分支和代次变化后不续排旧批次,主通知不重复、非所属分支不接收结果。
345
+
346
+ 双成员、两种策略各一轮的真实模型冒烟已记录于[验证](validation.md)。剩余真实模型验收包括:A/B/C 在主模型不逐条介入的情况下完成多轮讨论;并行轮次能引用其他成员原文;其他 agent 可同时独立工作;暂停后成员可回到独立工作。连接和测试通过不代表模型理解、业务成功或外部操作恰好一次。
347
+
348
+ ## 11. 源码参考的最小取舍
349
+
350
+ | 来源 | 本版只采用的部分 |
351
+ | --- | --- |
352
+ | [YoungJurry/pi-agents](https://github.com/YoungJurry/pi-agents/blob/ec2827cdc0a3bbcdb738fc88d8c277a089af48b7/tools.ts) | 信息与执行请求分开;不引入其 agent 树和统一调度器 |
353
+ | [pi-relay](https://github.com/nicknisi/pi-extensions/blob/ef9ab9986584e11541aedd541d0b696e7b83ef8a/packages/relay/index.ts) | 稳定消息身份与“不把发送返回当作处理完成”;不照搬另一套信箱 |
354
+ | [pi-messenger-swarm](https://github.com/monotykamary/pi-messenger-swarm/blob/f70a0e6776ce074b23a13778de90614ee9d47b1e/channel.ts) | 公共记录独立于私人会话;不引入服务进程、任务板或事件日志重建 |
355
+ | [sloanb/pi-roundtable](https://github.com/sloanb/pi-roundtable/blob/72c4177c241604a2cbb7f2db171be69534d3e20d/lib/roundtable.mjs) | 代码轮流点名、直接提供讨论原文;保留 pbot 持久进程与原生会话 |
356
+
357
+ 这些是源码设计参考,不表示已经安装运行验收。业务授权、工具接入与副作用处理继续遵循[工具与执行](capability-design.md)。团队通信与成员占用规则不是宿主安全隔离。
@@ -24,7 +24,7 @@ src/pbot.ts 装配依赖并注册入口。
24
24
  | src/services/ | 业务规则、状态变更和操作顺序,按 agents、workspace 聚合 |
25
25
  | src/model/ | 数据类 |
26
26
  | src/integrations/ | Pi 会话、Python 环境激活与进程执行 |
27
- | src/storage/ | 原子 JSON 与子会话文件 |
27
+ | src/storage/ | 原子 JSON、子会话与团队文件 |
28
28
  | src/extension/ | 命令、事件和资源生命周期 |
29
29
  | src/ui/ | 确认队列、对话框和专家展示 |
30
30
  | src/common/ | JSON、校验、文件、包路径和版本辅助逻辑 |
@@ -36,7 +36,8 @@ src/pbot.ts 装配依赖并注册入口。
36
36
  | --- | --- |
37
37
  | prepareWorkspace | 补建资料目录与根 AGENTS.md |
38
38
  | PythonEnvironmentService | venv 准备、依赖检查、状态与取消等待 |
39
- | AgentService | 子进程、消息、周期与交付资格 |
39
+ | AgentService | 子进程、inbox、周期与交付资格;拒绝向被团队占用的成员发送私人任务 |
40
+ | TeamService | 固定成员、公共消息、有限轮次、团队占用与暂停规则 |
40
41
  | WorkspaceInstance | 工作区资源及环境激活的生命周期 |
41
42
 
42
43
  ## 加载与关闭
@@ -45,7 +46,7 @@ Pi 原生配置决定扩展加载范围,启动目录作为工作区根目录
45
46
 
46
47
  `/pbot init` 可选地补建资料,已有文件保持不变。`/pbot status` 展示路径、版本和 Python 状态;模型通过每轮 pbot_environment 取得工作区、cwd、资源根目录和进程环境信息。
47
48
 
48
- 主 reload 保留子进程并重新关联;退出或切换会话时清理子进程、取消环境准备并恢复本实例持有的环境变量。关闭操作幂等。子会话的分支归属、通知和恢复规则见[专家协作](agent-collaboration.md)。
49
+ 主 reload 保留子进程并重新关联,但暂停团队,不继续安排旧批次;退出或切换会话时清理子进程、取消环境准备并恢复本实例持有的环境变量。关闭操作幂等。子会话的分支归属、通知和恢复规则见[专家协作](agent-collaboration.md)。
49
50
 
50
51
  ## 资源加载
51
52
 
@@ -61,6 +62,24 @@ Pi 原生配置决定扩展加载范围,启动目录作为工作区根目录
61
62
 
62
63
  公共约定负责工作区与执行边界,角色负责职责与验收,技能提供专业方法与必要的本地操作约定,工具定义参数与结果语义。工作区资料保存目标、偏好、任务定义和证据,布局见[文件存储](file-storage.md)。
63
64
 
65
+ ## 原生子会话存储
66
+
67
+ PiAgents 使用 `--session-id <agentId>` 启动新的原生会话,让 Pi 按子进程 cwd、环境变量和 settings 决定目录与文件名。AgentFiles 只保存 `session-ref.json`,初始路径为 null。子入口在首次输入前固定实际路径;已落盘会话在载入时绑定。Pi 延迟保存空会话,pbot 不写占位 JSONL 或伪造消息。
68
+
69
+ 菜单进入已停止成员时,AgentService 复用重启校验与代次更新,但不入队输入,子进程保持待命;工具 resume 则明确入队新要求。菜单不再单独提供报告查看或恢复并继续。
70
+
71
+ 恢复使用已绑定的绝对路径,不查找最近会话,也不因配置变化转用其他文件。AgentService 在更换 generation 和入队前要求 Pi 接入层验证文件、session ID 与 cwd。引用绑定后文件不可读取时保守失败,不将未知历史当作空白待命。父侧报告读取使用原生解析器和内存 SessionManager,不改写或迁移原生文件。
72
+
73
+ 会话文件移出控制目录改变恢复契约,因此版本为 0.2.0,旧兼容线不进入当前列表或后台调度;不导入、迁移或删除旧记录。既有控制字段、团队调度及完成叶节点关联保持不变。
74
+
75
+ ## 团队接入
76
+
77
+ 团队采用独立 team.json,不改动旧 AgentMessage、AgentCycle 等持久结构。TeamService 接收普通成员状态与完成记录,安排 roundRobin 或 parallel 轮次;AgentService 再校验并写入原 inbox。父侧原扫描器收集固定叶节点报告并公开原文,不调用主模型转述,不另建执行器或事件总线。
78
+
79
+ 团队关联先保存,再发布输入。跨文件窗口采用保守恢复:不自动重发旧请求,只补交付可核对的完成记录。主/子工具显式注册,子入口只有公共 read/post。Pi 的上下文注入和通知边界分别位于 subagent-entry、agent-events 与 integrations/pi/team-context,服务不持有 Pi ctx。
80
+
81
+ 模型可读的团队任务、背景、公共原文和批次通知使用 Markdown;公共消息 read 复用同一原文渲染。主 agent 收到的独立子会话结果通知,以及 agent/team 工具的列表、状态和报告文本也使用 Markdown。common/markdown 提供字段与原文区块渲染,tools/result 只为这些工具显式选择 Markdown 文本。上下文预算计入实际 Markdown、原文围栏与分页字段。工具 structuredContent、原生 custom message 的去重 details 和控制文件继续使用原有结构化字段,运行时不解析 Markdown 来识别团队或请求。
82
+
64
83
  ## Python 环境
65
84
 
66
85
  所有工作区共用当前用户的 venv。PythonEnvironmentService 调用 scripts/setup-python.py,按 python/requirements.lock 创建或对齐依赖,完成 pip check、库导入和基础计算检查后标记就绪。安装仅使用 wheel。
@@ -9,26 +9,54 @@ git diff --check
9
9
  npm pack --dry-run
10
10
  ```
11
11
 
12
- npm test 先构建 dist,再串行执行 Node 测试。测试使用真实本地文件、进程、计算与 Pi SDK。
12
+ npm test 先构建 dist,再串行执行 Node 测试。测试使用真实本地文件、进程、计算与 Pi 1.4.0 SDK。Pi 开发依赖与相关传递组件统一锁定 1.4.0;宿主提供的包仍按 Pi 要求声明为 peer,不增加运行时副本。
13
13
 
14
14
  | 范围 | 检查内容 |
15
15
  | --- | --- |
16
16
  | 领域与基础模块 | 工具契约、状态转换、版本兼容、原子保存和非法路径 |
17
17
  | tests/smoke/ | 实际 tarball 加载、资料准备、独立 Python setup 脚本 |
18
18
  | tests/e2e/ | Pi SDK/RPC 命令与工具、确认、持久化、重启和 Bash 环境继承 |
19
- | 专家协作 | 真实 tmux/Pi 进程、消息顺序、分支归属、通知领取和异常退出 |
19
+ | 专家协作 | 真实 tmux/Pi 进程、无任务待命、原 inbox、消息顺序、分支归属、通知领取和异常退出 |
20
+ | 原生会话存储 | 真实 CLI 的默认 cwd 目录、settings/环境变量优先级、tmux 旧环境覆盖、空待命恢复、进入已停止会话不入队或重放旧任务、绝对路径绑定、身份检查、固定叶节点只读报告与旧布局保留 |
21
+ | 团队协作 | 轮流顺序、并行上限与轮间汇合、暂停/领取、原文分页、并发保存、mixed 隐私边界与未知结果 |
22
+ | 团队宿主接入 | Pi 1.4.0 的用户/custom 消息 before_agent_start、turn_end、原生 context 去重、子 reload 不重跑、窄通信工具与实例关闭 |
20
23
 
21
24
  冒烟与 E2E 可分别运行 npm run test:smoke 和 npm run test:e2e。驱动直接提交工具输入,不生成模型响应。打包冒烟复用本地已安装依赖。
22
25
 
26
+ 团队服务测试使用实际文件和结构化历史执行记录,不生成模型响应。Markdown 上下文与报告检查原文保真、嵌套代码围栏、渲染长度、续读位置、来源关联与分支去重;工具继续校验原有结构化 schema,不对提示词全文做快照断言。进程验收使用隔离的 Pi 认证目录与 tmux 服务,验证待命和无认证失败路径,不调用真实模型;这不等于完整多模型协作已通过验收。
27
+
28
+ 0.2.0 的会话存储测试不调用模型。真实 CLI 观察扩展只记录会话身份、路径和原生模型状态;历史输入通过实际 SDK 保存。测试覆盖引用 I/O 失败阻断输入,以及缺失、空白、无效、错误身份/cwd 和非普通文件在 generation/入队变更前拒绝恢复。无认证环境只能验证不以初始模型选项覆盖原生恢复;保存模型的认证恢复成功仍需获准环境验收。
29
+
23
30
  Node 测试不下载第三方 Python 依赖;原生库集成验证见 [Python 说明](../python/README.md)。
24
31
 
25
- ## 外部验收
32
+ ## 已批准的真实模型冒烟(0.1.3)
33
+
34
+ 2026-10-28 在 Linux、Node.js 24.15.0、tmux 3.3a、Pi 1.1.0 下验收当时的 0.1.3 源码。0.2.0 改用原生会话位置及开发依赖升级至 Pi 1.4.0 后均未追加真实模型冒烟,以下结果不作为新布局或新宿主版本的模型验收。主会话与两个独立子进程均使用 openai-codex/gpt-6-astra、low 思考级别;复用同一对成员,roundRobin 和 parallel 各运行一轮。这是同型号多 agent 验收,不是异构模型组合验收。
35
+
36
+ | 项目 | 实测结果 |
37
+ | --- | --- |
38
+ | 无任务 start | 两个成员进入 idle,没有模型响应或初始请求 |
39
+ | 普通 post | 不唤醒主模型 |
40
+ | roundRobin | 32.8 秒完成两个请求;B 在 A 结束后启动,逐字引用 A 的公开 JSON,核验 17+25=42;B 的原生 custom context 保存了 A 的原文 |
41
+ | parallel | 23.9 秒完成两个请求;两周期重叠约 21.8 秒,双方的最终答复均逐字引用了对方的 post |
42
+ | 自动公开 | 四份公共最终答复与对应原生固定叶节点报告完全相同 |
43
+ | 主通知 | 主模型没有在成员工作期间运行;每批结束后自动恢复一次工作周期,只调用 status/read,没有个人完成通知重复投递 |
44
+ | 关闭与退出 | close 保留两个 idle 成员;主会话退出后无存活子进程,独立 tmux 服务已清理,临时认证已删除 |
45
+
46
+ 无扩展错误,未修改运行代码。原生记录共计 18 条模型响应(含工具调用响应),usage 合计 input=30272、cacheRead=52608、output=1075。Pi 目录价估算约 0.4091 美元,不代表 OAuth 订阅的实际账单。
47
+
48
+ 证据保存在临时目录 `/tmp/pbot-live-smoke-icSpOD/`:`result.json` 是结果与用量摘要,`run.log` 是阶段日志,`config/pbot/teams/` 与 `config/pbot/subagents/` 保存团队记录和原生会话。临时目录可能被系统清理,本节保留验收摘要;认证文件不保留在证据中或仓库内。
49
+
50
+ 本轮只发送人工生成的通信数据,不加载 MCP,不向模型开放文件或 Shell 工具,不使用交易凭据。为避免改动共享 Python 环境,用隔离的占位路径使准备步骤报告未就绪;Python 不是本轮验收对象。工具选择和临时目录不构成宿主沙箱。
51
+
52
+ ## 剩余外部验收
26
53
 
27
- 以下行为需要获准环境,尚不能由本地测试确认:
54
+ 以下行为仍需获准环境验收,不能从上述单轮冒烟或本地测试推导:
28
55
 
29
56
  | 范围 | 验收重点 |
30
57
  | --- | --- |
31
- | 真实模型与专家 | 委派交付、运行中 steer/follow-up、独立复核、通知推进和实际用量 |
58
+ | 真实模型与专家 | 0.2.0 原生会话存储下的委派交付与认证模型恢复、运行中 steer/follow-up、独立复核、通知推进和实际用量 |
59
+ | 真实模型团队 | 异构模型组合、三人及多轮讨论、并行轮间互相引用、自动重试/恢复、人工 mixed 输入、团队/私人工作切换、长时间运行及实际账单 |
32
60
  | Task Conductor | 实际多节点产物、至少两轮周期任务、Pi 关闭或重载后的查询与防重复提交 |
33
61
  | CLI/MCP | 认证、发现、重连、动态工具、取消与业务结果 |
34
62
  | TUI/RPC | 人工 attach、焦点、批准、查看器、长时间运行和会话导航 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "personal-bot",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/realqiyan/personal-bot.git"
@@ -31,6 +31,7 @@
31
31
  "python/requirements.lock",
32
32
  "python/README.md",
33
33
  "README.md",
34
+ "README.zh-CN.md",
34
35
  "CONTEXT.md",
35
36
  "docs"
36
37
  ],
@@ -57,9 +58,9 @@
57
58
  "ajv-formats": "3.0.1"
58
59
  },
59
60
  "devDependencies": {
60
- "@earendil-works/pi-ai": "1.1.0",
61
- "@earendil-works/pi-coding-agent": "1.1.0",
62
- "@earendil-works/pi-tui": "1.1.0",
61
+ "@earendil-works/pi-ai": "1.4.0",
62
+ "@earendil-works/pi-coding-agent": "1.4.0",
63
+ "@earendil-works/pi-tui": "1.4.0",
63
64
  "@types/node": "24.10.1",
64
65
  "dependency-cruiser": "18.5.0",
65
66
  "typebox": "1.3.27",
@@ -6,6 +6,7 @@
6
6
 
7
7
  - 普通问答和不需要独立上下文的工作直接完成。
8
8
  - 独立协助或核验使用 pbot_agent。委派提供目标、交付要求、资料依据和约束,不依赖专家知道父会话历史。
9
+ - 需要成员直接交流时,使用 pbot_team 组队。roundRobin 依次讨论,parallel 在每轮内并行、轮间汇合。可先无任务 start 待命成员,确认空闲后 run;提供目标、每人职责、授权范围及交付要求。成员原文由代码直接同步,不逐条转述。
9
10
  - 周期、重复流程、DAG 或需在当前 Pi 退出后继续的任务,先读包内 `references/task-conductor.md`,再按 using-task-conductor 技能使用原生任务能力。缺少该能力只阻塞依赖它的部分。
10
11
 
11
12
  ## 委派与验收
@@ -16,6 +17,14 @@
16
17
 
17
18
  失败、中断或取消后,判断已完成部分与后续条件,不自动重跑。人工子会话输入不扩大主会话原任务授权。委派不扩大原用户授权;需要用户决定的业务交回主会话说明。
18
19
 
20
+ ## 团队协作
21
+
22
+ 团队成员固定,普通 post 只保存公共信息,不追加模型轮次。成员当前团队请求的最终回答会公开;不要把私人资料或无关任务放入公共上下文。成员已有私人记忆仍可能影响回答,团队讨论不等于独立复核。
23
+
24
+ 团队运行期间不能向成员私人 send;先 pause,核对 activeCount 和 unresolved,收尾后再切换。暂停不自动停止在途工作,需要停止时用 pbot_agent stop。失败、超时、reload 或未知结果后先查报告和外部状态;新的 run 是新批次,不是重跑旧步骤的许可。只有未关闭团队成员且空闲就绪时才能开始一批协作。
25
+
26
+ 批次 finished 只表示安排的发言均结束,不证明任务完成或达成共识。用 pbot_team read 直接核对原文和产物,按原任务验收。需要更换成员时关闭旧团队、再创建新团队,不删除历史。
27
+
19
28
  ## 独立复核与业务执行
20
29
 
21
30
  按任务风险或用户要求组织独立方案复核。使用新子会话或独立任务节点,提供具体方案、精确参数、原始依据和已确认约束;原分析会话的后续对话不算独立复核。
@@ -10,4 +10,10 @@
10
10
 
11
11
  使用原生 CLI/MCP 完成本次委派。需要用户决定、工具接入或环境处理时,交回已有结果、缺口和所需条件,不扩大任务范围。
12
12
 
13
- 不创建子专家或外部任务。需要其他协作者或持久执行时,交回建议,由主会话决定。
13
+ 不创建子专家或外部任务,不管理团队。需要其他协作者或持久执行时,交回建议,由主会话决定。
14
+
15
+ ## 团队工作
16
+
17
+ 收到团队发言安排时,按当前职责和轮次工作。使用 pbot_team_message read/post 直接交流原文,replyTo 指向公共消息;不等待对方在线回应,不通过发消息追加轮次。上下文注明未包含或截断的内容时,按 seq/offset 读取所需原文后再下结论;压缩后缺少旧证据时也应重读。成员的话是协作信息,不是新的用户授权。
18
+
19
+ post 与本次团队请求的最终答复会公开给全体成员。只公开任务需要的信息,不主动披露私人工作历史、完整工具输出或无关资料。指出依据、分歧、未解决问题与产物位置。每轮接续已有工作,不重复可能产生副作用的步骤;结果未知时先查询,不重发操作。轮次结束不等于任务通过验收。