@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
@@ -21,8 +21,9 @@ import {
21
21
  removeBuiltinAgentOverrideFields,
22
22
  } from "./agents.ts";
23
23
  import { serializeAgent } from "./agent-serializer.ts";
24
+ import { mergeAgentsForScope } from "./agent-selection.ts";
24
25
  import { serializeChain, serializeJsonChain } from "./chain-serializer.ts";
25
- import { discoverAvailableSkills } from "./skills.ts";
26
+ import { discoverAvailableSkills, resolveSkills } from "./skills.ts";
26
27
  import {
27
28
  buildProactiveSkillSubagentRecommendationLines,
28
29
  } from "./proactive-skills.ts";
@@ -30,7 +31,9 @@ import { parseFrontmatter } from "./frontmatter.ts";
30
31
  import { toModelInfo } from "../shared/model-info.ts";
31
32
  import { resolveSubagentModelOverride, type ParentModel } from "../runs/shared/model-fallback.ts";
32
33
  import { validateToolBudgetConfig } from "../runs/shared/tool-budget.ts";
33
- import type { Details, ExtensionConfig, ToolBudgetConfig } from "../shared/types.ts";
34
+ import { resolveTurnBudgetConfig } from "../runs/shared/turn-budget.ts";
35
+ import { validateAcceptanceInput } from "../runs/shared/acceptance.ts";
36
+ import type { AcceptanceInput, Details, ExtensionConfig, ToolBudgetConfig } from "../shared/types.ts";
34
37
  import { getProjectConfigDir } from "../shared/utils.ts";
35
38
 
36
39
  type ManagementAction = "list" | "get" | "models" | "create" | "update" | "delete" | "eject" | "disable" | "enable" | "reset";
@@ -119,7 +122,7 @@ function findChains(name: string, cwd: string, scope: AgentScope = "both"): Chai
119
122
  const raw = name.trim();
120
123
  const sanitized = sanitizeName(raw);
121
124
  return discoverAgentsAll(cwd).chains
122
- .filter((c) => (scope === "both" || c.source === scope) && (c.name === raw || c.name === sanitized))
125
+ .filter((c) => (scope === "both" || c.source === "package" || c.source === scope) && (c.name === raw || c.name === sanitized))
123
126
  .sort((a, b) => a.source.localeCompare(b.source));
124
127
  }
125
128
 
@@ -187,16 +190,25 @@ function fallbackModelsWarning(ctx: ManagementContext, fallbackModels: string[]
187
190
  return missing.length ? `Warning: fallback models not in the current model registry: ${missing.join(", ")}.` : undefined;
188
191
  }
189
192
 
190
- function skillsWarning(cwd: string, skills: string[] | undefined): string | undefined {
191
- if (!skills || skills.length === 0) return undefined;
192
- const available = new Set(discoverAvailableSkills(cwd).map((s) => s.name));
193
- const missing = skills.filter((s) => !available.has(s));
193
+ function skillsWarning(cwd: string, agent: Pick<AgentConfig, "skills" | "skillPath" | "filePath">): string | undefined {
194
+ if (!agent.skills?.length) return undefined;
195
+ const { missing } = resolveSkills(
196
+ agent.skills,
197
+ cwd,
198
+ agent.skillPath,
199
+ agent.filePath ? path.dirname(agent.filePath) : cwd,
200
+ );
194
201
  return missing.length ? `Warning: skills not found: ${missing.join(", ")}.` : undefined;
195
202
  }
196
203
 
197
- function editableAgentConfig(agent: AgentConfig): AgentConfig {
204
+ export function editableAgentConfig(agent: AgentConfig): AgentConfig {
198
205
  const base = agent.override?.base;
199
- if (!base) return { ...agent };
206
+ if (!base) {
207
+ return {
208
+ ...agent,
209
+ extensions: agent.extensionsFromDefault ? undefined : agent.extensions ? [...agent.extensions] : undefined,
210
+ };
211
+ }
200
212
 
201
213
  return {
202
214
  ...agent,
@@ -207,11 +219,14 @@ function editableAgentConfig(agent: AgentConfig): AgentConfig {
207
219
  inheritProjectContext: base.inheritProjectContext,
208
220
  inheritSkills: base.inheritSkills,
209
221
  defaultContext: base.defaultContext,
222
+ acceptanceRole: base.acceptanceRole,
210
223
  disabled: base.disabled,
211
224
  systemPrompt: base.systemPrompt,
212
225
  skills: base.skills ? [...base.skills] : undefined,
226
+ skillPath: base.skillPath ? [...base.skillPath] : undefined,
213
227
  tools: base.tools ? [...base.tools] : undefined,
214
228
  mcpDirectTools: base.mcpDirectTools ? [...base.mcpDirectTools] : undefined,
229
+ extensions: base.extensions ? [...base.extensions] : undefined,
215
230
  subagentOnlyExtensions: base.subagentOnlyExtensions ? [...base.subagentOnlyExtensions] : undefined,
216
231
  completionGuard: base.completionGuard,
217
232
  override: undefined,
@@ -227,7 +242,7 @@ function readAgentFrontmatterFields(filePath: string): Set<string> {
227
242
  }
228
243
  }
229
244
 
230
- function preservedAgentFrontmatterFields(agent: AgentConfig, cfg: Record<string, unknown>): Set<string> {
245
+ export function preservedAgentFrontmatterFields(agent: AgentConfig, cfg: Record<string, unknown>): Set<string> {
231
246
  const fields = readAgentFrontmatterFields(agent.filePath);
232
247
  const changed = (...names: string[]) => {
233
248
  for (const name of names) fields.delete(name);
@@ -241,6 +256,7 @@ function preservedAgentFrontmatterFields(agent: AgentConfig, cfg: Record<string,
241
256
  if (hasKey(cfg, "fallbackModels")) changed("fallbackModels");
242
257
  if (hasKey(cfg, "tools")) changed("tools");
243
258
  if (hasKey(cfg, "skills")) changed("skill", "skills");
259
+ if (hasKey(cfg, "skillPath")) changed("skillPath");
244
260
  if (hasKey(cfg, "extensions")) changed("extensions");
245
261
  if (hasKey(cfg, "subagentOnlyExtensions")) changed("subagentOnlyExtensions");
246
262
  if (hasKey(cfg, "thinking")) {
@@ -260,6 +276,11 @@ function preservedAgentFrontmatterFields(agent: AgentConfig, cfg: Record<string,
260
276
  fields.add("inheritSkills");
261
277
  }
262
278
  if (hasKey(cfg, "defaultContext")) changed("defaultContext");
279
+ if (hasKey(cfg, "async")) changed("async");
280
+ if (hasKey(cfg, "timeoutMs")) changed("timeoutMs");
281
+ if (hasKey(cfg, "turnBudget")) changed("turnBudget");
282
+ if (hasKey(cfg, "acceptance")) changed("acceptance");
283
+ if (hasKey(cfg, "acceptanceRole")) changed("acceptanceRole");
263
284
  if (hasKey(cfg, "output")) changed("output");
264
285
  if (hasKey(cfg, "reads")) changed("defaultReads");
265
286
  if (hasKey(cfg, "progress")) changed("defaultProgress");
@@ -382,6 +403,14 @@ function applyAgentConfig(target: AgentConfig, cfg: Record<string, unknown>): st
382
403
  else if (typeof cfg.skills === "string") { const skills = parseCsv(cfg.skills); target.skills = skills.length ? skills : undefined; }
383
404
  else return "config.skills must be a comma-separated string or false when provided.";
384
405
  }
406
+ if (hasKey(cfg, "skillPath")) {
407
+ if (cfg.skillPath === false || cfg.skillPath === "") target.skillPath = undefined;
408
+ else if (typeof cfg.skillPath === "string") { const skillPath = parseCsv(cfg.skillPath); target.skillPath = skillPath.length ? skillPath : undefined; }
409
+ else if (Array.isArray(cfg.skillPath) && cfg.skillPath.every((entry) => typeof entry === "string")) {
410
+ const skillPath = [...new Set(cfg.skillPath.map((entry) => entry.trim()).filter(Boolean))];
411
+ target.skillPath = skillPath.length ? skillPath : undefined;
412
+ } else return "config.skillPath must be a comma-separated string, string array, or false when provided.";
413
+ }
385
414
  if (hasKey(cfg, "extensions")) {
386
415
  if (cfg.extensions === false) target.extensions = undefined;
387
416
  else if (cfg.extensions === "") target.extensions = [];
@@ -416,6 +445,37 @@ function applyAgentConfig(target: AgentConfig, cfg: Record<string, unknown>): st
416
445
  else if (cfg.defaultContext === "fresh" || cfg.defaultContext === "fork") target.defaultContext = cfg.defaultContext;
417
446
  else return "config.defaultContext must be 'fresh', 'fork', or false when provided.";
418
447
  }
448
+ if (hasKey(cfg, "async")) {
449
+ if (cfg.async === "") target.defaultAsync = undefined;
450
+ else if (typeof cfg.async === "boolean") target.defaultAsync = cfg.async;
451
+ else return "config.async must be a boolean or empty string when provided.";
452
+ }
453
+ if (hasKey(cfg, "timeoutMs")) {
454
+ if (cfg.timeoutMs === false || cfg.timeoutMs === "") target.defaultTimeoutMs = undefined;
455
+ else if (typeof cfg.timeoutMs === "number" && Number.isInteger(cfg.timeoutMs) && cfg.timeoutMs > 0) target.defaultTimeoutMs = cfg.timeoutMs;
456
+ else return "config.timeoutMs must be a positive integer or false when provided.";
457
+ }
458
+ if (hasKey(cfg, "turnBudget")) {
459
+ if (cfg.turnBudget === false || cfg.turnBudget === "") target.defaultTurnBudget = undefined;
460
+ else {
461
+ const resolved = resolveTurnBudgetConfig(cfg.turnBudget, "config.turnBudget");
462
+ if (resolved.error) return resolved.error;
463
+ target.defaultTurnBudget = resolved.turnBudget;
464
+ }
465
+ }
466
+ if (hasKey(cfg, "acceptance")) {
467
+ if (cfg.acceptance === "") target.defaultAcceptance = undefined;
468
+ else {
469
+ const errors = validateAcceptanceInput(cfg.acceptance, "config.acceptance");
470
+ if (errors.length > 0) return errors.join(" ");
471
+ target.defaultAcceptance = cfg.acceptance as AcceptanceInput;
472
+ }
473
+ }
474
+ if (hasKey(cfg, "acceptanceRole")) {
475
+ if (cfg.acceptanceRole === false || cfg.acceptanceRole === "") target.acceptanceRole = undefined;
476
+ else if (cfg.acceptanceRole === "read-only" || cfg.acceptanceRole === "writer") target.acceptanceRole = cfg.acceptanceRole;
477
+ else return "config.acceptanceRole must be 'read-only', 'writer', or false when provided.";
478
+ }
419
479
  if (hasKey(cfg, "output")) {
420
480
  if (cfg.output === false || cfg.output === "") target.output = undefined;
421
481
  else if (typeof cfg.output === "string") target.output = cfg.output;
@@ -508,10 +568,16 @@ function formatAgentDetail(agent: AgentConfig): string {
508
568
  if (agent.fallbackModels?.length) lines.push(`Fallback models: ${agent.fallbackModels.join(", ")}`);
509
569
  if (tools.length) lines.push(`Tools: ${tools.join(", ")}`);
510
570
  if (agent.skills?.length) lines.push(`Skills: ${agent.skills.join(", ")}`);
571
+ if (agent.skillPath?.length) lines.push(`Skill paths: ${agent.skillPath.join(", ")}`);
511
572
  lines.push(`System prompt mode: ${agent.systemPromptMode}`);
512
573
  lines.push(`Inherit project context: ${agent.inheritProjectContext ? "true" : "false"}`);
513
574
  lines.push(`Inherit skills: ${agent.inheritSkills ? "true" : "false"}`);
514
575
  if (agent.defaultContext) lines.push(`Default context: ${agent.defaultContext}`);
576
+ if (agent.defaultAsync !== undefined) lines.push(`Async: ${agent.defaultAsync ? "true" : "false"}`);
577
+ if (agent.defaultTimeoutMs !== undefined) lines.push(`Timeout: ${agent.defaultTimeoutMs}ms`);
578
+ if (agent.defaultTurnBudget) lines.push(`Turn budget: ${JSON.stringify(agent.defaultTurnBudget)}`);
579
+ if (agent.defaultAcceptance !== undefined) lines.push(`Acceptance: ${typeof agent.defaultAcceptance === "object" ? JSON.stringify(agent.defaultAcceptance) : String(agent.defaultAcceptance)}`);
580
+ if (agent.acceptanceRole) lines.push(`Acceptance role: ${agent.acceptanceRole}`);
515
581
  if (agent.source === "builtin") lines.push(`Disabled: ${agent.disabled ? "true" : "false"}`);
516
582
  if (agent.extensions !== undefined) lines.push(`Extensions: ${agent.extensions.length ? agent.extensions.join(", ") : "(none)"}`);
517
583
  if (agent.subagentOnlyExtensions !== undefined) lines.push(`Subagent-only extensions: ${agent.subagentOnlyExtensions.length ? agent.subagentOnlyExtensions.join(", ") : "(none)"}`);
@@ -580,7 +646,8 @@ function formatChainDetail(chain: ChainConfig): string {
580
646
  export function handleList(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {
581
647
  const scope = normalizeListScope(params.agentScope) ?? "both";
582
648
  const d = discoverAgentsAll(ctx.cwd);
583
- const scopedAgents = allAgents(d).filter((a) => scope === "both" || a.source === "builtin" || a.source === "package" || a.source === scope).sort((a, b) => a.name.localeCompare(b.name));
649
+ const scopedAgents = mergeAgentsForScope(scope, d.user, d.project, d.builtin, d.package)
650
+ .sort((a, b) => a.name.localeCompare(b.name));
584
651
  const agents = scopedAgents.filter((a) => !a.disabled);
585
652
  const chains = d.chains.filter((c) => scope === "both" || c.source === "package" || c.source === scope).sort((a, b) => a.name.localeCompare(b.name));
586
653
  const diagnostics = d.chainDiagnostics.filter((entry) => scope === "both" || entry.source === scope);
@@ -687,11 +754,17 @@ function handleModels(params: ManagementParams, ctx: ManagementContext): AgentTo
687
754
 
688
755
  function handleGet(params: ManagementParams, ctx: ManagementContext): AgentToolResult<Details> {
689
756
  if (!params.agent && !params.chainName) return result("Specify 'agent' or 'chainName' for get.", true);
757
+ const scope = normalizeListScope(params.agentScope);
758
+ if (!scope) return result("agentScope must be 'user', 'project', or 'both' for get.", true);
690
759
  const hasBoth = Boolean(params.agent && params.chainName);
691
760
  const blocks: string[] = [];
692
761
  let anyFound = false;
693
762
  if (params.agent) {
694
- const matches = findAgents(params.agent, ctx.cwd, "both");
763
+ const raw = params.agent.trim();
764
+ const sanitized = sanitizeName(raw);
765
+ const d = discoverAgentsAll(ctx.cwd);
766
+ const matches = mergeAgentsForScope(scope, d.user, d.project, d.builtin, d.package)
767
+ .filter((agent) => agent.name === raw || agent.name === sanitized);
695
768
  if (!matches.length) {
696
769
  const msg = `Agent '${params.agent}' not found. Available: ${availableNames(ctx.cwd, "agent").join(", ") || "none"}.`;
697
770
  if (!hasBoth) return result(msg, true);
@@ -702,7 +775,7 @@ function handleGet(params: ManagementParams, ctx: ManagementContext): AgentToolR
702
775
  }
703
776
  }
704
777
  if (params.chainName) {
705
- const matches = findChains(params.chainName, ctx.cwd, "both");
778
+ const matches = findChains(params.chainName, ctx.cwd, scope);
706
779
  if (!matches.length) {
707
780
  const msg = `Chain '${params.chainName}' not found. Available: ${availableNames(ctx.cwd, "chain").join(", ") || "none"}.`;
708
781
  if (!hasBoth) return result(msg, true);
@@ -770,7 +843,7 @@ export function handleCreate(params: ManagementParams, ctx: ManagementContext):
770
843
  if (mw) warnings.push(mw);
771
844
  const fmw = fallbackModelsWarning(ctx, agent.fallbackModels);
772
845
  if (fmw) warnings.push(fmw);
773
- const sw = skillsWarning(ctx.cwd, agent.skills);
846
+ const sw = skillsWarning(ctx.cwd, agent);
774
847
  if (sw) warnings.push(sw);
775
848
  fs.writeFileSync(targetPath, serializeAgent(agent), "utf-8");
776
849
  return result([`Created agent '${runtimeName}' at ${targetPath}.`, ...warnings].join("\n"));
@@ -819,8 +892,8 @@ export function handleUpdate(params: ManagementParams, ctx: ManagementContext):
819
892
  const fmw = fallbackModelsWarning(ctx, updated.fallbackModels);
820
893
  if (fmw) warnings.push(fmw);
821
894
  }
822
- if (hasKey(cfg, "skills")) {
823
- const sw = skillsWarning(ctx.cwd, updated.skills);
895
+ if (hasKey(cfg, "skills") || hasKey(cfg, "skillPath")) {
896
+ const sw = skillsWarning(ctx.cwd, updated);
824
897
  if (sw) warnings.push(sw);
825
898
  }
826
899
  if (updated.name !== oldName) {
@@ -13,8 +13,14 @@ export const KNOWN_FIELDS = new Set([
13
13
  "inheritProjectContext",
14
14
  "inheritSkills",
15
15
  "defaultContext",
16
+ "async",
17
+ "timeoutMs",
18
+ "turnBudget",
19
+ "acceptance",
20
+ "acceptanceRole",
16
21
  "skill",
17
22
  "skills",
23
+ "skillPath",
18
24
  "extensions",
19
25
  "subagentOnlyExtensions",
20
26
  "output",
@@ -62,9 +68,22 @@ export function serializeAgent(config: AgentConfig, options: SerializeAgentOptio
62
68
  if (!preservingExistingFrontmatter || preserve("inheritProjectContext")) lines.push(`inheritProjectContext: ${config.inheritProjectContext ? "true" : "false"}`);
63
69
  if (!preservingExistingFrontmatter || preserve("inheritSkills")) lines.push(`inheritSkills: ${config.inheritSkills ? "true" : "false"}`);
64
70
  if (config.defaultContext || preserve("defaultContext")) lines.push(`defaultContext: ${config.defaultContext ?? ""}`);
71
+ if (config.defaultAsync !== undefined || preserve("async")) lines.push(`async: ${config.defaultAsync === undefined ? "" : config.defaultAsync ? "true" : "false"}`);
72
+ if (config.defaultTimeoutMs !== undefined || preserve("timeoutMs")) lines.push(`timeoutMs: ${config.defaultTimeoutMs ?? ""}`);
73
+ if (config.defaultTurnBudget || preserve("turnBudget")) lines.push(`turnBudget: ${config.defaultTurnBudget ? JSON.stringify(config.defaultTurnBudget) : ""}`);
74
+ if (config.defaultAcceptance !== undefined || preserve("acceptance")) {
75
+ lines.push(`acceptance: ${config.defaultAcceptance === undefined
76
+ ? ""
77
+ : typeof config.defaultAcceptance === "object"
78
+ ? JSON.stringify(config.defaultAcceptance)
79
+ : String(config.defaultAcceptance)}`);
80
+ }
81
+ if (config.acceptanceRole || preserve("acceptanceRole")) lines.push(`acceptanceRole: ${config.acceptanceRole ?? ""}`);
65
82
 
66
83
  const skillsValue = joinComma(config.skills);
67
84
  if (skillsValue || preserve("skill", "skills")) lines.push(`skills: ${skillsValue ?? ""}`);
85
+ const skillPathValue = joinComma(config.skillPath);
86
+ if (skillPathValue || preserve("skillPath")) lines.push(`skillPath: ${skillPathValue ?? ""}`);
68
87
 
69
88
  if (config.extensions !== undefined) {
70
89
  const extensionsValue = joinComma(config.extensions);