@selesai/code 0.13.0 → 0.13.1

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 (461) hide show
  1. package/CHANGELOG.md +12 -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/ascii.txt +9 -0
  9. package/dist/extensions/package.json +1 -2
  10. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +371 -0
  11. package/dist/extensions/pi-hermes-memory/LICENSE +21 -0
  12. package/dist/extensions/pi-hermes-memory/README.md +643 -0
  13. package/dist/extensions/pi-hermes-memory/docs/0.1/TASKS.md +197 -0
  14. package/dist/extensions/pi-hermes-memory/docs/0.2/PLAN.md +290 -0
  15. package/dist/extensions/pi-hermes-memory/docs/0.2/TASKS.md +134 -0
  16. package/dist/extensions/pi-hermes-memory/docs/0.2/TEST-PLAN.md +216 -0
  17. package/dist/extensions/pi-hermes-memory/docs/0.3/PLAN.md +330 -0
  18. package/dist/extensions/pi-hermes-memory/docs/0.3/TASKS.md +125 -0
  19. package/dist/extensions/pi-hermes-memory/docs/0.4/PLAN.md +160 -0
  20. package/dist/extensions/pi-hermes-memory/docs/0.4/TASKS.md +113 -0
  21. package/dist/extensions/pi-hermes-memory/docs/0.6/CHANGELOG.md +57 -0
  22. package/dist/extensions/pi-hermes-memory/docs/0.6/PLAN.md +202 -0
  23. package/dist/extensions/pi-hermes-memory/docs/0.6/TASKS.md +144 -0
  24. package/dist/extensions/pi-hermes-memory/docs/0.7/PLAN.md +349 -0
  25. package/dist/extensions/pi-hermes-memory/docs/0.7/TASKS.md +110 -0
  26. package/dist/extensions/pi-hermes-memory/docs/PUBLISHING.md +149 -0
  27. package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +468 -0
  28. package/dist/extensions/pi-hermes-memory/docs/images/memory-architecture.svg +1 -0
  29. package/dist/extensions/pi-hermes-memory/docs/images/pi-logo.svg +22 -0
  30. package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.png +0 -0
  31. package/dist/extensions/pi-hermes-memory/docs/images/pi_memory.svg +19 -0
  32. package/dist/extensions/pi-hermes-memory/docs/images/security-flow.svg +1 -0
  33. package/dist/extensions/pi-hermes-memory/docs/images/session-lifecycle.svg +1 -0
  34. package/dist/extensions/pi-hermes-memory/docs/images/source-architecture.svg +1 -0
  35. package/dist/extensions/pi-hermes-memory/docs/mermaid/memory-architecture.mmd +49 -0
  36. package/dist/extensions/pi-hermes-memory/docs/mermaid/security-flow.mmd +40 -0
  37. package/dist/extensions/pi-hermes-memory/docs/mermaid/session-lifecycle.mmd +56 -0
  38. package/dist/extensions/pi-hermes-memory/docs/mermaid/source-architecture.mmd +54 -0
  39. package/dist/extensions/pi-hermes-memory/package-lock.json +3799 -0
  40. package/dist/extensions/pi-hermes-memory/package.json +66 -0
  41. package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +99 -0
  42. package/dist/extensions/pi-hermes-memory/scripts/ensure-dev.mjs +57 -0
  43. package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +6 -0
  44. package/dist/extensions/pi-hermes-memory/src/config.ts +178 -0
  45. package/dist/extensions/pi-hermes-memory/src/constants.ts +424 -0
  46. package/dist/extensions/pi-hermes-memory/src/extension-root-migration.ts +639 -0
  47. package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +401 -0
  48. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +297 -0
  49. package/dist/extensions/pi-hermes-memory/src/handlers/child-process-watchdog.mjs +90 -0
  50. package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +300 -0
  51. package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +86 -0
  52. package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +78 -0
  53. package/dist/extensions/pi-hermes-memory/src/handlers/interview.ts +37 -0
  54. package/dist/extensions/pi-hermes-memory/src/handlers/learn-memory.ts +186 -0
  55. package/dist/extensions/pi-hermes-memory/src/handlers/message-parts.ts +27 -0
  56. package/dist/extensions/pi-hermes-memory/src/handlers/pi-child-process.ts +485 -0
  57. package/dist/extensions/pi-hermes-memory/src/handlers/preview-context.ts +105 -0
  58. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +506 -0
  59. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +145 -0
  60. package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +151 -0
  61. package/dist/extensions/pi-hermes-memory/src/handlers/session-live-index.ts +94 -0
  62. package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +1334 -0
  63. package/dist/extensions/pi-hermes-memory/src/handlers/standing-pin.ts +111 -0
  64. package/dist/extensions/pi-hermes-memory/src/handlers/switch-project.ts +75 -0
  65. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +266 -0
  66. package/dist/extensions/pi-hermes-memory/src/index.ts +378 -0
  67. package/dist/extensions/pi-hermes-memory/src/lifecycle-timing.ts +54 -0
  68. package/dist/extensions/pi-hermes-memory/src/paths.ts +61 -0
  69. package/dist/extensions/pi-hermes-memory/src/project-context.ts +13 -0
  70. package/dist/extensions/pi-hermes-memory/src/project-memory-migration.ts +93 -0
  71. package/dist/extensions/pi-hermes-memory/src/project.ts +157 -0
  72. package/dist/extensions/pi-hermes-memory/src/prompt-context.ts +55 -0
  73. package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +375 -0
  74. package/dist/extensions/pi-hermes-memory/src/store/canonical-storage-path.ts +54 -0
  75. package/dist/extensions/pi-hermes-memory/src/store/content-scanner.ts +101 -0
  76. package/dist/extensions/pi-hermes-memory/src/store/db.ts +1180 -0
  77. package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +101 -0
  78. package/dist/extensions/pi-hermes-memory/src/store/markdown-mutation-lock.ts +38 -0
  79. package/dist/extensions/pi-hermes-memory/src/store/memory-lookup.ts +24 -0
  80. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +1191 -0
  81. package/dist/extensions/pi-hermes-memory/src/store/recovery-maintenance.ts +66 -0
  82. package/dist/extensions/pi-hermes-memory/src/store/schema.ts +118 -0
  83. package/dist/extensions/pi-hermes-memory/src/store/session-anchor-search.ts +472 -0
  84. package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +511 -0
  85. package/dist/extensions/pi-hermes-memory/src/store/session-parser.ts +213 -0
  86. package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +234 -0
  87. package/dist/extensions/pi-hermes-memory/src/store/skill-store.ts +950 -0
  88. package/dist/extensions/pi-hermes-memory/src/store/skill-utils.ts +133 -0
  89. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +1002 -0
  90. package/dist/extensions/pi-hermes-memory/src/store/sqlite-native.ts +241 -0
  91. package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +247 -0
  92. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +95 -0
  93. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +469 -0
  94. package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +246 -0
  95. package/dist/extensions/pi-hermes-memory/src/tools/shared-output-view.ts +170 -0
  96. package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +333 -0
  97. package/dist/extensions/pi-hermes-memory/src/tools/tool-result-views.ts +105 -0
  98. package/dist/extensions/pi-hermes-memory/src/types.ts +214 -0
  99. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +434 -0
  100. package/dist/extensions/pi-hermes-memory/tests/extension-root-migration.test.ts +368 -0
  101. package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +984 -0
  102. package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +950 -0
  103. package/dist/extensions/pi-hermes-memory/tests/handlers/correction-detector.test.ts +671 -0
  104. package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +157 -0
  105. package/dist/extensions/pi-hermes-memory/tests/handlers/interview.test.ts +127 -0
  106. package/dist/extensions/pi-hermes-memory/tests/handlers/pi-child-process.test.ts +905 -0
  107. package/dist/extensions/pi-hermes-memory/tests/handlers/preview-context.test.ts +152 -0
  108. package/dist/extensions/pi-hermes-memory/tests/handlers/prompt-context.test.ts +166 -0
  109. package/dist/extensions/pi-hermes-memory/tests/handlers/resources-discover.test.ts +71 -0
  110. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +614 -0
  111. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +192 -0
  112. package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +677 -0
  113. package/dist/extensions/pi-hermes-memory/tests/handlers/session-live-index.test.ts +225 -0
  114. package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +827 -0
  115. package/dist/extensions/pi-hermes-memory/tests/handlers/standing-pin.test.ts +134 -0
  116. package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +491 -0
  117. package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +199 -0
  118. package/dist/extensions/pi-hermes-memory/tests/handlers/thinking-max.test.ts +64 -0
  119. package/dist/extensions/pi-hermes-memory/tests/index.test.ts +30 -0
  120. package/dist/extensions/pi-hermes-memory/tests/integration/flow.test.ts +126 -0
  121. package/dist/extensions/pi-hermes-memory/tests/lifecycle-timing.test.ts +76 -0
  122. package/dist/extensions/pi-hermes-memory/tests/paths.test.ts +23 -0
  123. package/dist/extensions/pi-hermes-memory/tests/project-memory-migration.test.ts +80 -0
  124. package/dist/extensions/pi-hermes-memory/tests/project-rebinding.test.ts +115 -0
  125. package/dist/extensions/pi-hermes-memory/tests/project.test.ts +120 -0
  126. package/dist/extensions/pi-hermes-memory/tests/run-all-timeout.test.ts +107 -0
  127. package/dist/extensions/pi-hermes-memory/tests/run-all.sh +45 -0
  128. package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-coordinator.test.ts +381 -0
  129. package/dist/extensions/pi-hermes-memory/tests/store/content-scanner.test.ts +388 -0
  130. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +1046 -0
  131. package/dist/extensions/pi-hermes-memory/tests/store/markdown-mutation-lock.test.ts +34 -0
  132. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +2150 -0
  133. package/dist/extensions/pi-hermes-memory/tests/store/recovery-maintenance.test.ts +170 -0
  134. package/dist/extensions/pi-hermes-memory/tests/store/session-anchor-search.test.ts +210 -0
  135. package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +643 -0
  136. package/dist/extensions/pi-hermes-memory/tests/store/session-parser.test.ts +282 -0
  137. package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +287 -0
  138. package/dist/extensions/pi-hermes-memory/tests/store/skill-store.test.ts +678 -0
  139. package/dist/extensions/pi-hermes-memory/tests/store/skill-utils.test.ts +21 -0
  140. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-lazy-load.test.ts +78 -0
  141. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +543 -0
  142. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +164 -0
  143. package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +171 -0
  144. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +84 -0
  145. package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +709 -0
  146. package/dist/extensions/pi-hermes-memory/tests/tools/session-search-tool.test.ts +345 -0
  147. package/dist/extensions/pi-hermes-memory/tests/tools/shared-output-view.test.ts +362 -0
  148. package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +478 -0
  149. package/dist/extensions/pi-hermes-memory/tests/tools/tool-result-renderer-wiring.test.ts +40 -0
  150. package/dist/extensions/pi-hermes-memory/tsconfig.json +19 -0
  151. package/dist/extensions/pi-subagents/.oxlintrc.json +43 -0
  152. package/dist/extensions/pi-subagents/AGENTS.md +5 -0
  153. package/dist/extensions/pi-subagents/CHANGELOG.md +157 -0
  154. package/dist/extensions/pi-subagents/README.md +12 -6
  155. package/dist/extensions/pi-subagents/VISION.md +81 -0
  156. package/dist/extensions/pi-subagents/agents/claude-code-writer.md +15 -0
  157. package/dist/extensions/pi-subagents/agents/claude-code.md +15 -0
  158. package/dist/extensions/pi-subagents/agents/codex-exec-writer.md +15 -0
  159. package/dist/extensions/pi-subagents/agents/codex-exec.md +15 -0
  160. package/dist/extensions/pi-subagents/agents/cursor-agent-writer.md +14 -0
  161. package/dist/extensions/pi-subagents/agents/cursor-agent.md +14 -0
  162. package/dist/extensions/pi-subagents/agents/reviewer.md +1 -3
  163. package/dist/extensions/pi-subagents/docs/agents.md +488 -0
  164. package/dist/extensions/pi-subagents/docs/configuration.md +46 -9
  165. package/dist/extensions/pi-subagents/docs/extension-api.md +42 -3
  166. package/dist/extensions/pi-subagents/docs/models.md +27 -4
  167. package/dist/extensions/pi-subagents/docs/observability.md +10 -9
  168. package/dist/extensions/pi-subagents/docs/tool-reference.md +102 -6
  169. package/dist/extensions/pi-subagents/docs/workflows.md +135 -0
  170. package/dist/extensions/pi-subagents/package-lock.json +389 -2
  171. package/dist/extensions/pi-subagents/package.json +3 -1
  172. package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
  173. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +1 -1
  174. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +3 -1
  175. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +7 -3
  176. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
  177. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +26 -5
  178. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +41 -22
  179. package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +4 -4
  180. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +9 -2
  181. package/dist/extensions/pi-subagents/src/agents/agents.ts +322 -75
  182. package/dist/extensions/pi-subagents/src/agents/builtin-names.ts +6 -0
  183. package/dist/extensions/pi-subagents/src/agents/runtime-agent-events.ts +70 -0
  184. package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +27 -20
  185. package/dist/extensions/pi-subagents/src/api/agents.ts +10 -5
  186. package/dist/extensions/pi-subagents/src/api/background-work.ts +5 -1
  187. package/dist/extensions/pi-subagents/src/api/delegation.ts +0 -7
  188. package/dist/extensions/pi-subagents/src/api/preflight.ts +34 -12
  189. package/dist/extensions/pi-subagents/src/extension/config.ts +70 -0
  190. package/dist/extensions/pi-subagents/src/extension/doctor.ts +3 -3
  191. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +5 -3
  192. package/dist/extensions/pi-subagents/src/extension/index.ts +83 -30
  193. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +44 -15
  194. package/dist/extensions/pi-subagents/src/extension/rpc.ts +55 -19
  195. package/dist/extensions/pi-subagents/src/extension/schemas.ts +41 -15
  196. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -31
  197. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +2 -1
  198. package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +2 -10
  199. package/dist/extensions/pi-subagents/src/inspectors/herdr/session-roots-codec.ts +42 -0
  200. package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +51 -3
  201. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +2 -0
  202. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +5 -6
  203. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +77 -10
  204. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +176 -53
  205. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +19 -12
  206. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +29 -27
  207. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +20 -3
  208. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +23 -261
  209. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +73 -7
  210. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +8 -3
  211. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +74 -8
  212. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +37 -21
  213. package/dist/extensions/pi-subagents/src/runs/background/inspect-rpc.ts +8 -8
  214. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +184 -9
  215. package/dist/extensions/pi-subagents/src/runs/background/result-delivery-ownership.ts +45 -0
  216. package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +28 -14
  217. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +38 -15
  218. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +1 -1
  219. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +1 -1
  220. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +50 -13
  221. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +93 -8
  222. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +10 -4
  223. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +4 -14
  224. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +549 -377
  225. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +58 -10
  226. package/dist/extensions/pi-subagents/src/runs/background/terminal-run-index.ts +1 -1
  227. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +26 -1
  228. package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +23 -9
  229. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +9 -2
  230. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +2 -2
  231. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +204 -129
  232. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +9 -0
  233. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +23 -1
  234. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +773 -311
  235. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +140 -115
  236. package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +119 -0
  237. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +463 -0
  238. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +19 -4
  239. package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +151 -0
  240. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +21 -7
  241. package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +129 -0
  242. package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
  243. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +89 -0
  244. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +5 -4
  245. package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
  246. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +3 -3
  247. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +167 -0
  248. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +122 -0
  249. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +348 -55
  250. package/dist/extensions/pi-subagents/src/runs/shared/fast-mode-extension.ts +5 -5
  251. package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +230 -0
  252. package/dist/extensions/pi-subagents/src/runs/shared/lane-metadata.ts +105 -0
  253. package/dist/extensions/pi-subagents/src/runs/shared/launch-cwd.ts +16 -0
  254. package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +2 -1
  255. package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +422 -0
  256. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +221 -158
  257. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +197 -0
  258. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +69 -7
  259. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +47 -6
  260. package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +7 -2
  261. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +9 -3
  262. package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +9 -5
  263. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +419 -7
  264. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +15 -1
  265. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +81 -8
  266. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +13 -0
  267. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +21 -1
  268. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +44 -4
  269. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +98 -13
  270. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +1 -1
  271. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +847 -0
  272. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +18 -0
  273. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +46 -0
  274. package/dist/extensions/pi-subagents/src/shared/extension-context.ts +24 -0
  275. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +21 -0
  276. package/dist/extensions/pi-subagents/src/shared/formatters.ts +18 -3
  277. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +5 -1
  278. package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +450 -0
  279. package/dist/extensions/pi-subagents/src/shared/session-file-trust.ts +19 -0
  280. package/dist/extensions/pi-subagents/src/shared/session-tokens.ts +14 -3
  281. package/dist/extensions/pi-subagents/src/shared/settings.ts +19 -105
  282. package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +17 -0
  283. package/dist/extensions/pi-subagents/src/shared/types.ts +359 -40
  284. package/dist/extensions/pi-subagents/src/shared/utils.ts +41 -84
  285. package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +116 -0
  286. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -9
  287. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +0 -4
  288. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +1 -2
  289. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +378 -88
  290. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +22 -11
  291. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +3 -0
  292. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +147 -79
  293. package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +11 -5
  294. package/dist/extensions/pi-subagents/src/tui/fleet.ts +39 -18
  295. package/dist/extensions/pi-subagents/src/tui/render.ts +369 -46
  296. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +1 -1
  297. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +6 -3
  298. package/dist/extensions/pi-subagents/src/workflows/host-command.ts +230 -0
  299. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +740 -58
  300. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +121 -0
  301. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +270 -0
  302. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +195 -6
  303. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +246 -0
  304. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
  305. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1114 -260
  306. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +34 -0
  307. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +150 -3
  308. package/dist/extensions/pi-subagents/test/integration/claude-code-smoke.test.ts +52 -0
  309. package/dist/extensions/pi-subagents/test/integration/claude-code-writer-smoke.test.ts +55 -0
  310. package/dist/extensions/pi-subagents/test/integration/codex-exec-smoke.test.ts +53 -0
  311. package/dist/extensions/pi-subagents/test/integration/codex-exec-writer-smoke.test.ts +57 -0
  312. package/dist/extensions/pi-subagents/test/integration/cursor-agent-smoke.test.ts +59 -0
  313. package/dist/extensions/pi-subagents/test/integration/cursor-agent-writer-smoke.test.ts +62 -0
  314. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +57 -1
  315. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +1 -0
  316. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +20 -0
  317. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +4 -3
  318. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +2 -2
  319. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +54 -4
  320. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +482 -4
  321. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +157 -9
  322. package/dist/extensions/pi-subagents/test/integration/session-tokens.test.ts +5 -5
  323. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1508 -291
  324. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +423 -1
  325. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +8 -0
  326. package/dist/extensions/pi-subagents/test/support/cursor-smoke-inputs.ts +51 -0
  327. package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
  328. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +5 -5
  329. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +6 -6
  330. package/dist/extensions/pi-subagents/test/unit/abort-recovery.test.ts +152 -0
  331. package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +48 -0
  332. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +184 -6
  333. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +66 -6
  334. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +77 -0
  335. package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +18 -0
  336. package/dist/extensions/pi-subagents/test/unit/anti-slop-oxlint.test.ts +86 -0
  337. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +1 -1
  338. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +101 -1
  339. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +121 -0
  340. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +28 -0
  341. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +14 -7
  342. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +53 -0
  343. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +190 -0
  344. package/dist/extensions/pi-subagents/test/unit/async-status-snapshot.test.ts +42 -0
  345. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +8 -4
  346. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +23 -0
  347. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +78 -1
  348. package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +94 -0
  349. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +21 -0
  350. package/dist/extensions/pi-subagents/test/unit/child-session-name.test.ts +50 -0
  351. package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +245 -0
  352. package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +192 -0
  353. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +27 -0
  354. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +150 -0
  355. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +21 -0
  356. package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +259 -0
  357. package/dist/extensions/pi-subagents/test/unit/cursor-smoke-inputs.test.ts +77 -0
  358. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +1 -4
  359. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
  360. package/dist/extensions/pi-subagents/test/unit/extension-context.test.ts +27 -0
  361. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +223 -0
  362. package/dist/extensions/pi-subagents/test/unit/fast-mode-extension.test.ts +27 -0
  363. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +208 -2
  364. package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +29 -1
  365. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +110 -1
  366. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +10 -0
  367. package/dist/extensions/pi-subagents/test/unit/formatters.test.ts +14 -0
  368. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +18 -9
  369. package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +63 -0
  370. package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
  371. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +132 -0
  372. package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +156 -0
  373. package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +98 -0
  374. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +178 -26
  375. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +2 -1
  376. package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +21 -0
  377. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +138 -0
  378. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +1 -1
  379. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +91 -0
  380. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +72 -7
  381. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +21 -0
  382. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +1 -0
  383. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +20 -2
  384. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +129 -1
  385. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +2 -2
  386. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +4 -0
  387. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +358 -0
  388. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +574 -21
  389. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +109 -1
  390. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +71 -1
  391. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +7 -7
  392. package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +214 -0
  393. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +29 -8
  394. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +53 -0
  395. package/dist/extensions/pi-subagents/test/unit/result-delivery-ownership.test.ts +34 -0
  396. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +101 -3
  397. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +1 -0
  398. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +10 -8
  399. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +71 -1
  400. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +41 -7
  401. package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +136 -2
  402. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +137 -0
  403. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +33 -12
  404. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +504 -1
  405. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +8 -0
  406. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
  407. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +12 -1
  408. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +3 -5
  409. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +5 -6
  410. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +0 -8
  411. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +5 -0
  412. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +157 -2
  413. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +1 -1
  414. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +63 -4
  415. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +27 -23
  416. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +44 -0
  417. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +1 -0
  418. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +7 -5
  419. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +106 -0
  420. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +484 -9
  421. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +38 -4
  422. package/dist/extensions/pi-subagents/test/unit/workflow-preflight.test.ts +155 -0
  423. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +318 -0
  424. package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +365 -0
  425. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +349 -0
  426. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +21 -0
  427. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +2 -7
  428. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/index.ts +13 -0
  429. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/effect/rules/no-service-constructor-imports.ts +52 -0
  430. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/index.ts +41 -0
  431. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-chained-type-assertions.ts +77 -0
  432. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-conditional-empty-object-spread.ts +49 -0
  433. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-known-value-widening.ts +247 -0
  434. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-module-mocking.ts +91 -0
  435. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-object-parameters.ts +126 -0
  436. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-apply.ts +28 -0
  437. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-reflect-get.ts +28 -0
  438. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-runtime-typeof.ts +67 -0
  439. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts +39 -0
  440. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-parameters.ts +83 -0
  441. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-returns.ts +115 -0
  442. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unknown-type-aliases.ts +72 -0
  443. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts +134 -0
  444. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/no-widen-then-assert.ts +366 -0
  445. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/rules/require-safety-comment-for-type-assertion.ts +62 -0
  446. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/dictionary-types.ts +502 -0
  447. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/lexical-type-parameters.ts +60 -0
  448. package/dist/extensions/pi-subagents/tools/oxlint/anti-slop/shared/reflect-method.ts +35 -0
  449. package/dist/extensions/pi-tool-display/tests/capabilities.test.ts +1 -1
  450. package/dist/extensions/pi-tool-display/tests/settings-inspector.test.ts +2 -2
  451. package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +1 -1
  452. package/dist/modes/interactive/interactive-mode.js +7 -7
  453. package/dist/skills/workflow/SKILL.md +65 -50
  454. package/package.json +112 -110
  455. package/dist/extensions/enable-readonly-tools.test.ts +0 -63
  456. package/dist/extensions/enable-readonly-tools.ts +0 -24
  457. package/dist/extensions/model-prompt-injector/config.json +0 -16
  458. package/dist/extensions/model-prompt-injector/index.test.ts +0 -102
  459. package/dist/extensions/model-prompt-injector/index.ts +0 -148
  460. package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +0 -98
  461. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +0 -250
@@ -5,29 +5,30 @@
5
5
  import { spawn } from "node:child_process";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import * as fs from "node:fs";
8
- import * as os from "node:os";
9
8
  import * as path from "node:path";
10
9
  import { fileURLToPath } from "node:url";
11
10
  import { createRequire } from "node:module";
12
11
  import type { ExtensionAPI } from "@selesai/code";
13
- import type { AgentConfig } from "../../agents/agents.ts";
12
+ import { discoverAgents, formatUnknownAgentError, unknownAgentDiagnosticContext, type AgentConfig, type UnknownAgentDiagnosticContext } from "../../agents/agents.ts";
14
13
  import { appendAgentRefinementOverlay } from "../../agents/agent-refinements.ts";
15
14
  import { writePrivateAtomicJson } from "../../shared/atomic-json.ts";
16
15
  import { currentCompletionOwnerId } from "../../shared/completion-owner.ts";
16
+ import { planChildLaunch, resolveStepBehavior, suppressProgressForReadOnlyTask, type ResolvedStepBehavior } from "../shared/child-launch-plan.ts";
17
17
  import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/pi-args.ts";
18
18
  import { injectOutputPathSystemPrompt, injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.ts";
19
- import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveChainPath, resolveExistingReadPaths, resolveStepBehavior, suppressProgressForReadOnlyTask, writeInitialProgressFile, type ChainStep, type ResolvedStepBehavior, type SequentialStep, type StepOverrides } from "../../shared/settings.ts";
19
+ import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveExistingReadPaths, writeInitialProgressFile, type ChainStep, type SequentialStep, type StepOverrides } from "../../shared/settings.ts";
20
20
  import type { RunnerStep } from "../shared/parallel-utils.ts";
21
21
  import type { ContextMode } from "../shared/context-mode.ts";
22
22
  import { resolvePiPackageRoot } from "../shared/pi-spawn.ts";
23
+ import { preflightLaunchCwd } from "../shared/launch-cwd.ts";
23
24
  import { resolveNodeExecutable } from "../../shared/node-executable.ts";
24
25
  import { buildSkillInjection, normalizeSkillInput, resolveSkillsWithFallback } from "../../agents/skills.ts";
25
26
  import { buildAgentMemoryInjection } from "../../agents/agent-memory.ts";
26
27
  import { SELESAI_CODING_AGENT_PACKAGE_ROOT_ENV, PROMPT_REDACTED, resolveChildCwd } from "../../shared/utils.ts";
27
- import { buildModelCandidates, inheritsParentModel, resolveEffectiveSubagentModel, resolveModelCandidate, resolveSubagentModelOverride, type AvailableModelInfo, type ParentModel } from "../shared/model-fallback.ts";
28
+ import { buildModelCandidates, inheritsParentModel, resolveEffectiveSubagentModel, resolveSubagentModelOverride, type AvailableModelInfo, type ParentModel } from "../shared/model-fallback.ts";
28
29
  import { resolveToolTimeoutMs, toolTimeoutFromEnv } from "../shared/tool-timeout.ts";
29
30
  import { resolveModelScopesForAgent, type ModelScopeConfig } from "../shared/model-scope.ts";
30
- import { resolveEffectiveThinking } from "../../shared/model-info.ts";
31
+ import { findModelInfo, resolveEffectiveThinking } from "../../shared/model-info.ts";
31
32
  import { assertThinkingWithinCeiling, decodeThinkingCeiling, intersectThinkingCeilings, SUBAGENT_THINKING_CEILING_ENV, type ThinkingLevel } from "../../shared/thinking-ceiling.ts";
32
33
  import { resolveExpectedWorktreeAgentCwd } from "../shared/worktree.ts";
33
34
  import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.ts";
@@ -39,6 +40,7 @@ import { validateImplementationToolContract } from "../shared/completion-guard.t
39
40
  import {
40
41
  type AcceptanceInput,
41
42
  type AgentContract,
43
+ type AsyncParallelGroupStatus,
42
44
  type AsyncStatus,
43
45
  type ArtifactConfig,
44
46
  type Details,
@@ -47,12 +49,12 @@ import {
47
49
  type MaxOutputConfig,
48
50
  type NestedRouteInfo,
49
51
  type ResolvedControlConfig,
50
- type ResolvedTurnBudget,
51
52
  type ResolvedToolBudget,
52
53
  type RunFanoutBudgetDescriptor,
53
54
  type ToolBudgetConfig,
54
55
  type SubagentRunMode,
55
56
  type SteeringRecoveryDescriptor,
57
+ type WorkflowLaneMetadata,
56
58
  type UsageBudgetConfig,
57
59
  DIRS,
58
60
  SUBAGENT_ASYNC_STARTED_EVENT,
@@ -63,18 +65,19 @@ import {
63
65
  } from "../../shared/types.ts";
64
66
  import { nestedResultsPath, nestedSummaryFromAsyncStatus, resolveInheritedNestedRouteFromEnv, resolveNestedParentAddressFromEnv, writeNestedEvent } from "../shared/nested-events.ts";
65
67
  import { resultFilePath } from "./result-files.ts";
66
- import { appendTurnBudgetSystemPrompt, initialTurnBudgetState } from "../shared/turn-budget.ts";
67
68
  import { validateToolBudgetConfig } from "../shared/tool-budget.ts";
68
69
  import { usageBudgetState } from "../shared/usage-budget.ts";
69
70
  import type { ImportedAsyncRoot } from "./chain-root-attachment.ts";
70
71
  import type { SessionLeaseRequest } from "../shared/session-lease.ts";
71
72
  import { finalizeProcessTerminal, readProcessTerminal } from "./process-terminal.ts";
72
73
  import type { ActiveAsyncCapacityHandle } from "./active-async-capacity.ts";
74
+ import { statusStepDescription } from "./chain-append.ts";
73
75
  import { SUBAGENT_PROCESS_TERMINAL_EVENT } from "../../shared/types.ts";
74
76
  import { assertAgentAllowedByCapabilityCeiling, decodeSubagentCapabilityCeiling, intersectSubagentCapabilityCeilings, resolveCurrentSubagentCapabilityCeiling, SUBAGENT_CAPABILITY_CEILING_ENV, type ResolvedSubagentCapabilityCeiling } from "../shared/capability-ceiling.ts";
75
77
  import { agentDefinitionDigest, launchBindingDigest } from "../../shared/launch-contract.ts";
76
78
  import { resolvePermissionRules, type PermissionConfig } from "../shared/permissions.ts";
77
79
  import { normalizeExtensionBindings, omitExtensionBindingsEnv, type ExtensionBindings } from "../shared/extension-bindings.ts";
80
+ import { assertWorkflowLaneKey, normalizeWorkflowLaneMetadata } from "../shared/lane-metadata.ts";
78
81
 
79
82
  const require = createRequire(import.meta.url);
80
83
  const piPackageRoot = resolvePiPackageRoot();
@@ -151,6 +154,8 @@ interface AsyncChainParams {
151
154
  attachRoot?: ImportedAsyncRoot & { agent: string; outputName?: string; label?: string };
152
155
  resultMode?: SubagentRunMode;
153
156
  agents: AgentConfig[];
157
+ /** Original discovery provenance, retained by normal callers for unknown-agent diagnostics. */
158
+ unknownAgentDiagnosticContext?: UnknownAgentDiagnosticContext;
154
159
  ctx: AsyncExecutionContext;
155
160
  availableModels?: AvailableModelInfo[];
156
161
  cwd?: string;
@@ -168,6 +173,7 @@ interface AsyncChainParams {
168
173
  dynamicFanoutMaxItems?: number;
169
174
  maxSubagentDepth: number;
170
175
  waitToolEnabled?: boolean;
176
+ waitToolDefaultTimeoutMs?: number;
171
177
  worktreeSetupHook?: string;
172
178
  worktreeSetupHookTimeoutMs?: number;
173
179
  worktreeBaseDir?: string;
@@ -178,7 +184,6 @@ interface AsyncChainParams {
178
184
  acceptance?: AcceptanceInput;
179
185
  fast?: boolean;
180
186
  timeoutMs?: number;
181
- turnBudget?: ResolvedTurnBudget;
182
187
  toolBudget?: ResolvedToolBudget;
183
188
  usageBudget?: UsageBudgetConfig;
184
189
  configToolBudget?: ResolvedToolBudget;
@@ -195,6 +200,7 @@ interface AsyncChainParams {
195
200
  runFanoutBudget?: RunFanoutBudgetDescriptor;
196
201
  parentWorkflowRunId?: string;
197
202
  workflowKey?: string;
203
+ lane?: WorkflowLaneMetadata;
198
204
  activeAsyncCapacity?: ActiveAsyncCapacityHandle;
199
205
  }
200
206
 
@@ -208,6 +214,7 @@ interface AsyncSingleParams {
208
214
  recoveryAgentConfig?: AgentConfig;
209
215
  ctx: AsyncExecutionContext;
210
216
  cwd?: string;
217
+ requestedCwd?: string;
211
218
  maxOutput?: MaxOutputConfig;
212
219
  artifactsDir?: string;
213
220
  artifactConfig: ArtifactConfig;
@@ -222,6 +229,7 @@ interface AsyncSingleParams {
222
229
  reads?: string[] | false;
223
230
  outputMode?: "inline" | "file-only";
224
231
  outputBaseDir?: string;
232
+ outputClaimPath?: string;
225
233
  agentContract?: AgentContract;
226
234
  structuredOutputSchema?: JsonSchemaObject;
227
235
  modelOverride?: string;
@@ -231,6 +239,7 @@ interface AsyncSingleParams {
231
239
  availableModels?: AvailableModelInfo[];
232
240
  maxSubagentDepth: number;
233
241
  waitToolEnabled?: boolean;
242
+ waitToolDefaultTimeoutMs?: number;
234
243
  worktreeSetupHook?: string;
235
244
  worktreeSetupHookTimeoutMs?: number;
236
245
  worktreeBaseDir?: string;
@@ -245,7 +254,6 @@ interface AsyncSingleParams {
245
254
  absoluteDeadlineAt?: number;
246
255
  /** Optional per-call hard toolTimeoutMs override (highest precedence). */
247
256
  toolTimeoutMs?: number;
248
- turnBudget?: { maxTurns: number; graceTurns?: number };
249
257
  toolBudget?: ResolvedToolBudget | ToolBudgetConfig;
250
258
  usageBudget?: UsageBudgetConfig;
251
259
  configToolBudget?: ResolvedToolBudget;
@@ -259,6 +267,7 @@ interface AsyncSingleParams {
259
267
  runFanoutBudget?: RunFanoutBudgetDescriptor;
260
268
  parentWorkflowRunId?: string;
261
269
  workflowKey?: string;
270
+ lane?: WorkflowLaneMetadata;
262
271
  workflowAwaitAsync?: boolean;
263
272
  activeAsyncCapacity?: ActiveAsyncCapacityHandle;
264
273
  externalJobFollowUp?: {
@@ -283,6 +292,8 @@ export interface AsyncRunnerStepBuildParams {
283
292
  attachRoot?: ImportedAsyncRoot & { agent: string; outputName?: string; label?: string };
284
293
  resultMode?: SubagentRunMode;
285
294
  agents: AgentConfig[];
295
+ /** Exact discovery provenance for failed resolution; omission triggers defensive fallback discovery. */
296
+ unknownAgentDiagnosticContext?: UnknownAgentDiagnosticContext;
286
297
  ctx: AsyncExecutionContext;
287
298
  availableModels?: AvailableModelInfo[];
288
299
  cwd?: string;
@@ -295,6 +306,7 @@ export interface AsyncRunnerStepBuildParams {
295
306
  dynamicFanoutMaxItems?: number;
296
307
  maxSubagentDepth: number;
297
308
  waitToolEnabled?: boolean;
309
+ waitToolDefaultTimeoutMs?: number;
298
310
  worktreeBaseDir?: string;
299
311
  asyncDir: string;
300
312
  outputBaseDir?: string;
@@ -493,24 +505,33 @@ interface SpawnRunnerResult {
493
505
  startupDidNotProceed?: boolean;
494
506
  }
495
507
 
496
- function spawnRunner(cfg: object, suffix: string, cwd: string, onProcessTerminal?: (proof: unknown) => void): SpawnRunnerResult {
497
- if (!jitiCliPath) {
498
- return { error: "upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed" };
499
- }
508
+ function isStaleExtensionContextError(error: unknown): boolean {
509
+ return error instanceof Error && /extension ctx is stale|stale after session replacement or reload/i.test(error.message);
510
+ }
500
511
 
512
+ export function emitProcessTerminalEvent(ctx: AsyncExecutionContext, proof: unknown): void {
501
513
  try {
502
- const cwdStats = fs.statSync(cwd);
503
- if (!cwdStats.isDirectory()) {
504
- return { error: `cwd is not a directory: ${cwd}` };
505
- }
506
- } catch {
507
- return { error: `cwd does not exist: ${cwd}` };
514
+ ctx.pi.events.emit(SUBAGENT_PROCESS_TERMINAL_EVENT, proof);
515
+ } catch (error) {
516
+ if (isStaleExtensionContextError(error)) return;
517
+ console.error("Failed to emit subagent process-terminal event:", error);
518
+ }
519
+ }
520
+
521
+ function spawnRunner(cfg: object, suffix: string, cwd: string, initialStatus: Omit<AsyncStatus, "pid" | "processTerminal">, initialStatusPath: string, onProcessTerminal?: (proof: unknown) => void, requestedCwd = cwd): SpawnRunnerResult {
522
+ const cwdError = preflightLaunchCwd(requestedCwd, cwd);
523
+ if (cwdError) return { error: cwdError };
524
+
525
+ if (!jitiCliPath) {
526
+ return { error: "upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed" };
508
527
  }
509
528
 
510
529
  fs.mkdirSync(TEMP_ROOT_DIR, { recursive: true });
511
530
  const cfgPath = getAsyncConfigPath(suffix);
512
531
  const runnerProcessInstanceId = randomUUID();
513
- const launchConfig = { ...cfg, runnerProcessInstanceId };
532
+ const hasRevivalLease = typeof (cfg as { revivalLease?: unknown }).revivalLease === "object";
533
+ const launchBarrierToken = hasRevivalLease ? undefined : runnerProcessInstanceId;
534
+ const launchConfig = { ...cfg, runnerProcessInstanceId, ...(launchBarrierToken ? { launchBarrierToken } : {}) };
514
535
  writePrivateAtomicJson(cfgPath, launchConfig);
515
536
  const runner = path.join(path.dirname(fileURLToPath(import.meta.url)), "subagent-runner.ts");
516
537
  const nodeCommand = resolveNodeExecutable();
@@ -523,7 +544,9 @@ function spawnRunner(cfg: object, suffix: string, cwd: string, onProcessTerminal
523
544
  ? path.join(launchAsyncDir, "runner-startup.json")
524
545
  : undefined;
525
546
  const startupAckPath = startupPath ? path.join(path.dirname(startupPath), "runner-startup-ack.json") : undefined;
526
- const startupProceedPath = startupPath ? path.join(path.dirname(startupPath), "runner-startup-proceed.json") : undefined;
547
+ const startupProceedPath = launchAsyncDir && (startupPath || launchBarrierToken)
548
+ ? path.join(launchAsyncDir, "runner-startup-proceed.json")
549
+ : undefined;
527
550
  if (startupPath) fs.rmSync(startupPath, { force: true });
528
551
  if (startupAckPath) fs.rmSync(startupAckPath, { force: true });
529
552
  if (startupProceedPath) fs.rmSync(startupProceedPath, { force: true });
@@ -605,6 +628,27 @@ function spawnRunner(cfg: object, suffix: string, cwd: string, onProcessTerminal
605
628
  if (typeof proc.pid !== "number") {
606
629
  return { error: `async runner did not produce a pid for cwd: ${cwd}` };
607
630
  }
631
+ try {
632
+ writePrivateAtomicJson(initialStatusPath, {
633
+ ...initialStatus,
634
+ pid: proc.pid,
635
+ processTerminal: { version: 1, state: "pending", runId: initialStatus.runId, runnerProcessInstanceId },
636
+ });
637
+ } catch (error) {
638
+ const message = `Failed to persist initial async status: ${error instanceof Error ? error.message : String(error)}`;
639
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
640
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
641
+ }
642
+ if (launchBarrierToken && startupProceedPath) {
643
+ try {
644
+ writeRunnerStartupControl(startupProceedPath, { action: "proceed", token: launchBarrierToken });
645
+ } catch (error) {
646
+ const message = `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}`;
647
+ if (launchAsyncDir) persistPreProceedStartupFailure(launchAsyncDir, launchRunId, runnerProcessInstanceId, launchSessionId, launchCompletionOwnerId, message);
648
+ const terminationObserved = terminateRunnerBeforeProceed(proc.pid);
649
+ return { pid: proc.pid, runnerProcessInstanceId, error: message, terminationObserved, startupDidNotProceed: true };
650
+ }
651
+ }
608
652
  proc.unref();
609
653
  if (startupPath && startupAckPath && startupProceedPath) {
610
654
  const persistStartupFailure = (message: string) => {
@@ -709,6 +753,8 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
709
753
  }
710
754
  const workflowGraph = buildWorkflowGraphSnapshot({ runId: id, mode: resultMode, steps: graphChain });
711
755
 
756
+ const diagnosticContext = params.unknownAgentDiagnosticContext
757
+ ?? unknownAgentDiagnosticContext(discoverAgents(path.resolve(runnerCwd), "both"));
712
758
  for (const s of chain) {
713
759
  const stepAgents = isParallelStep(s)
714
760
  ? s.parallel.map((t) => t.agent)
@@ -716,9 +762,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
716
762
  ? [s.parallel.agent]
717
763
  : [(s as SequentialStep).agent];
718
764
  for (const agentName of stepAgents) {
719
- if (!agents.find((x) => x.name === agentName)) {
720
- return { error: `Unknown agent: ${agentName}` };
721
- }
765
+ if (!agents.find((x) => x.name === agentName)) return { error: formatUnknownAgentError(agentName, diagnosticContext) };
722
766
  }
723
767
  }
724
768
 
@@ -764,19 +808,21 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
764
808
  envValue: params.toolTimeoutMsEnv ?? toolTimeoutFromEnv(),
765
809
  });
766
810
  if (resolvedToolTimeout.error) throw new AsyncStartValidationError(resolvedToolTimeout.error);
767
- const stepCwd = resolveChildCwd(runnerCwd, s.cwd);
768
- const instructionCwd = behaviorCwd ?? stepCwd;
769
- const readExistenceCwd = behaviorCwd ? stepCwd : instructionCwd;
770
- let behavior = suppressProgressForReadOnlyTask(resolvedBehavior ?? resolveStepBehavior(a, buildStepOverrides(s), chainSkills), s.task, originalTask);
771
- const inheritedRelativeParallelOutput = parallelOutputNamespace && s.output === undefined && typeof behavior.output === "string" && !path.isAbsolute(behavior.output);
772
- if (inheritedRelativeParallelOutput && parallelOutputNamespace.taskIndex !== undefined) {
773
- behavior = {
774
- ...behavior,
775
- output: path.join(`parallel-${parallelOutputNamespace.stepIndex}`, `${parallelOutputNamespace.taskIndex}-${s.agent}`, behavior.output as string),
776
- };
777
- }
778
- const namespaceOutputPath = Boolean(inheritedRelativeParallelOutput && parallelOutputNamespace.taskIndex === undefined);
779
- const skillNames = behavior.skills === false ? [] : behavior.skills;
811
+ const launchPlan = planChildLaunch({
812
+ agentConfig: a,
813
+ stepOverrides: buildStepOverrides(s),
814
+ task: s.task,
815
+ originalTask,
816
+ runnerCwd,
817
+ runtimeCwd: ctx.cwd,
818
+ stepCwdInput: s.cwd,
819
+ behaviorCwd,
820
+ chainSkills,
821
+ outputBaseDir,
822
+ parallelOutputNamespace,
823
+ resolvedBehavior,
824
+ });
825
+ const { stepCwd, instructionCwd, readExistenceCwd, behavior, namespaceOutputPath, outputPath, skillNames } = launchPlan;
780
826
  const { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(
781
827
  skillNames,
782
828
  stepCwd,
@@ -801,7 +847,6 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
801
847
  const isFirstProgressAgent = behavior.progress && !progressPrecreated && !progressInstructionCreated;
802
848
  if (behavior.progress) progressInstructionCreated = true;
803
849
  const progressInstructions = buildChainInstructions({ ...behavior, output: false, reads: false }, progressDir, isFirstProgressAgent);
804
- const outputPath = resolveSingleOutputPath(behavior.output, ctx.cwd, instructionCwd, outputBaseDir);
805
850
  if (!namespaceOutputPath) systemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, a);
806
851
  const validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Async step (${s.agent})`);
807
852
  if (validationError) throw new AsyncStartValidationError(validationError);
@@ -824,6 +869,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
824
869
  const thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];
825
870
  const effectiveThinking = externalRunner ? undefined : thinkingOverride ?? a.thinking;
826
871
  const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);
872
+ const contextLimit = model ? findModelInfo(model, availableModels, a.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
827
873
  const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(
828
874
  params.thinkingCeiling,
829
875
  a.maxThinking,
@@ -855,6 +901,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
855
901
  const fast = s.fast ?? params.fast ?? a.fast;
856
902
  const toolPlan = resolvePiLaunchToolPlan({
857
903
  tools: a.tools,
904
+ allowNestedSubagents: a.allowNestedSubagents,
858
905
  extensions: a.extensions,
859
906
  subagentOnlyExtensions: a.subagentOnlyExtensions,
860
907
  mcpDirectTools: a.mcpDirectTools,
@@ -868,6 +915,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
868
915
  inheritedCapabilityCeiling: decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),
869
916
  agentName: a.name,
870
917
  permissionRules,
918
+ runtimeSnapshotHost: ctx.pi,
871
919
  });
872
920
  const launchResolvedExtensions = externalRunner ? undefined : projectLaunchResolvedChildExtensions(toolPlan);
873
921
  if (externalRunner && permissionRules) {
@@ -902,22 +950,29 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
902
950
  outputName: s.as,
903
951
  structured: Boolean(s.outputSchema),
904
952
  cwd: stepCwd,
953
+ requestedCwd: s.cwd ?? stepCwd,
905
954
  model,
955
+ ...(contextLimit !== undefined ? { contextLimit } : {}),
906
956
  ...(fast !== undefined ? { fast } : {}),
907
957
  thinking: resolveEffectiveThinking(model, effectiveThinking),
908
958
  ...(thinkingCeiling ? { thinkingCeiling } : {}),
909
959
  launchResolvedExtensions,
960
+ ...(toolPlan.mcpConfig ? { mcpConfig: toolPlan.mcpConfig } : {}),
961
+ ...(toolPlan.runtimeServerNames ? { runtimeServerNames: toolPlan.runtimeServerNames } : {}),
910
962
  modelCandidates: externalRunner ? undefined : modelCandidates,
911
963
  ...(primaryModelFromParent ? { skipPrimaryModelVerification: true } : {}),
912
964
  ...(availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {}),
913
965
  tools: a.tools,
966
+ allowNestedSubagents: a.allowNestedSubagents,
914
967
  extensions: a.extensions,
915
968
  subagentOnlyExtensions: a.subagentOnlyExtensions,
916
969
  mcpDirectTools: a.mcpDirectTools,
970
+ mutationTools: a.mutationTools,
917
971
  completionGuard: a.completionGuard,
918
972
  systemPrompt,
919
973
  systemPromptMode: a.systemPromptMode,
920
974
  inheritProjectContext: a.inheritProjectContext,
975
+ inheritGlobalContext: a.inheritGlobalContext,
921
976
  inheritSkills: a.inheritSkills,
922
977
  skills: resolvedSkills.map((r) => r.name),
923
978
  outputPath,
@@ -928,6 +983,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
928
983
  timeoutMs: a.defaultTimeoutMs ?? DEFAULT_ASYNC_TIMEOUT_MS,
929
984
  toolTimeoutMs: resolvedToolTimeout.toolTimeoutMs,
930
985
  waitToolEnabled: params.waitToolEnabled,
986
+ waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
931
987
  effectiveAcceptance: resolveEffectiveAcceptance({
932
988
  explicit: s.acceptance,
933
989
  agentName: s.agent,
@@ -1054,6 +1110,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
1054
1110
  index: params.attachRoot.index,
1055
1111
  },
1056
1112
  inheritProjectContext: false,
1113
+ inheritGlobalContext: false,
1057
1114
  inheritSkills: false,
1058
1115
  }, ...builtSteps]
1059
1116
  : builtSteps;
@@ -1140,6 +1197,7 @@ export function executeAsyncChain(
1140
1197
  attachRoot: params.attachRoot,
1141
1198
  resultMode,
1142
1199
  agents,
1200
+ unknownAgentDiagnosticContext: params.unknownAgentDiagnosticContext,
1143
1201
  ctx,
1144
1202
  availableModels: params.availableModels,
1145
1203
  cwd,
@@ -1153,6 +1211,7 @@ export function executeAsyncChain(
1153
1211
  dynamicFanoutMaxItems: params.dynamicFanoutMaxItems,
1154
1212
  maxSubagentDepth,
1155
1213
  waitToolEnabled: params.waitToolEnabled,
1214
+ waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
1156
1215
  worktreeBaseDir,
1157
1216
  asyncDir,
1158
1217
  fast: params.fast,
@@ -1174,7 +1233,6 @@ export function executeAsyncChain(
1174
1233
  }
1175
1234
  const { steps, runnerCwd, workflowGraph, eventChain } = built;
1176
1235
  const deadlineAt = params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined;
1177
- const initialTurnBudget = params.turnBudget ? initialTurnBudgetState(params.turnBudget) : undefined;
1178
1236
  const initialUsageBudget = usageBudgetState(params.usageBudget, undefined);
1179
1237
  let childTargetIndex = 0;
1180
1238
  const childIntercomTargets = childIntercomTarget ? steps.flatMap((step) => {
@@ -1191,6 +1249,21 @@ export function executeAsyncChain(
1191
1249
  }
1192
1250
  return "agent" in step ? [childIntercomTarget(step.agent, childTargetIndex++)] : [undefined];
1193
1251
  }) : undefined;
1252
+ const initialStatusSteps = eventChain.flatMap((step) => isParallelStep(step)
1253
+ ? step.parallel.map((task) => ({ agent: task.agent, ...(statusStepDescription(task.task) ? { description: statusStepDescription(task.task) } : {}), ...(task.label ? { label: task.label } : {}), ...(task.as ? { outputName: task.as } : {}), status: "pending" as const }))
1254
+ : isDynamicParallelStep(step)
1255
+ ? [{ agent: `expand:${step.parallel.agent}`, label: step.label ?? step.parallel.label ?? `Dynamic fanout (${step.collect.as})`, outputName: step.collect.as, status: "pending" as const }]
1256
+ : [{ agent: (step as SequentialStep).agent, ...(statusStepDescription((step as SequentialStep).task) ? { description: statusStepDescription((step as SequentialStep).task) } : {}), ...((step as SequentialStep).label ? { label: (step as SequentialStep).label } : {}), ...((step as SequentialStep).as ? { outputName: (step as SequentialStep).as } : {}), status: "pending" as const }]);
1257
+ const initialParallelGroups: AsyncParallelGroupStatus[] = [];
1258
+ let initialFlatIndex = 0;
1259
+ for (let stepIndex = 0; stepIndex < eventChain.length; stepIndex++) {
1260
+ const step = eventChain[stepIndex]!;
1261
+ if (isParallelStep(step)) initialParallelGroups.push({ start: initialFlatIndex, count: step.parallel.length, stepIndex });
1262
+ else if (isDynamicParallelStep(step)) initialParallelGroups.push({ start: initialFlatIndex, count: 1, stepIndex });
1263
+ initialFlatIndex += isParallelStep(step) ? step.parallel.length : 1;
1264
+ }
1265
+ const initialStatusAt = Date.now();
1266
+ const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1194
1267
 
1195
1268
  let spawnResult: SpawnRunnerResult = {};
1196
1269
  try {
@@ -1216,7 +1289,6 @@ export function executeAsyncChain(
1216
1289
  worktreeSetupHookTimeoutMs,
1217
1290
  worktreeBaseDir,
1218
1291
  controlConfig,
1219
- turnBudget: params.turnBudget,
1220
1292
  toolBudget: params.toolBudget,
1221
1293
  usageBudget: params.usageBudget,
1222
1294
  controlIntercomTarget,
@@ -1240,7 +1312,22 @@ export function executeAsyncChain(
1240
1312
  },
1241
1313
  id,
1242
1314
  runnerCwd,
1243
- (proof) => ctx.pi.events.emit(SUBAGENT_PROCESS_TERMINAL_EVENT, proof),
1315
+ {
1316
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1317
+ runId: id,
1318
+ ...(ctx.currentSessionId ? { sessionId: ctx.currentSessionId } : {}),
1319
+ ...(initialCompletionOwnerId ? { completionOwnerId: initialCompletionOwnerId } : {}),
1320
+ mode: resultMode,
1321
+ state: "running",
1322
+ startedAt: initialStatusAt,
1323
+ lastUpdate: initialStatusAt,
1324
+ currentStep: 0,
1325
+ chainStepCount: eventChain.length,
1326
+ ...(initialParallelGroups.length ? { parallelGroups: initialParallelGroups } : {}),
1327
+ steps: initialStatusSteps,
1328
+ },
1329
+ path.join(asyncDir, "status.json"),
1330
+ (proof) => emitProcessTerminalEvent(ctx, proof),
1244
1331
  );
1245
1332
  } catch (error) {
1246
1333
  params.activeAsyncCapacity?.rollback();
@@ -1320,7 +1407,6 @@ export function executeAsyncChain(
1320
1407
  chainStepCount: eventChain.length,
1321
1408
  parallelGroups,
1322
1409
  ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),
1323
- ...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),
1324
1410
  startedAt: now,
1325
1411
  lastUpdate: now,
1326
1412
  ...(capabilityCeiling ? { capabilityCeiling } : {}),
@@ -1351,7 +1437,6 @@ export function executeAsyncChain(
1351
1437
  asyncDir,
1352
1438
  ...(sessionRoot ? { sessionRoot } : {}),
1353
1439
  ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),
1354
- ...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),
1355
1440
  ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}),
1356
1441
  ...(capabilityCeiling ? { capabilityCeiling } : {}),
1357
1442
  ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
@@ -1368,7 +1453,7 @@ export function executeAsyncChain(
1368
1453
 
1369
1454
  return {
1370
1455
  content: [{ type: "text", text: formatAsyncStartedMessage(`Async ${resultMode}: ${chainDesc} [${id}]`, ctx.interactive === true) }],
1371
- details: { mode: resultMode, runId: id, results: [], asyncId: id, asyncDir, workflowGraph, ...(capabilityCeiling ? { capabilityCeiling } : {}), ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}), ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}), ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}), ...(params.turnBudget ? { turnBudget: params.turnBudget } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}), ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}) },
1456
+ details: { mode: resultMode, runId: id, results: [], asyncId: id, asyncDir, workflowGraph, ...(capabilityCeiling ? { capabilityCeiling } : {}), ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}), ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}), ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}), ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}) },
1372
1457
  };
1373
1458
  }
1374
1459
 
@@ -1403,6 +1488,13 @@ export function executeAsyncSingle(
1403
1488
  childIntercomTarget,
1404
1489
  nestedRoute,
1405
1490
  } = params;
1491
+ let lane: WorkflowLaneMetadata | undefined;
1492
+ try {
1493
+ lane = normalizeWorkflowLaneMetadata(params.lane, "lane");
1494
+ assertWorkflowLaneKey(lane, params.workflowKey, "lane");
1495
+ } catch (error) {
1496
+ return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1497
+ }
1406
1498
  const task = params.task ?? "";
1407
1499
  let extensionBindings: ExtensionBindings | undefined;
1408
1500
  try {
@@ -1507,6 +1599,7 @@ export function executeAsyncSingle(
1507
1599
  );
1508
1600
  const effectiveThinking = externalRunner ? undefined : params.thinkingOverride ?? agentConfig.thinking;
1509
1601
  const model = externalRunner ? undefined : applyThinkingSuffix(primaryModel, effectiveThinking, params.thinkingOverride !== undefined);
1602
+ const contextLimit = model ? findModelInfo(model, availableModels, agentConfig.modelProvider ?? ctx.currentModelProvider)?.contextWindow : undefined;
1510
1603
  const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(
1511
1604
  params.thinkingCeiling,
1512
1605
  agentConfig.maxThinking,
@@ -1535,7 +1628,6 @@ export function executeAsyncSingle(
1535
1628
  });
1536
1629
  if (resolvedToolTimeout.error) return formatAsyncStartError("single", resolvedToolTimeout.error);
1537
1630
  const toolTimeoutMs = resolvedToolTimeout.toolTimeoutMs;
1538
- const initialTurnBudget = params.turnBudget ? initialTurnBudgetState(params.turnBudget) : undefined;
1539
1631
  const initialUsageBudget = usageBudgetState(params.usageBudget, undefined);
1540
1632
  const resolvedSessionDir = params.sessionDir ?? (sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined);
1541
1633
  const structuredOutput = params.structuredOutputSchema
@@ -1558,9 +1650,9 @@ export function executeAsyncSingle(
1558
1650
  return formatAsyncStartError("single", error instanceof Error ? error.message : String(error));
1559
1651
  }
1560
1652
  }
1561
- const effectiveSystemPrompt = appendTurnBudgetSystemPrompt(systemPrompt, params.turnBudget);
1562
1653
  const toolPlan = resolvePiLaunchToolPlan({
1563
1654
  tools: agentConfig.tools,
1655
+ allowNestedSubagents: agentConfig.allowNestedSubagents,
1564
1656
  extensions: agentConfig.extensions,
1565
1657
  subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
1566
1658
  mcpDirectTools: agentConfig.mcpDirectTools,
@@ -1574,6 +1666,7 @@ export function executeAsyncSingle(
1574
1666
  inheritedCapabilityCeiling: decodeSubagentCapabilityCeiling(process.env[SUBAGENT_CAPABILITY_CEILING_ENV]),
1575
1667
  agentName: agentConfig.name,
1576
1668
  permissionRules: resolvePermissionRules(ctx.permissions, agentConfig.permissions),
1669
+ runtimeSnapshotHost: ctx.pi,
1577
1670
  });
1578
1671
  const launchResolvedExtensions = externalRunner ? undefined : projectLaunchResolvedChildExtensions(toolPlan);
1579
1672
  if (!externalRunner) {
@@ -1598,9 +1691,10 @@ export function executeAsyncSingle(
1598
1691
  ...((params.fast ?? agentConfig.fast) !== undefined ? { fast: params.fast ?? agentConfig.fast } : {}),
1599
1692
  ...(resolveEffectiveThinking(model, effectiveThinking) ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {}),
1600
1693
  ...(thinkingCeiling ? { thinkingCeiling } : {}),
1601
- systemPrompt: effectiveSystemPrompt,
1694
+ systemPrompt,
1602
1695
  systemPromptMode: agentConfig.systemPromptMode,
1603
1696
  inheritProjectContext: agentConfig.inheritProjectContext,
1697
+ inheritGlobalContext: agentConfig.inheritGlobalContext,
1604
1698
  inheritSkills: agentConfig.inheritSkills,
1605
1699
  skills: resolvedSkills.map((skill) => skill.name),
1606
1700
  tools: toolPlan.effectiveToolAllowlist,
@@ -1623,6 +1717,7 @@ export function executeAsyncSingle(
1623
1717
  const recoveryAgentConfig = params.recoveryAgentConfig ?? agentConfig;
1624
1718
  const recoveryDescriptor: SteeringRecoveryDescriptor = {
1625
1719
  version: 1,
1720
+ ...(lane ? { lane } : {}),
1626
1721
  launchContractDigest,
1627
1722
  ...(extensionBindings ? { extensionBindings } : {}),
1628
1723
  runFanoutBudget,
@@ -1640,12 +1735,15 @@ export function executeAsyncSingle(
1640
1735
  ...(effectiveThinking ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {}),
1641
1736
  ...(thinkingCeiling ? { thinkingCeiling } : {}),
1642
1737
  ...(recoveryAgentConfig.tools ? { tools: [...recoveryAgentConfig.tools] } : {}),
1738
+ ...(recoveryAgentConfig.allowNestedSubagents !== undefined ? { allowNestedSubagents: recoveryAgentConfig.allowNestedSubagents } : {}),
1643
1739
  ...(recoveryAgentConfig.extensions ? { extensions: [...recoveryAgentConfig.extensions] } : {}),
1644
1740
  ...(recoveryAgentConfig.subagentOnlyExtensions ? { subagentOnlyExtensions: [...recoveryAgentConfig.subagentOnlyExtensions] } : {}),
1645
1741
  ...(recoveryAgentConfig.mcpDirectTools ? { mcpDirectTools: [...recoveryAgentConfig.mcpDirectTools] } : {}),
1742
+ ...(recoveryAgentConfig.mutationTools ? { mutationTools: [...recoveryAgentConfig.mutationTools] } : {}),
1646
1743
  ...(recoveryAgentConfig.systemPrompt ? { systemPrompt: recoveryAgentConfig.systemPrompt } : {}),
1647
1744
  systemPromptMode: recoveryAgentConfig.systemPromptMode,
1648
1745
  inheritProjectContext: recoveryAgentConfig.inheritProjectContext,
1746
+ inheritGlobalContext: recoveryAgentConfig.inheritGlobalContext,
1649
1747
  inheritSkills: recoveryAgentConfig.inheritSkills,
1650
1748
  ...(resolvedSkills.length ? { skills: resolvedSkills.map((skill) => skill.name) } : {}),
1651
1749
  ...(recoveryAgentConfig.skillPath ? { skillPath: [...recoveryAgentConfig.skillPath] } : {}),
@@ -1660,7 +1758,6 @@ export function executeAsyncSingle(
1660
1758
  ...(params.context ? { context: params.context } : {}),
1661
1759
  ...(params.intercomBridge !== undefined ? { intercomBridge: params.intercomBridge } : {}),
1662
1760
  ...(deadlineAt !== undefined ? { absoluteDeadlineAt: deadlineAt } : {}),
1663
- ...(initialTurnBudget ? { initialTurnBudget: { maxTurns: initialTurnBudget.maxTurns, graceTurns: initialTurnBudget.graceTurns } } : {}),
1664
1761
  ...(resolvedToolBudget.budget ? { initialToolBudget: resolvedToolBudget.budget } : {}),
1665
1762
  maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, recoveryAgentConfig.maxSubagentDepth),
1666
1763
  ...(maxOutput ? { maxOutput } : {}),
@@ -1678,6 +1775,8 @@ export function executeAsyncSingle(
1678
1775
  }
1679
1776
  }
1680
1777
  let spawnResult: SpawnRunnerResult = {};
1778
+ const initialStatusAt = Date.now();
1779
+ const initialCompletionOwnerId = ctx.completionOwnerId ?? currentCompletionOwnerId();
1681
1780
  try {
1682
1781
  spawnResult = spawnRunner(
1683
1782
  {
@@ -1693,7 +1792,9 @@ export function executeAsyncSingle(
1693
1792
  ...(params.externalJobFollowUp ? { externalJobFollowUp: params.externalJobFollowUp } : {}),
1694
1793
  ...(params.context ? { context: params.context } : {}),
1695
1794
  cwd: runnerCwd,
1795
+ requestedCwd: params.requestedCwd ?? runnerCwd,
1696
1796
  model,
1797
+ ...(contextLimit !== undefined ? { contextLimit } : {}),
1697
1798
  ...(params.fast ?? agentConfig.fast ? { fast: params.fast ?? agentConfig.fast } : {}),
1698
1799
  thinking: resolveEffectiveThinking(model, effectiveThinking),
1699
1800
  ...(thinkingCeiling ? { thinkingCeiling } : {}),
@@ -1701,20 +1802,27 @@ export function executeAsyncSingle(
1701
1802
  ...(params.modelOverrideFromParent ? { skipPrimaryModelVerification: true } : {}),
1702
1803
  ...(availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {}),
1703
1804
  tools: agentConfig.tools,
1805
+ allowNestedSubagents: agentConfig.allowNestedSubagents,
1704
1806
  extensions: agentConfig.extensions,
1705
1807
  subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
1706
1808
  mcpDirectTools: agentConfig.mcpDirectTools,
1809
+ ...(toolPlan.mcpConfig ? { mcpConfig: toolPlan.mcpConfig } : {}),
1810
+ ...(toolPlan.runtimeServerNames ? { runtimeServerNames: toolPlan.runtimeServerNames } : {}),
1811
+ mutationTools: agentConfig.mutationTools,
1707
1812
  completionGuard: agentConfig.completionGuard,
1708
1813
  systemPrompt,
1709
1814
  systemPromptMode: agentConfig.systemPromptMode,
1710
1815
  inheritProjectContext: agentConfig.inheritProjectContext,
1816
+ inheritGlobalContext: agentConfig.inheritGlobalContext,
1711
1817
  inheritSkills: agentConfig.inheritSkills,
1712
1818
  skills: resolvedSkills.map((r) => r.name),
1713
1819
  outputPath,
1820
+ ...(params.outputClaimPath ? { outputClaimPath: params.outputClaimPath } : {}),
1714
1821
  outputMode,
1715
1822
  ...(!externalRunner && sessionFile ? { sessionFile } : {}),
1716
1823
  maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, agentConfig.maxSubagentDepth),
1717
1824
  waitToolEnabled: params.waitToolEnabled,
1825
+ waitToolDefaultTimeoutMs: params.waitToolDefaultTimeoutMs,
1718
1826
  ...(params.agentContract ? { agentContract: params.agentContract } : {}),
1719
1827
  definitionDigest: agentDefinitionDigest(agentConfig),
1720
1828
  launchBindingTask: task,
@@ -1726,6 +1834,7 @@ export function executeAsyncSingle(
1726
1834
  ...(params.structuredOutputSchema ? { structuredOutputSchema: params.structuredOutputSchema } : {}),
1727
1835
  ...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),
1728
1836
  ...(params.worktree === true ? { worktree: true } : {}),
1837
+ ...(lane ? { lane } : {}),
1729
1838
  },
1730
1839
  ],
1731
1840
  resultPath: params.parentWorkflowRunId !== undefined && (params.revivalLease !== undefined || params.workflowAwaitAsync === true)
@@ -1751,7 +1860,6 @@ export function executeAsyncSingle(
1751
1860
  timeoutMs,
1752
1861
  deadlineAt,
1753
1862
  toolTimeoutMs,
1754
- turnBudget: params.turnBudget,
1755
1863
  toolBudget: params.toolBudget,
1756
1864
  usageBudget: params.usageBudget,
1757
1865
  controlIntercomTarget,
@@ -1762,6 +1870,7 @@ export function executeAsyncSingle(
1762
1870
  runFanoutBudget,
1763
1871
  ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
1764
1872
  ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}),
1873
+ ...(lane ? { lane } : {}),
1765
1874
  ...(params.revivalLease ? { revivalLease: params.revivalLease } : {}),
1766
1875
  nestedRoute: nestedRoute ?? inheritedNestedRoute,
1767
1876
  nestedSelf: inheritedNestedRoute && nestedAddress ? {
@@ -1773,7 +1882,23 @@ export function executeAsyncSingle(
1773
1882
  },
1774
1883
  id,
1775
1884
  runnerCwd,
1776
- (proof) => ctx.pi.events.emit(SUBAGENT_PROCESS_TERMINAL_EVENT, proof),
1885
+ {
1886
+ lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
1887
+ runId: id,
1888
+ ...(ctx.currentSessionId ? { sessionId: ctx.currentSessionId } : {}),
1889
+ ...(initialCompletionOwnerId ? { completionOwnerId: initialCompletionOwnerId } : {}),
1890
+ mode: "single",
1891
+ state: "running",
1892
+ startedAt: initialStatusAt,
1893
+ lastUpdate: initialStatusAt,
1894
+ currentStep: 0,
1895
+ chainStepCount: 1,
1896
+ ...(lane ? { lane } : {}),
1897
+ steps: [{ agent, status: "pending", ...(lane ? { lane } : {}), ...(model ? { model } : {}), ...(contextLimit !== undefined ? { contextLimit } : {}) }],
1898
+ },
1899
+ path.join(asyncDir, "status.json"),
1900
+ (proof) => emitProcessTerminalEvent(ctx, proof),
1901
+ params.requestedCwd ?? runnerCwd,
1777
1902
  );
1778
1903
  } catch (error) {
1779
1904
  params.activeAsyncCapacity?.rollback();
@@ -1819,7 +1944,6 @@ export function executeAsyncSingle(
1819
1944
  agents: [agent],
1820
1945
  chainStepCount: 1,
1821
1946
  ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),
1822
- ...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),
1823
1947
  startedAt: now,
1824
1948
  lastUpdate: now,
1825
1949
  ...(capabilityCeiling ? { capabilityCeiling } : {}),
@@ -1847,7 +1971,6 @@ export function executeAsyncSingle(
1847
1971
  ...(params.parentWorkflowRunId ? { parentWorkflowRunId: params.parentWorkflowRunId } : {}),
1848
1972
  ...(params.workflowKey ? { workflowKey: params.workflowKey } : {}),
1849
1973
  ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),
1850
- ...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),
1851
1974
  ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}),
1852
1975
  ...(capabilityCeiling ? { capabilityCeiling } : {}),
1853
1976
  nestedRoute,
@@ -1856,6 +1979,6 @@ export function executeAsyncSingle(
1856
1979
 
1857
1980
  return {
1858
1981
  content: [{ type: "text", text: formatAsyncStartedMessage(`Async: ${agent} [${id}]`, ctx.interactive === true) }],
1859
- details: { mode: "single", runId: id, results: [], asyncId: id, asyncDir, launchContractDigest, launchResolvedExtensions, ...(capabilityCeiling ? { capabilityCeiling } : {}), ...(params.context ? { context: params.context } : {}), ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}), ...(params.turnBudget ? { turnBudget: params.turnBudget } : {}), ...(params.toolBudget ? { toolBudget: resolvedToolBudget.budget ?? params.toolBudget } : {}), ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}) } as Details,
1982
+ details: { mode: "single", runId: id, results: [], asyncId: id, asyncDir, launchContractDigest, launchResolvedExtensions, ...(capabilityCeiling ? { capabilityCeiling } : {}), ...(params.context ? { context: params.context } : {}), ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}), ...(params.toolBudget ? { toolBudget: resolvedToolBudget.budget ?? params.toolBudget } : {}), ...(initialUsageBudget ? { usageBudget: initialUsageBudget } : {}) } as Details,
1860
1983
  };
1861
1984
  }