@selesai/code 0.5.20 → 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 (263) 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-subagents/CHANGELOG.md +1367 -0
  4. package/dist/extensions/pi-subagents/README.md +602 -220
  5. package/dist/extensions/pi-subagents/banner.png +0 -0
  6. package/dist/extensions/pi-subagents/index.ts +1 -0
  7. package/dist/extensions/pi-subagents/install.mjs +3 -3
  8. package/dist/extensions/pi-subagents/package-lock.json +3405 -0
  9. package/dist/extensions/pi-subagents/package.json +26 -14
  10. package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
  11. package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
  12. package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +3 -3
  13. package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +7 -7
  14. package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
  15. package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
  16. package/dist/extensions/pi-subagents/prompts/review-loop.md +13 -11
  17. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +267 -176
  18. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +89 -16
  19. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +19 -0
  20. package/dist/extensions/pi-subagents/src/agents/agents.ts +218 -120
  21. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +67 -13
  22. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
  23. package/dist/extensions/pi-subagents/src/agents/skills.ts +25 -12
  24. package/dist/extensions/pi-subagents/src/api/background-work.ts +197 -0
  25. package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +17 -0
  26. package/dist/extensions/pi-subagents/src/api/delegation.ts +285 -0
  27. package/dist/extensions/pi-subagents/src/api/preflight.ts +399 -0
  28. package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +165 -0
  29. package/dist/extensions/pi-subagents/src/extension/config.ts +7 -1
  30. package/dist/extensions/pi-subagents/src/extension/doctor.ts +15 -0
  31. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +3 -1
  32. package/dist/extensions/pi-subagents/src/extension/index.ts +113 -157
  33. package/dist/extensions/pi-subagents/src/extension/rpc.ts +41 -4
  34. package/dist/extensions/pi-subagents/src/extension/schemas.ts +45 -15
  35. package/dist/extensions/pi-subagents/src/extension/steering-notices.ts +35 -0
  36. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +28 -15
  37. package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +4 -3
  38. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +225 -29
  39. package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +11 -0
  40. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -10
  41. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +452 -62
  42. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +60 -9
  43. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +198 -52
  44. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +119 -21
  45. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +67 -0
  46. package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -0
  47. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +16 -8
  48. package/dist/extensions/pi-subagents/src/runs/background/completion-batcher.ts +6 -4
  49. package/dist/extensions/pi-subagents/src/runs/background/completion-dedupe.ts +2 -11
  50. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +260 -13
  51. package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +32 -6
  52. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +171 -90
  53. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +280 -0
  54. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +149 -88
  55. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +14 -2
  56. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +33 -17
  57. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +9 -1
  58. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +38 -10
  59. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +237 -0
  60. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +1297 -307
  61. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +610 -0
  62. package/dist/extensions/pi-subagents/src/runs/background/top-level-async.ts +2 -1
  63. package/dist/extensions/pi-subagents/src/runs/background/wait-config.ts +36 -0
  64. package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +26 -0
  65. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +230 -0
  66. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +22 -6
  67. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +228 -140
  68. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +452 -138
  69. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +90 -0
  70. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1001 -416
  71. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +443 -132
  72. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +38 -0
  73. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +178 -0
  74. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +121 -0
  75. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +41 -93
  76. package/dist/extensions/pi-subagents/src/runs/shared/context-mode.ts +44 -0
  77. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +11 -9
  78. package/dist/extensions/pi-subagents/src/runs/shared/long-running-guard.ts +4 -0
  79. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +12 -6
  80. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +36 -0
  81. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +44 -7
  82. package/dist/extensions/pi-subagents/src/runs/shared/nested-render.ts +4 -1
  83. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +154 -0
  84. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +18 -0
  85. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +174 -54
  86. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +38 -31
  87. package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +90 -5
  88. package/dist/extensions/pi-subagents/src/runs/shared/session-lease.ts +299 -0
  89. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +61 -6
  90. package/dist/extensions/pi-subagents/src/runs/shared/spawn-budget.ts +128 -0
  91. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +112 -7
  92. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +14 -6
  93. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +149 -36
  94. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +181 -0
  95. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +83 -0
  96. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +11 -5
  97. package/dist/extensions/pi-subagents/src/runs/shared/turn-budget.ts +50 -4
  98. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +63 -14
  99. package/dist/extensions/pi-subagents/src/shared/accessible-dir.ts +25 -0
  100. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +37 -7
  101. package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +18 -43
  102. package/dist/extensions/pi-subagents/src/shared/child-transcript.ts +52 -0
  103. package/dist/extensions/pi-subagents/src/shared/env.ts +16 -0
  104. package/dist/extensions/pi-subagents/src/shared/file-system-retry.ts +47 -0
  105. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +28 -3
  106. package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +123 -0
  107. package/dist/extensions/pi-subagents/src/shared/model-info.ts +8 -5
  108. package/dist/extensions/pi-subagents/src/shared/settings.ts +9 -1
  109. package/dist/extensions/pi-subagents/src/shared/status-format.ts +7 -1
  110. package/dist/extensions/pi-subagents/src/shared/types.ts +522 -51
  111. package/dist/extensions/pi-subagents/src/shared/utils.ts +59 -53
  112. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +604 -0
  113. package/dist/extensions/pi-subagents/src/slash/delegation-json.ts +108 -0
  114. package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +249 -0
  115. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +353 -345
  116. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +2 -2
  117. package/dist/extensions/pi-subagents/src/slash/selector.ts +147 -0
  118. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +265 -23
  119. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +2 -2
  120. package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +428 -0
  121. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +362 -0
  122. package/dist/extensions/pi-subagents/src/tui/fleet-transcript.ts +472 -0
  123. package/dist/extensions/pi-subagents/src/tui/fleet.ts +664 -0
  124. package/dist/extensions/pi-subagents/src/tui/render.ts +115 -31
  125. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +220 -0
  126. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +205 -0
  127. package/dist/extensions/pi-subagents/src/watchdog/emission-guard.ts +123 -0
  128. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +532 -0
  129. package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +167 -0
  130. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +117 -0
  131. package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +433 -0
  132. package/dist/extensions/pi-subagents/src/watchdog/render.ts +54 -0
  133. package/dist/extensions/pi-subagents/src/watchdog/review.ts +298 -0
  134. package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +714 -0
  135. package/dist/extensions/pi-subagents/src/watchdog/settings.ts +528 -0
  136. package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +155 -0
  137. package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +161 -0
  138. package/dist/extensions/pi-subagents/src/watchdog/types.ts +188 -0
  139. package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +73 -0
  140. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +130 -2
  141. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +439 -0
  142. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1632 -61
  143. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +54 -1
  144. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +112 -0
  145. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +98 -1
  146. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +179 -9
  147. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +16 -9
  148. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +6 -5
  149. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +589 -9
  150. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +528 -21
  151. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +227 -3
  152. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +235 -7
  153. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +27 -0
  154. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +172 -2
  155. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1502 -18
  156. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +993 -4
  157. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +27 -0
  158. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +7 -1
  159. package/dist/extensions/pi-subagents/test/support/helpers.ts +32 -0
  160. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +59 -2
  161. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +32 -6
  162. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +25 -24
  163. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +59 -35
  164. package/dist/extensions/pi-subagents/test/support/session-lease-child.mjs +42 -0
  165. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +703 -69
  166. package/dist/extensions/pi-subagents/test/unit/accessible-dir.test.ts +82 -0
  167. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
  168. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
  169. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +478 -19
  170. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +228 -7
  171. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +1 -1
  172. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +198 -78
  173. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +15 -1
  174. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +102 -7
  175. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +439 -6
  176. package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +41 -1
  177. package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +79 -0
  178. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +285 -0
  179. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +84 -0
  180. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +68 -0
  181. package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +326 -0
  182. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +82 -0
  183. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +46 -4
  184. package/dist/extensions/pi-subagents/test/unit/completion-batcher.test.ts +3 -1
  185. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +9 -17
  186. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +175 -3
  187. package/dist/extensions/pi-subagents/test/unit/config-dir-runtime.test.ts +10 -5
  188. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +126 -6
  189. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +219 -0
  190. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +913 -0
  191. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +13 -2
  192. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +3 -3
  193. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +351 -0
  194. package/dist/extensions/pi-subagents/test/unit/fleet-transcript.test.ts +280 -0
  195. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +575 -0
  196. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +65 -0
  197. package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +94 -1
  198. package/dist/extensions/pi-subagents/test/unit/get-final-output.test.ts +23 -0
  199. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +157 -0
  200. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +367 -5
  201. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +11 -0
  202. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +36 -0
  203. package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +25 -3
  204. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +1 -1
  205. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +341 -10
  206. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +16 -0
  207. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +52 -0
  208. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +168 -7
  209. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +85 -7
  210. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +175 -0
  211. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +1 -1
  212. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +243 -16
  213. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +79 -36
  214. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +174 -56
  215. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +322 -0
  216. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +204 -0
  217. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +20 -12
  218. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +117 -4
  219. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +40 -7
  220. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +48 -1
  221. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +21 -3
  222. package/dist/extensions/pi-subagents/test/unit/selector.test.ts +57 -0
  223. package/dist/extensions/pi-subagents/test/unit/session-lease.test.ts +326 -0
  224. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +101 -2
  225. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +111 -1
  226. package/dist/extensions/pi-subagents/test/unit/spawn-budget.test.ts +124 -0
  227. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +6 -4
  228. package/dist/extensions/pi-subagents/test/unit/status-format.test.ts +7 -0
  229. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +397 -0
  230. package/dist/extensions/pi-subagents/test/unit/steering-notices.test.ts +58 -0
  231. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +173 -0
  232. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +25 -4
  233. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +390 -25
  234. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +837 -0
  235. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +86 -0
  236. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +15 -0
  237. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +47 -1
  238. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +56 -10
  239. package/dist/extensions/pi-subagents/test/unit/watchdog-change-signature.test.ts +387 -0
  240. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +110 -0
  241. package/dist/extensions/pi-subagents/test/unit/watchdog-emission-guard.test.ts +62 -0
  242. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +144 -0
  243. package/dist/extensions/pi-subagents/test/unit/watchdog-model-selection.test.ts +121 -0
  244. package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +76 -0
  245. package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +327 -0
  246. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +863 -0
  247. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +290 -0
  248. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +91 -0
  249. package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +130 -0
  250. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +32 -4
  251. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +5 -1
  252. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +30 -0
  253. package/dist/extensions/question/batch.ts +39 -0
  254. package/dist/extensions/question/dialog-adapter.ts +23 -1
  255. package/dist/extensions/question/index.ts +237 -7
  256. package/dist/extensions/question/schemas.ts +28 -15
  257. package/dist/extensions/question/tests/batch.test.ts +26 -0
  258. package/dist/extensions/question/tests/ui-protocol.test.ts +23 -3
  259. package/dist/extensions/question/tui-adapter.ts +2 -3
  260. package/dist/extensions/question/types.ts +37 -0
  261. package/dist/extensions/question/ui-protocol.ts +3 -3
  262. package/dist/skills/batch-grill-me/SKILL.md +3 -1
  263. package/package.json +1 -1
@@ -0,0 +1,82 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, it } from "node:test";
3
+ import { ensureAccessibleDir } from "../../src/shared/accessible-dir.ts";
4
+
5
+ class FakeFs {
6
+ mkdirCalls = 0;
7
+ accessCalls = 0;
8
+ failMkdirCodes: string[] = [];
9
+ failAccessCodes: string[] = [];
10
+
11
+ mkdirSync(): void {
12
+ this.mkdirCalls++;
13
+ const failureCode = this.failMkdirCodes.shift();
14
+ if (failureCode) {
15
+ const error = new Error(`mkdir failed with ${failureCode}`) as NodeJS.ErrnoException;
16
+ error.code = failureCode;
17
+ throw error;
18
+ }
19
+ }
20
+
21
+ accessSync(): void {
22
+ this.accessCalls++;
23
+ const failureCode = this.failAccessCodes.shift();
24
+ if (failureCode) {
25
+ const error = new Error(`access failed with ${failureCode}`) as NodeJS.ErrnoException;
26
+ error.code = failureCode;
27
+ throw error;
28
+ }
29
+ }
30
+ }
31
+
32
+ describe("ensureAccessibleDir", () => {
33
+ it("retries transient shared-directory mkdir failures before validating access", () => {
34
+ const fakeFs = new FakeFs();
35
+ fakeFs.failMkdirCodes = ["EPERM", "EBUSY"];
36
+ const waits: number[] = [];
37
+
38
+ ensureAccessibleDir("/tmp/pi-subagents-user/async-subagent-results", {
39
+ fs: fakeFs as any,
40
+ retryDirectoryErrors: true,
41
+ retryDelaysMs: [1, 2, 3],
42
+ wait: (delayMs) => waits.push(delayMs),
43
+ });
44
+
45
+ assert.equal(fakeFs.mkdirCalls, 3);
46
+ assert.equal(fakeFs.accessCalls, 1);
47
+ assert.deepEqual(waits, [1, 2]);
48
+ });
49
+
50
+ it("retries transient shared-directory access failures without recreating the directory", () => {
51
+ const fakeFs = new FakeFs();
52
+ fakeFs.failAccessCodes = ["EPERM", "EACCES"];
53
+ const waits: number[] = [];
54
+
55
+ ensureAccessibleDir("/tmp/pi-subagents-user/async-subagent-results", {
56
+ fs: fakeFs as any,
57
+ retryDirectoryErrors: true,
58
+ retryDelaysMs: [1, 2, 3],
59
+ wait: (delayMs) => waits.push(delayMs),
60
+ });
61
+
62
+ assert.equal(fakeFs.mkdirCalls, 1);
63
+ assert.equal(fakeFs.accessCalls, 3);
64
+ assert.deepEqual(waits, [1, 2]);
65
+ });
66
+
67
+ it("throws non-retryable access failures without retrying", () => {
68
+ const fakeFs = new FakeFs();
69
+ fakeFs.failAccessCodes = ["ENOENT"];
70
+ const waits: number[] = [];
71
+
72
+ assert.throws(() => ensureAccessibleDir("/tmp/pi-subagents-user/async-subagent-results", {
73
+ fs: fakeFs as any,
74
+ retryDirectoryErrors: true,
75
+ retryDelaysMs: [1, 2, 3],
76
+ wait: (delayMs) => waits.push(delayMs),
77
+ }), /ENOENT/);
78
+ assert.equal(fakeFs.mkdirCalls, 1);
79
+ assert.equal(fakeFs.accessCalls, 1);
80
+ assert.deepEqual(waits, []);
81
+ });
82
+ });
@@ -45,15 +45,15 @@ describe("builtin agent disabling", () => {
45
45
  writeJson(path.join(tempHome, ".selesai", "agent", "settings.json"), {
46
46
  subagents: {
47
47
  agentOverrides: {
48
- reviewer: { disabled: true },
48
+ commentator: { disabled: true },
49
49
  },
50
50
  },
51
51
  });
52
52
 
53
- const runtimeReviewer = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "reviewer");
53
+ const runtimeReviewer = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "commentator");
54
54
  assert.equal(runtimeReviewer, undefined);
55
55
 
56
- const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "reviewer");
56
+ const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "commentator");
57
57
  assert.ok(allReviewer);
58
58
  assert.equal(allReviewer.disabled, true);
59
59
  assert.equal(allReviewer.override?.scope, "user");
@@ -64,7 +64,7 @@ describe("builtin agent disabling", () => {
64
64
  writeJson(settingsPath, {
65
65
  subagents: {
66
66
  agentOverrides: {
67
- reviewer: { disabled: "true" },
67
+ commentator: { disabled: "true" },
68
68
  },
69
69
  },
70
70
  });
@@ -73,7 +73,7 @@ describe("builtin agent disabling", () => {
73
73
  () => discoverAgents(tempProject, "both"),
74
74
  (error: unknown) => error instanceof Error
75
75
  && error.message.includes(settingsPath)
76
- && error.message.includes("reviewer")
76
+ && error.message.includes("commentator")
77
77
  && error.message.includes("disabled"),
78
78
  );
79
79
  });
@@ -97,16 +97,16 @@ describe("builtin agent disabling", () => {
97
97
  subagents: {
98
98
  disableBuiltins: true,
99
99
  agentOverrides: {
100
- reviewer: { model: "openai/gpt-5.4" },
100
+ commentator: { model: "openai/gpt-5.4" },
101
101
  },
102
102
  },
103
103
  });
104
104
 
105
- const reviewer = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "reviewer");
106
- assert.ok(reviewer);
107
- assert.equal(reviewer.disabled, undefined);
108
- assert.equal(reviewer.model, "openai/gpt-5.4");
109
- assert.equal(reviewer.override?.scope, "user");
105
+ const commentator = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "commentator");
106
+ assert.ok(commentator);
107
+ assert.equal(commentator.disabled, undefined);
108
+ assert.equal(commentator.model, "openai/gpt-5.4");
109
+ assert.equal(commentator.override?.scope, "user");
110
110
  });
111
111
 
112
112
  it("project disableBuiltins false re-enables builtins hidden by user bulk disable", () => {
@@ -127,7 +127,7 @@ describe("builtin agent disabling", () => {
127
127
  subagents: {
128
128
  disableBuiltins: true,
129
129
  agentOverrides: {
130
- reviewer: { disabled: false, model: "openai/gpt-5.4" },
130
+ commentator: { disabled: false, model: "openai/gpt-5.4" },
131
131
  },
132
132
  },
133
133
  });
@@ -135,10 +135,10 @@ describe("builtin agent disabling", () => {
135
135
  subagents: { disableBuiltins: true },
136
136
  });
137
137
 
138
- const reviewer = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "reviewer");
139
- assert.equal(reviewer, undefined);
138
+ const commentator = discoverAgents(tempProject, "both").agents.find((agent) => agent.name === "commentator");
139
+ assert.equal(commentator, undefined);
140
140
 
141
- const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "reviewer");
141
+ const allReviewer = discoverAgentsAll(tempProject).builtin.find((agent) => agent.name === "commentator");
142
142
  assert.ok(allReviewer);
143
143
  assert.equal(allReviewer.disabled, true);
144
144
  assert.equal(allReviewer.override?.scope, "project");
@@ -74,18 +74,18 @@ describe("agent eject/disable/enable/reset management actions", () => {
74
74
  describe("eject", () => {
75
75
  it("copies a bundled builtin to user scope verbatim and shadows the builtin", () => {
76
76
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
77
- const builtin = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "reviewer");
77
+ const builtin = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "commentator");
78
78
  assert.ok(builtin);
79
79
 
80
- const ejected = handleManagementAction("eject", { agent: "reviewer" }, ctx);
80
+ const ejected = handleManagementAction("eject", { agent: "commentator" }, ctx);
81
81
  assert.equal(ejected.isError, false);
82
- assert.match(readText(ejected), /Ejected agent 'reviewer' from builtin to user scope/);
82
+ assert.match(readText(ejected), /Ejected agent 'commentator' from builtin to user scope/);
83
83
 
84
- const target = userAgentPath("reviewer");
84
+ const target = userAgentPath("commentator");
85
85
  assert.equal(fs.existsSync(target), true);
86
86
  assert.equal(fs.readFileSync(target, "utf-8"), fs.readFileSync(builtin.filePath, "utf-8"));
87
87
 
88
- const effective = discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer");
88
+ const effective = discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator");
89
89
  assert.ok(effective);
90
90
  assert.equal(effective.source, "user");
91
91
  assert.equal(effective.filePath, target);
@@ -94,38 +94,38 @@ describe("agent eject/disable/enable/reset management actions", () => {
94
94
  it("ejects to project scope when agentScope is project", () => {
95
95
  fs.mkdirSync(path.join(tempDir, ".selesai"), { recursive: true });
96
96
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
97
- const ejected = handleManagementAction("eject", { agent: "scout", agentScope: "project" }, ctx);
97
+ const ejected = handleManagementAction("eject", { agent: "explorer", agentScope: "project" }, ctx);
98
98
  assert.equal(ejected.isError, false);
99
99
  assert.match(readText(ejected), /to project scope/);
100
- assert.equal(fs.existsSync(projectAgentPath("scout")), true);
101
- assert.equal(discoverAgentsAll(tempDir).project.find((a) => a.name === "scout")?.source, "project");
100
+ assert.equal(fs.existsSync(projectAgentPath("explorer")), true);
101
+ assert.equal(discoverAgentsAll(tempDir).project.find((a) => a.name === "explorer")?.source, "project");
102
102
  });
103
103
 
104
104
  it("copies a package agent that shadows a builtin by runtime precedence", () => {
105
105
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
106
- writePackageAgent("reviewer");
107
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer")?.source, "package");
106
+ writePackageAgent("commentator");
107
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator")?.source, "package");
108
108
 
109
- const ejected = handleManagementAction("eject", { agent: "reviewer" }, ctx);
109
+ const ejected = handleManagementAction("eject", { agent: "commentator" }, ctx);
110
110
  assert.equal(ejected.isError, false);
111
111
  assert.match(readText(ejected), /from package to user scope/);
112
- assert.equal(fs.readFileSync(userAgentPath("reviewer"), "utf-8"), fs.readFileSync(packageAgentPath("reviewer"), "utf-8"));
112
+ assert.equal(fs.readFileSync(userAgentPath("commentator"), "utf-8"), fs.readFileSync(packageAgentPath("commentator"), "utf-8"));
113
113
  });
114
114
 
115
115
  it("refuses invalid management scopes without writing user files", () => {
116
116
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
117
- const ejected = handleManagementAction("eject", { agent: "reviewer", agentScope: "workspace" }, ctx);
117
+ const ejected = handleManagementAction("eject", { agent: "commentator", agentScope: "workspace" }, ctx);
118
118
  assert.equal(ejected.isError, true);
119
119
  assert.match(readText(ejected), /agentScope must be 'user' or 'project'/);
120
- assert.equal(fs.existsSync(userAgentPath("reviewer")), false);
120
+ assert.equal(fs.existsSync(userAgentPath("commentator")), false);
121
121
  });
122
122
 
123
123
  it("refuses to eject when a custom agent already exists", () => {
124
124
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
125
- fs.mkdirSync(path.dirname(userAgentPath("reviewer")), { recursive: true });
126
- fs.writeFileSync(userAgentPath("reviewer"), "---\nname: reviewer\ndescription: Mine\n---\n\nMine.\n", "utf-8");
125
+ fs.mkdirSync(path.dirname(userAgentPath("commentator")), { recursive: true });
126
+ fs.writeFileSync(userAgentPath("commentator"), "---\nname: commentator\ndescription: Mine\n---\n\nMine.\n", "utf-8");
127
127
 
128
- const ejected = handleManagementAction("eject", { agent: "reviewer" }, ctx);
128
+ const ejected = handleManagementAction("eject", { agent: "commentator" }, ctx);
129
129
  assert.equal(ejected.isError, true);
130
130
  assert.match(readText(ejected), /already a custom user agent/);
131
131
  });
@@ -141,48 +141,48 @@ describe("agent eject/disable/enable/reset management actions", () => {
141
141
  describe("disable", () => {
142
142
  it("hides a builtin from runtime discovery via a user settings override", () => {
143
143
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
144
- const disabled = handleManagementAction("disable", { agent: "reviewer" }, ctx);
144
+ const disabled = handleManagementAction("disable", { agent: "commentator" }, ctx);
145
145
  assert.equal(disabled.isError, false);
146
- assert.match(readText(disabled), /Disabled agent 'reviewer' via user settings override/);
146
+ assert.match(readText(disabled), /Disabled agent 'commentator' via user settings override/);
147
147
 
148
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"), undefined);
149
- const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "reviewer");
148
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"), undefined);
149
+ const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "commentator");
150
150
  assert.ok(all);
151
151
  assert.equal(all.disabled, true);
152
152
  assert.equal(all.override?.scope, "user");
153
153
 
154
- const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { reviewer: { disabled: boolean } } } };
155
- assert.equal(settings.subagents.agentOverrides.reviewer.disabled, true);
154
+ const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { commentator: { disabled: boolean } } } };
155
+ assert.equal(settings.subagents.agentOverrides.commentator.disabled, true);
156
156
  });
157
157
 
158
158
  it("merges disabled into an existing override without dropping other fields", () => {
159
159
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
160
160
  writeJson(userSettingsPath(), {
161
- subagents: { agentOverrides: { reviewer: { model: "openai/gpt-5.4" } } },
161
+ subagents: { agentOverrides: { commentator: { model: "openai/gpt-5.4" } } },
162
162
  });
163
163
 
164
- handleManagementAction("disable", { agent: "reviewer" }, ctx);
164
+ handleManagementAction("disable", { agent: "commentator" }, ctx);
165
165
 
166
- const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { reviewer: { model: string; disabled: boolean } } } };
167
- assert.deepEqual(settings.subagents.agentOverrides.reviewer, { model: "openai/gpt-5.4", disabled: true });
166
+ const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { commentator: { model: string; disabled: boolean } } } };
167
+ assert.deepEqual(settings.subagents.agentOverrides.commentator, { model: "openai/gpt-5.4", disabled: true });
168
168
  });
169
169
 
170
170
  it("hides a disabled agent from agent-facing list output", () => {
171
171
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
172
- handleManagementAction("disable", { agent: "reviewer" }, ctx);
172
+ handleManagementAction("disable", { agent: "commentator" }, ctx);
173
173
 
174
174
  const text = readText(handleManagementAction("list", {}, ctx));
175
- assert.doesNotMatch(text, /^- reviewer /m);
175
+ assert.doesNotMatch(text, /^- commentator /m);
176
176
  });
177
177
 
178
178
  it("writes a project-scoped override when agentScope is project", () => {
179
179
  fs.mkdirSync(path.join(tempDir, ".selesai"), { recursive: true });
180
180
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
181
- const disabled = handleManagementAction("disable", { agent: "reviewer", agentScope: "project" }, ctx);
181
+ const disabled = handleManagementAction("disable", { agent: "commentator", agentScope: "project" }, ctx);
182
182
  assert.equal(disabled.isError, false);
183
183
  assert.match(readText(disabled), /via project settings override/);
184
184
 
185
- const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "reviewer");
185
+ const all = discoverAgentsAll(tempDir).builtin.find((a) => a.name === "commentator");
186
186
  assert.equal(all?.override?.scope, "project");
187
187
  assert.equal(fs.existsSync(projectSettingsPath()), true);
188
188
  });
@@ -206,14 +206,14 @@ describe("agent eject/disable/enable/reset management actions", () => {
206
206
 
207
207
  it("also disables a package agent via a settings override", () => {
208
208
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
209
- writePackageAgent("packaged-reviewer");
210
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-reviewer")?.source, "package");
209
+ writePackageAgent("packaged-commentator");
210
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-commentator")?.source, "package");
211
211
 
212
- const disabled = handleManagementAction("disable", { agent: "packaged-reviewer" }, ctx);
212
+ const disabled = handleManagementAction("disable", { agent: "packaged-commentator" }, ctx);
213
213
  assert.equal(disabled.isError, false);
214
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-reviewer"), undefined);
214
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "packaged-commentator"), undefined);
215
215
 
216
- const all = discoverAgentsAll(tempDir).package.find((a) => a.name === "packaged-reviewer");
216
+ const all = discoverAgentsAll(tempDir).package.find((a) => a.name === "packaged-commentator");
217
217
  assert.equal(all?.disabled, true);
218
218
  assert.equal(all?.override?.scope, "user");
219
219
  });
@@ -222,34 +222,34 @@ describe("agent eject/disable/enable/reset management actions", () => {
222
222
  describe("enable", () => {
223
223
  it("restores a previously disabled builtin to runtime discovery", () => {
224
224
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
225
- handleManagementAction("disable", { agent: "reviewer" }, ctx);
226
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"), undefined);
225
+ handleManagementAction("disable", { agent: "commentator" }, ctx);
226
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"), undefined);
227
227
 
228
- const enabled = handleManagementAction("enable", { agent: "reviewer" }, ctx);
228
+ const enabled = handleManagementAction("enable", { agent: "commentator" }, ctx);
229
229
  assert.equal(enabled.isError, false);
230
- assert.match(readText(enabled), /Enabled agent 'reviewer'/);
231
- assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"));
230
+ assert.match(readText(enabled), /Enabled agent 'commentator'/);
231
+ assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
232
232
 
233
233
  const settings = readJson(userSettingsPath()) as { subagents?: { agentOverrides?: Record<string, unknown> } };
234
- assert.equal(settings.subagents?.agentOverrides?.reviewer, undefined);
234
+ assert.equal(settings.subagents?.agentOverrides?.commentator, undefined);
235
235
  });
236
236
 
237
237
  it("preserves other override fields when removing the disabled flag", () => {
238
238
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
239
239
  writeJson(userSettingsPath(), {
240
- subagents: { agentOverrides: { reviewer: { model: "openai/gpt-5.4", disabled: true } } },
240
+ subagents: { agentOverrides: { commentator: { model: "openai/gpt-5.4", disabled: true } } },
241
241
  });
242
242
 
243
- handleManagementAction("enable", { agent: "reviewer" }, ctx);
243
+ handleManagementAction("enable", { agent: "commentator" }, ctx);
244
244
 
245
- const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { reviewer: { model: string; disabled?: boolean } } } };
246
- assert.deepEqual(settings.subagents.agentOverrides.reviewer, { model: "openai/gpt-5.4" });
247
- assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"));
245
+ const settings = readJson(userSettingsPath()) as { subagents: { agentOverrides: { commentator: { model: string; disabled?: boolean } } } };
246
+ assert.deepEqual(settings.subagents.agentOverrides.commentator, { model: "openai/gpt-5.4" });
247
+ assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
248
248
  });
249
249
 
250
250
  it("reports already enabled and makes no changes when nothing is disabled", () => {
251
251
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
252
- const enabled = handleManagementAction("enable", { agent: "reviewer" }, ctx);
252
+ const enabled = handleManagementAction("enable", { agent: "commentator" }, ctx);
253
253
  assert.equal(enabled.isError, false);
254
254
  assert.match(readText(enabled), /already enabled/);
255
255
  assert.equal(fs.existsSync(userSettingsPath()), false);
@@ -258,9 +258,9 @@ describe("agent eject/disable/enable/reset management actions", () => {
258
258
  it("points to the disabling scope when enabling the wrong scope", () => {
259
259
  fs.mkdirSync(path.join(tempDir, ".selesai"), { recursive: true });
260
260
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
261
- handleManagementAction("disable", { agent: "reviewer", agentScope: "project" }, ctx);
261
+ handleManagementAction("disable", { agent: "commentator", agentScope: "project" }, ctx);
262
262
 
263
- const enabled = handleManagementAction("enable", { agent: "reviewer" }, ctx);
263
+ const enabled = handleManagementAction("enable", { agent: "commentator" }, ctx);
264
264
  assert.equal(enabled.isError, true);
265
265
  assert.match(readText(enabled), /still disabled via a project scope override/);
266
266
  assert.match(readText(enabled), /agentScope: 'project'/);
@@ -277,45 +277,45 @@ describe("agent eject/disable/enable/reset management actions", () => {
277
277
  describe("reset", () => {
278
278
  it("deletes a custom shadow file and restores the bundled builtin", () => {
279
279
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
280
- handleManagementAction("eject", { agent: "reviewer" }, ctx);
281
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer")?.source, "user");
280
+ handleManagementAction("eject", { agent: "commentator" }, ctx);
281
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator")?.source, "user");
282
282
 
283
- const reset = handleManagementAction("reset", { agent: "reviewer" }, ctx);
283
+ const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
284
284
  assert.equal(reset.isError, false);
285
285
  assert.match(readText(reset), /Deleted custom user agent file/);
286
- assert.match(readText(reset), /Reset agent 'reviewer' to its bundled builtin default/);
287
- assert.equal(fs.existsSync(userAgentPath("reviewer")), false);
288
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer")?.source, "builtin");
286
+ assert.match(readText(reset), /Reset agent 'commentator' to its bundled builtin default/);
287
+ assert.equal(fs.existsSync(userAgentPath("commentator")), false);
288
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator")?.source, "builtin");
289
289
  });
290
290
 
291
291
  it("removes a settings override and restores the pristine builtin", () => {
292
292
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
293
- handleManagementAction("disable", { agent: "reviewer" }, ctx);
294
- assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"), undefined);
293
+ handleManagementAction("disable", { agent: "commentator" }, ctx);
294
+ assert.equal(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"), undefined);
295
295
 
296
- const reset = handleManagementAction("reset", { agent: "reviewer" }, ctx);
296
+ const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
297
297
  assert.equal(reset.isError, false);
298
298
  assert.match(readText(reset), /Removed user settings override/);
299
- assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"));
299
+ assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
300
300
  assert.equal((readJson(userSettingsPath()) as { subagents?: unknown }).subagents, undefined);
301
301
  });
302
302
 
303
303
  it("removes both a custom file and a settings override in one reset", () => {
304
304
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
305
- handleManagementAction("eject", { agent: "reviewer" }, ctx);
306
- handleManagementAction("disable", { agent: "reviewer" }, ctx);
305
+ handleManagementAction("eject", { agent: "commentator" }, ctx);
306
+ handleManagementAction("disable", { agent: "commentator" }, ctx);
307
307
 
308
- const reset = handleManagementAction("reset", { agent: "reviewer" }, ctx);
308
+ const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
309
309
  assert.equal(reset.isError, false);
310
310
  assert.match(readText(reset), /Deleted custom user agent file/);
311
311
  assert.match(readText(reset), /Removed user settings override/);
312
- assert.equal(fs.existsSync(userAgentPath("reviewer")), false);
313
- assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "reviewer"));
312
+ assert.equal(fs.existsSync(userAgentPath("commentator")), false);
313
+ assert.ok(discoverAgents(tempDir, "both").agents.find((a) => a.name === "commentator"));
314
314
  });
315
315
 
316
316
  it("reports a no-op when there is nothing to reset in the target scope", () => {
317
317
  const ctx = { cwd: tempDir, modelRegistry: { getAvailable: () => [] } };
318
- const reset = handleManagementAction("reset", { agent: "reviewer" }, ctx);
318
+ const reset = handleManagementAction("reset", { agent: "commentator" }, ctx);
319
319
  assert.equal(reset.isError, false);
320
320
  assert.match(readText(reset), /no user customization to reset/);
321
321
  assert.match(readText(reset), /at its bundled builtin default/);