@selesai/code 0.13.0 → 0.13.2

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 (463) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/core/agent-session.d.ts +1 -1
  3. package/dist/core/agent-session.js +1 -1
  4. package/dist/core/sdk.d.ts +2 -2
  5. package/dist/core/sdk.js +1 -1
  6. package/dist/core/system-prompt.d.ts +1 -1
  7. package/dist/core/system-prompt.js +1 -1
  8. package/dist/extensions/package.json +1 -2
  9. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +371 -0
  10. package/dist/extensions/pi-hermes-memory/LICENSE +21 -0
  11. package/dist/extensions/pi-hermes-memory/README.md +643 -0
  12. package/dist/extensions/pi-hermes-memory/docs/0.1/TASKS.md +197 -0
  13. package/dist/extensions/pi-hermes-memory/docs/0.2/PLAN.md +290 -0
  14. package/dist/extensions/pi-hermes-memory/docs/0.2/TASKS.md +134 -0
  15. package/dist/extensions/pi-hermes-memory/docs/0.2/TEST-PLAN.md +216 -0
  16. package/dist/extensions/pi-hermes-memory/docs/0.3/PLAN.md +330 -0
  17. package/dist/extensions/pi-hermes-memory/docs/0.3/TASKS.md +125 -0
  18. package/dist/extensions/pi-hermes-memory/docs/0.4/PLAN.md +160 -0
  19. package/dist/extensions/pi-hermes-memory/docs/0.4/TASKS.md +113 -0
  20. package/dist/extensions/pi-hermes-memory/docs/0.6/CHANGELOG.md +57 -0
  21. package/dist/extensions/pi-hermes-memory/docs/0.6/PLAN.md +202 -0
  22. package/dist/extensions/pi-hermes-memory/docs/0.6/TASKS.md +144 -0
  23. package/dist/extensions/pi-hermes-memory/docs/0.7/PLAN.md +349 -0
  24. package/dist/extensions/pi-hermes-memory/docs/0.7/TASKS.md +110 -0
  25. package/dist/extensions/pi-hermes-memory/docs/PUBLISHING.md +149 -0
  26. package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +468 -0
  27. package/dist/extensions/pi-hermes-memory/docs/images/memory-architecture.svg +1 -0
  28. package/dist/extensions/pi-hermes-memory/docs/images/pi-logo.svg +22 -0
  29. package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.png +0 -0
  30. package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.svg +19 -0
  31. package/dist/extensions/pi-hermes-memory/docs/images/security-flow.svg +1 -0
  32. package/dist/extensions/pi-hermes-memory/docs/images/session-lifecycle.svg +1 -0
  33. package/dist/extensions/pi-hermes-memory/docs/images/source-architecture.svg +1 -0
  34. package/dist/extensions/pi-hermes-memory/docs/mermaid/memory-architecture.mmd +49 -0
  35. package/dist/extensions/pi-hermes-memory/docs/mermaid/security-flow.mmd +40 -0
  36. package/dist/extensions/pi-hermes-memory/docs/mermaid/session-lifecycle.mmd +56 -0
  37. package/dist/extensions/pi-hermes-memory/docs/mermaid/source-architecture.mmd +54 -0
  38. package/dist/extensions/pi-hermes-memory/package-lock.json +3799 -0
  39. package/dist/extensions/pi-hermes-memory/package.json +66 -0
  40. package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +99 -0
  41. package/dist/extensions/pi-hermes-memory/scripts/ensure-dev.mjs +57 -0
  42. package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +6 -0
  43. package/dist/extensions/pi-hermes-memory/src/config.ts +178 -0
  44. package/dist/extensions/pi-hermes-memory/src/constants.ts +424 -0
  45. package/dist/extensions/pi-hermes-memory/src/extension-root-migration.ts +639 -0
  46. package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +401 -0
  47. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +297 -0
  48. package/dist/extensions/pi-hermes-memory/src/handlers/child-process-watchdog.mjs +90 -0
  49. package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +300 -0
  50. package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +86 -0
  51. package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +78 -0
  52. package/dist/extensions/pi-hermes-memory/src/handlers/interview.ts +37 -0
  53. package/dist/extensions/pi-hermes-memory/src/handlers/learn-memory.ts +186 -0
  54. package/dist/extensions/pi-hermes-memory/src/handlers/message-parts.ts +27 -0
  55. package/dist/extensions/pi-hermes-memory/src/handlers/pi-child-process.ts +485 -0
  56. package/dist/extensions/pi-hermes-memory/src/handlers/preview-context.ts +105 -0
  57. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +506 -0
  58. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +145 -0
  59. package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +151 -0
  60. package/dist/extensions/pi-hermes-memory/src/handlers/session-live-index.ts +94 -0
  61. package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +1334 -0
  62. package/dist/extensions/pi-hermes-memory/src/handlers/standing-pin.ts +111 -0
  63. package/dist/extensions/pi-hermes-memory/src/handlers/switch-project.ts +75 -0
  64. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +266 -0
  65. package/dist/extensions/pi-hermes-memory/src/index.ts +378 -0
  66. package/dist/extensions/pi-hermes-memory/src/lifecycle-timing.ts +54 -0
  67. package/dist/extensions/pi-hermes-memory/src/paths.ts +61 -0
  68. package/dist/extensions/pi-hermes-memory/src/project-context.ts +13 -0
  69. package/dist/extensions/pi-hermes-memory/src/project-memory-migration.ts +93 -0
  70. package/dist/extensions/pi-hermes-memory/src/project.ts +157 -0
  71. package/dist/extensions/pi-hermes-memory/src/prompt-context.ts +55 -0
  72. package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +375 -0
  73. package/dist/extensions/pi-hermes-memory/src/store/canonical-storage-path.ts +54 -0
  74. package/dist/extensions/pi-hermes-memory/src/store/content-scanner.ts +101 -0
  75. package/dist/extensions/pi-hermes-memory/src/store/db.ts +1180 -0
  76. package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +101 -0
  77. package/dist/extensions/pi-hermes-memory/src/store/markdown-mutation-lock.ts +38 -0
  78. package/dist/extensions/pi-hermes-memory/src/store/memory-lookup.ts +24 -0
  79. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +1191 -0
  80. package/dist/extensions/pi-hermes-memory/src/store/recovery-maintenance.ts +66 -0
  81. package/dist/extensions/pi-hermes-memory/src/store/schema.ts +118 -0
  82. package/dist/extensions/pi-hermes-memory/src/store/session-anchor-search.ts +472 -0
  83. package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +511 -0
  84. package/dist/extensions/pi-hermes-memory/src/store/session-parser.ts +213 -0
  85. package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +234 -0
  86. package/dist/extensions/pi-hermes-memory/src/store/skill-store.ts +950 -0
  87. package/dist/extensions/pi-hermes-memory/src/store/skill-utils.ts +133 -0
  88. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +1002 -0
  89. package/dist/extensions/pi-hermes-memory/src/store/sqlite-native.ts +241 -0
  90. package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +247 -0
  91. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +95 -0
  92. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +469 -0
  93. package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +246 -0
  94. package/dist/extensions/pi-hermes-memory/src/tools/shared-output-view.ts +170 -0
  95. package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +333 -0
  96. package/dist/extensions/pi-hermes-memory/src/tools/tool-result-views.ts +105 -0
  97. package/dist/extensions/pi-hermes-memory/src/types.ts +214 -0
  98. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +434 -0
  99. package/dist/extensions/pi-hermes-memory/tests/extension-root-migration.test.ts +368 -0
  100. package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +984 -0
  101. package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +950 -0
  102. package/dist/extensions/pi-hermes-memory/tests/handlers/correction-detector.test.ts +671 -0
  103. package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +157 -0
  104. package/dist/extensions/pi-hermes-memory/tests/handlers/interview.test.ts +127 -0
  105. package/dist/extensions/pi-hermes-memory/tests/handlers/pi-child-process.test.ts +905 -0
  106. package/dist/extensions/pi-hermes-memory/tests/handlers/preview-context.test.ts +152 -0
  107. package/dist/extensions/pi-hermes-memory/tests/handlers/prompt-context.test.ts +166 -0
  108. package/dist/extensions/pi-hermes-memory/tests/handlers/resources-discover.test.ts +71 -0
  109. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +614 -0
  110. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +192 -0
  111. package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +677 -0
  112. package/dist/extensions/pi-hermes-memory/tests/handlers/session-live-index.test.ts +225 -0
  113. package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +827 -0
  114. package/dist/extensions/pi-hermes-memory/tests/handlers/standing-pin.test.ts +134 -0
  115. package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +491 -0
  116. package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +199 -0
  117. package/dist/extensions/pi-hermes-memory/tests/handlers/thinking-max.test.ts +64 -0
  118. package/dist/extensions/pi-hermes-memory/tests/index.test.ts +30 -0
  119. package/dist/extensions/pi-hermes-memory/tests/integration/flow.test.ts +126 -0
  120. package/dist/extensions/pi-hermes-memory/tests/lifecycle-timing.test.ts +76 -0
  121. package/dist/extensions/pi-hermes-memory/tests/paths.test.ts +23 -0
  122. package/dist/extensions/pi-hermes-memory/tests/project-memory-migration.test.ts +80 -0
  123. package/dist/extensions/pi-hermes-memory/tests/project-rebinding.test.ts +115 -0
  124. package/dist/extensions/pi-hermes-memory/tests/project.test.ts +120 -0
  125. package/dist/extensions/pi-hermes-memory/tests/run-all-timeout.test.ts +107 -0
  126. package/dist/extensions/pi-hermes-memory/tests/run-all.sh +45 -0
  127. package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-coordinator.test.ts +381 -0
  128. package/dist/extensions/pi-hermes-memory/tests/store/content-scanner.test.ts +388 -0
  129. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +1046 -0
  130. package/dist/extensions/pi-hermes-memory/tests/store/markdown-mutation-lock.test.ts +34 -0
  131. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +2150 -0
  132. package/dist/extensions/pi-hermes-memory/tests/store/recovery-maintenance.test.ts +170 -0
  133. package/dist/extensions/pi-hermes-memory/tests/store/session-anchor-search.test.ts +210 -0
  134. package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +643 -0
  135. package/dist/extensions/pi-hermes-memory/tests/store/session-parser.test.ts +282 -0
  136. package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +287 -0
  137. package/dist/extensions/pi-hermes-memory/tests/store/skill-store.test.ts +678 -0
  138. package/dist/extensions/pi-hermes-memory/tests/store/skill-utils.test.ts +21 -0
  139. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-lazy-load.test.ts +78 -0
  140. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +543 -0
  141. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +164 -0
  142. package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +171 -0
  143. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +84 -0
  144. package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +709 -0
  145. package/dist/extensions/pi-hermes-memory/tests/tools/session-search-tool.test.ts +345 -0
  146. package/dist/extensions/pi-hermes-memory/tests/tools/shared-output-view.test.ts +362 -0
  147. package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +478 -0
  148. package/dist/extensions/pi-hermes-memory/tests/tools/tool-result-renderer-wiring.test.ts +40 -0
  149. package/dist/extensions/pi-hermes-memory/tsconfig.json +19 -0
  150. package/dist/extensions/pi-rewind-hook/README.md +4 -1
  151. package/dist/extensions/pi-rewind-hook/index.ts +151 -21
  152. package/dist/extensions/pi-rewind-hook/package.json +5 -3
  153. package/dist/extensions/pi-subagents/.oxlintrc.json +43 -0
  154. package/dist/extensions/pi-subagents/AGENTS.md +5 -0
  155. package/dist/extensions/pi-subagents/CHANGELOG.md +157 -0
  156. package/dist/extensions/pi-subagents/README.md +12 -6
  157. package/dist/extensions/pi-subagents/VISION.md +81 -0
  158. package/dist/extensions/pi-subagents/agents/claude-code-writer.md +15 -0
  159. package/dist/extensions/pi-subagents/agents/claude-code.md +15 -0
  160. package/dist/extensions/pi-subagents/agents/codex-exec-writer.md +15 -0
  161. package/dist/extensions/pi-subagents/agents/codex-exec.md +15 -0
  162. package/dist/extensions/pi-subagents/agents/cursor-agent-writer.md +14 -0
  163. package/dist/extensions/pi-subagents/agents/cursor-agent.md +14 -0
  164. package/dist/extensions/pi-subagents/agents/reviewer.md +1 -3
  165. package/dist/extensions/pi-subagents/docs/agents.md +488 -0
  166. package/dist/extensions/pi-subagents/docs/configuration.md +46 -9
  167. package/dist/extensions/pi-subagents/docs/extension-api.md +42 -3
  168. package/dist/extensions/pi-subagents/docs/models.md +27 -4
  169. package/dist/extensions/pi-subagents/docs/observability.md +10 -9
  170. package/dist/extensions/pi-subagents/docs/tool-reference.md +102 -6
  171. package/dist/extensions/pi-subagents/docs/workflows.md +135 -0
  172. package/dist/extensions/pi-subagents/package-lock.json +389 -2
  173. package/dist/extensions/pi-subagents/package.json +3 -1
  174. package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
  175. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +1 -1
  176. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +3 -1
  177. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +7 -3
  178. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
  179. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +26 -5
  180. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +41 -22
  181. package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +4 -4
  182. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +9 -2
  183. package/dist/extensions/pi-subagents/src/agents/agents.ts +322 -75
  184. package/dist/extensions/pi-subagents/src/agents/builtin-names.ts +6 -0
  185. package/dist/extensions/pi-subagents/src/agents/runtime-agent-events.ts +70 -0
  186. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +27 -20
  187. package/dist/extensions/pi-subagents/src/api/agents.ts +10 -5
  188. package/dist/extensions/pi-subagents/src/api/background-work.ts +5 -1
  189. package/dist/extensions/pi-subagents/src/api/delegation.ts +0 -7
  190. package/dist/extensions/pi-subagents/src/api/preflight.ts +34 -12
  191. package/dist/extensions/pi-subagents/src/extension/config.ts +70 -0
  192. package/dist/extensions/pi-subagents/src/extension/doctor.ts +3 -3
  193. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +5 -3
  194. package/dist/extensions/pi-subagents/src/extension/index.ts +83 -30
  195. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +44 -15
  196. package/dist/extensions/pi-subagents/src/extension/rpc.ts +55 -19
  197. package/dist/extensions/pi-subagents/src/extension/schemas.ts +41 -15
  198. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -31
  199. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +2 -1
  200. package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +2 -10
  201. package/dist/extensions/pi-subagents/src/inspectors/herdr/session-roots-codec.ts +42 -0
  202. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +51 -7
  203. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +2 -0
  204. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +5 -6
  205. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +77 -10
  206. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +176 -53
  207. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +19 -12
  208. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +29 -27
  209. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +20 -3
  210. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +23 -261
  211. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +73 -7
  212. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +8 -3
  213. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +74 -8
  214. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +37 -21
  215. package/dist/extensions/pi-subagents/src/runs/background/inspect-rpc.ts +8 -8
  216. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +184 -9
  217. package/dist/extensions/pi-subagents/src/runs/background/result-delivery-ownership.ts +45 -0
  218. package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +28 -14
  219. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +38 -15
  220. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +1 -1
  221. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +1 -1
  222. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +50 -13
  223. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +93 -8
  224. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +10 -4
  225. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +4 -14
  226. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +549 -377
  227. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +58 -10
  228. package/dist/extensions/pi-subagents/src/runs/background/terminal-run-index.ts +1 -1
  229. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +26 -1
  230. package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +23 -9
  231. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +9 -2
  232. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +2 -2
  233. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +204 -129
  234. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +9 -0
  235. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +23 -1
  236. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +773 -311
  237. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +140 -115
  238. package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +119 -0
  239. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +463 -0
  240. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +19 -4
  241. package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +151 -0
  242. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +21 -7
  243. package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +129 -0
  244. package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
  245. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +89 -0
  246. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +5 -4
  247. package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
  248. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +3 -3
  249. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +167 -0
  250. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +122 -0
  251. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +348 -55
  252. package/dist/extensions/pi-subagents/src/runs/shared/fast-mode-extension.ts +5 -5
  253. package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +230 -0
  254. package/dist/extensions/pi-subagents/src/runs/shared/lane-metadata.ts +105 -0
  255. package/dist/extensions/pi-subagents/src/runs/shared/launch-cwd.ts +16 -0
  256. package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +2 -1
  257. package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +422 -0
  258. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +221 -158
  259. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +197 -0
  260. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +69 -7
  261. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +47 -6
  262. package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +7 -2
  263. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +9 -3
  264. package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +9 -5
  265. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +419 -7
  266. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +15 -1
  267. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +81 -8
  268. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +13 -0
  269. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +21 -1
  270. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +44 -4
  271. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +98 -13
  272. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +1 -1
  273. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +847 -0
  274. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +18 -0
  275. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +46 -0
  276. package/dist/extensions/pi-subagents/src/shared/extension-context.ts +24 -0
  277. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +21 -0
  278. package/dist/extensions/pi-subagents/src/shared/formatters.ts +18 -3
  279. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +5 -1
  280. package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +450 -0
  281. package/dist/extensions/pi-subagents/src/shared/session-file-trust.ts +19 -0
  282. package/dist/extensions/pi-subagents/src/shared/session-tokens.ts +14 -3
  283. package/dist/extensions/pi-subagents/src/shared/settings.ts +19 -105
  284. package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +17 -0
  285. package/dist/extensions/pi-subagents/src/shared/types.ts +359 -40
  286. package/dist/extensions/pi-subagents/src/shared/utils.ts +41 -84
  287. package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +116 -0
  288. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -9
  289. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +0 -4
  290. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +1 -2
  291. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +378 -88
  292. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +22 -11
  293. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +3 -0
  294. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +147 -79
  295. package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +11 -5
  296. package/dist/extensions/pi-subagents/src/tui/fleet.ts +39 -18
  297. package/dist/extensions/pi-subagents/src/tui/render.ts +369 -46
  298. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +1 -1
  299. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +6 -3
  300. package/dist/extensions/pi-subagents/src/workflows/host-command.ts +230 -0
  301. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +740 -58
  302. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +121 -0
  303. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +270 -0
  304. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +195 -6
  305. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +246 -0
  306. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
  307. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1114 -260
  308. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +34 -0
  309. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +150 -3
  310. package/dist/extensions/pi-subagents/test/integration/claude-code-smoke.test.ts +52 -0
  311. package/dist/extensions/pi-subagents/test/integration/claude-code-writer-smoke.test.ts +55 -0
  312. package/dist/extensions/pi-subagents/test/integration/codex-exec-smoke.test.ts +53 -0
  313. package/dist/extensions/pi-subagents/test/integration/codex-exec-writer-smoke.test.ts +57 -0
  314. package/dist/extensions/pi-subagents/test/integration/cursor-agent-smoke.test.ts +59 -0
  315. package/dist/extensions/pi-subagents/test/integration/cursor-agent-writer-smoke.test.ts +62 -0
  316. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +57 -1
  317. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +1 -0
  318. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +20 -0
  319. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +4 -3
  320. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +2 -2
  321. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +54 -4
  322. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +482 -4
  323. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +157 -9
  324. package/dist/extensions/pi-subagents/test/integration/session-tokens.test.ts +5 -5
  325. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1508 -291
  326. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +423 -1
  327. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +8 -0
  328. package/dist/extensions/pi-subagents/test/support/cursor-smoke-inputs.ts +51 -0
  329. package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
  330. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +5 -5
  331. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +6 -6
  332. package/dist/extensions/pi-subagents/test/unit/abort-recovery.test.ts +152 -0
  333. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +48 -0
  334. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +184 -6
  335. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +66 -6
  336. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +77 -0
  337. package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +18 -0
  338. package/dist/extensions/pi-subagents/test/unit/anti-slop-oxlint.test.ts +86 -0
  339. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +1 -1
  340. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +101 -1
  341. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +121 -0
  342. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +28 -0
  343. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +14 -7
  344. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +53 -0
  345. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +190 -0
  346. package/dist/extensions/pi-subagents/test/unit/async-status-snapshot.test.ts +42 -0
  347. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +8 -4
  348. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +23 -0
  349. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +78 -1
  350. package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +94 -0
  351. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +21 -0
  352. package/dist/extensions/pi-subagents/test/unit/child-session-name.test.ts +50 -0
  353. package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +245 -0
  354. package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +192 -0
  355. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +27 -0
  356. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +150 -0
  357. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +21 -0
  358. package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +259 -0
  359. package/dist/extensions/pi-subagents/test/unit/cursor-smoke-inputs.test.ts +77 -0
  360. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +1 -4
  361. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
  362. package/dist/extensions/pi-subagents/test/unit/extension-context.test.ts +27 -0
  363. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +223 -0
  364. package/dist/extensions/pi-subagents/test/unit/fast-mode-extension.test.ts +27 -0
  365. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +208 -2
  366. package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +29 -1
  367. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +110 -1
  368. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +10 -0
  369. package/dist/extensions/pi-subagents/test/unit/formatters.test.ts +14 -0
  370. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +18 -9
  371. package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +63 -0
  372. package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
  373. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +136 -6
  374. package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +156 -0
  375. package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +98 -0
  376. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +178 -26
  377. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +2 -1
  378. package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +21 -0
  379. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +138 -0
  380. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +1 -1
  381. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +91 -0
  382. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +72 -7
  383. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +21 -0
  384. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +1 -0
  385. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +20 -2
  386. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +129 -1
  387. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +2 -2
  388. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +4 -0
  389. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +358 -0
  390. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +574 -21
  391. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +109 -1
  392. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +71 -1
  393. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +7 -7
  394. package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +214 -0
  395. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +29 -8
  396. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +53 -0
  397. package/dist/extensions/pi-subagents/test/unit/result-delivery-ownership.test.ts +34 -0
  398. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +101 -3
  399. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +1 -0
  400. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +10 -8
  401. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +71 -1
  402. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +41 -7
  403. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +136 -2
  404. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +137 -0
  405. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +33 -12
  406. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +504 -1
  407. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +8 -0
  408. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
  409. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +12 -1
  410. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +3 -5
  411. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +5 -6
  412. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +0 -8
  413. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +5 -0
  414. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +157 -2
  415. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +1 -1
  416. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +63 -4
  417. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +27 -23
  418. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +44 -0
  419. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +1 -0
  420. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +7 -5
  421. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +106 -0
  422. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +484 -9
  423. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +38 -4
  424. package/dist/extensions/pi-subagents/test/unit/workflow-preflight.test.ts +155 -0
  425. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +318 -0
  426. package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +365 -0
  427. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +349 -0
  428. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +21 -0
  429. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +2 -7
  430. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/index.ts +13 -0
  431. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/rules/no-service-constructor-imports.ts +52 -0
  432. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/index.ts +41 -0
  433. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-chained-type-assertions.ts +77 -0
  434. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-conditional-empty-object-spread.ts +49 -0
  435. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-known-value-widening.ts +247 -0
  436. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-module-mocking.ts +91 -0
  437. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-object-parameters.ts +126 -0
  438. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-apply.ts +28 -0
  439. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-get.ts +28 -0
  440. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-runtime-typeof.ts +67 -0
  441. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts +39 -0
  442. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-parameters.ts +83 -0
  443. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-returns.ts +115 -0
  444. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-type-aliases.ts +72 -0
  445. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts +134 -0
  446. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts +366 -0
  447. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/require-safety-comment-for-type-assertion.ts +62 -0
  448. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/dictionary-types.ts +502 -0
  449. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/lexical-type-parameters.ts +60 -0
  450. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/reflect-method.ts +35 -0
  451. package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +1 -1
  452. package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +2 -2
  453. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +1 -1
  454. package/dist/modes/interactive/interactive-mode.js +7 -7
  455. package/dist/skills/workflow/SKILL.md +65 -50
  456. package/package.json +112 -110
  457. package/dist/extensions/enable-readonly-tools.test.ts +0 -63
  458. package/dist/extensions/enable-readonly-tools.ts +0 -24
  459. package/dist/extensions/model-prompt-injector/config.json +0 -16
  460. package/dist/extensions/model-prompt-injector/index.test.ts +0 -102
  461. package/dist/extensions/model-prompt-injector/index.ts +0 -148
  462. package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +0 -98
  463. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +0 -250
@@ -111,6 +111,16 @@ test("widget render keys keep compact payloads quiet and expanded payloads fresh
111
111
  const nestedVisibleChange = structuredClone(job);
112
112
  nestedVisibleChange.nestedChildren = [{ id: "nested-1", parentRunId: "workflow-1", depth: 1, path: [{ runId: "workflow-1" }], state: "failed", agent: "nested", error: "failed" }];
113
113
  assert.notEqual(widgetRenderKey(nestedVisibleChange), widgetRenderKey(job));
114
+
115
+ const preflightJob: AsyncJobState = {
116
+ ...job,
117
+ preflight: { version: 1, coverage: "complete", lanes: [{ key: "writer", decision: "Implement change" }] },
118
+ workflow: { trace: [], emits: [], console: [], preflightWarnings: ["first mismatch"] },
119
+ };
120
+ const warningDetailChange = structuredClone(preflightJob);
121
+ warningDetailChange.workflow!.preflightWarnings = ["different mismatch"];
122
+ assert.equal(widgetRenderKey(warningDetailChange), widgetRenderKey(preflightJob));
123
+ assert.notEqual(widgetRenderKey(warningDetailChange, true), widgetRenderKey(preflightJob, true));
114
124
  });
115
125
 
116
126
  test("multiline rendering omits two-column graphemes at one-column width", () => {
@@ -146,6 +156,8 @@ test("running single-subagent cards show the configured detach shortcut", () =>
146
156
  undefined,
147
157
  "ctrl+b",
148
158
  ));
159
+ assert.match(configured, /task: reviewer task/);
160
+ assert.match(configured, /Ctrl\+Alt\+F Fleet/);
149
161
  assert.match(configured, /Ctrl\+B to run in background/);
150
162
 
151
163
  const unconfigured = componentText(renderSubagentResult(toolResult as never, { expanded: false }, theme as any));
@@ -172,6 +184,33 @@ test("running single-subagent cards show the configured detach shortcut", () =>
172
184
  assert.doesNotMatch(pendingBackground, /run in background/);
173
185
  });
174
186
 
187
+ test("compact multi-result cards prefer bounded workflow labels over raw tasks", () => {
188
+ const longLabel = `Review auth flow\n${"x".repeat(140)}`;
189
+ const running = {
190
+ ...result("reviewer", ""),
191
+ task: "raw task that should not win",
192
+ progress: { status: "running", index: 0, agent: "reviewer", toolCount: 0, tokens: 0, durationMs: 0 },
193
+ };
194
+ const text = componentText(renderSubagentResult({
195
+ content: [{ type: "text", text: "running" }],
196
+ details: {
197
+ mode: "parallel",
198
+ results: [running],
199
+ workflowGraph: {
200
+ runId: "workflow-task-label",
201
+ mode: "parallel",
202
+ phases: [],
203
+ nodes: [{ id: "review", kind: "agent", agent: "reviewer", label: longLabel, status: "running", flatIndex: 0 }],
204
+ },
205
+ },
206
+ }, { expanded: false }, theme as any));
207
+
208
+ assert.match(text, /task: Review auth flow x+/);
209
+ assert.doesNotMatch(text, /raw task that should not win/);
210
+ assert.match(text, /\.\.\.$/m);
211
+ assert.match(text, /Ctrl\+Alt\+F Fleet/);
212
+ });
213
+
175
214
  test("compact chain rendering uses workflow graph spans for dynamic fanout results", () => {
176
215
  const component = renderSubagentResult({
177
216
  content: [{ type: "text", text: "done" }],
@@ -331,6 +370,20 @@ test("static sequential and static parallel chain rendering keep existing labels
331
370
  assert.match(parallel, /Step 3: writer/);
332
371
  });
333
372
 
373
+ test("expanded simple chain summaries prefer result session names", () => {
374
+ const expanded = componentText(renderSubagentResult({
375
+ content: [{ type: "text", text: "done" }],
376
+ details: {
377
+ mode: "chain",
378
+ chainAgents: ["chain-label"],
379
+ totalSteps: 1,
380
+ results: [{ ...result("worker", "done"), sessionName: " worker: named task " }],
381
+ },
382
+ }, { expanded: true }, theme as any));
383
+ assert.match(expanded, /Step 1: worker: named task/);
384
+ assert.doesNotMatch(expanded, /Step 1: chain-label/);
385
+ });
386
+
334
387
  test("main-window renderer config removes compact result indentation without changing status glyphs", () => {
335
388
  const component = renderSubagentResult({
336
389
  content: [{ type: "text", text: "done" }],
@@ -0,0 +1,34 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { createResultDeliveryOwnership } from "../../src/runs/background/result-delivery-ownership.ts";
4
+
5
+ const OWNER = "owner-a";
6
+
7
+ describe("result delivery ownership", () => {
8
+ it("claims only the directly proven previous runtime session", () => {
9
+ const state = { currentSessionId: "old" as string | null, completionOwnerId: OWNER };
10
+ const ownership = createResultDeliveryOwnership(state);
11
+ assert.equal(ownership.claimPredecessor(undefined, "old"), false);
12
+ assert.equal(ownership.claimPredecessor("different", "old"), false);
13
+ assert.equal(ownership.claimPredecessor("old", "different"), false);
14
+ assert.equal(ownership.claimPredecessor("old", "old"), true);
15
+ state.currentSessionId = "new";
16
+ assert.equal(ownership.owns("old", OWNER), true);
17
+ assert.equal(ownership.owns("new", OWNER), true);
18
+ assert.equal(ownership.owns("old", "other-owner"), false);
19
+ assert.equal(ownership.owns("foreign", OWNER), false);
20
+ });
21
+
22
+ it("keeps predecessor claims bounded", () => {
23
+ const state = { currentSessionId: "session-0" as string | null, completionOwnerId: OWNER };
24
+ const ownership = createResultDeliveryOwnership(state);
25
+ for (let index = 0; index < 9; index += 1) {
26
+ const previous = `session-${index}`;
27
+ assert.equal(ownership.claimPredecessor(previous, previous), true);
28
+ state.currentSessionId = `session-${index + 1}`;
29
+ }
30
+ assert.deepEqual(ownership.claimedSessionIds(), ["session-1", "session-2", "session-3", "session-4", "session-5", "session-6", "session-7", "session-8"]);
31
+ assert.equal(ownership.owns("session-0", OWNER), false);
32
+ assert.equal(ownership.owns("session-8", OWNER), true);
33
+ });
34
+ });
@@ -5,7 +5,7 @@ import * as os from "node:os";
5
5
  import * as path from "node:path";
6
6
  import { describe, it } from "node:test";
7
7
  import { encodeIndexSegment, MAX_INDEX_SEGMENT_BYTES } from "../../src/runs/background/index-segment.ts";
8
- import { cleanupResultIndexes, removeResultIndex, resultCandidateFilesForSession, resultFilesForSession, resultFilesForToolCall, resultPayloadPathForIndexedRun, resultPayloadPathForSessionRun, writeAsyncResultFile, writePendingAsyncResultFile, writeResultIndexForData } from "../../src/runs/background/result-files.ts";
8
+ import { cleanupResultIndexes, removeResultIndex, resultCandidateFilesForSession, resultFilesForSession, resultFilesForToolCall, resultPayloadPathForIndexedRun, resultPayloadPathForMissionObserverRun, resultPayloadPathForSessionRun, writeAsyncResultFile, writePendingAsyncResultFile, writeResultIndexForData } from "../../src/runs/background/result-files.ts";
9
9
 
10
10
  const JSON_EXTENSION = ".json";
11
11
  const MAX_JSON_FILE_STEM_BYTES = MAX_INDEX_SEGMENT_BYTES - Buffer.byteLength(JSON_EXTENSION, "utf-8");
@@ -175,6 +175,22 @@ describe("result file indexes", () => {
175
175
  }
176
176
  });
177
177
 
178
+ it("treats a missing mission observer index directory as absent without logging", () => {
179
+ const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-files-observer-enotdir-"));
180
+ const originalError = console.error;
181
+ const errors: unknown[][] = [];
182
+ try {
183
+ fs.writeFileSync(path.join(resultsDir, "result-index"), "not a directory", "utf-8");
184
+ console.error = (...args: unknown[]) => { errors.push(args); };
185
+
186
+ assert.equal(resultPayloadPathForMissionObserverRun(resultsDir, "mission-run"), undefined);
187
+ assert.deepEqual(errors, []);
188
+ } finally {
189
+ console.error = originalError;
190
+ fs.rmSync(resultsDir, { recursive: true, force: true });
191
+ }
192
+ });
193
+
178
194
  it("does not commit a result payload without a session id", () => {
179
195
  const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-files-no-session-"));
180
196
  try {
@@ -293,7 +309,7 @@ describe("result file indexes", () => {
293
309
  it("round-trips results for Windows session file paths", () => {
294
310
  const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-files-win-session-"));
295
311
  try {
296
- const sessionId = String.raw`C:\Users\theap\.pi\agent\sessions\leaf.jsonl`;
312
+ const sessionId = String.raw`C:\Users\theap\.selesai\agent\sessions\leaf.jsonl`;
297
313
  const runId = "win-session-run";
298
314
  const resultPath = path.join(resultsDir, `${runId}.json`);
299
315
  writeAsyncResultFile(resultPath, { id: runId, runId, sessionId, success: true });
@@ -308,10 +324,92 @@ describe("result file indexes", () => {
308
324
  }
309
325
  });
310
326
 
327
+ it("treats an unaddressable legacy session alias as absent and keeps canonical fallback candidates", (t) => {
328
+ const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-files-legacy-enametoolong-"));
329
+ const sessionId = String.raw`C:\Users\theap\.selesai\agent\sessions\leaf.jsonl`;
330
+ const runId = "legacy-alias-fallback";
331
+ const resultPath = path.join(resultsDir, `${runId}.json`);
332
+ const legacyDir = path.join(resultsDir, "result-index", "sessions", encodeURIComponent(sessionId));
333
+ const originalReadFileSync = fsDefault.readFileSync;
334
+ const originalReaddirSync = fsDefault.readdirSync;
335
+ const originalError = console.error;
336
+ const errors: unknown[][] = [];
337
+ try {
338
+ writeAsyncResultFile(resultPath, { id: runId, runId, sessionId, success: true });
339
+ const canonicalDir = path.join(resultsDir, "result-index", "sessions", encodeIndexSegment(sessionId));
340
+ const [canonicalIndexFile] = fs.readdirSync(canonicalDir);
341
+ assert.ok(canonicalIndexFile);
342
+ const canonicalPendingPath = pendingPath(resultsDir, sessionId, runId);
343
+ fs.mkdirSync(path.dirname(canonicalPendingPath), { recursive: true });
344
+ fs.copyFileSync(resultPath, canonicalPendingPath);
345
+
346
+ const nameTooLong = new Error("legacy alias is too long") as NodeJS.ErrnoException;
347
+ nameTooLong.code = "ENAMETOOLONG";
348
+ fsDefault.readFileSync = ((filePath: fs.PathOrFileDescriptor, ...args: unknown[]) => {
349
+ if (String(filePath).startsWith(legacyDir)) throw nameTooLong;
350
+ return (originalReadFileSync as (...input: unknown[]) => unknown)(filePath, ...args);
351
+ }) as typeof fsDefault.readFileSync;
352
+ fsDefault.readdirSync = ((dirPath: fs.PathLike, ...args: unknown[]) => {
353
+ if (String(dirPath) === legacyDir) throw nameTooLong;
354
+ return (originalReaddirSync as (...input: unknown[]) => unknown)(dirPath, ...args);
355
+ }) as typeof fsDefault.readdirSync;
356
+ console.error = (...args: unknown[]) => { errors.push(args); };
357
+ syncBuiltinESMExports();
358
+
359
+ assert.deepEqual(resultCandidateFilesForSession(resultsDir, sessionId), [`${runId}.json`]);
360
+ fs.copyFileSync(resultPath, canonicalPendingPath);
361
+ fs.rmSync(path.join(canonicalDir, canonicalIndexFile));
362
+ assert.equal(resultPayloadPathForSessionRun(resultsDir, sessionId, runId), canonicalPendingPath);
363
+ assert.deepEqual(errors, []);
364
+ } finally {
365
+ fsDefault.readFileSync = originalReadFileSync;
366
+ fsDefault.readdirSync = originalReaddirSync;
367
+ console.error = originalError;
368
+ t.mock.restoreAll();
369
+ syncBuiltinESMExports();
370
+ fs.rmSync(resultsDir, { recursive: true, force: true });
371
+ }
372
+ });
373
+
374
+ it("leaves an unaddressable legacy index untouched during cleanup", (t) => {
375
+ const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-files-cleanup-enametoolong-"));
376
+ const sessionId = String.raw`C:\Users\theap\.selesai\agent\sessions\leaf.jsonl`;
377
+ const runId = "legacy-cleanup";
378
+ const originalStatSync = fsDefault.statSync;
379
+ const originalError = console.error;
380
+ const errors: unknown[][] = [];
381
+ try {
382
+ writeAsyncResultFile(path.join(resultsDir, `${runId}.json`), { id: runId, runId, sessionId, success: true });
383
+ const canonicalDir = path.join(resultsDir, "result-index", "sessions", encodeIndexSegment(sessionId));
384
+ const legacyDir = path.join(resultsDir, "result-index", "sessions", encodeURIComponent(sessionId));
385
+ fs.renameSync(canonicalDir, legacyDir);
386
+ const [legacyIndexFile] = fs.readdirSync(legacyDir);
387
+ assert.ok(legacyIndexFile);
388
+ const legacyIndexPath = path.join(legacyDir, legacyIndexFile);
389
+ const nameTooLong = new Error("legacy alias is too long") as NodeJS.ErrnoException;
390
+ nameTooLong.code = "ENAMETOOLONG";
391
+ t.mock.method(fsDefault, "statSync", ((filePath: fs.PathLike) => {
392
+ if (String(filePath) === legacyIndexPath) throw nameTooLong;
393
+ return originalStatSync(filePath);
394
+ }) as typeof fsDefault.statSync);
395
+ console.error = (...args: unknown[]) => { errors.push(args); };
396
+ syncBuiltinESMExports();
397
+
398
+ assert.equal(cleanupResultIndexes(resultsDir, Date.now() + 86_400_001, 86_400_000), 0);
399
+ assert.equal(fs.existsSync(legacyIndexPath), true);
400
+ assert.deepEqual(errors, []);
401
+ } finally {
402
+ console.error = originalError;
403
+ t.mock.restoreAll();
404
+ syncBuiltinESMExports();
405
+ fs.rmSync(resultsDir, { recursive: true, force: true });
406
+ }
407
+ });
408
+
311
409
  it("reads a pre-hash URI-encoded session index after the encoding change", () => {
312
410
  const resultsDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-result-files-legacy-session-"));
313
411
  try {
314
- const sessionId = String.raw`C:\Users\theap\.pi\agent\sessions\leaf.jsonl`;
412
+ const sessionId = String.raw`C:\Users\theap\.selesai\agent\sessions\leaf.jsonl`;
315
413
  const runId = "legacy-session-run";
316
414
  const resultPath = path.join(resultsDir, `${runId}.json`);
317
415
  writeAsyncResultFile(resultPath, { id: runId, runId, sessionId, success: true });
@@ -70,6 +70,7 @@ function writeRetainedRun(root: string, index: number, options: WriteRunOptions
70
70
  agent: options.recoveryAgent ?? "worker",
71
71
  cwd: options.recoveryCwd ?? root,
72
72
  systemPromptMode: "replace",
73
+ inheritGlobalContext: false,
73
74
  inheritProjectContext: false,
74
75
  inheritSkills: false,
75
76
  outputMode: "inline",
@@ -203,7 +203,7 @@ describe("subagent extension RPC bridge", () => {
203
203
  asyncJobs: new Map([["async-private-id", {
204
204
  asyncId: "async-private-id", sessionId: "/sessions/parent.jsonl", status: "running", mode: "single",
205
205
  description: ["Review", "\u001b]8;;hostile\u0007", "the diff"].join("\n"),
206
- startedAt: 100, steps: [{ agent: "reviewer", label: "opaque label", status: "running", startedAt: 120, model: "anthropic/claude-opus-4-8:high", thinking: "high", tokens: { input: 12, output: 34, total: 46 } }],
206
+ startedAt: 100, steps: [{ agent: "reviewer", label: "opaque label", status: "running", startedAt: 120, model: "anthropic/claude-opus-4-8:high", thinking: "high", tokens: { input: 12, output: 34, total: 46, window: 40, windowPeak: 44 } }],
207
207
  }]]),
208
208
  } as any;
209
209
  const bridge = registerSubagentRpcBridge({
@@ -217,7 +217,7 @@ describe("subagent extension RPC bridge", () => {
217
217
  assert.equal((fleet as { omitted?: number }).omitted, 0);
218
218
  assert.deepEqual(fleet.entries[0], {
219
219
  key: "fleet-1", agent: "reviewer", role: "opaque label", model: "anthropic/claude-opus-4-8:high", effort: "high",
220
- startedAt: 120, tokens: { input: 12, output: 34, total: 46 },
220
+ startedAt: 120, tokens: { input: 12, output: 34, total: 46, window: 40, windowPeak: 44 },
221
221
  });
222
222
  assert.equal(JSON.stringify(fleet).includes("Review the diff"), false);
223
223
  assert.equal(JSON.stringify(fleet).includes("async-private-id"), false);
@@ -779,7 +779,7 @@ describe("subagent extension RPC bridge", () => {
779
779
  childId: "review",
780
780
  status: "stopping",
781
781
  ts: 150,
782
- reason: "user",
782
+ reason: "rpc",
783
783
  source: "rpc",
784
784
  asyncDir,
785
785
  stepIndex: 1,
@@ -835,6 +835,7 @@ describe("subagent extension RPC bridge", () => {
835
835
  assert.equal(childStatus?.runId, "workflow-stop-child");
836
836
  assert.equal(childStatus?.childId, "slow");
837
837
  assert.equal(childStatus?.status, "stopping");
838
+ assert.equal(childStatus?.reason, "rpc");
838
839
  assert.equal(childStatus?.source, "rpc");
839
840
  assert.equal(childStatus?.workflowKey, "slow");
840
841
 
@@ -931,7 +932,7 @@ describe("subagent extension RPC bridge", () => {
931
932
  }
932
933
  });
933
934
 
934
- it("rejects stop requests for reload-recovered workflows", async () => {
935
+ it("stops reload-recovered workflows through the durable control channel", async () => {
935
936
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-rpc-stop-workflow-"));
936
937
  try {
937
938
  const events = new FakeEvents();
@@ -965,10 +966,11 @@ describe("subagent extension RPC bridge", () => {
965
966
 
966
967
  const reply = await request(events, "stop-workflow", "stop", { id: "workflow-run" });
967
968
 
968
- assert.equal(reply.success, false);
969
- assert.equal((reply as { error: { code: string; message: string } }).error.code, "invalid_state");
970
- assert.match((reply as { error: { message: string } }).error.message, /reload recovery cannot stop it safely/);
971
- assert.equal(fs.existsSync(stopRequestPath(asyncDir)), false);
969
+ assert.equal(reply.success, true);
970
+ assert.equal((reply as { data: { runId?: string; state?: string; message?: string } }).data.runId, "workflow-run");
971
+ assert.equal((reply as { data: { state?: string } }).data.state, "stopping");
972
+ assert.match((reply as { data: { message?: string } }).data.message ?? "", /Stop requested for async run workflow-run/);
973
+ assert.equal(consumeStopRequestPayload(asyncDir)?.type, "stop");
972
974
  assert.equal(killCalls, 0);
973
975
 
974
976
  bridge.dispose();
@@ -14,7 +14,9 @@ import {
14
14
  RunFanoutLimitError,
15
15
  validateRunFanoutBudgetDescriptor,
16
16
  } from "../../src/runs/shared/run-fanout-budget.ts";
17
- import { resolveMaxSubagentSpawnsPerRun } from "../../src/shared/types.ts";
17
+ import { resolveMaxSubagentSpawnsPerRun, type AsyncStatus } from "../../src/shared/types.ts";
18
+ import { listAsyncRuns, summarizeAsyncStatus } from "../../src/runs/background/async-status.ts";
19
+ import { createNestedRoute, writeNestedEvent } from "../../src/runs/shared/nested-events.ts";
18
20
 
19
21
  const directories: string[] = [];
20
22
  const externalDirectories: string[] = [];
@@ -47,6 +49,74 @@ describe("run fan-out budget", () => {
47
49
  }
48
50
  });
49
51
 
52
+ it("degrades status projection when persisted budget state is removed", () => {
53
+ const descriptor = budget(2);
54
+ fs.rmSync(path.join(descriptor.directory, "claims"), { recursive: true, force: true });
55
+ const asyncDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-run-fanout-status-"));
56
+ directories.push(asyncDir);
57
+ fs.writeFileSync(path.join(asyncDir, "run-fanout-budget.json"), JSON.stringify(descriptor), "utf-8");
58
+ const fallback = { used: 1, limit: 2, remaining: 1 };
59
+ const status = {
60
+ runId: "run-1",
61
+ mode: "single",
62
+ state: "running",
63
+ startedAt: 100,
64
+ lastUpdate: 200,
65
+ steps: [{ agent: "worker", status: "running", startedAt: 100 }],
66
+ runFanoutBudget: fallback,
67
+ } as AsyncStatus;
68
+ const summary = summarizeAsyncStatus(asyncDir, status);
69
+ assert.deepEqual(summary.runFanoutBudget, fallback);
70
+ assert.ok(summary.nestedWarnings?.some((warning) => warning.includes("Run fan-out status unavailable")));
71
+ });
72
+
73
+ it("keeps nested status projection when persisted budget state is removed", () => {
74
+ const runId = "run-fanout-nested-status";
75
+ const asyncRoot = fs.mkdtempSync(path.join(os.tmpdir(), "pi-run-fanout-nested-root-"));
76
+ directories.push(asyncRoot);
77
+ const asyncDir = path.join(asyncRoot, runId);
78
+ fs.mkdirSync(asyncDir, { recursive: true });
79
+ const route = createNestedRoute(runId);
80
+ directories.push(path.dirname(route.eventSink));
81
+ const descriptor = budget(2);
82
+ fs.rmSync(path.join(descriptor.directory, "claims"), { recursive: true, force: true });
83
+ fs.writeFileSync(path.join(asyncDir, "run-fanout-budget.json"), JSON.stringify(descriptor), "utf-8");
84
+ const fallback = { used: 1, limit: 2, remaining: 1 };
85
+ fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
86
+ runId,
87
+ mode: "single",
88
+ state: "running",
89
+ startedAt: 100,
90
+ lastUpdate: 200,
91
+ steps: [{ agent: "worker", status: "running" }],
92
+ runFanoutBudget: fallback,
93
+ }), "utf-8");
94
+ writeNestedEvent(route, {
95
+ type: "subagent.nested.started",
96
+ ts: 300,
97
+ parentRunId: runId,
98
+ parentStepIndex: 0,
99
+ child: {
100
+ id: "nested-child",
101
+ parentRunId: runId,
102
+ parentStepIndex: 0,
103
+ depth: 1,
104
+ path: [{ runId, stepIndex: 0 }],
105
+ mode: "single",
106
+ state: "running",
107
+ agent: "nested-worker",
108
+ startedAt: 100,
109
+ lastUpdate: 300,
110
+ },
111
+ });
112
+
113
+ const summary = listAsyncRuns(asyncRoot, { states: ["running"], repairScan: true })[0];
114
+ assert.deepEqual(summary?.runFanoutBudget, fallback);
115
+ assert.equal(summary?.nestedChildren?.[0]?.id, "nested-child");
116
+ assert.equal(summary?.steps[0]?.children?.[0]?.id, "nested-child");
117
+ assert.ok(summary?.nestedWarnings?.some((warning) => warning.includes("Run fan-out status unavailable")));
118
+ });
119
+
50
120
  it("persists claims and rejects the responsible next path at the exact cap", () => {
51
121
  const descriptor = budget(2);
52
122
  assert.deepEqual(claimRunFanoutBatch(descriptor, ["tasks[0]", "tasks[1]"]), { used: 2, limit: 2, remaining: 0 });
@@ -117,6 +117,36 @@ describe("async run status inspection", () => {
117
117
  }
118
118
  });
119
119
 
120
+ it("normalizes old external-cli runner status before rendering adapter details", () => {
121
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-run-status-old-external-cli-"));
122
+ try {
123
+ const asyncRoot = path.join(root, "runs");
124
+ const asyncDir = path.join(asyncRoot, "run-old-external-cli");
125
+ fs.mkdirSync(asyncDir, { recursive: true });
126
+ fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
127
+ runId: "run-old-external-cli",
128
+ mode: "single",
129
+ state: "complete",
130
+ startedAt: 100,
131
+ lastUpdate: 200,
132
+ steps: [{
133
+ agent: "external",
134
+ status: "complete",
135
+ runner: { type: "external-cli", command: "review-cli", args: [], promptDelivery: "stdin", capabilities: { stop: true, steer: false, resume: false, structuredOutput: false, toolEvents: false } },
136
+ }],
137
+ }, null, 2), "utf-8");
138
+
139
+ const result = inspectSubagentStatus({ id: "run-old-external-cli" }, { asyncDirRoot: asyncRoot, resultsDir: path.join(root, "results") });
140
+
141
+ const text = textContent(result);
142
+ assert.equal(result.isError, undefined);
143
+ assert.match(text, /Adapter: external-cli v1 \(one-shot-stdin\)/);
144
+ assert.match(text, /Unsupported resume: The one-shot stdin adapter has no durable external session identity/);
145
+ } finally {
146
+ fs.rmSync(root, { recursive: true, force: true });
147
+ }
148
+ });
149
+
120
150
  it("shows parallel mode and aggregate progress for top-level async parallel runs", () => {
121
151
  const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-run-status-parallel-"));
122
152
  try {
@@ -141,7 +171,7 @@ describe("async run status inspection", () => {
141
171
  chainStepCount: 1,
142
172
  parallelGroups: [{ start: 0, count: 3, stepIndex: 0 }],
143
173
  steps: [
144
- { agent: "reviewer", status: "running", startedAt: 100, model: "openai-codex/gpt-5.5:high" },
174
+ { agent: "reviewer", sessionName: " reviewer: Inspect the first result ", status: "running", startedAt: 100, model: "openai-codex/gpt-5.5:high" },
145
175
  { agent: "reviewer", status: "running", startedAt: 100, model: "anthropic/claude-haiku-4-5", thinking: "low" },
146
176
  { agent: "reviewer", status: "pending" },
147
177
  ],
@@ -159,7 +189,7 @@ describe("async run status inspection", () => {
159
189
  assert.match(text, /Error: top-level async status error/);
160
190
  assert.match(text, /Progress: 2 agents running · 0\/3 done/);
161
191
  assert.match(text, new RegExp(`Output: ${runOutputPath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`));
162
- assert.match(text, /Agent 1\/3: reviewer running \(gpt-5\.5 · thinking high\)/);
192
+ assert.match(text, /Agent 1\/3: reviewer: Inspect the first result running \(gpt-5\.5 · thinking high\)/);
163
193
  assert.match(text, /Agent 2\/3: reviewer running \(claude-haiku-4-5 · thinking low\)/);
164
194
  assert.match(text, /Agent 3\/3: reviewer pending/);
165
195
  assert.doesNotMatch(text, /openai-codex\/gpt-5\.5/);
@@ -186,7 +216,7 @@ describe("async run status inspection", () => {
186
216
  startedAt: 100,
187
217
  lastUpdate: 200,
188
218
  currentStep: 0,
189
- steps: [{ agent: "worker", status: "running", startedAt: 100 }],
219
+ steps: [{ agent: "worker", sessionName: " worker: Read the transcript ", status: "running", startedAt: 100 }],
190
220
  }, null, 2), "utf-8");
191
221
 
192
222
  const result = inspectSubagentStatus({ id: "run-transcript", view: "transcript", lines: 2 }, {
@@ -199,7 +229,7 @@ describe("async run status inspection", () => {
199
229
  const text = textContent(result);
200
230
  assert.equal(result.isError, undefined);
201
231
  assert.match(text, /Run: run-transcript/);
202
- assert.match(text, /Step: 0 \(worker\) \| running/);
232
+ assert.match(text, /Step: 0 \(worker: Read the transcript\) \| running/);
203
233
  assert.match(text, new RegExp(`Transcript tail from ${outputPath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")} \\(tail truncated\\):`));
204
234
  assert.doesNotMatch(text, /first line/);
205
235
  assert.match(text, /second line/);
@@ -435,7 +465,7 @@ describe("async run status inspection", () => {
435
465
  chainStepCount: 1,
436
466
  parallelGroups: [{ start: 0, count: 2, stepIndex: 0 }],
437
467
  steps: [
438
- { agent: "worker", status: "running", startedAt: 100 },
468
+ { agent: "worker", sessionName: " worker: Inspect fleet ", label: "Fleet check", status: "running", startedAt: 100 },
439
469
  { agent: "reviewer", status: "pending" },
440
470
  ],
441
471
  }, null, 2), "utf-8");
@@ -447,6 +477,7 @@ describe("async run status inspection", () => {
447
477
  startedAt: 100,
448
478
  updatedAt: 250,
449
479
  currentAgent: "scout",
480
+ sessionName: " foreground: Inspect fleet ",
450
481
  currentIndex: 0,
451
482
  lastActivityAt: 240,
452
483
  }]]),
@@ -464,8 +495,10 @@ describe("async run status inspection", () => {
464
495
  assert.equal(result.isError, undefined);
465
496
  assert.match(text, /Subagent fleet: 2 tracked/);
466
497
  assert.match(text, /Foreground runs:/);
467
- assert.match(text, /fg-run \| running \| scout/);
498
+ assert.match(text, /fg-run \| running \| foreground: Inspect fleet/);
499
+ assert.doesNotMatch(text, /fg-run \| running \| scout/);
468
500
  assert.match(text, /Async runs:/);
501
+ assert.match(text, /0\. worker: Inspect fleet \| running/);
469
502
  assert.match(text, /run-fleet \| running .*\| parallel \| 1 agent running · 0\/2 done/);
470
503
  assert.match(text, /transcript: subagent\(\{ action: "status", id: "run-fleet", view: "transcript" \}\)/);
471
504
  assert.match(text, /transcript: subagent\(\{ action: "status", id: "run-fleet", index: 0, view: "transcript" \}\)/);
@@ -705,6 +738,7 @@ describe("async run status inspection", () => {
705
738
  path: [{ runId: "run-nested-root", stepIndex: 0, agent: "orchestrator" }],
706
739
  state: "running",
707
740
  agent: "reviewer",
741
+ sessionName: " reviewer: Read the status ",
708
742
  currentTool: "read",
709
743
  lastUpdate: 150,
710
744
  },
@@ -720,7 +754,7 @@ describe("async run status inspection", () => {
720
754
  const text = textContent(result);
721
755
  assert.equal(result.isError, undefined);
722
756
  assert.match(text, /Step 1: orchestrator running/);
723
- assert.match(text, /↳ reviewer \[nested-status-child\] running \| tool read/);
757
+ assert.match(text, /↳ reviewer: Read the status \[nested-status-child\] running \| tool read/);
724
758
  assert.match(text, /Status: subagent\(\{ action: "status", id: "nested-status-child" \}\)/);
725
759
  } finally {
726
760
  fs.rmSync(root, { recursive: true, force: true });