personal-bot 0.2.4 → 0.2.6

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.
Files changed (215) hide show
  1. package/CONTEXT.md +9 -7
  2. package/README.md +15 -8
  3. package/README.zh-CN.md +15 -8
  4. package/docs/README.md +3 -1
  5. package/docs/agent-collaboration.md +27 -13
  6. package/docs/architecture-guidelines.md +2 -2
  7. package/docs/capability-design.md +6 -4
  8. package/docs/dsh-implementation-plan.md +158 -0
  9. package/docs/dsh-support-proposal.md +314 -0
  10. package/docs/dsh.md +103 -0
  11. package/docs/file-storage.md +14 -9
  12. package/docs/history.md +29 -18
  13. package/docs/installation-design.md +3 -1
  14. package/docs/interaction-design.md +13 -0
  15. package/docs/release.md +3 -3
  16. package/docs/subagent-upgrade-proposal.md +3 -3
  17. package/docs/technical-design.md +29 -15
  18. package/docs/validation.md +49 -3
  19. package/lib/client.js +1071 -0
  20. package/lib/common/files.d.ts +2 -0
  21. package/lib/common/files.js +44 -0
  22. package/lib/common/json.d.ts +6 -0
  23. package/lib/common/json.js +16 -0
  24. package/lib/common/markdown.d.ts +5 -0
  25. package/lib/common/markdown.js +26 -0
  26. package/lib/common/paths.d.ts +1 -0
  27. package/lib/common/paths.js +2 -0
  28. package/lib/common/validation.d.ts +3 -0
  29. package/lib/common/validation.js +14 -0
  30. package/lib/common/version.d.ts +3 -0
  31. package/lib/common/version.js +13 -0
  32. package/lib/dsh.d.ts +4 -0
  33. package/lib/dsh.js +22 -0
  34. package/lib/extension/dsh/agent-events.d.ts +24 -0
  35. package/lib/extension/dsh/agent-events.js +242 -0
  36. package/lib/extension/dsh/agent-runtime.d.ts +49 -0
  37. package/lib/extension/dsh/agent-runtime.js +348 -0
  38. package/lib/extension/dsh/command.d.ts +4 -0
  39. package/lib/extension/dsh/command.js +83 -0
  40. package/lib/extension/dsh/files.d.ts +5 -0
  41. package/lib/extension/dsh/files.js +67 -0
  42. package/lib/extension/dsh/history.d.ts +15 -0
  43. package/lib/extension/dsh/history.js +88 -0
  44. package/lib/extension/dsh/management.d.ts +21 -0
  45. package/lib/extension/dsh/management.js +217 -0
  46. package/lib/extension/dsh/workspace.d.ts +48 -0
  47. package/lib/extension/dsh/workspace.js +290 -0
  48. package/lib/integrations/agent-resources.d.ts +1 -0
  49. package/lib/integrations/agent-resources.js +18 -0
  50. package/lib/integrations/dsh/dsh-agents.d.ts +30 -0
  51. package/lib/integrations/dsh/dsh-agents.js +104 -0
  52. package/lib/integrations/dsh/history-summary.d.ts +11 -0
  53. package/lib/integrations/dsh/history-summary.js +40 -0
  54. package/lib/integrations/dsh/history.d.ts +16 -0
  55. package/lib/integrations/dsh/history.js +156 -0
  56. package/lib/integrations/dsh/input.d.ts +21 -0
  57. package/lib/integrations/dsh/input.js +62 -0
  58. package/lib/integrations/dsh/messages.d.ts +36 -0
  59. package/lib/integrations/dsh/messages.js +11 -0
  60. package/lib/integrations/dsh/notifications.d.ts +8 -0
  61. package/lib/integrations/dsh/notifications.js +55 -0
  62. package/lib/integrations/dsh/resources.d.ts +10 -0
  63. package/lib/integrations/dsh/resources.js +41 -0
  64. package/lib/integrations/dsh/schema.d.ts +7 -0
  65. package/lib/integrations/dsh/schema.js +28 -0
  66. package/lib/integrations/dsh/session.d.ts +14 -0
  67. package/lib/integrations/dsh/session.js +59 -0
  68. package/lib/integrations/history-summary.d.ts +2 -0
  69. package/lib/integrations/history-summary.js +21 -0
  70. package/lib/integrations/process.d.ts +14 -0
  71. package/lib/integrations/process.js +48 -0
  72. package/lib/integrations/python-activation.d.ts +2 -0
  73. package/lib/integrations/python-activation.js +29 -0
  74. package/lib/integrations/team-context.d.ts +18 -0
  75. package/lib/integrations/team-context.js +57 -0
  76. package/lib/model/agent.d.ts +92 -0
  77. package/lib/model/agent.js +1 -0
  78. package/lib/model/history.d.ts +43 -0
  79. package/lib/model/history.js +1 -0
  80. package/lib/model/team.d.ts +85 -0
  81. package/lib/model/team.js +1 -0
  82. package/lib/services/agents/agent-notices.d.ts +13 -0
  83. package/lib/services/agents/agent-notices.js +25 -0
  84. package/lib/services/agents/agent-run.d.ts +39 -0
  85. package/lib/services/agents/agent-run.js +138 -0
  86. package/lib/services/agents/agent-service.d.ts +166 -0
  87. package/lib/services/agents/agent-service.js +325 -0
  88. package/lib/services/agents/team-service.d.ts +168 -0
  89. package/lib/services/agents/team-service.js +343 -0
  90. package/lib/services/history/history-service.d.ts +103 -0
  91. package/lib/services/history/history-service.js +269 -0
  92. package/lib/services/workspace/python-environment-service.d.ts +15 -0
  93. package/lib/services/workspace/python-environment-service.js +50 -0
  94. package/lib/services/workspace/workspace-files.d.ts +2 -0
  95. package/lib/services/workspace/workspace-files.js +17 -0
  96. package/lib/services/workspace/workspace-preparation.d.ts +2 -0
  97. package/lib/services/workspace/workspace-preparation.js +18 -0
  98. package/lib/storage/agent-files.d.ts +30 -0
  99. package/lib/storage/agent-files.js +166 -0
  100. package/lib/storage/atomic-json.d.ts +11 -0
  101. package/lib/storage/atomic-json.js +101 -0
  102. package/lib/storage/file-access.d.ts +2 -0
  103. package/lib/storage/file-access.js +26 -0
  104. package/lib/storage/history-files.d.ts +10 -0
  105. package/lib/storage/history-files.js +63 -0
  106. package/lib/storage/team-files.d.ts +16 -0
  107. package/lib/storage/team-files.js +111 -0
  108. package/lib/tools/agents/actions.d.ts +52 -0
  109. package/lib/tools/agents/actions.js +49 -0
  110. package/lib/tools/agents/contract.d.ts +163 -0
  111. package/lib/tools/agents/contract.js +56 -0
  112. package/lib/tools/agents/dsh-contract.d.ts +52 -0
  113. package/lib/tools/agents/dsh-contract.js +15 -0
  114. package/lib/tools/agents/dsh-tool.d.ts +5 -0
  115. package/lib/tools/agents/dsh-tool.js +38 -0
  116. package/lib/tools/history/actions.d.ts +70 -0
  117. package/lib/tools/history/actions.js +7 -0
  118. package/lib/tools/history/contract.d.ts +81 -0
  119. package/lib/tools/history/contract.js +32 -0
  120. package/lib/tools/history/dsh-tool.d.ts +4 -0
  121. package/lib/tools/history/dsh-tool.js +22 -0
  122. package/lib/tools/result.d.ts +18 -0
  123. package/lib/tools/result.js +10 -0
  124. package/lib/tools/teams/actions.d.ts +24 -0
  125. package/lib/tools/teams/actions.js +38 -0
  126. package/lib/tools/teams/contract.d.ts +232 -0
  127. package/lib/tools/teams/contract.js +67 -0
  128. package/lib/tools/teams/dsh-tool.d.ts +8 -0
  129. package/lib/tools/teams/dsh-tool.js +49 -0
  130. package/lib/ui/dsh/attachments.d.ts +5 -0
  131. package/lib/ui/dsh/attachments.js +39 -0
  132. package/lib/ui/dsh/elements.d.ts +17 -0
  133. package/lib/ui/dsh/elements.js +79 -0
  134. package/lib/ui/dsh/index.d.ts +4 -0
  135. package/lib/ui/dsh/index.js +13 -0
  136. package/lib/ui/dsh/management.d.ts +4 -0
  137. package/lib/ui/dsh/management.js +711 -0
  138. package/lib/ui/dsh/remote.d.ts +15 -0
  139. package/lib/ui/dsh/remote.js +11 -0
  140. package/lib/ui/dsh/styles.d.ts +1 -0
  141. package/lib/ui/dsh/styles.js +132 -0
  142. package/lib/ui/presentation.d.ts +3 -0
  143. package/lib/ui/presentation.js +12 -0
  144. package/npm-shrinkwrap.json +11123 -793
  145. package/package.json +94 -11
  146. package/python/README.md +6 -6
  147. package/resources/agents/coordinator.md +1 -1
  148. package/resources/dsh/cordis.patch.yml +3 -0
  149. package/resources/prompts/workspace.md +1 -1
  150. package/resources/references/compute.md +1 -1
  151. package/resources/references/task-conductor.md +6 -4
  152. package/resources/skills/provider-connections/SKILL.md +10 -0
  153. package/scripts/README.md +9 -1
  154. package/src/dsh.ts +22 -0
  155. package/src/extension/agent-events.ts +51 -46
  156. package/src/extension/agents-command.ts +48 -34
  157. package/src/extension/command.ts +42 -23
  158. package/src/extension/dsh/agent-events.ts +148 -0
  159. package/src/extension/dsh/agent-runtime.ts +251 -0
  160. package/src/extension/dsh/command.ts +78 -0
  161. package/src/extension/dsh/files.ts +61 -0
  162. package/src/extension/dsh/history.ts +69 -0
  163. package/src/extension/dsh/management.ts +108 -0
  164. package/src/extension/dsh/workspace.ts +206 -0
  165. package/src/extension/events.ts +6 -4
  166. package/src/extension/history.ts +15 -12
  167. package/src/extension/subagent-entry.ts +34 -63
  168. package/src/extension/teams-command.ts +53 -46
  169. package/src/integrations/{pi/agent-resources.ts → agent-resources.ts} +2 -2
  170. package/src/integrations/dsh/dsh-agents.ts +97 -0
  171. package/src/integrations/dsh/history-summary.ts +43 -0
  172. package/src/integrations/dsh/history.ts +76 -0
  173. package/src/integrations/dsh/input.ts +66 -0
  174. package/src/integrations/dsh/messages.ts +22 -0
  175. package/src/integrations/dsh/notifications.ts +46 -0
  176. package/src/integrations/dsh/resources.ts +44 -0
  177. package/src/integrations/dsh/schema.ts +26 -0
  178. package/src/integrations/dsh/session.ts +67 -0
  179. package/src/integrations/history-summary.ts +20 -0
  180. package/src/integrations/pi/history.ts +4 -14
  181. package/src/integrations/pi/pi-agents.ts +17 -6
  182. package/src/integrations/pi/team-context.ts +6 -58
  183. package/src/integrations/team-context.ts +60 -0
  184. package/src/model/agent.ts +2 -0
  185. package/src/model/history.ts +3 -1
  186. package/src/pbot.ts +1 -1
  187. package/src/services/agents/agent-notices.ts +28 -0
  188. package/src/services/agents/agent-run.ts +114 -0
  189. package/src/services/agents/agent-service.ts +127 -64
  190. package/src/services/history/history-service.ts +120 -59
  191. package/src/storage/agent-files.ts +17 -4
  192. package/src/storage/history-files.ts +30 -5
  193. package/src/tools/agents/actions.ts +47 -0
  194. package/src/tools/agents/contract.ts +8 -5
  195. package/src/tools/agents/dsh-contract.ts +16 -0
  196. package/src/tools/agents/dsh-tool.ts +41 -0
  197. package/src/tools/agents/tool.ts +7 -43
  198. package/src/tools/history/actions.ts +9 -0
  199. package/src/tools/history/contract.ts +34 -0
  200. package/src/tools/history/dsh-tool.ts +22 -0
  201. package/src/tools/history/tool.ts +7 -30
  202. package/src/tools/teams/actions.ts +38 -0
  203. package/src/tools/teams/contract.ts +7 -3
  204. package/src/tools/teams/dsh-tool.ts +55 -0
  205. package/src/tools/teams/tool.ts +6 -31
  206. package/src/ui/agent-display.ts +7 -4
  207. package/src/ui/dsh/attachments.ts +42 -0
  208. package/src/ui/dsh/elements.ts +50 -0
  209. package/src/ui/dsh/index.ts +18 -0
  210. package/src/ui/dsh/management.ts +412 -0
  211. package/src/ui/dsh/remote.ts +20 -0
  212. package/src/ui/dsh/styles.ts +132 -0
  213. package/src/ui/pi/menu.ts +37 -0
  214. package/src/ui/pi/reader.ts +46 -0
  215. package/src/ui/presentation.ts +12 -0
package/CONTEXT.md CHANGED
@@ -20,11 +20,13 @@
20
20
 
21
21
  **工作区记忆**:跨会话查找、使用和修正所属资料的能力。正文只维护一份;保留的知识不证明当前事实、软件可用性或操作授权。
22
22
 
23
+ **历史消息树(history)**:由问答原文、分层摘要、父子关系及来源引用组成的历史资料,供两个宿主共同检索。各宿主维护自己来源的历史;它不包含完整工具日志、推理或图片二进制,也不用于恢复另一宿主的会话。
24
+
23
25
  **项目资料维护**:根据已有工作结果与证据,整理和更新当前任务、直接关联资料及进行中任务的资料,由助手判断相关内容是否更新完整。可由用户主动发起,或由助手在正常交互中识别更新需要。
24
26
 
25
27
  **能力提供方(provider)**:通过 CLI 或 MCP 提供数据查询、计算或业务操作的外部系统。它不同于 `src/services/` 中的业务服务。
26
28
 
27
- **原生接入**:复用 CLI 的命令与认证,或使用 Pi 原生 MCP 配置、工具发现与调用。Personal Bot 不保存另一套操作目录或逐工具权限。
29
+ **原生接入**:复用 CLI 的命令与认证,或使用当前宿主原生的 MCP 配置、工具发现与调用。Personal Bot 不保存另一套操作目录或逐工具权限。
28
30
 
29
31
  **受控变更**:经精确准备、必要复核和用户授权后执行的业务状态改变。交易是其中一类,不代表全部变更。
30
32
 
@@ -34,10 +36,10 @@
34
36
 
35
37
  **调用约定**:原生操作的输入、结果与执行要求,按当前版本的帮助或协议定义核对。
36
38
 
37
- **工作区**:组织学习资料、长期事务、项目、能力接入与执行记录的工作范围。用途可以组合;投资任务可覆盖多个市场。用户资料可以共享,应用状态独立保存。
39
+ **工作区**:组织学习资料、长期事务、项目、能力接入与执行记录的工作范围,用途可以组合,投资任务可覆盖多个市场。业务约定、用户资料和历史消息树可以跨宿主使用,原生会话与运行状态独立保存。
38
40
  _避免_:用工作区表示单个会话或真实账户。
39
41
 
40
- **Personal Bot 启用**:Pi 按原生配置加载 Personal Bot 扩展。没有独立的工作区就绪状态;资料和外部服务是否准备好不影响加载,也不证明某项能力可用或已获执行许可。
42
+ **Personal Bot 启用**:当前宿主按原生配置加载 Personal Bot 扩展。没有独立的工作区就绪状态;资料和外部服务是否准备好不影响加载,也不证明某项能力可用或已获执行许可。
41
43
 
42
44
  **配套插件**:与 Personal Bot 配合提供附加能力、可独立安装的组件。其依赖的外部服务不属于插件本体,安装插件不代表服务已准备好。
43
45
 
@@ -53,21 +55,21 @@ _避免_:用工作区表示单个会话或真实账户。
53
55
 
54
56
  **协调者**:协助用户学习和积累知识、推进任务与项目、开展研究并支持决策的主助手,负责方案建议、专家协作和已授权操作的结果跟踪。
55
57
 
56
- **通用专家(general-purpose)**:pbot 唯一可委派类型,在独立子会话中完成研究、分析、计算或独立复核,按任务选择专业方法。start 使用新上下文,send 可继续既有上下文;独立复核须新建会话。通用职责不表示可以超出委派范围或绕过用户授权。
58
+ **通用专家(general-purpose)**:pbot 唯一可委派类型,在具有独立上下文和任务归属的子会话中完成研究、分析、计算或独立复核,按任务选择专业方法。start 使用新上下文,send 可继续既有上下文;独立复核须新建会话,通用职责不扩大委派范围或用户授权。
57
59
 
58
60
  **独立复核者**:在新会话或独立任务节点中核验具体方案的事实与约束,给出通过、拒绝或无法确认结论的助手,不是另一个可委派的 pbot 角色类型。
59
61
 
60
62
  **专家协作**:保留独立委派与团队工作。协调者组织和验收,团队成员可直接交换原文;轮流讨论或并行轮次由代码安排,不依赖协调者模型逐条转述。它不规定固定研究流程,不替代用户授权,也不承载 Task Conductor 的持久调度。
61
63
 
62
- **团队(team)**:同一父会话中的固定成员和公共记录,以 teamId 标识。成员仍有各自的私人 Pi 上下文;团队关闭不销毁成员或清除记忆。
64
+ **团队(team)**:同一父会话中的固定成员和公共记录,以 teamId 标识。成员仍有各自的私人会话上下文;团队关闭不销毁成员或清除记忆。
63
65
 
64
66
  **团队批次(team run)**:以 runId 标识的一批有限轮次,采用 roundRobin 或 parallel。后者同轮并行、轮间汇合;结束不代表业务完成,暂停或恢复不自动重跑旧请求。该 runId 与 Task Conductor 的 runId 分属不同系统。
65
67
 
66
68
  **专家职责**:通用专家 general-purpose 的工作范围与交付责任,不是子会话实例标识。工作区仅 coordinator.md 和 general-purpose.md 的职责补充会被加载。
67
69
 
68
- **子会话(agent)**:由 start 创建的独立 Pi 会话,以 agentId 标识;新布局中它也是原生 session ID,对话文件由 Pi 管理。工作结束后可用 send 继续对话;停止后用 resume 携新要求显式恢复,不重放旧工作。它绑定父会话与创建分支,不是持久任务调度器。
70
+ **子会话(agent)**:由 start 创建、以 agentId 标识的独立专家会话,绑定父会话与创建分支,归属创建它的宿主。工作结束后可用 send 继续对话;停止后用 resume 携新要求显式恢复,不重放旧工作,也不跨宿主接管。
69
71
 
70
- **工作周期(cycle)**:子会话从开始处理到本轮结束的一次活动,以 cycleId 标识。一个周期可处理多条消息;进程空闲不代表上轮工作成功。
72
+ **工作周期(cycle)**:子会话从开始处理到本轮结束的一次活动,以 cycleId 标识。一个周期可处理多条消息;空闲状态不代表上轮工作成功。
71
73
 
72
74
  **消息请求(request)**:父侧提交的一条子会话消息,以 requestId 标识。入队或接收不证明模型已阅读或任务已完成。
73
75
 
package/README.md CHANGED
@@ -4,13 +4,13 @@ English | [简体中文](README.zh-CN.md)
4
4
 
5
5
  **A personal assistant connecting knowledge, research, and action.**
6
6
 
7
- Personal Bot is currently a workspace-scoped [Pi](https://pi.dev) extension for learning, project work, research, and decision support, including investment analysis and explicitly authorized operations.
7
+ Personal Bot provides a workspace-scoped [Pi](https://pi.dev) extension and a native Web integration for a fixed dsh release. It supports learning, project work, research, decision support, investment analysis, and explicitly authorized operations. See the [dsh guide](docs/dsh.md) for its usage and acceptance limits.
8
8
 
9
9
  The model handles analysis, coordination, and native tools. Personal Bot adds workspace materials, specialist collaboration, and Python environment preparation. It does not create a second main agent or start tasks or trades automatically.
10
10
 
11
11
  ## Install
12
12
 
13
- The installer supports Linux and macOS. It requires Node.js 22.19+, npm, and Python 3.11+ with venv/ensurepip. Run in an interactive terminal:
13
+ The Pi installer supports Linux and macOS. It requires Node.js 22.19+, npm, and Python 3.11+ with venv/ensurepip. Run in an interactive terminal:
14
14
 
15
15
  ```bash
16
16
  npx personal-bot@latest setup
@@ -44,7 +44,7 @@ pi
44
44
 
45
45
  `--local` saves the package declaration in the project's `.pi/settings.json`. Review and grant project trust when Pi prompts you, and start Pi from the workspace root. Loading Personal Bot enables its roles, skills, tools, and shared Python environment preparation. There is no separate activation switch.
46
46
 
47
- Use `pi install` without `--local` only when you want the extension in every Pi session. Use Pi package management or `pi config` to adjust an existing installation's scope. Do not load both the npm and source installations. The existing development and test baseline is Pi 1.4.0; installer acceptance limits are recorded in [validation](docs/validation.md).
47
+ Use `pi install` without `--local` only when you want the extension in every Pi session. Use Pi package management or `pi config` to adjust an existing installation's scope. Do not load both the npm and source installations. The development and test baseline is Pi 1.5.0; installer acceptance limits are recorded in [validation](docs/validation.md).
48
48
 
49
49
  ### Install from source
50
50
 
@@ -68,9 +68,15 @@ pi
68
68
 
69
69
  Replace the example paths with your actual paths. A local installation loads the source directory directly, so keep that directory and its dependencies available.
70
70
 
71
+ ### Use with dsh
72
+
73
+ The integration targets `@deepseek-ai/dsh@0.2.2-rc.1` and requires Node.js 24.9+. Build a tarball from the current source with normal `npm pack`, create a separate `pbot` Web profile, and install it with `dsh plugin --profile pbot add <tarball>`. Follow the [dsh guide](docs/dsh.md); `pbot setup` remains the Pi installer.
74
+
75
+ The bare `/pbot` action opens workspace, specialist, team, and history management. Specialists use native Agent/Session instances in the server process. Refreshing a page does not stop accepted work. Both hosts query the saved history archives while each maintains its own source. Models, authentication, and MCP remain under native host configuration. Real model workflows and the latest Linux checks remain subject to the [validation record](docs/validation.md).
76
+
71
77
  ### Optional: Task Conductor
72
78
 
73
- For scheduled tasks, recurring workflows, or DAGs, install `task-conductor-plugin`. This integration package is distinct from the `task-conductor` service and is not required for Personal Bot. It requires Pi 1.4.0+ with native MCP support and npm.
79
+ For scheduled tasks, recurring workflows, or DAGs, install `task-conductor-plugin`. This integration package is distinct from the `task-conductor` service and is not required for Personal Bot. Use it with the project's Pi 1.5.0 baseline, native MCP support, and npm.
74
80
 
75
81
  Check `pi list` first. If the package is already installed but its skill is missing, check resource configuration and reload rather than installing it again. Review the [upstream integration guide](https://github.com/realqiyan/task-conductor/blob/master/docs/host-integrations.md), then run from the workspace root:
76
82
 
@@ -92,10 +98,11 @@ Keep goals, markets, preferences, and working agreements in ordinary documents.
92
98
 
93
99
  ## Daily use
94
100
 
95
- Describe the task directly: organize project materials, compare research findings, delegate an independent review, or run calculations. No fixed workflow is required.
101
+ Describe the task directly: organize project materials, compare research findings, delegate an independent review, or run calculations. No fixed workflow is required. The command table and process details below describe Pi; see the [dsh guide](docs/dsh.md) for its Web interface and commands.
96
102
 
97
103
  | Command | Purpose |
98
104
  | --- | --- |
105
+ | `/pbot` | Open the workspace menu |
99
106
  | `/pbot init` | Create missing material directories and root `AGENTS.md` |
100
107
  | `/pbot status` | Show workspace path, Personal Bot version, and Python environment status |
101
108
  | `/pbot history [text]` | Search historical exchanges and summaries; read originals and navigate their parents and children |
@@ -124,7 +131,7 @@ Personal Bot maintains no separate provider-call ledger or result wrapper. Nativ
124
131
  | `AGENTS.md` | Material navigation and working agreements |
125
132
  | `areas/`, `projects/` | Long-term goals, task definitions, conclusions, and deliverables |
126
133
  | `knowledge/` | Reusable concepts, methods, and analysis definitions |
127
- | `.pi/pbot/history/` | Saved exchanges, summaries, and node links that can travel with the workspace |
134
+ | `.pi/pbot/history/`, `.dsh/pbot/history/` | Saved exchanges, summaries, and node links, maintained by source and queried together |
128
135
  | `providers/` | Provider guides, coverage gaps, and validation evidence |
129
136
  | `scratch/` | Temporary scripts, query and calculation data, downloads, and runtime environments |
130
137
  | `agents/`, `.agents/skills/` | Workspace additions to coordinator/general-purpose roles and workspace skills |
@@ -135,7 +142,7 @@ Personal Bot stores no private activation state in the workspace. Pi owns its co
135
142
 
136
143
  ## Updates and historical data
137
144
 
138
- Current release: **0.2.4**. Personal Bot maintains no workspace format, initialization state, or workspace upgrade mechanism. Update the plugin through Pi package management. For a local installation, update the source, run `npm ci --ignore-scripts` if dependencies changed, then reload or restart Pi.
145
+ Current release: **0.2.6**. Personal Bot maintains no workspace format, initialization state, or workspace upgrade mechanism. Update the plugin through its native host package manager. For a local Pi installation, update the source, run `npm ci --ignore-scripts` if dependencies changed, then reload or restart Pi.
139
146
 
140
147
  Stop active sub-sessions before changing versions. Sub-session compatibility follows the minor version before 1.0 and the major version from 1.0 onward. Sessions from another compatibility line cannot be resumed directly.
141
148
 
@@ -158,7 +165,7 @@ npm test
158
165
  git diff --check
159
166
  ```
160
167
 
161
- `npm test` includes smoke and E2E tests and generates `dist/` for test imports and `lib/` for the installation CLI. Pi still loads the extension source directly. Inspect package contents with `npm pack --dry-run`. See [validation](docs/validation.md) for test groups and limits.
168
+ Full development and acceptance for both hosts require Linux and Node.js 24.9+. `npm test` includes smoke and E2E tests and generates `dist/` for tests and `lib/` for the CLI and dsh Host/Web entries. Pi still loads the extension source directly. Inspect package contents with `npm pack --dry-run`. See [validation](docs/validation.md) for test groups and limits.
162
169
 
163
170
  The README is available in English and Simplified Chinese. Detailed design documents and bundled guides are currently primarily in Chinese.
164
171
 
package/README.zh-CN.md CHANGED
@@ -4,13 +4,13 @@
4
4
 
5
5
  **个人助手,连接知识、研究与行动。**
6
6
 
7
- 当前基于 Pi 实现,提供按工作区加载的扩展,用于学习、项目推进、研究与决策支持,也支持投资分析与已授权业务。
7
+ 提供 Pi 工作区扩展和固定版 dsh 原生 Web 接入,用于学习、项目推进、研究与决策支持,也支持投资分析与已授权业务。dsh 的使用和当前验收范围见[专门说明](docs/dsh.md)。
8
8
 
9
9
  定位为可信模型驱动的个人助手。模型负责分析、协调与原生工具使用;pbot 提供资料入口、专家协作和 Python 环境准备。不另建主 Agent,不自动开展任务或交易。
10
10
 
11
11
  ## 安装
12
12
 
13
- 安装器支持 Linux 和 macOS,需要 Node.js 22.19+、npm、Python 3.11+ 及 venv/ensurepip。在终端运行:
13
+ 下面的安装器面向 Pi,支持 Linux 和 macOS,需要 Node.js 22.19+、npm、Python 3.11+ 及 venv/ensurepip。在终端运行:
14
14
 
15
15
  ```bash
16
16
  npx personal-bot@latest setup
@@ -42,7 +42,7 @@ pi install --local npm:personal-bot
42
42
  pi
43
43
  ```
44
44
 
45
- `--local` 将包声明保存在项目 `.pi/settings.json`。按 Pi 提示确认项目信任,每次从工作区根目录启动。Pi 加载 Personal Bot 就会启用角色、技能、工具及共享 Python 环境准备;没有第二个启用开关。除非希望所有 Pi 会话都启用 Personal Bot,否则不要用省略 `--local` 的 `pi install` 注册全局扩展。已有全局安装请用 Pi 原生包管理或 `pi config` 调整加载范围。开发与原有测试基线为 Pi 1.4.0,安装器验收范围见[验证](docs/validation.md)。
45
+ `--local` 将包声明保存在项目 `.pi/settings.json`。按 Pi 提示确认项目信任,每次从工作区根目录启动。Pi 加载 Personal Bot 就会启用角色、技能、工具及共享 Python 环境准备;没有第二个启用开关。除非希望所有 Pi 会话都启用 Personal Bot,否则不要用省略 `--local` 的 `pi install` 注册全局扩展。已有全局安装请用 Pi 原生包管理或 `pi config` 调整加载范围。开发与测试基线为 Pi 1.5.0,安装器验收范围见[验证](docs/validation.md)。
46
46
 
47
47
  ### 从源码安装
48
48
 
@@ -66,9 +66,15 @@ pi
66
66
 
67
67
  将示例路径换成实际路径。本地安装直接加载来源目录,请保留源码和依赖。不要同时加载源码与 npm 两个来源。
68
68
 
69
+ ### 使用 dsh
70
+
71
+ dsh 接入固定为 `@deepseek-ai/dsh@0.2.2-rc.1`,使用 Node.js 24.9+。从当前源码正常 `npm pack` 后,按[dsh 使用说明](docs/dsh.md)建立独立 `pbot` Web profile,并通过 `dsh plugin --profile pbot add <tarball>` 安装。`pbot setup` 不配置 dsh。
72
+
73
+ Web 的裸 `/pbot` 打开工作区、专家、团队和历史管理页。专家使用同进程的原生 Agent/Session;页面刷新不停止已接纳工作。两种宿主共同读取历史归档,各自维护自己的来源,模型、认证和 MCP 配置分别由原生宿主管理。真实模型与最新 Linux 验收仍见[验证记录](docs/validation.md)。
74
+
69
75
  ### 可选安装 Task Conductor
70
76
 
71
- 需要周期任务、重复流程或 DAG 时,安装接入包 `task-conductor-plugin`。它不是服务包 `task-conductor`,也不是启用 pbot 的前提。该接入方式需要 Pi 1.4.0+ 的原生 MCP 和 npm。
77
+ 需要周期任务、重复流程或 DAG 时,安装接入包 `task-conductor-plugin`。它不是服务包 `task-conductor`,也不是启用 pbot 的前提。按本项目 Pi 1.5.0 基线使用原生 MCP 和 npm 接入。
72
78
 
73
79
  先用 `pi list` 检查是否已经安装;已安装但技能不可见时,检查资源是否启用并重载,不要重复安装。新安装请审阅[官方接入说明](https://github.com/realqiyan/task-conductor/blob/master/docs/host-integrations.md),从工作区根目录执行:
74
80
 
@@ -90,10 +96,11 @@ pi install --local npm:task-conductor-plugin
90
96
 
91
97
  ## 日常使用
92
98
 
93
- 直接向助手说明任务,例如整理项目资料、比较研究结论、委派独立复核或运行计算。无需手动编排固定流程。
99
+ 直接向助手说明任务,例如整理项目资料、比较研究结论、委派独立复核或运行计算。无需手动编排固定流程。以下命令表与进程说明面向 Pi;dsh 的命令和 Web 操作见[专门说明](docs/dsh.md)。
94
100
 
95
101
  | 命令 | 用途 |
96
102
  | --- | --- |
103
+ | `/pbot` | 打开工作区菜单 |
97
104
  | `/pbot init` | 可选地补建资料目录和缺失的根 `AGENTS.md` |
98
105
  | `/pbot status` | 查看工作区路径、Personal Bot 版本和 Python 环境状态 |
99
106
  | `/pbot history [关键词]` | 搜索历史问答与分层摘要,查看原文和上下层节点 |
@@ -122,7 +129,7 @@ pi install --local npm:task-conductor-plugin
122
129
  | `AGENTS.md` | 资料导航与工作约定 |
123
130
  | `areas/`、`projects/` | 长期目标、任务定义、结论与交付物 |
124
131
  | `knowledge/` | 可复用的概念、方法与口径 |
125
- | `.pi/pbot/history/` | 可随工作区分享的问答原文、摘要与节点关系 |
132
+ | `.pi/pbot/history/`、`.dsh/pbot/history/` | 按来源保存、可共同查询的问答原文、摘要与节点关系 |
126
133
  | `providers/` | 提供方手册、覆盖缺口与验证依据 |
127
134
  | `scratch/` | 临时脚本、查询与计算数据、下载及运行环境 |
128
135
  | `agents/`、`.agents/skills/` | coordinator/general-purpose 职责补充与工作区技能 |
@@ -133,7 +140,7 @@ Personal Bot 不在工作区内保存私有启用状态。Pi 配置仍由 Pi 管
133
140
 
134
141
  ## 更新与历史数据
135
142
 
136
- 当前版本为 **0.2.4**。不维护工作区格式、初始化状态或升级机制。插件更新使用 Pi 原生包管理;本地安装则更新来源源码,依赖变化后执行 `npm ci --ignore-scripts`,再重载或重启 Pi。更换版本前先停止活动子会话;不同兼容线的子会话不能直接恢复。
143
+ 当前版本为 **0.2.6**。不维护工作区格式、初始化状态或升级机制。插件更新使用对应宿主的原生包管理;Pi 本地安装则更新来源源码,依赖变化后执行 `npm ci --ignore-scripts`,再重载或重启 Pi。更换版本前先停止活动子会话;不同兼容线的子会话不能直接恢复。
137
144
 
138
145
  子会话 JSONL 由 Pi 保存在原生 sessions 目录或原生配置指定的位置;`pbot/subagents/` 只保存控制记录与会话引用,团队公共记录保存在 `pbot/teams/`。0.2.0 不兼容旧会话位置,不迁移或删除 0.1.x 历史;旧记录不进入当前列表或后台调度。先在旧版停止活动成员,更新后重新创建 agent。共享 Python 环境使用用户级 `pbot/python/.venv`,具体系统路径见 [Python 说明](python/README.md)。不自动导入其他应用的会话、配置或环境,也不修改其数据。MCP 连接与 CLI 环境按原生方式显式配置;用户资料、历史证据和备份原样保留。
139
146
 
@@ -154,7 +161,7 @@ npm test
154
161
  git diff --check
155
162
  ```
156
163
 
157
- `npm test` 包含冒烟和 E2E 测试,并生成测试用 `dist/` 与发布用 CLI `lib/`;Pi 扩展运行时仍直接加载源码。包内容可用 `npm pack --dry-run` 检查。测试分组与限制见[验证](docs/validation.md)。
164
+ 双宿主完整开发与验收使用 Linux、Node.js 24.9+。`npm test` 包含冒烟和 E2E 测试,并生成测试用 `dist/` 及 CLI、dsh Host/Web 的 `lib/`;Pi 扩展运行时仍直接加载源码。包内容可用 `npm pack --dry-run` 检查。测试分组与限制见[验证](docs/validation.md)。
158
165
 
159
166
  - [开发文档索引](docs/README.md):架构、工具、专家协作、存储与验证。
160
167
  - [npm 发布](docs/release.md):配置、授权、发布与安装验收。
package/docs/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
  | --- | --- |
7
7
  | [架构原则](architecture-guidelines.md) | 模块划分、依赖和开发方法 |
8
8
  | [技术设计](technical-design.md) | 系统组成、生命周期与资源加载 |
9
+ | [界面设计](interaction-design.md) | Pi TUI 与 dsh GUI |
10
+ | [dsh 使用](dsh.md) | 固定版本、原生 profile 安装、Web 管理与宿主差异 |
9
11
  | [工具与执行](capability-design.md) | CLI/MCP 接入、授权和结果核验 |
10
12
  | [专家协作](agent-collaboration.md) | 子会话工具、通信、通知和生命周期 |
11
13
  | [历史对话](history.md) | 自动收录、连续摘要树、全文查询与原文展开 |
@@ -14,7 +16,7 @@
14
16
  | [npm 发布](release.md) | 发布配置、授权、操作与验收 |
15
17
  | [安装与升级](installation-design.md) | npx setup、工作区选择、插件安装、初始化与失败恢复 |
16
18
 
17
- 增量设计与范围取舍见 [Subagent 升级方案](subagent-upgrade-proposal.md)。团队策略在 0.1.3 实现,0.2.0 将子会话对话交给 Pi 原生存储,不迁移旧历史。当前用法见专家协作;0.1.3 的真实模型冒烟、0.2.0 本地验证与剩余验收见验证。
19
+ 双宿主范围见[dsh 接入方案](dsh-support-proposal.md),执行与验收进度见[实施记录](dsh-implementation-plan.md)。既有子会话范围取舍见 [Subagent 升级方案](subagent-upgrade-proposal.md)。团队策略在 0.1.3 实现,0.2.0 将子会话对话交给 Pi 原生存储,不迁移旧历史。当前用法见专家协作;0.1.3 的真实模型冒烟、0.2.0 本地验证与剩余验收见验证。
18
20
 
19
21
  Python 环境与库许可见 [python/README.md](../python/README.md)。模型使用的方法维护在 resources/skills,运行时职责维护在 resources/agents。
20
22
 
@@ -1,6 +1,6 @@
1
1
  # 专家协作
2
2
 
3
- Personal Bot 保留独立工作和团队工作。成员仍由 tmux 和独立 Pi 进程运行,各自保留原生 JSONL 上下文。主模型负责组织与验收,成员原文由代码同步,不需要主模型逐条转述。
3
+ Personal Bot 保留独立工作和团队工作。Pi 成员由 tmux 和独立进程运行;dsh 成员使用同进程的独立 Agent/Session。各自保留原生上下文,不跨宿主恢复。主模型负责组织与验收,成员原文由代码同步,不需要主模型逐条转述。
4
4
 
5
5
  ## 独立工作
6
6
 
@@ -14,21 +14,31 @@ Personal Bot 保留独立工作和团队工作。成员仍由 tmux 和独立 Pi
14
14
  | stop | 请求停止,保留历史 |
15
15
  | resume | 用新 message 重启已停止子会话,不重放旧工作 |
16
16
 
17
- 每个父会话最多 50 个存活进程,包括待命进程。启动异步返回,不提供 wait。无任务 start 不请求模型,也不产生工作完成通知;停止未接过任务的进程不伪造失败周期。
17
+ 每个父会话最多 50 个存活或启动、释放中的专家,包括待命实例。启动预约也占用限额。启动异步返回,不提供 wait。无任务 start 不请求模型,也不产生工作完成通知;停止未接过任务的进程不伪造失败周期。
18
18
 
19
- start 支持 noExtensions、noSkills、noPromptTemplates 和 noContextFiles。noExtensions 默认 true,显式保留子入口及 Pi 内置 MCP、codemode、工具搜索;设为 false 时按 Pi 规则发现其他扩展。tools 遵循 Pi 原生选择。子入口只增加 pbot_team_message,不提供 pbot_agent 或 pbot_team 管理能力。
19
+ Pi 的 start 支持 noExtensions、noSkills、noPromptTemplates 和 noContextFiles。noExtensions 默认 true,显式保留子入口及 Pi 内置 MCP、codemode、工具搜索;设为 false 时按 Pi 规则发现其他扩展。tools 遵循 Pi 原生选择。子入口只增加 pbot_team_message,不提供 pbot_agent 或 pbot_team 管理能力。
20
20
 
21
- 初始 files 相对工作区根目录解析。子入口在每份附件前标出绝对来源路径,保留 Pi 原生 read 的文本、图像及截断提示;未读完的附件由成员沿该路径续读。message 与 prompts 合并为一次输入,不继承父聊天历史。
21
+ 以下附件、进程模型与 TUI 说明面向 Pi;dsh 的差异见下一节。初始 files 相对工作区根目录解析。子入口在每份附件前标出绝对来源路径,保留 Pi 原生 read 的文本、图像及截断提示;未读完的附件由成员沿该路径续读。message 与 prompts 合并为一次输入,不继承父聊天历史。
22
22
 
23
23
  初始模型与思考级别默认继承主会话;恢复时交由 Pi 使用保存的原生模型配置,不重新传入初始模型选项。模型不可用或缺少认证时仍遵循 Pi 的原生回退与错误行为。子会话从自己的 cwd 和 Pi agent dir 取得原生配置与认证,不继承父进程临时注册的模型或 MCP。环境与授权规则见[工具与执行](capability-design.md)。
24
24
 
25
- ## 原生会话与恢复入口
25
+ ## dsh 专家
26
+
27
+ dsh 使用原生 provider/model/reasoning effort,拒绝 Pi 专属扩展、提示模板和上下文文件开关。tools 使用原生能力名,noSkills 控制技能;专家不拥有协调者管理工具。只在模型选择仍与父一致时继承父 effort。恢复保留原生选择,不用新父默认值覆盖旧会话。
28
+
29
+ 服务器文件由原生附件存储保留内容,图片使用原生准入;Web 人工对话还接受本机文件与图片。人工对话先成功暂停所属团队,再进入原生 inbox;队列接纳、实际进入、模型消费和完成分别记录,未来排队输入不提前改变此前回答的归因。
30
+
31
+ 每个专家绑定父身份与 generation。启动、校验与释放在短控制锁外等待,预约期间的停止会取消启动;旧代次不能释放新实例。原生 registry 中由其他实例持有的 Agent 不能被替换或假称释放。正常完成要求请求实际消费、持久的正常 stop 和非空最终答复;空闲、工具文本、截断或缺失结束标记都不代表成功。
32
+
33
+ `/pbot` Web 管理页提供人工对话、完整原生记录、停止和携新要求恢复。离页不停止已接纳工作;父 Agent 或组件关闭会暂停安排并释放其拥有的专家。重新打开页面不会恢复或重放旧工作。详情见[dsh 使用](dsh.md)。
34
+
35
+ ## Pi 原生会话与恢复入口
26
36
 
27
37
  新建 agent 的 agentId 也是 Pi session ID。对话由 Pi 保存在原生 sessions 目录或其原生配置指定的位置,按子进程 cwd 归组;pbot 只保存控制记录和文件引用。无任务待命不伪造对话,也可能尚无 JSONL 文件。首次输入前固定路径,之后恢复只打开这个文件;文件缺失或不匹配时不新建空白替代。具体规则见[文件存储](file-storage.md)。
28
38
 
29
39
  有对话后,成员会出现在相应项目的 `pi --resume` / `/resume` 列表,并支持 Pi 原生导出。`pi --continue` 可能选中最近活跃的子会话,不保证选中主会话;需要主会话时从列表中明确选择。
30
40
 
31
- `/pbot agents` 的“进入 TUI”连接运行中的成员;成员已停止时,加载原会话并启动待命进程,不入队新要求、不调用模型、不重放旧工作。尚无对话文件的空会话仍以原 agentId 待命。运行中不另开进程同时写同一 JSONL。停止后从原生列表打开属于普通 Pi 对话,不恢复 pbot 成员身份或团队资格;模型工具 `pbot_agent resume` 仍用于携新要求继续工作。
41
+ `/pbot agents` 的“进入会话”连接运行中的成员;成员已停止时,“打开原会话”加载原会话并启动待命进程,不入队新要求、不调用模型、不重放旧工作。尚无对话文件的空会话仍以原 agentId 待命。运行中不另开进程同时写同一 JSONL。停止后从原生列表打开属于普通 Pi 对话,不恢复 pbot 成员身份或团队资格;模型工具 `pbot_agent resume` 仍用于携新要求继续工作。
32
42
 
33
43
  ## 团队与两种策略
34
44
 
@@ -71,7 +81,7 @@ run 要求全部成员空闲、无未消费的私人输入,并已加载可用
71
81
 
72
82
  ## 原文、上下文与公开范围
73
83
 
74
- 团队公共记录独立于各自私人会话。新团队请求通过原有 inbox 投递;before_agent_start 注入已署名的公共原文,运行中在 turn_end 安全边界追加消息,不请求额外 continuation。空闲成员在下一次团队请求时取得信息,私人工作不自动注入新群消息。
84
+ 团队公共记录独立于各自私人会话。Pi 通过原 inbox 投递,在 before_agent_start 和 turn_end 的安全边界注入已署名的公共原文,不请求额外 continuation。dsh 使用原生 inbox 和 pre-step;团队领取先获得原生 maintenance 准入,人工输入待处理或当前步骤已有人工消息时不追加团队背景。空闲成员在下一次团队请求时取得信息,私人工作不自动注入新群消息。
75
85
 
76
86
  成员任务、团队背景、自动注入的公共消息和批次通知使用 Markdown 文档。团队背景按共同目标和成员职责分节,保留身份与轮次;本批次要求仅在成员任务输入中给出,避免在系统简报中重复。公共消息按 seq 分节,列出作者、回复关系与来源,正文放入保留原文的代码区块,包含代码围栏的正文也不会破坏区块边界。成员原文中的 JSON 保留原样。
77
87
 
@@ -87,7 +97,7 @@ read 的文本结果也使用 Markdown,同时保留工具的结构化结果。
87
97
  | --- | --- |
88
98
  | agentId | 持续上下文 |
89
99
  | requestId | 一条父侧输入;团队关联另存,不改变旧 AgentMessage |
90
- | cycleId | 从工作开始到 agent_settled 的周期,包含内部多次 agent_start、工具与自动恢复 |
100
+ | cycleId | 一次受管工作周期;Pi 以 agent_settled 收尾,dsh 以持久 turn/end 收尾,另行核对消费与最终答复 |
91
101
  | teamId / runId | 团队 / 一批有限轮次,不与 Task Conductor 的标识混用 |
92
102
  | seq | 团队内公共消息顺序 |
93
103
 
@@ -101,14 +111,16 @@ read 的文本结果也使用 Markdown,同时保留工具的结构化结果。
101
111
 
102
112
  主 agent 收到的独立子会话结果通知,以及 pbot_agent、pbot_team 和 pbot_team_message 的文本结果均使用 Markdown。列表、状态、工作周期和报告分节展示,报告保留原文;通知中的报告最多展示 2000 字符,完整内容通过 read 分页读取。工具的 structuredContent、details 与 read 收据保持原有契约。
103
113
 
104
- 独立周期的 read 结果进入当前分支后领取该周期通知,包括只读取部分正文的情况。nextOffset 非空时,以同一 agentId、返回的 cycle.cycleId 和 nextOffset 续读,避免默认最新周期发生变化;status 不领取通知。团队关联周期不重复发个人完成通知;主模型只收到批次结束、暂停和收尾状态。普通 post 不唤醒主模型。团队通知按 teamId/runId/状态去重,UI 或工具 read 不领取模型通知。
114
+ Pi 独立周期的 read 结果进入当前分支后领取该周期通知,包括只读取部分正文的情况。dsh 以持久化的上下文消费或成功模型 read 领取;PTC 内层 read 还需根调用成功,排队仅防重,不视为已消费。人工管理页不领取模型通知。nextOffset 非空时,以同一 agentId、返回的 cycle.cycleId 和 nextOffset 续读,避免默认最新周期发生变化;status 不领取通知。团队关联周期不重复发个人完成通知;主模型只收到批次结束、暂停和收尾状态。普通 post 不唤醒主模型。团队通知按 teamId/runId/状态去重,UI 或工具 read 不领取模型通知。
105
115
 
106
116
  团队与成员均绑定父 session/分支。失去归属时暂停新安排,不向当前主分支投递结果。fork 不接管旧团队;返回原分支不会自动恢复旧批次。公共记录与外部工作不会随树导航回滚。
107
117
 
108
118
  | 事件 | 行为 |
109
119
  | --- | --- |
110
120
  | 独立周期完成 | 保持 idle,可继续对话 |
111
- | 主 reload | 保留子进程,但暂停团队;可补交付已完成结果,不续排旧批次 |
121
+ | Pi 主 reload | 保留子进程,但暂停团队;可补交付已完成结果,不续排旧批次 |
122
+ | dsh 页面关闭、刷新、重连 | 已接纳工作继续归服务端,查看不恢复旧任务 |
123
+ | dsh 父 Agent 释放、组件停用或卸载 | 暂停安排,取消预约并等待自己的专家资源释放;后续须显式恢复 |
112
124
  | 主中断 | 暂停团队新增安排,已领取工作默认收尾 |
113
125
  | 主退出或切换 session | 先暂停团队,再按原有约 5 秒宽限清理子进程 |
114
126
  | 成员 stop/异常退出/代次变化 | 暂停依赖它的批次,保留记录,不自动 resume |
@@ -120,12 +132,14 @@ pause 返回时可能仍有在途请求。unresolved 区分排队、已接收、
120
132
 
121
133
  ## UI 与验证边界
122
134
 
123
- /pbot agents 提供状态列表、进入子 TUI、补充要求、重命名和停止,不再提供单独的报告查看或恢复并继续菜单。报告仍可通过 pbot_agent read 获取。/pbot teams 提供团队状态、公共记录分页、post、新批次、pause、close,以及相同的成员菜单。无 TUI 时通过同样的结构化工具使用,不支持 attach。
135
+ dsh 的 Web、原生 Remote、附件、长记录、冷读与恢复,以及真实模型验收缺口见[实施记录](dsh-implementation-plan.md)。下面保留 Pi 的 TUI 使用规则。
136
+
137
+ `/pbot` 打开工作区菜单。`/pbot agents` 提供专家列表、详情、会话入口、补充要求、重命名和停止;`/pbot teams` 提供团队状态、公共消息、批次及成员入口。长记录使用只读阅读页。完整报告仍通过 `pbot_agent read` 获取;非 TUI 模式保留结构化输出。
124
138
 
125
139
  后台扫描遇到短暂的 `.control` 锁竞争时,在下一次扫描重试;连续至少 5 秒仍无法取得锁,包括主会话中断后暂停团队仍被锁阻塞的情况,会保留 UI 错误并通知模型。暂停未成功时,通知明确说明暂停尚未确认。报告或控制记录读取失败也会通知模型。同一持续故障在当前分支去重;恢复要求升级时补发一次通知。主会话中断期间延后投递,恢复输入后再通知。
126
140
 
127
141
  通知按实际服务状态说明恢复方式:锁释放后自动恢复扫描;可恢复的读取错误先排障,修复后由后台重试;团队服务或协作存储已停用时,修复文件仍不能恢复当前实例,须请用户在当前 Pi 会话执行 `/reload`。重载前不反复调用 pbot_team,可通过 pbot_agent list/status/read 核对仍可读取的成员状态与报告;重载后再用 pbot_team status/read 核对团队。成功扫描后清除故障状态。通知不重发任务、不删除锁,命令和工具的错误仍直接返回。
128
142
 
129
- 选择成员后,操作菜单的“进入 TUI”选项直接标明返回快捷键,选中后立即进入,不再二次确认。团队成员入口使用相同流程。默认 tmux 绑定下,普通终端按 Ctrl+B 后按 d 脱离子会话;主会话已在 tmux 中时,按 Ctrl+B 后按小写 l 切回上一个会话。自定义绑定以自己的 tmux 配置为准。返回不会停止成员,不要用 /exit 代替返回。
143
+ 进入成员前提示返回快捷键,团队成员使用相同入口。默认 tmux 绑定下,普通终端按 Ctrl+B 后按 d 脱离;主会话已在 tmux 中时,按 Ctrl+B 后按小写 l 切回。自定义绑定以自己的配置为准。返回不停止成员,不要用 /exit 代替。
130
144
 
131
- Pi 1.4.0 的本地 SDK、实际无认证 Pi/tmux 进程、文件并发与恢复测试已覆盖基础契约。未使用假模型或模拟 provider。2026-10-28 在 0.1.3 上的真实模型双成员冒烟已通过两种策略的单轮通信、原文引用与主通知;0.2.0 的原生存储调整及 Pi 1.4.0 升级仅做本地 SDK/无认证进程验证,未追加真实模型调用;异构模型、多轮讨论、长期使用与交互 TUI 尚未验收,详见[验证](validation.md)。单轮通过不证明一般协作质量或外部操作恰好一次。
145
+ Pi 1.5.0 的本地 SDK、实际无认证 Pi/tmux 进程、文件并发与恢复测试已覆盖基础契约。未使用假模型或模拟 provider。2026-10-28 在 0.1.3 上的真实模型双成员冒烟已通过两种策略的单轮通信、原文引用与主通知;0.2.0 的原生存储调整及 Pi 1.4.0 升级仅做本地 SDK/无认证进程验证,未追加真实模型调用;异构模型、多轮讨论、长期使用与交互 TUI 尚未验收,详见[验证](validation.md)。单轮通过不证明一般协作质量或外部操作恰好一次。
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## 复用宿主
10
10
 
11
- Pi 负责主会话、模型配置、工具、UI、资源发现与会话恢复。Personal Bot 补充资料准备、专家协作和 Python 环境。
11
+ 各宿主负责自己的主会话、模型配置、工具、UI、资源发现与会话恢复。Pi 和 dsh 分别加载,共享业务服务与资料;不构建通用 Host 平台。Personal Bot 补充资料准备、专家协作和 Python 环境。
12
12
 
13
13
  角色定义职责,技能描述专业方法,代码实现需要确定执行的规则。优先使用原生 CLI/MCP,执行权限由实际凭据、外部服务和运行环境约束。
14
14
 
@@ -26,7 +26,7 @@ Pi 负责主会话、模型配置、工具、UI、资源发现与会话恢复。
26
26
 
27
27
  ## 验证行为
28
28
 
29
- 测试业务契约和具体失败风险,使用真实本地文件、进程、计算和 Pi SDK。测试不依赖假模型、模拟 provider、个人凭据或真实交易,也不以文案和实现结构作为行为断言。
29
+ 测试业务契约和具体失败风险,使用真实本地文件、进程、计算和各宿主 SDK。测试不依赖假模型、模拟 provider、个人凭据或真实交易,也不以文案和实现结构作为行为断言。
30
30
 
31
31
  本地测试与外部验收分别记录,范围见[验证](validation.md)。
32
32
 
@@ -1,13 +1,13 @@
1
1
  # 工具与执行
2
2
 
3
- Personal Bot 使用 Pi 原生工具与配置。接入方法见[接入技能](../resources/skills/provider-connections/SKILL.md)。
3
+ Personal Bot 使用当前 Pi 或 dsh 宿主的原生工具与配置。接入方法见[接入技能](../resources/skills/provider-connections/SKILL.md)。
4
4
 
5
5
  ## 责任划分
6
6
 
7
7
  | 内容 | 所有者 |
8
8
  | --- | --- |
9
9
  | CLI 参数、校验、认证 | 原生命令、help 与 profile |
10
- | MCP 连接、认证、发现、schema 与结果 | Pi 原生 MCP |
10
+ | MCP 连接、认证、发现、schema 与结果 | 所属宿主的原生 MCP |
11
11
  | 数据口径、项目约定与使用经验 | providers/<id>/GUIDE.md |
12
12
  | 任务范围、业务判断与必要确认 | 用户与模型 |
13
13
  | 账户权限、额度与强制批准 | 外部服务或执行环境 |
@@ -22,11 +22,13 @@ Pi 处理信任、认证与工具暴露。使用 /mcp 查看连接、工具和
22
22
 
23
23
  子会话按自己的 cwd 和 Pi agent dir 加载配置。需要工作区项目 MCP 时,以工作区根目录作为 cwd,在命令中切换计算目录。父进程临时注册的连接不会自动转移到子进程。
24
24
 
25
+ dsh 使用其固定版本的原生 MCP 组件和 profile 配置,模型与认证也由 dsh 管理。不得将上述 Pi 命令、配置目录或安装包声明直接用于 dsh,也不自动同步两套配置。同进程专家遵循 dsh 的原生作用域与工具可见性;不模拟 Pi 子进程的扩展开关。
26
+
25
27
  ## 授权与结果
26
28
 
27
29
  模型按用户请求和委派范围行动。研究、查询和接入不包含交易、转账或账本修改的授权。独立复核、用户授权和成果验收分别判断。
28
30
 
29
- Bash、Python、MCP 和扩展拥有其实际账户与凭据权限。文件确认与工具选择是防误操作措施,不是执行隔离;硬性限制使用只读凭据、服务端控制或受限环境。
31
+ Bash、Python、MCP 和扩展拥有其实际账户与凭据权限。dsh 的原生 write、edit、apply_patch 检查原工作区,主会话越界要求一次原生批准,专家越界拒绝;整份 patch 和确认后的路径身份都需有效。文件确认与工具选择是防误操作措施,不是执行隔离;硬性限制使用只读凭据、服务端控制或受限环境。
30
32
 
31
33
  工具保留原生结果与错误格式,任务按需保存证据。业务完成需核对实际结果,不能只看退出码或协议成功。取消、超时和断连后,先查询原生状态与业务标识,再决定后续操作;聊天或子会话恢复不自动重发可能已执行的操作。
32
34
 
@@ -36,7 +38,7 @@ Task Conductor 通过原生 MCP 提供周期任务、重复流程和 DAG,独
36
38
 
37
39
  提交任务时明确输入、cwd、工具与认证前提、输出和完成条件;周期任务还需明确频率、时区、授权范围及每轮数据时点。项目资料保存必要的 taskId、runId、节点 ID 和证据,实时状态向 Task Conductor 查询。
38
40
 
39
- pbot 子会话绑定父会话,Task Conductor 可在 Pi 关闭后继续。两者分别查询和停止;取消当前 run 与停止未来周期也是两个操作。
41
+ pbot 子会话绑定父会话,Task Conductor 可在所属宿主会话关闭后继续。两者分别查询和停止;取消当前 run 与停止未来周期也是两个操作。
40
42
 
41
43
  外部节点需单独配置工具、技能、Python 环境和认证,不自动继承主会话能力。需要人工确认的业务不安排无人值守执行。提交结果不明时先按原标识查询,避免重复创建。
42
44
 
@@ -0,0 +1,158 @@
1
+ # dsh 双宿主实施技术方案
2
+
3
+ 状态:双宿主实现及本机 SDK、分发、Web 和桌面验证已完成;最新 Linux 全量与成功模型工作流待验收。产品边界见[双宿主方案](dsh-support-proposal.md),最新结果见[验证](validation.md)。
4
+
5
+ ## 目标与完成条件
6
+
7
+ 在同一个 `personal-bot` npm 包中保留 Pi 入口,增加 dsh 服务端和 Web 客户端入口。两端共用资料、业务规则和历史查询;各自管理原生会话、模型、认证、配置与执行生命周期。dsh 固定使用 `0.2.2-rc.1`,开发和完整验证使用 Linux、Node.js 24.9.0 以上。
8
+
9
+ 交付必须覆盖专家、团队、通知、history、共享 Python、资源、文件确认及人工管理。接入验证和部分功能可作为实施里程碑,不能被表述为完整支持。先验证真实接口,再调整共享服务,避免以假定 API 建立大范围改动。
10
+
11
+ ## 模块与依赖
12
+
13
+ | 模块 | 实施职责 |
14
+ | --- | --- |
15
+ | `src/pbot.ts` | 保留 Pi 装配及加载方式 |
16
+ | `src/dsh.ts` | dsh Cordis 插件入口,显式声明依赖与配置,装配服务端资源 |
17
+ | `src/integrations/dsh/` | 原生 Agent/Session、持久化、模型、历史、附件及事件转换 |
18
+ | `src/extension/dsh/` | 父会话实例、原生命令、Remote、调度、通知及资源释放 |
19
+ | `src/services/agents/` | 专家准入、归属、代次、请求、周期、团队占用与恢复规则 |
20
+ | `src/services/history/` | 来源隔离、归档查询与摘要提交协调 |
21
+ | `src/tools/{agents,teams,history}/` | 普通数据与 JSON Schema、输入校验、业务处理及分别注册的宿主适配 |
22
+ | `src/ui/dsh/` | Web 管理界面,只保存选择、草稿和订阅;不拥有执行资源 |
23
+ | `src/storage/` | 沿用控制记录与原子写入;原生会话位置由接入层解释 |
24
+ | `scripts/` 与包清单 | 服务端 ESM、客户端单 bundle、bundle patch、可选 peer 与 tarball 验证 |
25
+
26
+ 服务不得导入 Cordis、Pi 或 dsh SDK。工具、命令与 Remote 使用同一业务服务。Pi 加载链不能引入 dsh 或浏览器运行时。依赖检查覆盖新增目录及双宿主边界,不新建通用宿主框架。
27
+
28
+ ## 专家与异步边界
29
+
30
+ 现有 `AgentHost` 的同步创建、恢复校验和报告读取需要支持 dsh 原生异步接口。保留同步的本地状态查询;异步操作在共享服务中显式等待,调用方逐层传播,不把 Promise 放入同步文件锁。
31
+
32
+ 创建与恢复分为以下步骤:
33
+
34
+ 1. 核对实例、工作区、父会话、兼容线与模型选项。
35
+ 2. 在短控制锁内完成同一父会话的 50 个存活/启动中专家限额准入,保存新 generation 和启动状态。
36
+ 3. 锁外创建或恢复原生 Agent,在 setup 中安装资源及监听器。恢复时校验原生身份、cwd 和父级,清除旧 native inbox。
37
+ 4. 使用 `SessionStore.flush` 等公开持久化屏障确认空会话已落盘。屏障缺失或失败时不能宣布 start 成功。
38
+ 5. 再核对 generation、stop 和实例;过期则释放原生句柄。通过后才接纳本 generation 的新要求。
39
+
40
+ Pi 继续保留原始 `session-ref.json`、路径与 leaf。dsh 使用独立的原生 Session 引用及持久位置,不给 Pi 文件字段填入 Session ID。业务层只传递引用,不解析 SDK 事件。
41
+
42
+ 从 `extension/subagent-entry.ts` 提取两端实际需要的领取、周期、人工输入归因和中断规则。原生事件转换为请求消费、周期开始、结束原因及固定位置等普通数据。成功判定要求已消费请求、有效轮次结束和非空最终答复;idle 不是成功凭据。
43
+
44
+ stop 先保存停止意图,再取消和释放句柄;释放未完成时保留占用与 stopping 状态。恢复只执行新要求,不自动重放旧 generation 或旧团队批次。只读查看不恢复执行。
45
+
46
+ ## 生命周期、团队与通知
47
+
48
+ 服务端组件持有进程级 Python 激活;工作区持有共用历史整理器;父 Session 持有专家、团队和调度器;专家持有 AgentHandle。页面只观察这些资源。使用服务端实例信号承接已接受的工作,不能让浏览器断连信号取消已接受任务。
49
+
50
+ 团队继续使用现有算法。主会话 send 遵循 `TEAM_BUSY`;专家直接人工输入归为 interactive,混合周期为 mixed,暂停团队且不自动公开混合答复。公共原文注入下一安全边界,普通 post 不开启模型轮次。
51
+
52
+ 通知按 agent/cycle 或 team/run/状态去重。模型领取报告与 UI 浏览分开。异步回调核对实例和 generation;父 Session 关闭或执行组件卸载后,旧工具与 Remote 调用失效。
53
+
54
+ ## History
55
+
56
+ Pi 只维护 `.pi/pbot/history/`,dsh 只维护 `.dsh/pbot/history/`,两端查询双方归档。来源由归档目录确定,关联键为 host 与 sessionId,不重写旧 Pi 节点。新 dsh 根 ID 使用 `dsh-<uuid>`。
57
+
58
+ `search` 增加可选 host 筛选;结果、导航和 read source 带来源。原有正文、关系分页和 Pi ID 语义保留。dsh 接入仅通过公开 Session query/persistence 读原生日志,不扫描另一宿主的原生记录,也不触发 Pi 旧归档导入。
59
+
60
+ 摘要只在本宿主正常交互结束后安排。查询和重连不得调用模型。模型调用在短写锁外;提交前重读归档并核对原文和子节点,丢弃过期结果。dsh 使用原生 LLM 接口,复用当前模型和认证,不写入主聊天。完整工具日志由专家视图读取,不能用问答归档替代。
61
+
62
+ ## Web 与安装
63
+
64
+ 原生命令提供 `/pbot init`、`status`、`python setup` 及专家、团队、history 入口。Web 模块通过 dsh 原生 Remote 查询和操作同一服务,提供专家完整记录、直接对话、停止/恢复,团队操作与 history 展开。查询路径不得隐式激活 Agent。
65
+
66
+ bundle patch 基于原生 Web profile,声明默认 pbot 组合、服务端插件和客户端依赖。固定版客户端发现只接受包根 Loader 名称,因此 `personal-bot` 包根导出作为 dsh 服务端入口的别名,bundle 使用包根名称加载;`personal-bot/dsh` 独立入口仍保留,Pi 继续显式加载源码入口。客户端遵守固定版本 module loader 格式;外部复用 Cordis、React 和原生 UI。宿主包为可选 peer,开发依赖固定版本,不在发布产物打包第二份 SDK。TypeBox 是共享契约库,声明为范围为 `"*"` 的必需 peer,并在开发依赖中锁定版本。Pi 原生加载器提供 TypeBox;dsh 不提供它,由包管理器在安装时补齐,不能依靠 Pi 的安装间接供应。固定版 dsh 的输出 schema 只支持结构约束和 `oneOf`,因此协作工具保留完整生产端校验,并向宿主提供去除 TypeBox 元数据、采用互斥分支的结构 schema。
67
+
68
+ 安装使用原生插件流程。`--from-default-profile` 仅用于首次创建,不作为升级命令。Pi 安装 CLI 不扩展为 dsh 配置管理器。`prepack` 生成 CLI、dsh 服务端和 Web 产物;`dist` 仍只用于测试。
69
+
70
+ ## 实施里程碑
71
+
72
+ | 阶段 | 改动与验收 | 当前状态 |
73
+ | --- | --- | --- |
74
+ | A 固定版接入 | 隔离 home、真实插件加载、空 Agent flush/冷恢复、setup 清旧 inbox、只读查询、Remote/客户端加载、Bash 环境继承 | 已通过下列接入验证 |
75
+ | B 公共边界 | 异步 AgentHost、原生引用、运行规则与工具契约提取;Pi 完整回归、既有持久契约保留 | 已通过 Linux 回归 |
76
+ | C dsh 业务 | 专家、团队、通知、资源、文件确认、多会话与 Python 生命周期 | 核心接入和本地验证通过;完整工作流待验收 |
77
+ | D History 与 Web | 来源查询与写隔离、原生历史及摘要、完整人工管理与重连 | 进行中 |
78
+ | E 分发与验收 | tarball 双宿主加载、CLI 独立运行、文档更新、Linux 全量检查和真实 Web 验收 | 本机全量、双宿主 tarball 与 Web 通过;最新 Linux 和真实模型工作流未完成 |
79
+
80
+ 阶段 A 在临时目录安装固定发布包,不使用个人认证或工作区配置。使用真实 SDK 和 Session API 构造本地记录,不使用 mock、stub、假模型或模拟 provider。SDK 行为验证与最终插件行为测试分开记录;仅保留能覆盖实际正确性风险的测试。
81
+
82
+ 完整检查为 `npm run check`、`npm test`、`git diff --check`、`npm pack --dry-run`。真实模型调用只在已批准环境进行;缺少环境时明确记录相应验收缺口,不能以无模型测试替代。
83
+
84
+ ## 接入验证记录
85
+
86
+ - 固定发布包的真实 Cordis、AgentLoop、JSONL persistence 和内存 query:空专家经 flush 后可被独立进程读取;冷恢复保留身份;恢复 setup 清除旧 inbox 后没有开启旧轮次;错误归属或缺失记录不会激活或替换会话。
87
+ - 使用原生 Session API 写入轮次记录,验证报告固定到持久的 `turn/end`,后续对话及 Agent 释放不改变旧报告。
88
+ - 原生 Bash 在 spawn 时读取进程 venv,两个工作区保留各自 cwd,禁用 user site,环境恢复通过。原生命令的两个父会话分别绑定工作区;关闭一个不影响另一个;卸载插件后旧 handler 失效。
89
+ - Linux Node.js 24.15.0 的初始完整检查通过:`npm ci --ignore-scripts`、`npm run check`、`npm test`,103 项测试通过。之后新增的固定报告及工作区生命周期测试已在本地通过;最终 Linux 全量检查仍须重跑。
90
+ - npm tarball 经原生插件命令安装到隔离 `pbot` profile;真实 Chrome 打开 Web,选择临时工作区,展开 `/pbot` 菜单、执行 status 和 init、刷新后再次查询,工作区和父会话身份保持一致,没有 pageerror。客户端需要同时声明 `remote` 与 `remote.commands` 注入。包根发现规则及 Remote 依赖问题已修正。
91
+ - Web 测试中的 Python 目录刻意包含无关数据,原生 setup 如实返回错误且没有覆盖该数据。该测试不证明完整 Python 依赖安装成功;真实计算环境测试由既有 Python 验证及原生 Bash 测试覆盖。
92
+
93
+ 这些结果只证明接入与无模型生命周期边界。专家完整工作流、执行中页面断开/组件关闭、团队、history、文件确认与模型结果仍在后续阶段验收。
94
+
95
+ 公共边界回归已完成两轮 Linux 全量检查,108 项测试全部通过。`AgentHost` 的创建、校验、报告读取和释放支持异步;启动预约计入限额,恢复校验期间停止不会更换 generation 或写入新输入,关闭等待实际释放。`AgentRun` 统一保存领取、消费、周期与人工输入归因,并封存结果未知的旧领取;Pi 原有文件引用和完成记录格式保留。专家/团队动作处理及公共原文格式化已拆离 Pi 适配。异步扫描发现的会话树事件等待问题已修正,通知恢复与故障升级的原有测试通过。
96
+
97
+ 阶段 C 已接入每个父会话的专家与团队服务、原生工具、角色与技能提供方、附件保存和服务端调度。请求先保存领取,再按原生 inbox 进入轮次、`user/message` 消费及持久 `turn/end` 分别记录;原生领取本身不满足成功条件。人工输入在领取时归入对应周期,在消费后才能支持成功判定;等待未来轮次的人工输入不会把此前的答复误标为 mixed。
98
+
99
+ 当前实现状态见下列阶段 D 记录。阶段 C 检查点的 `npm run check`、构建、差异检查与 19 项定向测试曾全部通过。新增真实原生工具测试验证原工作区固定、归属拒绝、空专家不启轮次、显式恢复与原模型选项保留、缺失 provider 的真实失败、团队有限批次失败暂停且不发布失败答复。真实 Agent maintenance 中运行原生 Bash,验证关闭一个父会话等待其进程退出且另一父会话继续,组件卸载等待剩余进程退出。未安装模型适配器,没有伪造模型回答。创建专家也先 flush 父会话,冷恢复测试因此使用原生 resume 恢复既有父身份。
100
+
101
+ 完成通知复用共同的团队/个人选择和格式规则。dsh 以已提交的 `user/message` 或成功模型工具结果确认领取;PTC 内层 read 还须外层调用成功。原生 inbox 中的排队通知只防止重复提交,不冒充消费。没有正常交互的冷加载和只读查看不会唤醒模型;实际接纳通知或新的人工输入才重新允许自动跟进,失败准入不形成自动重试循环。主会话中断先暂停团队,后台仍核对在途工作;暂停与报告读取故障分别报告。Pi 的三项通知故障与恢复测试通过;测试临时工作目录规范化,避免 macOS 的 `/var` 符号链接造成无效工作区 fixture。
102
+
103
+ 原生 `write`、`edit`、`apply_patch` 已接入文件规则。整份 patch 的源与移动目标先检查,执行前重核 cwd 和目标身份;专家工作区外直接拒绝,主会话使用原生一次批准。真实文件测试覆盖内部修改、符号链接外逃、move 和混合补丁拒绝,以及原生 `rejected`/`unavailable` 审计。真实附件服务验证二进制文件跨块保存后原字节可读、图片准入、原路径删除后附件仍可读,以及目录、取消和图片数量上限拒绝。图片总字节与数量在批量载入期间按宿主限额检查。
104
+
105
+ 阶段 C 检查点仍缺最新 Linux 回归:服务器 SSH 不可达,本机没有 Docker、Colima、Lima 或 Podman,先前 C1 安装未取得成功退出证据。当时浏览器产物只到阶段 A;后续审批、资源与管理验收结果见下文。
106
+
107
+ 阶段 D 的 history 服务和原生工具已接入。两个来源可共同搜索、分别维护;Pi 旧 ID、摘要、关系、分页和旧归档导入继续保留,dsh 不清理或导入 Pi 归档。公开 Session query 读取当前工作区及关联专家,按父级归属纳入不同 cwd 的专家,不把别的工作区专家因 cwd 相同而混入。普通 fork 保留为自身的原生会话;`isSeeded` 是 fork 标记,不是应排除的模板标记。人工 steering、未结束或截断答复保留为原文,工具记录仍由完整原生视图提供。
108
+
109
+ 每个工作区共享一个服务端整理器,正常主交互结束后安排,其他父会话尚在交互或有待输入时不启动;新人工输入和下一原生 step 会取消整理。原生 `llm.prepareCall` 与 `stream` 复用当前模型及认证,采用宿主声明的最低 reasoning effort,单独处理纯文本且不写主聊天。摘要和扫描均在短写锁外准备,提交时重读;原文或子节点变化时放弃旧结果,已经保存的摘要优先。失败保留待整理节点并暴露警告,查询不会调用模型。
110
+
111
+ 本地类型、依赖检查(121 个模块、497 条依赖)、构建、差异检查和 28 项定向组合已通过,覆盖 AgentRun、Pi 通知、全部 dsh 测试及 history。新增测试使用真实 Session、双来源归档和两个 Node 进程;FIFO 仅承载真实 SDK JSONL,用操作系统读写屏障验证慢扫描不能覆盖另一进程的新索引,没有替代来源或模型。测试还覆盖同一原生 ID 的来源区分、来源损坏隔离、旧 Pi 身份与摘要、冷读不激活、取消查询不取消后续刷新、过期摘要拒绝、实际缺失提供方的失败,以及同工作区关闭一个父会话后继续查询。随后补充未加载索引状态区分,相关 10 项 history/工作区回归及检查、构建和差异检查再次通过。
112
+
113
+ 同时收紧了两项原生边界:最终答复需要持久流的 `stop` 标记,工具调用文本和 token 截断不满足成功条件;团队投递使用原生 maintenance 的空闲准入,避免把其公开的 `idle` 状态当作真正空闲。真实 Bash maintenance 验证团队要求在维护结束前没有进入 inbox。外部原生句柄占用也计入存活,恢复被拒绝且 generation 不变;当前组件不能假称已释放别的执行实例。组件卸载会撤销其挂在父会话上的 effect,释放历史缓存。
114
+
115
+ Web 管理已接入固定版公开的 `TypertRemoteService`、`Remote` 和 Typert 注册接口。四个查询描述符由 Host 与 Client 共用,Host 按组件注册,Client 通过原生 `$mount` 挂载;没有私有 HTTP 或额外类型编译框架。读取、轮询和完整原生记录使用查询方法;原生命令会追加 `command/run`/`command/done`,不能拿它反复轮询页面。原生记录按事件分页,正文与完整事件都能继续读取长内容,停止后的专家仍可冷读。人工写操作复用命令、工具的业务动作,命令不重复记录私人输入正文。
116
+
117
+ `/pbot` 的裸调用打开工作区、专家、团队和历史管理页;带参数的原生命令支持 `agent`、`chat`、`team`、`post`、`history`、`records`。页面保存自己的表单与选择,只取消查询,已经接纳的执行归服务端所有。人工对话支持服务器文件及原生输入框已准入附件,先成功暂停所属团队再进入 inbox;人工输入待进入时停止追加团队上下文。原生 registry 的根归属用于识别协调者,不只依靠可选的 origin 标签。改变 provider 或 model 时,不再把父会话的 reasoning effort 带到另一模型。
118
+
119
+ 新增真实 SDK 管理测试覆盖只读查询不写主会话、不启动空专家、完整记录分页、停止后冷读、父归属、未标注 origin 的原生子 Agent、组件卸载后的失效、暂停锁失败时不接纳人工消息,以及实际缺失 provider 的失败。该测试没有模拟模型。
120
+
121
+ 本机全量回归发现测试环境只隔离 XDG 路径,不符合 macOS Python 按 HOME 定位的规则,并有临时目录 `/var` 别名与 `/private/var` 不一致的问题。已停止首次全量运行;核查个人 Python 环境元数据,未发现首次全量日志创建之后修改的文件或目录条目,没有删除或回滚。此前本机测试不能作为完整 Python 环境隔离的证据。测试现在使用临时 HOME,让真实脚本以 `--check` 确定环境位置,再放入无关数据;真实 Python 仍用于解释器与计算检查。32 项定向回归通过,随后全量为 120/122,余下两项是旧 fixture 固定 Linux 路径和 `/usr/bin/python3` 的假设。修正后相关 E2E/包检查 4 项通过,随后本机完整 `npm run check`、`npm test` 和 `git diff --check` 通过,122/122 项测试成功。该结果不替代 Linux 验收。
122
+
123
+ 正常 `prepack` 生成的 tarball 已通过原生插件命令装入新的隔离 Web profile,并使用真实 Chrome 验证四个 Remote 的实际传输。管理页新增本机附件选择:通用文件使用原生 `fileUpload` 的 Session 凭证,图片按原生命令的编码图片契约准入;不发送任意附件引用,也不实现私有上传路由。32 个附件的数量限制与取消由实际输入路径检查。上传期间保留新编辑的草稿,关闭视图取消尚未接纳的上传,已接纳命令继续属于服务端。
124
+
125
+ 本轮浏览器验收通过:
126
+
127
+ - 创建无任务专家;轮询保留人工草稿,不发管理写命令。
128
+ - 上传 524,305 字节文件与 1×1 图片,原生专家记录保留相应文件长度、图像引用和完整人工文本;长 JSON 事件可分段重组。
129
+ - 创建两个固定成员的团队,发布 20,000 字符公共消息;翻到后续正文后轮询保留页码与草稿。
130
+ - 真实缺失 provider 使批次暂停,没有伪造提供方或成功模型答复。
131
+ - 停止后的专家可冷读,显式新任务恢复成功接纳;history 可以检索失败交互并读取原文。
132
+ - 页面刷新前后父身份一致,专家保持存活;全流程观察到恰好 9 次管理写命令,查询与轮询未追加写命令;`pageerror` 为空。
133
+
134
+ 文件确认也通过实际原生 Web 审批:仅有的一次允许产生 `allowed-once` 并写入测试目录中的目标;等待期间改变符号链接后,即使允许也拒绝执行,两个原文件不变;真实信号取消产生 `cancelled`,目标未创建。验证命令只存在于临时 profile,使用公开 Session API 打开审计轮次并直接执行原生工具,没有生成模型响应。证据位于 `/tmp/pbot-dsh-web-D/upload/`、`/tmp/pbot-dsh-web-D/file-proof/` 和 `/tmp/pbot-dsh-browser/`,临时文件可能被清理。
135
+
136
+ 固定版原生默认工作区使用操作系统 Documents 查询,macOS 上不会随测试 HOME 自动改变。测试 profile 已配置 `documentsDirectory`,并通过真实目录选择器选入临时工作区;pbot 的准备、专家、团队及 history 写入验收均在该目录内完成。
137
+
138
+ 接入基线的本机检查已通过:`npm run check`、`npm test`、`git diff --check` 退出码 0,122/122 无跳过,测试耗时约 54.1 秒,覆盖附件与资源新增逻辑。依赖边界为 130 个模块、532 条依赖。专家不再显示无法调用的父 history 工具;真实 SDK 验证 noSkills、工具限制、包内技能读取及工作区技能隔离。Web 状态刷新也丢弃过期响应,避免旧查询覆盖新状态。
139
+
140
+ 正常 `npm pack --dry-run` 与 prepack 打包通过。实际 tarball 在独立消费者中只安装包自身运行时依赖,没有 Pi/dsh SDK 副本;Node.js 22.19.0 下独立 CLI、Pi 四工具与技能加载、资料初始化、空专家查询通过。固定版 dsh 原生安装最终运行代码后,附件、长记录、团队、history、冷读、恢复与刷新再次通过,观察到 9 次管理写命令,轮询未增加写命令,浏览器错误为空。证据:`/tmp/pbot-dsh-docs/check-E-final.*`、`/tmp/pbot-dsh-final/`。
141
+
142
+ 真实 Web 停用插件会移除命令并释放专家,重新启用后保持停止且可冷读;关闭管理页不停止专家。完整浏览器进程关闭后再打开,原父身份与两个专家的存活状态保持。资料准备可重复执行并保留文件。证据:`/tmp/pbot-dsh-web-D/unload-verified.json` 和 `/tmp/pbot-dsh-final/reconnect.json`。
143
+
144
+ 本机桌面应用 0.2.2-rc.1(内置 Node.js 24.21.0)也完成实际验收:独立 Electron userData、DSH_HOME、HOME 与 Documents 目录,通过原生插件 UI 安装 tarball、启用并执行完整管理流程。附件、长记录、团队失败暂停、history、恢复与刷新通过,10 次管理写命令且页面错误为空;32 MiB 上传在关闭面板后取消,没有提交 chat 或追加 inbox。完整退出应用会停止专家,重开及插件重新启用均不自动恢复。临时登录 Shell 的 PATH 提供 Python 3.12 后,应用真实安装锁定依赖并达到 ready,pip check 和 5 项原生库测试通过。隔离实例模型选择器显示 `No models available`;原日常应用进程保持运行,测试进程已退出。详见[桌面验收记录](validation.md#macos-桌面应用实测),证据在 `/tmp/pbot-dsh-desktop-test/`。
145
+
146
+ 后台模型整理成功、输入优先取消真实模型请求、成功专家/团队协作、模型实际使用资源与团队上下文,以及最新 Linux 全量仍未验收。SSH 最后重试仍超时;无模型检查和旧版 Pi 冒烟不能替代本次真实提供方工作流。
147
+
148
+ ## 优先核查的风险
149
+
150
+ | 风险 | 验证与处理 |
151
+ | --- | --- |
152
+ | 空会话延迟落盘 | 真实创建、公开 flush、释放、冷读取与恢复;不插入假消息促使落盘 |
153
+ | 恢复自动消费旧 inbox | 在 setup 中清除旧输入,验证发布前顺序;只接受新 generation |
154
+ | 服务端所有权与页面生命周期耦合 | 两个父会话、断开观察、组件卸载分别验证 |
155
+ | 同进程专家无法强杀 | 验证协作取消及 dispose;阻塞时保持真实状态和占用 |
156
+ | 客户端发布格式或依赖解析不匹配 | 使用真实 tarball 在隔离 Web profile 加载,检查 Remote 与原生 UI |
157
+ | Pi 既有存储被异步改动破坏 | 先完成 Pi 回归,再接入 dsh;原始数据不迁移 |
158
+ | 固定预发布包缺少必要公开能力 | 保存可复现证据与具体影响,报告需重审的决定,不静默改版本或缩减范围 |