@selesai/code 0.5.19 → 0.5.21

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 (265) hide show
  1. package/dist/extensions/handoff-new.test.ts +8 -9
  2. package/dist/extensions/handoff-new.ts +6 -8
  3. package/dist/extensions/pi-intercom/broker/spawn.test.ts +31 -0
  4. package/dist/extensions/pi-intercom/broker/spawn.ts +5 -3
  5. package/dist/extensions/pi-subagents/CHANGELOG.md +1367 -0
  6. package/dist/extensions/pi-subagents/README.md +602 -220
  7. package/dist/extensions/pi-subagents/banner.png +0 -0
  8. package/dist/extensions/pi-subagents/index.ts +1 -0
  9. package/dist/extensions/pi-subagents/install.mjs +3 -3
  10. package/dist/extensions/pi-subagents/package-lock.json +3405 -0
  11. package/dist/extensions/pi-subagents/package.json +26 -14
  12. package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
  13. package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
  14. package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +3 -3
  15. package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +7 -7
  16. package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
  17. package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
  18. package/dist/extensions/pi-subagents/prompts/review-loop.md +13 -11
  19. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +267 -176
  20. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +89 -16
  21. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +19 -0
  22. package/dist/extensions/pi-subagents/src/agents/agents.ts +218 -120
  23. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +67 -13
  24. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
  25. package/dist/extensions/pi-subagents/src/agents/skills.ts +25 -12
  26. package/dist/extensions/pi-subagents/src/api/background-work.ts +197 -0
  27. package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +17 -0
  28. package/dist/extensions/pi-subagents/src/api/delegation.ts +285 -0
  29. package/dist/extensions/pi-subagents/src/api/preflight.ts +399 -0
  30. package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +165 -0
  31. package/dist/extensions/pi-subagents/src/extension/config.ts +7 -1
  32. package/dist/extensions/pi-subagents/src/extension/doctor.ts +15 -0
  33. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +3 -1
  34. package/dist/extensions/pi-subagents/src/extension/index.ts +113 -157
  35. package/dist/extensions/pi-subagents/src/extension/rpc.ts +41 -4
  36. package/dist/extensions/pi-subagents/src/extension/schemas.ts +45 -15
  37. package/dist/extensions/pi-subagents/src/extension/steering-notices.ts +35 -0
  38. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -15
  39. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +4 -3
  40. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +225 -29
  41. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +11 -0
  42. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -10
  43. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +452 -62
  44. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +60 -9
  45. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +198 -52
  46. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +119 -21
  47. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +67 -0
  48. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -0
  49. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +16 -8
  50. package/dist/extensions/pi-subagents/src/runs/background/completion-batcher.ts +6 -4
  51. package/dist/extensions/pi-subagents/src/runs/background/completion-dedupe.ts +2 -11
  52. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +260 -13
  53. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +32 -6
  54. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +171 -90
  55. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +280 -0
  56. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +149 -88
  57. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +14 -2
  58. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +33 -17
  59. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +9 -1
  60. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +38 -10
  61. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +237 -0
  62. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +1297 -307
  63. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +610 -0
  64. package/dist/extensions/pi-subagents/src/runs/background/top-level-async.ts +2 -1
  65. package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +36 -0
  66. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +26 -0
  67. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +230 -0
  68. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +22 -6
  69. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +228 -140
  70. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +452 -138
  71. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +90 -0
  72. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1001 -416
  73. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +443 -132
  74. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +38 -0
  75. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +178 -0
  76. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +121 -0
  77. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +41 -93
  78. package/dist/extensions/pi-subagents/src/runs/shared/context-mode.ts +44 -0
  79. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +11 -9
  80. package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +4 -0
  81. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +12 -6
  82. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +36 -0
  83. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +44 -7
  84. package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +4 -1
  85. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +154 -0
  86. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +18 -0
  87. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +174 -54
  88. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +38 -31
  89. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +90 -5
  90. package/dist/extensions/pi-subagents/src/runs/shared/session-lease.ts +299 -0
  91. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +61 -6
  92. package/dist/extensions/pi-subagents/src/runs/shared/spawn-budget.ts +128 -0
  93. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +112 -7
  94. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +14 -6
  95. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +149 -36
  96. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +181 -0
  97. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +83 -0
  98. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +11 -5
  99. package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +50 -4
  100. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +63 -14
  101. package/dist/extensions/pi-subagents/src/shared/accessible-dir.ts +25 -0
  102. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +37 -7
  103. package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +18 -43
  104. package/dist/extensions/pi-subagents/src/shared/child-transcript.ts +52 -0
  105. package/dist/extensions/pi-subagents/src/shared/env.ts +16 -0
  106. package/dist/extensions/pi-subagents/src/shared/file-system-retry.ts +47 -0
  107. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +28 -3
  108. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +123 -0
  109. package/dist/extensions/pi-subagents/src/shared/model-info.ts +8 -5
  110. package/dist/extensions/pi-subagents/src/shared/settings.ts +9 -1
  111. package/dist/extensions/pi-subagents/src/shared/status-format.ts +7 -1
  112. package/dist/extensions/pi-subagents/src/shared/types.ts +522 -51
  113. package/dist/extensions/pi-subagents/src/shared/utils.ts +59 -53
  114. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +604 -0
  115. package/dist/extensions/pi-subagents/src/slash/delegation-json.ts +108 -0
  116. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +249 -0
  117. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +353 -345
  118. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +2 -2
  119. package/dist/extensions/pi-subagents/src/slash/selector.ts +147 -0
  120. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +265 -23
  121. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +2 -2
  122. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +428 -0
  123. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +362 -0
  124. package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +472 -0
  125. package/dist/extensions/pi-subagents/src/tui/fleet.ts +664 -0
  126. package/dist/extensions/pi-subagents/src/tui/render.ts +115 -31
  127. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +220 -0
  128. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +205 -0
  129. package/dist/extensions/pi-subagents/src/watchdog/emission-guard.ts +123 -0
  130. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +532 -0
  131. package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +167 -0
  132. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +117 -0
  133. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +433 -0
  134. package/dist/extensions/pi-subagents/src/watchdog/render.ts +54 -0
  135. package/dist/extensions/pi-subagents/src/watchdog/review.ts +298 -0
  136. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +714 -0
  137. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +528 -0
  138. package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +155 -0
  139. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +161 -0
  140. package/dist/extensions/pi-subagents/src/watchdog/types.ts +188 -0
  141. package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +73 -0
  142. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +130 -2
  143. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +439 -0
  144. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1632 -61
  145. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +54 -1
  146. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +112 -0
  147. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +98 -1
  148. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +179 -9
  149. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +16 -9
  150. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +6 -5
  151. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +589 -9
  152. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +528 -21
  153. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +227 -3
  154. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +235 -7
  155. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +27 -0
  156. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +172 -2
  157. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1502 -18
  158. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +993 -4
  159. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +27 -0
  160. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +7 -1
  161. package/dist/extensions/pi-subagents/test/support/helpers.ts +32 -0
  162. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +59 -2
  163. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +32 -6
  164. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +25 -24
  165. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +59 -35
  166. package/dist/extensions/pi-subagents/test/support/session-lease-child.mjs +42 -0
  167. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +703 -69
  168. package/dist/extensions/pi-subagents/test/unit/accessible-dir.test.ts +82 -0
  169. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
  170. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
  171. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +478 -19
  172. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +228 -7
  173. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +1 -1
  174. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +198 -78
  175. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +15 -1
  176. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +102 -7
  177. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +439 -6
  178. package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +41 -1
  179. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +79 -0
  180. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +285 -0
  181. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +84 -0
  182. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +68 -0
  183. package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +326 -0
  184. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +82 -0
  185. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +46 -4
  186. package/dist/extensions/pi-subagents/test/unit/completion-batcher.test.ts +3 -1
  187. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +9 -17
  188. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +175 -3
  189. package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +10 -5
  190. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +126 -6
  191. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +219 -0
  192. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +913 -0
  193. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +13 -2
  194. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +3 -3
  195. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +351 -0
  196. package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +280 -0
  197. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +575 -0
  198. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +65 -0
  199. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +94 -1
  200. package/dist/extensions/pi-subagents/test/unit/get-final-output.test.ts +23 -0
  201. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +157 -0
  202. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +367 -5
  203. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +11 -0
  204. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +36 -0
  205. package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +25 -3
  206. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +1 -1
  207. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +341 -10
  208. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +16 -0
  209. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +52 -0
  210. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +168 -7
  211. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +85 -7
  212. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +175 -0
  213. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +1 -1
  214. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +243 -16
  215. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +79 -36
  216. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +174 -56
  217. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +322 -0
  218. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +204 -0
  219. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +20 -12
  220. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +117 -4
  221. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +40 -7
  222. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +48 -1
  223. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +21 -3
  224. package/dist/extensions/pi-subagents/test/unit/selector.test.ts +57 -0
  225. package/dist/extensions/pi-subagents/test/unit/session-lease.test.ts +326 -0
  226. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +101 -2
  227. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +111 -1
  228. package/dist/extensions/pi-subagents/test/unit/spawn-budget.test.ts +124 -0
  229. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +6 -4
  230. package/dist/extensions/pi-subagents/test/unit/status-format.test.ts +7 -0
  231. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +397 -0
  232. package/dist/extensions/pi-subagents/test/unit/steering-notices.test.ts +58 -0
  233. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +173 -0
  234. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +25 -4
  235. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +390 -25
  236. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +837 -0
  237. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +86 -0
  238. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +15 -0
  239. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +47 -1
  240. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +56 -10
  241. package/dist/extensions/pi-subagents/test/unit/watchdog-change-signature.test.ts +387 -0
  242. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +110 -0
  243. package/dist/extensions/pi-subagents/test/unit/watchdog-emission-guard.test.ts +62 -0
  244. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +144 -0
  245. package/dist/extensions/pi-subagents/test/unit/watchdog-model-selection.test.ts +121 -0
  246. package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +76 -0
  247. package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +327 -0
  248. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +863 -0
  249. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +290 -0
  250. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +91 -0
  251. package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +130 -0
  252. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +32 -4
  253. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +5 -1
  254. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +30 -0
  255. package/dist/extensions/question/batch.ts +39 -0
  256. package/dist/extensions/question/dialog-adapter.ts +23 -1
  257. package/dist/extensions/question/index.ts +237 -7
  258. package/dist/extensions/question/schemas.ts +28 -15
  259. package/dist/extensions/question/tests/batch.test.ts +26 -0
  260. package/dist/extensions/question/tests/ui-protocol.test.ts +23 -3
  261. package/dist/extensions/question/tui-adapter.ts +2 -3
  262. package/dist/extensions/question/types.ts +37 -0
  263. package/dist/extensions/question/ui-protocol.ts +3 -3
  264. package/dist/skills/batch-grill-me/SKILL.md +3 -1
  265. package/package.json +2 -1
@@ -3,7 +3,7 @@ import * as fs from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
5
  import { afterEach, beforeEach, describe, it } from "node:test";
6
- import { handleCreate, handleManagementAction, handleUpdate } from "../../src/agents/agent-management.ts";
6
+ import { handleCreate, handleList, handleManagementAction, handleUpdate } from "../../src/agents/agent-management.ts";
7
7
  import { clearSkillCache } from "../../src/agents/skills.ts";
8
8
 
9
9
  let tempDir = "";
@@ -42,6 +42,82 @@ describe("agent management config parsing", () => {
42
42
  assert.match(readText(result), /config must be valid JSON:/);
43
43
  });
44
44
 
45
+ it("hides lower-priority agents shadowed by project agents in list output", () => {
46
+ const agentsDir = path.join(tempDir, ".selesai", "agents");
47
+ fs.mkdirSync(agentsDir, { recursive: true });
48
+ fs.writeFileSync(path.join(agentsDir, "scout.md"), "---\nname: scout\ndescription: Project scout override\n---\n\nProject scout agent.\n");
49
+
50
+ const result = handleList(
51
+ { agentScope: "project" },
52
+ { cwd: tempDir, modelRegistry: { getAvailable: () => [] } },
53
+ );
54
+
55
+ assert.equal(result.isError, false);
56
+ assert.match(readText(result), /- scout \(project\): Project scout override/);
57
+ assert.doesNotMatch(readText(result), /- scout \(builtin/);
58
+ });
59
+
60
+ it("gets only the effective agent detail and respects explicit scope", () => {
61
+ const projectAgentsDir = path.join(tempDir, ".selesai", "agents");
62
+ const userAgentsDir = path.join(tempDir, "agent-home", "agents");
63
+ const packageDir = path.join(tempDir, ".selesai", "npm", "node_modules", "test-agents");
64
+ fs.mkdirSync(projectAgentsDir, { recursive: true });
65
+ fs.mkdirSync(userAgentsDir, { recursive: true });
66
+ fs.mkdirSync(path.join(packageDir, "agents"), { recursive: true });
67
+ fs.mkdirSync(path.join(packageDir, "chains"), { recursive: true });
68
+ fs.writeFileSync(path.join(projectAgentsDir, "worker.md"), "---\nname: worker\ndescription: Project worker override\n---\n\nProject worker.\n");
69
+ fs.writeFileSync(path.join(userAgentsDir, "worker.md"), "---\nname: worker\ndescription: User worker override\n---\n\nUser worker.\n");
70
+ fs.writeFileSync(path.join(packageDir, "package.json"), JSON.stringify({ "pi-subagents": { agents: ["agents"], chains: ["chains"] } }));
71
+ fs.writeFileSync(path.join(packageDir, "agents", "worker.md"), "---\nname: worker\ndescription: Package worker override\n---\n\nPackage worker.\n");
72
+ fs.writeFileSync(path.join(packageDir, "chains", "package-flow.chain.json"), JSON.stringify({
73
+ name: "package-flow",
74
+ description: "Package flow",
75
+ chain: [{ agent: "worker", task: "Package task" }],
76
+ }), "utf-8");
77
+ const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
78
+
79
+ const effective = readText(handleManagementAction("get", { agent: "worker" }, ctx));
80
+ assert.match(effective, /Agent: worker \(project\)/);
81
+ assert.match(effective, /Description: Project worker override/);
82
+ assert.doesNotMatch(effective, /User worker override|Package worker override|Implementation agent for normal tasks/);
83
+
84
+ const userScoped = readText(handleManagementAction("get", { agent: "worker", agentScope: "user" }, ctx));
85
+ assert.match(userScoped, /Agent: worker \(user\)/);
86
+ assert.match(userScoped, /Description: User worker override/);
87
+ assert.doesNotMatch(userScoped, /Project worker override|Implementation agent for normal tasks/);
88
+
89
+ const userChainsDir = path.join(tempDir, "agent-home", "chains");
90
+ const projectChainsDir = path.join(tempDir, ".selesai", "chains");
91
+ fs.mkdirSync(userChainsDir, { recursive: true });
92
+ fs.mkdirSync(projectChainsDir, { recursive: true });
93
+ fs.writeFileSync(path.join(userChainsDir, "shared-flow.chain.json"), JSON.stringify({
94
+ name: "shared-flow",
95
+ description: "User shared flow",
96
+ chain: [{ agent: "worker", task: "User flow" }],
97
+ }), "utf-8");
98
+ fs.writeFileSync(path.join(projectChainsDir, "shared-flow.chain.json"), JSON.stringify({
99
+ name: "shared-flow",
100
+ description: "Project shared flow",
101
+ chain: [{ agent: "worker", task: "Project flow" }],
102
+ }), "utf-8");
103
+
104
+ const userChain = readText(handleManagementAction("get", { chainName: "shared-flow", agentScope: "user" }, ctx));
105
+ assert.match(userChain, /Chain: shared-flow \(user\)/);
106
+ assert.match(userChain, /Description: User shared flow/);
107
+ assert.doesNotMatch(userChain, /Project shared flow|Project flow/);
108
+
109
+ const projectChain = readText(handleManagementAction("get", { chainName: "shared-flow", agentScope: "project" }, ctx));
110
+ assert.match(projectChain, /Chain: shared-flow \(project\)/);
111
+ assert.match(projectChain, /Description: Project shared flow/);
112
+ assert.doesNotMatch(projectChain, /User shared flow|User flow/);
113
+
114
+ for (const agentScope of ["user", "project"] as const) {
115
+ const packageChain = readText(handleManagementAction("get", { chainName: "package-flow", agentScope }, ctx));
116
+ assert.match(packageChain, /Chain: package-flow \(package\)/);
117
+ assert.match(packageChain, /Description: Package flow/);
118
+ }
119
+ });
120
+
45
121
  it("surfaces JSON parse errors for update config strings", () => {
46
122
  const result = handleUpdate(
47
123
  { agent: "reviewer", config: '{"description":' },
@@ -90,6 +166,39 @@ describe("agent management config parsing", () => {
90
166
  assert.equal(fs.existsSync(updatedPath), false);
91
167
  });
92
168
 
169
+ it("creates, reports, and clears agent-local skill paths", () => {
170
+ const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
171
+ const skillFile = path.join(tempDir, ".selesai", "agents", "skills", "private", "SKILL.md");
172
+ fs.mkdirSync(path.dirname(skillFile), { recursive: true });
173
+ fs.writeFileSync(skillFile, "---\ndescription: Private skill\n---\nbody\n", "utf-8");
174
+
175
+ const created = handleCreate({ config: {
176
+ name: "Local",
177
+ description: "Local skills",
178
+ scope: "project",
179
+ skills: "private",
180
+ skillPath: ["./skills", "./skills"],
181
+ } }, ctx);
182
+ assert.equal(created.isError, false);
183
+ assert.doesNotMatch(readText(created), /skills not found/);
184
+ const filePath = path.join(tempDir, ".selesai", "agents", "local.md");
185
+ let content = fs.readFileSync(filePath, "utf-8");
186
+ assert.match(content, /^skillPath: \.\/skills$/m);
187
+
188
+ const got = handleManagementAction("get", { agent: "local" }, ctx);
189
+ assert.match(readText(got), /^Skill paths: \.\/skills$/m);
190
+
191
+ const updated = handleUpdate({ agent: "local", config: { skills: false, skillPath: false } }, ctx);
192
+ assert.equal(updated.isError, false);
193
+ content = fs.readFileSync(filePath, "utf-8");
194
+ assert.doesNotMatch(content, /^skills?:/m);
195
+ assert.doesNotMatch(content, /^skillPath:/m);
196
+
197
+ const invalid = handleUpdate({ agent: "local", config: { skillPath: ["./skills", 1] } }, ctx);
198
+ assert.equal(invalid.isError, true);
199
+ assert.match(readText(invalid), /config\.skillPath must be/);
200
+ });
201
+
93
202
  it("rejects package values that cannot be normalized", () => {
94
203
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
95
204
  const created = handleCreate(
@@ -138,6 +247,89 @@ Inspect
138
247
  assert.doesNotMatch(content, /^package:/m);
139
248
  });
140
249
 
250
+ it("creates and updates agents with single-agent launch defaults", () => {
251
+ const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
252
+ const result = handleCreate(
253
+ {
254
+ config: {
255
+ name: "background-reviewer",
256
+ description: "Review in the background",
257
+ scope: "project",
258
+ async: false,
259
+ timeoutMs: 120_000,
260
+ turnBudget: { maxTurns: 8, graceTurns: 2 },
261
+ acceptance: { level: "none", reason: "lightweight reviewer" },
262
+ },
263
+ },
264
+ ctx,
265
+ );
266
+
267
+ assert.equal(result.isError, false);
268
+ const filePath = path.join(tempDir, ".selesai", "agents", "background-reviewer.md");
269
+ let content = fs.readFileSync(filePath, "utf-8");
270
+ assert.match(content, /^async: false$/m);
271
+ assert.match(content, /^timeoutMs: 120000$/m);
272
+ assert.match(content, /^turnBudget: \{"maxTurns":8,"graceTurns":2\}$/m);
273
+ assert.match(content, /^acceptance: \{"level":"none","reason":"lightweight reviewer"\}$/m);
274
+
275
+ const got = handleManagementAction("get", { agent: "background-reviewer" }, ctx);
276
+ assert.equal(got.isError, false);
277
+ assert.match(readText(got), /Async: false/);
278
+ assert.match(readText(got), /Timeout: 120000ms/);
279
+ assert.match(readText(got), /Turn budget: \{"maxTurns":8,"graceTurns":2\}/);
280
+ assert.match(readText(got), /Acceptance: \{"level":"none","reason":"lightweight reviewer"\}/);
281
+
282
+ const updated = handleUpdate(
283
+ { agent: "background-reviewer", config: { async: true, timeoutMs: false, turnBudget: false, acceptance: "" } },
284
+ ctx,
285
+ );
286
+ assert.equal(updated.isError, false);
287
+ content = fs.readFileSync(filePath, "utf-8");
288
+ assert.match(content, /^async: true$/m);
289
+ assert.doesNotMatch(content, /^timeoutMs:/m);
290
+ assert.doesNotMatch(content, /^turnBudget:/m);
291
+ assert.doesNotMatch(content, /^acceptance:/m);
292
+
293
+ const deprecatedFalse = handleUpdate(
294
+ { agent: "background-reviewer", config: { acceptance: false } },
295
+ ctx,
296
+ );
297
+ assert.equal(deprecatedFalse.isError, false);
298
+ content = fs.readFileSync(filePath, "utf-8");
299
+ assert.match(content, /^acceptance: false$/m);
300
+ });
301
+
302
+ it("rejects invalid single-agent launch defaults", () => {
303
+ const result = handleCreate(
304
+ {
305
+ config: {
306
+ name: "bad-launch-defaults",
307
+ description: "Bad defaults",
308
+ scope: "project",
309
+ timeoutMs: 0,
310
+ },
311
+ },
312
+ { cwd: tempDir, modelRegistry: { getAvailable: () => [] } },
313
+ );
314
+
315
+ assert.equal(result.isError, true);
316
+ assert.match(readText(result), /config\.timeoutMs must be a positive integer/);
317
+
318
+ const invalidAcceptance = handleCreate(
319
+ {
320
+ config: {
321
+ name: "bad-acceptance-default",
322
+ description: "Bad acceptance",
323
+ scope: "project",
324
+ acceptance: "none",
325
+ },
326
+ },
327
+ { cwd: tempDir, modelRegistry: { getAvailable: () => [] } },
328
+ );
329
+ assert.equal(invalidAcceptance.isError, true);
330
+ assert.match(readText(invalidAcceptance), /config\.acceptance level "none" requires a reason/);
331
+ });
332
+
141
333
  it("creates and updates agents with tool budgets", () => {
142
334
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
143
335
  const result = handleCreate(
@@ -180,6 +372,35 @@ Inspect
180
372
  assert.match(readText(chainResult), /config\.steps\[0\]\.toolBudget\.block must contain at least one tool name/);
181
373
  });
182
374
 
375
+ it("creates, updates, reports, clears, and validates acceptance roles", () => {
376
+ const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
377
+ const created = handleCreate(
378
+ { config: { name: "explorer", description: "Explore code", scope: "project", acceptanceRole: "read-only" } },
379
+ ctx,
380
+ );
381
+ assert.equal(created.isError, false);
382
+
383
+ const filePath = path.join(tempDir, ".selesai", "agents", "explorer.md");
384
+ assert.match(fs.readFileSync(filePath, "utf-8"), /^acceptanceRole: read-only$/m);
385
+ assert.match(readText(handleManagementAction("get", { agent: "explorer" }, ctx)), /Acceptance role: read-only/);
386
+
387
+ const updated = handleUpdate({ agent: "explorer", config: { acceptanceRole: "writer" } }, ctx);
388
+ assert.equal(updated.isError, false);
389
+ assert.match(fs.readFileSync(filePath, "utf-8"), /^acceptanceRole: writer$/m);
390
+
391
+ const cleared = handleUpdate({ agent: "explorer", config: { acceptanceRole: false } }, ctx);
392
+ assert.equal(cleared.isError, false);
393
+ assert.doesNotMatch(fs.readFileSync(filePath, "utf-8"), /^acceptanceRole:/m);
394
+
395
+ assert.equal(handleUpdate({ agent: "explorer", config: { acceptanceRole: "read-only" } }, ctx).isError, false);
396
+ assert.equal(handleUpdate({ agent: "explorer", config: { acceptanceRole: "" } }, ctx).isError, false);
397
+ assert.doesNotMatch(fs.readFileSync(filePath, "utf-8"), /^acceptanceRole:/m);
398
+
399
+ const invalid = handleUpdate({ agent: "explorer", config: { acceptanceRole: "observer" } }, ctx);
400
+ assert.equal(invalid.isError, true);
401
+ assert.match(readText(invalid), /config\.acceptanceRole must be 'read-only', 'writer', or false/);
402
+ });
403
+
183
404
  it("creates agents with completion guard disabled", () => {
184
405
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
185
406
  const result = handleCreate(
@@ -440,7 +661,7 @@ Drive the failing test first.
440
661
  assert.equal(result.isError, false);
441
662
  assert.match(text, /^Builtin subagent models/m);
442
663
  assert.match(text, /Current session model:\n openai\/gpt-5-mini/);
443
- assert.match(text, /(?:^|\n)scout\n model:\n openai\/gpt-5-mini\n source: inherits current session model(?:\n|$)/);
664
+ assert.match(text, /(?:^|\n)explorer\n model:\n openai\/gpt-5-mini\n source: inherits current session model(?:\n|$)/);
444
665
  });
445
666
 
446
667
  it("reports override source and disabled builtin state in runtime model mappings", () => {
@@ -449,7 +670,7 @@ Drive the failing test first.
449
670
  fs.writeFileSync(projectSettingsPath, JSON.stringify({
450
671
  subagents: {
451
672
  agentOverrides: {
452
- reviewer: { model: "claude-sonnet-4", disabled: true },
673
+ commentator: { model: "claude-sonnet-4", disabled: true },
453
674
  },
454
675
  },
455
676
  }, null, 2), "utf-8");
@@ -465,16 +686,16 @@ Drive the failing test first.
465
686
  model: { provider: "openai", id: "gpt-5-mini" },
466
687
  };
467
688
 
468
- const result = handleManagementAction("models", { agent: "reviewer" }, ctx);
689
+ const result = handleManagementAction("models", { agent: "commentator" }, ctx);
469
690
  const text = readText(result);
470
691
  assert.equal(result.isError, false);
471
692
  assert.match(text, /^Builtin subagent model/m);
472
- assert.match(text, /Agent: reviewer/);
693
+ assert.match(text, /Agent: commentator/);
473
694
  assert.match(text, /Effective model:\n anthropic\/claude-sonnet-4/);
474
695
  assert.match(text, /Source: project override/);
475
696
  assert.match(text, /Requested model setting:\n claude-sonnet-4/);
476
697
  assert.match(text, /Disabled: true/);
477
- assert.match(text.replaceAll("\\", "/"), /Override file:\n .*\.pi\/settings\.json/);
698
+ assert.match(text.replaceAll("\\", "/"), /Override file:\n .*\.selesai\/settings\.json/);
478
699
  });
479
700
 
480
701
  it("rejects unknown builtin filters for runtime model mappings", () => {
@@ -525,7 +746,7 @@ Inspect cleanup.
525
746
  const listed = handleManagementAction("list", {}, ctx);
526
747
  const text = readText(listed);
527
748
  assert.match(text, /Proactive skill subagent suggestions:/);
528
- assert.match(text, /- deslop via reviewer/);
749
+ assert.match(text, /- deslop via commentator/);
529
750
  assert.match(text, /Cleanup review\./);
530
751
  });
531
752
 
@@ -299,7 +299,7 @@ describe("buildAgentMemoryInjection", () => {
299
299
  const memoryFile = path.join(memoryDir, AGENT_MEMORY_FILE);
300
300
  assert.match(injection, new RegExp(`Memory file: ${escapeRegex(memoryFile)}`));
301
301
  assert.match(injection, /Release gotcha: tag before gh release\./);
302
- // Must not collide with the owner's ~/.pi/agent/memory/{project}/ layout.
302
+ // Must not collide with the owner's ~/.selesai/agent/memory/{project}/ layout.
303
303
  assert.doesNotMatch(injection, /agent\/memory\/[^/]+\/release-agent/);
304
304
  });
305
305
  });