@selesai/code 0.13.15 → 0.13.18

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 (473) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +2 -14
  3. package/dist/bun/cli.d.ts +3 -1
  4. package/dist/bun/cli.js +3 -9
  5. package/dist/bun/{register-bedrock.js → runtime-setup.js} +5 -0
  6. package/dist/bun/sandbox-env-setup.d.ts +1 -0
  7. package/dist/bun/sandbox-env-setup.js +3 -0
  8. package/dist/cli/auth-command.d.ts +23 -0
  9. package/dist/cli/auth-command.js +102 -0
  10. package/dist/cli/config-selector.js +2 -1
  11. package/dist/cli/setup.d.ts +1 -0
  12. package/dist/cli/setup.js +11 -0
  13. package/dist/cli.js +2 -14
  14. package/dist/config.d.ts +3 -2
  15. package/dist/config.js +9 -4
  16. package/dist/core/agent-session-runtime.js +15 -7
  17. package/dist/core/agent-session.d.ts +2 -6
  18. package/dist/core/agent-session.js +15 -4
  19. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  20. package/dist/core/compaction/branch-summarization.js +2 -1
  21. package/dist/core/extensions/loader.js +3 -0
  22. package/dist/core/extensions/types.d.ts +16 -2
  23. package/dist/core/http-dispatcher.js +2 -0
  24. package/dist/core/keybindings.d.ts +5 -0
  25. package/dist/core/keybindings.js +4 -0
  26. package/dist/core/messages.d.ts +1 -1
  27. package/dist/core/model-config.d.ts +15 -0
  28. package/dist/core/model-config.js +3 -0
  29. package/dist/core/model-runtime.d.ts +1 -0
  30. package/dist/core/model-runtime.js +5 -2
  31. package/dist/core/provider-composer.js +8 -2
  32. package/dist/core/session-export.d.ts +3 -0
  33. package/dist/core/session-export.js +31 -0
  34. package/dist/core/session-manager.d.ts +3 -2
  35. package/dist/core/session-manager.js +40 -13
  36. package/dist/core/skills.d.ts +1 -1
  37. package/dist/core/skills.js +4 -2
  38. package/dist/core/system-prompt.js +10 -10
  39. package/dist/core/tools/bash.js +3 -117
  40. package/dist/core/tools/edit.d.ts +1 -12
  41. package/dist/core/tools/edit.js +5 -163
  42. package/dist/core/tools/find.js +4 -55
  43. package/dist/core/tools/grep.js +4 -60
  44. package/dist/core/tools/ls.js +4 -49
  45. package/dist/core/tools/read.d.ts +4 -0
  46. package/dist/core/tools/read.js +10 -122
  47. package/dist/core/tools/renderers/bash.d.ts +11 -0
  48. package/dist/core/tools/renderers/bash.js +129 -0
  49. package/dist/core/tools/renderers/edit.d.ts +22 -0
  50. package/dist/core/tools/renderers/edit.js +166 -0
  51. package/dist/core/tools/renderers/find.d.ts +9 -0
  52. package/dist/core/tools/renderers/find.js +63 -0
  53. package/dist/core/tools/renderers/grep.d.ts +9 -0
  54. package/dist/core/tools/renderers/grep.js +68 -0
  55. package/dist/core/tools/renderers/index.d.ts +27 -0
  56. package/dist/core/tools/renderers/index.js +46 -0
  57. package/dist/core/tools/renderers/ls.d.ts +9 -0
  58. package/dist/core/tools/renderers/ls.js +57 -0
  59. package/dist/core/tools/renderers/read.d.ts +10 -0
  60. package/dist/core/tools/renderers/read.js +128 -0
  61. package/dist/core/tools/renderers/write.d.ts +9 -0
  62. package/dist/core/tools/renderers/write.js +152 -0
  63. package/dist/core/tools/write.js +5 -146
  64. package/dist/extensions/capability-gateway/index.ts +12 -1
  65. package/dist/extensions/capability-gateway/integration.test.ts +23 -0
  66. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
  67. package/dist/extensions/pi-hermes-memory/README.md +16 -12
  68. package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
  69. package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
  70. package/dist/extensions/pi-hermes-memory/package.json +4 -4
  71. package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
  72. package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
  73. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
  74. package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
  75. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
  76. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
  77. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
  78. package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
  79. package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
  80. package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
  81. package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
  82. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
  83. package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
  84. package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
  85. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
  86. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
  87. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
  88. package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
  89. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
  90. package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
  91. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
  92. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
  93. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
  94. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
  95. package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
  96. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
  97. package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
  98. package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
  99. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
  100. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
  101. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
  102. package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
  103. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  104. package/dist/extensions/pi-intercom/README.md +16 -2
  105. package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
  106. package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
  107. package/dist/extensions/pi-intercom/index.ts +1 -1
  108. package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
  109. package/dist/extensions/pi-intercom/package.json +1 -1
  110. package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
  111. package/dist/extensions/pi-intercom/project-agent.ts +1 -6
  112. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
  113. package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
  114. package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
  115. package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
  116. package/dist/extensions/pi-subagents/README.md +3 -3
  117. package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
  118. package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
  119. package/dist/extensions/pi-subagents/agents/scout.md +1 -1
  120. package/dist/extensions/pi-subagents/docs/agents.md +32 -16
  121. package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
  122. package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
  123. package/dist/extensions/pi-subagents/docs/missions.md +2 -0
  124. package/dist/extensions/pi-subagents/docs/models.md +58 -1
  125. package/dist/extensions/pi-subagents/docs/observability.md +50 -12
  126. package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
  127. package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
  128. package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
  129. package/dist/extensions/pi-subagents/package-lock.json +747 -177
  130. package/dist/extensions/pi-subagents/package.json +6 -4
  131. package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
  132. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
  133. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
  134. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
  135. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
  136. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
  137. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
  138. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
  139. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
  140. package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
  141. package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
  142. package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
  143. package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
  144. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
  145. package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
  146. package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
  147. package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
  148. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
  149. package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
  150. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
  151. package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
  152. package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
  153. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
  154. package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
  155. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
  156. package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
  157. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
  158. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
  159. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
  160. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
  161. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
  162. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
  163. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
  164. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
  165. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
  166. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
  167. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
  168. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
  169. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
  170. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
  171. package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
  172. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
  173. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
  174. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
  175. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
  176. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
  177. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
  178. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
  179. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
  180. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
  181. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
  182. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
  183. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
  184. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
  185. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
  186. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
  187. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
  188. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
  189. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
  190. package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
  191. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
  192. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
  193. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
  194. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
  195. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
  196. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
  197. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
  198. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
  199. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
  200. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
  201. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
  202. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
  203. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
  204. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
  205. package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
  206. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
  207. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
  208. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
  209. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
  210. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
  211. package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
  212. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
  213. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
  214. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
  215. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
  216. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
  217. package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
  218. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
  219. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
  220. package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
  221. package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
  222. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
  223. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
  224. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
  225. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
  226. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
  227. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
  228. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
  229. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
  230. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
  231. package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
  232. package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
  233. package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
  234. package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
  235. package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
  236. package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
  237. package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
  238. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
  239. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
  240. package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
  241. package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
  242. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
  243. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
  244. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  245. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
  246. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
  247. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
  248. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
  249. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
  250. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
  251. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
  252. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
  253. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
  254. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
  255. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
  256. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
  257. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
  258. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
  259. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
  260. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
  261. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
  262. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
  263. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
  264. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
  265. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
  266. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
  267. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
  268. package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
  269. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
  270. package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
  271. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
  272. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
  273. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
  274. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
  275. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
  276. package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
  277. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
  278. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
  279. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
  280. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
  281. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
  282. package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
  283. package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
  284. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
  285. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
  286. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
  287. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
  288. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
  289. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
  290. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
  291. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
  292. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
  293. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
  294. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
  295. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
  296. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
  297. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
  298. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
  299. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
  300. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
  301. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
  302. package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
  303. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
  304. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
  305. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
  306. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
  307. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
  308. package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
  309. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
  310. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
  311. package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
  312. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
  313. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
  314. package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
  315. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
  316. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
  317. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
  318. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
  319. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
  320. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
  321. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
  322. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
  323. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
  324. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
  325. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
  326. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
  327. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
  328. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
  329. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
  330. package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
  331. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
  332. package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
  333. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
  334. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
  335. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
  336. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
  337. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
  338. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
  339. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
  340. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
  341. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
  342. package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
  343. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
  344. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
  345. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
  346. package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
  347. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
  348. package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
  349. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
  350. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
  351. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
  352. package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
  353. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
  354. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
  355. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
  356. package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
  357. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
  358. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
  359. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
  360. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
  361. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
  362. package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
  363. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
  364. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
  365. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
  366. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
  367. package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
  368. package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
  369. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
  370. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
  371. package/dist/extensions/pi-web-agent/src/backends/config.ts +1 -0
  372. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +5 -3
  373. package/dist/extensions/pi-web-agent/src/search/tokenin.ts +7 -3
  374. package/dist/extensions/pi-web-agent/src/types.ts +1 -1
  375. package/dist/extensions/pi-zentui/README.md +17 -0
  376. package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
  377. package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
  378. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
  379. package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
  380. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
  381. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
  382. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
  383. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
  384. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
  385. package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
  386. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
  387. package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
  388. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
  389. package/dist/extensions/pi-zentui/package-lock.json +277 -517
  390. package/dist/extensions/pi-zentui/package.json +7 -4
  391. package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
  392. package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
  393. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
  394. package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
  395. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
  396. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  397. package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
  398. package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
  399. package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
  400. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
  401. package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
  402. package/dist/index.d.ts +1 -1
  403. package/dist/main.js +4 -1
  404. package/dist/modes/interactive/chat-viewport.d.ts +19 -0
  405. package/dist/modes/interactive/chat-viewport.js +27 -0
  406. package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
  407. package/dist/modes/interactive/components/assistant-message.js +30 -13
  408. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  409. package/dist/modes/interactive/components/custom-editor.js +39 -1
  410. package/dist/modes/interactive/components/first-time-setup.js +1 -1
  411. package/dist/modes/interactive/components/index.d.ts +1 -1
  412. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
  413. package/dist/modes/interactive/components/markdown-transform.js +18 -0
  414. package/dist/modes/interactive/components/model-selector.js +19 -17
  415. package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
  416. package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
  417. package/dist/modes/interactive/components/settings-selector.js +128 -20
  418. package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
  419. package/dist/modes/interactive/components/settings-submenu.js +164 -0
  420. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  421. package/dist/modes/interactive/components/status-indicator.js +10 -3
  422. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  423. package/dist/modes/interactive/components/thinking-selector.js +75 -18
  424. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  425. package/dist/modes/interactive/components/tool-execution.js +35 -33
  426. package/dist/modes/interactive/components/trust-selector.js +2 -2
  427. package/dist/modes/interactive/interactive-mode.d.ts +13 -15
  428. package/dist/modes/interactive/interactive-mode.js +144 -80
  429. package/dist/modes/interactive/session-share.d.ts +15 -0
  430. package/dist/modes/interactive/session-share.js +183 -0
  431. package/dist/modes/interactive/theme/dark.json +2 -1
  432. package/dist/modes/interactive/theme/light.json +2 -1
  433. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  434. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  435. package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
  436. package/dist/modes/interactive/theme/theme-json.js +129 -0
  437. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  438. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  439. package/dist/modes/interactive/theme/theme.js +18 -119
  440. package/dist/modes/interactive/tui-renderer.d.ts +20 -0
  441. package/dist/modes/interactive/tui-renderer.js +65 -0
  442. package/dist/utils/exif-orientation.js +2 -3
  443. package/dist/utils/management-http.d.ts +24 -0
  444. package/dist/utils/management-http.js +53 -0
  445. package/dist/utils/text.d.ts +7 -0
  446. package/dist/utils/text.js +8 -0
  447. package/dist/utils/tools-manager.d.ts +1 -0
  448. package/dist/utils/tools-manager.js +43 -21
  449. package/docs/docs.json +0 -4
  450. package/package.json +4 -4
  451. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
  452. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
  453. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
  454. package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  455. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
  456. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
  457. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
  458. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
  459. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
  460. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
  461. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
  462. package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
  463. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
  464. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
  465. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
  466. package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
  467. package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
  468. package/dist/skills/implanger/SKILL.md +0 -70
  469. package/dist/skills/output/SKILL.md +0 -49
  470. package/dist/skills/planger/SKILL.md +0 -167
  471. package/dist/skills/workflow/SKILL.md +0 -95
  472. package/docs/workflows.md +0 -18
  473. /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
@@ -1,447 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
-
4
- const queueDir = process.env.MOCK_PI_QUEUE_DIR;
5
-
6
- function exitAfterFlush(code) {
7
- // process.exit() can truncate buffered stdout/stderr on slow runners (e.g.
8
- // GitHub Actions), dropping the final lines the parent executor needs to see
9
- // the run as successful. Drain the writable streams first, then exit.
10
- // A hard timeout (ref'd, not unref'd) guards against stream.end() callbacks
11
- // that never fire on some platforms (notably Windows pipe-backed stdout).
12
- const streams = [process.stdout, process.stderr].filter((s) => !s.destroyed && !s.writableEnded);
13
- if (streams.length === 0) {
14
- process.exit(code);
15
- return;
16
- }
17
- let exited = false;
18
- const forceExit = () => {
19
- if (exited) return;
20
- exited = true;
21
- process.exit(code);
22
- };
23
- let pending = streams.length;
24
- for (const stream of streams) {
25
- stream.end(() => {
26
- if (--pending === 0) forceExit();
27
- });
28
- }
29
- setTimeout(forceExit, 500);
30
- }
31
-
32
- function fail(message, exitCode = 1) {
33
- process.stderr.write(`${message}\n`);
34
- exitAfterFlush(exitCode);
35
- }
36
-
37
- function listPendingFiles(dir) {
38
- return fs.readdirSync(dir)
39
- .filter((name) => name.startsWith("pending-") && name.endsWith(".json"))
40
- .sort();
41
- }
42
-
43
- function readPendingResponse(filePath) {
44
- try {
45
- return JSON.parse(fs.readFileSync(filePath, "utf-8"));
46
- } catch (error) {
47
- if (error && typeof error === "object" && "code" in error) {
48
- const code = error.code;
49
- if (code === "ENOENT") return undefined;
50
- }
51
- throw error;
52
- }
53
- }
54
-
55
- function hasArgMatcher(response) {
56
- return Object.prototype.hasOwnProperty.call(response ?? {}, "matchArgIncludes");
57
- }
58
-
59
- function resolveTaskFileArg(arg) {
60
- if (typeof arg !== "string" || !arg.startsWith("@") || !arg.endsWith("task.md")) return arg;
61
- try {
62
- return fs.readFileSync(arg.slice(1), "utf-8");
63
- } catch {
64
- return arg;
65
- }
66
- }
67
-
68
- function resolveTaskFileArgs(args) {
69
- return args.map(resolveTaskFileArg);
70
- }
71
-
72
- function responseMatchesArgs(response, args) {
73
- const matcher = response?.matchArgIncludes;
74
- if (matcher === undefined) return true;
75
- const needles = Array.isArray(matcher) ? matcher : [matcher];
76
- if (needles.length === 0) return true;
77
- const effectiveArgs = resolveTaskFileArgs(args);
78
- const haystack = `${args.join("\n")}\n${effectiveArgs.join("\n")}`;
79
- return needles.every((needle) => typeof needle === "string" && haystack.includes(needle));
80
- }
81
-
82
- function claimResponseFile(dir, fileName) {
83
- const sourcePath = path.join(dir, fileName);
84
- const targetPath = path.join(dir, fileName.replace(/^pending-/, "consumed-"));
85
- try {
86
- fs.renameSync(sourcePath, targetPath);
87
- return JSON.parse(fs.readFileSync(targetPath, "utf-8"));
88
- } catch (error) {
89
- if (error && typeof error === "object" && "code" in error) {
90
- const code = error.code;
91
- if (code === "ENOENT" || code === "EEXIST" || code === "EPERM") return undefined;
92
- }
93
- throw error;
94
- }
95
- }
96
-
97
- function claimNextResponse(dir, args) {
98
- for (const fileName of listPendingFiles(dir)) {
99
- const sourcePath = path.join(dir, fileName);
100
- const response = readPendingResponse(sourcePath);
101
- if (!response || !hasArgMatcher(response) || !responseMatchesArgs(response, args)) continue;
102
- const claimed = claimResponseFile(dir, fileName);
103
- if (claimed) return claimed;
104
- }
105
-
106
- for (const fileName of listPendingFiles(dir)) {
107
- const sourcePath = path.join(dir, fileName);
108
- const response = readPendingResponse(sourcePath);
109
- if (!response || hasArgMatcher(response)) continue;
110
- const claimed = claimResponseFile(dir, fileName);
111
- if (claimed) return claimed;
112
- }
113
-
114
- const defaultPath = path.join(dir, "default-response.json");
115
- if (!fs.existsSync(defaultPath)) return undefined;
116
- const fallback = JSON.parse(fs.readFileSync(defaultPath, "utf-8"));
117
- return responseMatchesArgs(fallback, args) ? fallback : undefined;
118
- }
119
-
120
- function requestedModelArg(args) {
121
- for (let i = 0; i < args.length; i++) {
122
- if (args[i] === "--model" && typeof args[i + 1] === "string") return args[i + 1];
123
- }
124
- return "mock/test-model";
125
- }
126
-
127
- function defaultAssistantMessage(output, args) {
128
- return {
129
- type: "message_end",
130
- message: {
131
- role: "assistant",
132
- content: [{ type: "text", text: output }],
133
- model: requestedModelArg(args),
134
- stopReason: "stop",
135
- usage: {
136
- input: 100,
137
- output: 50,
138
- cacheRead: 0,
139
- cacheWrite: 0,
140
- cost: { total: 0.001 },
141
- },
142
- },
143
- };
144
- }
145
-
146
- function taskRequestsAcceptance(args) {
147
- for (const arg of args) {
148
- if (typeof arg !== "string") continue;
149
- if (arg.includes("## Acceptance Contract")) return true;
150
- if (!arg.startsWith("@")) continue;
151
- try {
152
- if (fs.readFileSync(arg.slice(1), "utf-8").includes("## Acceptance Contract")) return true;
153
- } catch {
154
- // Ignore unreadable temp prompt references in the mock harness.
155
- }
156
- }
157
- return false;
158
- }
159
-
160
- function defaultAcceptanceReport() {
161
- return [
162
- "```acceptance-report",
163
- JSON.stringify({
164
- criteriaSatisfied: [
165
- { id: "criterion-1", status: "satisfied", evidence: "mock acceptance evidence" },
166
- { id: "criterion-2", status: "satisfied", evidence: "mock acceptance evidence" },
167
- ],
168
- changedFiles: ["mock-file.ts"],
169
- testsAddedOrUpdated: ["mock-file.test.ts"],
170
- commandsRun: [{ command: "mock validation", result: "passed", summary: "passed" }],
171
- validationOutput: ["mock validation passed"],
172
- residualRisks: [],
173
- noStagedFiles: true,
174
- reviewFindings: [],
175
- manualNotes: "mock run completed",
176
- notes: "mock run completed",
177
- }),
178
- "```",
179
- ].join("\n");
180
- }
181
-
182
- function withAcceptanceReport(output, args) {
183
- if (!taskRequestsAcceptance(args) || output.includes("```acceptance-report")) return output;
184
- return `${output}\n${defaultAcceptanceReport()}`;
185
- }
186
-
187
- function defaultResponse() {
188
- return { output: "ok", exitCode: 0 };
189
- }
190
-
191
- function writeDeclaredFiles(response) {
192
- if (!Array.isArray(response.writeFiles)) return;
193
- for (const file of response.writeFiles) {
194
- if (!file || typeof file.path !== "string" || typeof file.content !== "string") continue;
195
- const target = path.resolve(process.cwd(), file.path);
196
- fs.mkdirSync(path.dirname(target), { recursive: true });
197
- fs.writeFileSync(target, file.content, "utf-8");
198
- }
199
- }
200
-
201
- function writeStructuredOutputCapture(response) {
202
- if (!Object.prototype.hasOwnProperty.call(response, "structuredOutputCapture")) return;
203
- const outputPath = process.env.SELESAI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE;
204
- if (!outputPath) return;
205
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
206
- fs.writeFileSync(outputPath, JSON.stringify(response.structuredOutputCapture), "utf-8");
207
- if (Object.prototype.hasOwnProperty.call(response, "structuredOutputAcceptanceReport")) {
208
- const acceptancePath = process.env.SELESAI_SUBAGENT_STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE;
209
- if (acceptancePath) fs.writeFileSync(acceptancePath, JSON.stringify(response.structuredOutputAcceptanceReport), "utf-8");
210
- }
211
- if (Object.prototype.hasOwnProperty.call(response, "structuredOutputAcceptanceReportRaw")) {
212
- const acceptancePath = process.env.SELESAI_SUBAGENT_STRUCTURED_OUTPUT_ACCEPTANCE_CAPTURE;
213
- if (acceptancePath) fs.writeFileSync(acceptancePath, response.structuredOutputAcceptanceReportRaw, "utf-8");
214
- }
215
- }
216
-
217
- function writeRuntimeAcknowledgedExtensions(response) {
218
- if (!Object.prototype.hasOwnProperty.call(response, "runtimeAcknowledgedExtensions")) return;
219
- const outputPath = process.env.SELESAI_SUBAGENT_RUNTIME_ACKNOWLEDGED_EXTENSIONS;
220
- if (!outputPath) return;
221
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
222
- fs.writeFileSync(outputPath, JSON.stringify(response.runtimeAcknowledgedExtensions), "utf-8");
223
- }
224
-
225
- function writeToolDiagnostic(response) {
226
- if (!Array.isArray(response.missingTools) || response.missingTools.length === 0) return;
227
- const diagnosticPath = process.env.SELESAI_SUBAGENT_TOOL_DIAGNOSTIC_PATH;
228
- const required = JSON.parse(process.env.SELESAI_SUBAGENT_REQUIRED_TOOLS ?? "[]");
229
- if (!diagnosticPath || !Array.isArray(required)) return;
230
- const missing = response.missingTools.filter((name) => typeof name === "string" && required.includes(name));
231
- const available = required.filter((name) => !missing.includes(name));
232
- fs.mkdirSync(path.dirname(diagnosticPath), { recursive: true });
233
- fs.writeFileSync(diagnosticPath, JSON.stringify({
234
- agent: process.env.SELESAI_SUBAGENT_CHILD_AGENT,
235
- required,
236
- available,
237
- missing,
238
- }), "utf-8");
239
- }
240
-
241
- function readRequiredToolsEnv() {
242
- try {
243
- const encoded = process.env.SELESAI_SUBAGENT_REQUIRED_TOOLS;
244
- const parsed = encoded === undefined ? [] : JSON.parse(encoded);
245
- return Array.isArray(parsed) ? parsed : undefined;
246
- } catch {
247
- return undefined;
248
- }
249
- }
250
-
251
- function isJsonMode(args) {
252
- for (let i = 0; i < args.length; i++) {
253
- if (args[i] === "--mode") {
254
- return args[i + 1] === "json";
255
- }
256
- }
257
- return false;
258
- }
259
-
260
- function writeSessionFile(args) {
261
- for (let i = 0; i < args.length; i++) {
262
- if (args[i] !== "--session") continue;
263
- const sessionFile = args[i + 1];
264
- if (!sessionFile) return;
265
- fs.mkdirSync(path.dirname(sessionFile), { recursive: true });
266
- fs.writeFileSync(sessionFile, "", { flag: "a" });
267
- return;
268
- }
269
- }
270
-
271
- function readSystemPromptRecords(args) {
272
- const records = [];
273
- for (let i = 0; i < args.length; i++) {
274
- if (args[i] !== "--system-prompt" && args[i] !== "--append-system-prompt") continue;
275
- const promptPath = args[i + 1];
276
- if (!promptPath) continue;
277
- try {
278
- records.push({
279
- mode: args[i],
280
- path: promptPath,
281
- text: fs.readFileSync(promptPath, "utf-8"),
282
- });
283
- } catch (error) {
284
- records.push({
285
- mode: args[i],
286
- path: promptPath,
287
- error: error instanceof Error ? error.message : String(error),
288
- });
289
- }
290
- }
291
- return records;
292
- }
293
-
294
- async function writeStdout(text) {
295
- if (process.stdout.write(text)) return;
296
- await new Promise((resolve) => process.stdout.once("drain", resolve));
297
- }
298
-
299
- async function writeJsonlLine(entry) {
300
- const line = typeof entry === "string" ? entry : JSON.stringify(entry);
301
- await writeStdout(`${line}\n`);
302
- }
303
-
304
- async function writeRawStdout(entry) {
305
- if (Array.isArray(entry?.stdoutBase64Chunks)) {
306
- for (const chunk of entry.stdoutBase64Chunks) {
307
- if (typeof chunk === "string") await writeStdout(Buffer.from(chunk, "base64"));
308
- }
309
- }
310
- if (typeof entry?.stdoutRaw === "string") await writeStdout(entry.stdoutRaw);
311
- }
312
-
313
- function extractPlainText(entry) {
314
- if (!entry || typeof entry !== "object") return "";
315
- if (entry.type === "message_end") {
316
- const text = entry.message?.content?.find?.((part) => part?.type === "text")?.text;
317
- return typeof text === "string" ? text : "";
318
- }
319
- if (entry.type === "tool_result_end") {
320
- const text = entry.message?.content?.find?.((part) => part?.type === "text")?.text;
321
- return typeof text === "string" ? text : "";
322
- }
323
- return "";
324
- }
325
-
326
- async function writeResponseEntries(entries, jsonMode, args) {
327
- let sawProviderError = false;
328
- for (const entry of entries) {
329
- if (entry?.type === "message_end") {
330
- const textPart = entry.message?.content?.find?.((part) => part?.type === "text");
331
- const isProviderError = Boolean(entry.message?.errorMessage || entry.message?.stopReason === "error");
332
- if (isProviderError) sawProviderError = true;
333
- if (!isProviderError && textPart && typeof textPart.text === "string" && (!sawProviderError || textPart.text.trim())) {
334
- textPart.text = withAcceptanceReport(textPart.text, args);
335
- }
336
- }
337
- if (jsonMode) {
338
- await writeJsonlLine(entry);
339
- continue;
340
- }
341
- const text = extractPlainText(entry);
342
- if (text) await writeStdout(`${text}\n`);
343
- }
344
- }
345
-
346
- async function maybeWriteStructuredOutput(response, jsonMode) {
347
- if (!Object.prototype.hasOwnProperty.call(response, "structuredOutput")) return;
348
- const outputPath = process.env.SELESAI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE;
349
- if (!outputPath) return;
350
- fs.mkdirSync(path.dirname(outputPath), { recursive: true });
351
- fs.writeFileSync(outputPath, JSON.stringify(response.structuredOutput), "utf-8");
352
- if (!jsonMode) return;
353
- await writeJsonlLine({ type: "tool_execution_start", toolName: "structured_output", args: { value: response.structuredOutput } });
354
- await writeJsonlLine({
355
- type: "tool_result_end",
356
- message: {
357
- role: "toolResult",
358
- toolName: "structured_output",
359
- content: [{ type: "text", text: "Structured output captured." }],
360
- },
361
- });
362
- await writeJsonlLine({ type: "tool_execution_end", toolName: "structured_output" });
363
- }
364
-
365
- async function main() {
366
- if (!queueDir) fail("MOCK_PI_QUEUE_DIR is required.");
367
- if (!fs.existsSync(queueDir)) fail(`Mock queue dir does not exist: ${queueDir}`);
368
-
369
- const args = process.argv.slice(2);
370
- const jsonMode = isJsonMode(args);
371
- const response = claimNextResponse(queueDir, args) ?? defaultResponse();
372
- if (response.ignoreSigterm === true) {
373
- process.on("SIGTERM", () => {});
374
- }
375
- writeSessionFile(args);
376
- writeToolDiagnostic(response);
377
- const effectiveArgs = resolveTaskFileArgs(args);
378
- const callPath = path.join(queueDir, `call-${Date.now()}-${process.pid}-${Math.random().toString(16).slice(2)}.json`);
379
- const callTempPath = `${callPath}.tmp-${process.pid}-${Date.now()}`;
380
- fs.writeFileSync(callTempPath, JSON.stringify({ args, effectiveArgs, cwd: process.cwd(), systemPrompts: readSystemPromptRecords(args), requiredChildTools: readRequiredToolsEnv() }), "utf-8");
381
- fs.renameSync(callTempPath, callPath);
382
-
383
- if (typeof response.delay === "number" && response.delay > 0) {
384
- await new Promise((resolve) => setTimeout(resolve, response.delay));
385
- }
386
- async function waitForReleasePath(waitForPath) {
387
- if (typeof waitForPath !== "string") return;
388
- const deadline = Date.now() + 30_000;
389
- while (!fs.existsSync(waitForPath)) {
390
- if (Date.now() >= deadline) fail(`Timed out waiting for mock release path: ${waitForPath}`);
391
- await new Promise((resolve) => setTimeout(resolve, 20));
392
- }
393
- }
394
- await waitForReleasePath(response.waitForPath);
395
-
396
- writeDeclaredFiles(response);
397
- writeStructuredOutputCapture(response);
398
- writeRuntimeAcknowledgedExtensions(response);
399
-
400
- if (Array.isArray(response.steps) && response.steps.length > 0) {
401
- for (const step of response.steps) {
402
- if (typeof step?.delay === "number" && step.delay > 0) {
403
- await new Promise((resolve) => setTimeout(resolve, step.delay));
404
- }
405
- await waitForReleasePath(step?.waitForPath);
406
- if (Array.isArray(step?.jsonl) && step.jsonl.length > 0) {
407
- await writeResponseEntries(step.jsonl, jsonMode, args);
408
- }
409
- await writeRawStdout(step);
410
- if (typeof step?.stderr === "string" && step.stderr.length > 0) {
411
- process.stderr.write(step.stderr);
412
- }
413
- }
414
- } else if (Array.isArray(response.jsonl) && response.jsonl.length > 0) {
415
- await writeResponseEntries(response.jsonl, jsonMode, args);
416
- } else if (Array.isArray(response.stdoutBase64Chunks) || typeof response.stdoutRaw === "string") {
417
- await writeRawStdout(response);
418
- } else if (Array.isArray(response.echoEnv) && response.echoEnv.length > 0) {
419
- const envSnapshot = Object.fromEntries(response.echoEnv.map((key) => [key, process.env[key] ?? null]));
420
- const output = withAcceptanceReport(JSON.stringify(envSnapshot), args);
421
- if (jsonMode) await writeJsonlLine(defaultAssistantMessage(output, args));
422
- else await writeStdout(`${output}\n`);
423
- } else if (typeof response.output === "string") {
424
- const output = withAcceptanceReport(response.output, args);
425
- if (jsonMode) await writeJsonlLine(defaultAssistantMessage(output, args));
426
- else await writeStdout(`${output}\n`);
427
- }
428
- await maybeWriteStructuredOutput(response, jsonMode);
429
-
430
- if (typeof response.stderr === "string" && response.stderr.length > 0) {
431
- process.stderr.write(response.stderr);
432
- }
433
-
434
- if (typeof response.keepAliveAfterFinalMessageMs === "number" && response.keepAliveAfterFinalMessageMs > 0) {
435
- await new Promise((resolve) => setTimeout(resolve, response.keepAliveAfterFinalMessageMs));
436
- }
437
-
438
- if (typeof response.signal === "string") {
439
- process.kill(process.pid, response.signal);
440
- return;
441
- }
442
- exitAfterFlush(typeof response.exitCode === "number" ? response.exitCode : 0);
443
- }
444
-
445
- main().catch((error) => {
446
- fail(error instanceof Error ? error.message : String(error));
447
- });
@@ -1,185 +0,0 @@
1
- #!/usr/bin/env node
2
- import { mkdtempSync, rmSync } from "node:fs";
3
- import * as fs from "node:fs";
4
- import * as os from "node:os";
5
- import * as path from "node:path";
6
- import { fauxAssistantMessage, fauxProvider, fauxText, fauxToolCall } from "@earendil-works/pi-ai/providers/faux";
7
- import {
8
- createAgentSession,
9
- DefaultResourceLoader,
10
- ModelRuntime,
11
- SessionManager,
12
- SettingsManager,
13
- } from "@selesai/code";
14
-
15
- function readText(filePath) {
16
- return fs.readFileSync(filePath, "utf-8");
17
- }
18
-
19
- function parseArgs(argv) {
20
- const parsed = {
21
- mode: "text",
22
- extensions: [],
23
- appendSystemPrompts: [],
24
- noSession: false,
25
- noSkills: false,
26
- };
27
-
28
- for (let i = 0; i < argv.length; i++) {
29
- const arg = argv[i];
30
- if (arg === "--mode") {
31
- parsed.mode = argv[++i] ?? "text";
32
- continue;
33
- }
34
- if (arg === "-p" || arg === "--print") continue;
35
- if (arg === "--no-session") {
36
- parsed.noSession = true;
37
- continue;
38
- }
39
- if (arg === "--session") {
40
- parsed.sessionFile = argv[++i];
41
- continue;
42
- }
43
- if (arg === "--session-dir") {
44
- parsed.sessionDir = argv[++i];
45
- continue;
46
- }
47
- if (arg === "--model") {
48
- parsed.model = argv[++i];
49
- continue;
50
- }
51
- if (arg === "--tools") {
52
- parsed.tools = (argv[++i] ?? "").split(",").map((tool) => tool.trim()).filter(Boolean);
53
- continue;
54
- }
55
- if (arg === "--extension") {
56
- const extensionPath = argv[++i];
57
- if (extensionPath) parsed.extensions.push(extensionPath);
58
- continue;
59
- }
60
- if (arg === "--no-extensions") continue;
61
- if (arg === "--no-skills") {
62
- parsed.noSkills = true;
63
- continue;
64
- }
65
- if (arg === "--system-prompt") {
66
- const promptPath = argv[++i];
67
- if (promptPath) parsed.systemPrompt = readText(promptPath);
68
- continue;
69
- }
70
- if (arg === "--append-system-prompt") {
71
- const promptPath = argv[++i];
72
- if (promptPath) parsed.appendSystemPrompts.push(readText(promptPath));
73
- continue;
74
- }
75
- if (arg?.startsWith("--")) continue;
76
- parsed.prompt = arg;
77
- }
78
-
79
- if (parsed.prompt?.startsWith("@")) {
80
- parsed.prompt = readText(parsed.prompt.slice(1));
81
- }
82
- return parsed;
83
- }
84
-
85
- function createSessionManager(parsed, cwd) {
86
- if (parsed.sessionFile) {
87
- const sessionDir = parsed.sessionDir ?? path.dirname(parsed.sessionFile);
88
- const manager = SessionManager.create(cwd, sessionDir);
89
- manager.setSessionFile(parsed.sessionFile);
90
- return manager;
91
- }
92
- if (parsed.noSession) return SessionManager.inMemory(cwd);
93
- return SessionManager.create(cwd, parsed.sessionDir);
94
- }
95
-
96
- async function main() {
97
- const parsed = parseArgs(process.argv.slice(2));
98
- const responseText = process.env.SELESAI_SUBAGENTS_E2E_CHILD_TEXT ?? "CHILD_REAL_SESSION_OK";
99
- const reportChildTools = process.env.SELESAI_SUBAGENTS_E2E_REPORT_CHILD_TOOLS === "1";
100
- const cwd = process.cwd();
101
- const ownedAgentDir = process.env.SELESAI_CODING_AGENT_DIR
102
- ? undefined
103
- : mkdtempSync(path.join(os.tmpdir(), "pi-e2e-agent-dir-"));
104
- const agentDir = process.env.SELESAI_CODING_AGENT_DIR ?? ownedAgentDir;
105
-
106
- const faux = fauxProvider({
107
- provider: "faux-e2e-child",
108
- models: [{ id: "child", contextWindow: 200_000 }],
109
- });
110
- const modelRuntime = await ModelRuntime.create({
111
- authPath: path.join(agentDir, "auth.json"),
112
- modelsPath: null,
113
- allowModelNetwork: false,
114
- });
115
- modelRuntime.registerProvider(faux.provider.id, {
116
- name: faux.provider.name,
117
- api: faux.api,
118
- apiKey: "faux",
119
- streamSimple: faux.provider.streamSimple,
120
- models: [...faux.models],
121
- });
122
- const model = modelRuntime.getModel(faux.provider.id, "child");
123
- if (!model) throw new Error("faux child model was not registered");
124
- let session;
125
- faux.setResponses([
126
- () => process.env.SELESAI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE
127
- ? fauxAssistantMessage(fauxToolCall("structured_output", { value: { marker: "STRUCTURED_OUTPUT_OK" } }), { stopReason: "toolUse" })
128
- : fauxAssistantMessage(fauxText(reportChildTools ? `ACTIVE_TOOLS:${session?.getActiveToolNames().sort().join(",") ?? ""}` : responseText), { stopReason: "stop" }),
129
- ]);
130
-
131
- const settingsManager = SettingsManager.inMemory({
132
- compaction: { enabled: false },
133
- retry: { enabled: false },
134
- });
135
- const loader = new DefaultResourceLoader({
136
- cwd,
137
- agentDir,
138
- settingsManager,
139
- additionalExtensionPaths: parsed.extensions,
140
- noSkills: parsed.noSkills,
141
- noPromptTemplates: true,
142
- noThemes: true,
143
- noContextFiles: true,
144
- systemPrompt: parsed.systemPrompt,
145
- appendSystemPrompt: parsed.appendSystemPrompts,
146
- });
147
-
148
- try {
149
- await loader.reload();
150
- const created = await createAgentSession({
151
- cwd,
152
- agentDir,
153
- model,
154
- modelRuntime,
155
- resourceLoader: loader,
156
- sessionManager: createSessionManager(parsed, cwd),
157
- settingsManager,
158
- tools: parsed.tools,
159
- });
160
- session = created.session;
161
-
162
- session.subscribe((event) => {
163
- if (
164
- event.type === "message_end"
165
- || event.type === "tool_execution_start"
166
- || event.type === "tool_execution_end"
167
- || event.type === "tool_result_end"
168
- ) {
169
- process.stdout.write(`${JSON.stringify(event)}\n`);
170
- }
171
- });
172
-
173
- await session.bindExtensions({});
174
- await session.prompt(parsed.prompt ?? "", { expandPromptTemplates: false });
175
- await session.extensionRunner.emit({ type: "session_shutdown", reason: "quit" });
176
- session.dispose();
177
- } finally {
178
- if (ownedAgentDir) rmSync(ownedAgentDir, { recursive: true, force: true });
179
- }
180
- }
181
-
182
- main().catch((error) => {
183
- process.stderr.write(`${error instanceof Error ? error.stack || error.message : String(error)}\n`);
184
- process.exit(1);
185
- });