@iowarp/clio-coder 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (988) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +50 -53
  3. package/dist/acp-FPR54DGL.js +138 -0
  4. package/dist/{agents-Q4MYPMUW.js → agents-OGPIHPJH.js} +33 -25
  5. package/dist/assets/codewiki.json +1 -0
  6. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
  7. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
  8. package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
  9. package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
  10. package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
  11. package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
  12. package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
  13. package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
  14. package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
  15. package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
  16. package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
  17. package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
  18. package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
  19. package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
  20. package/dist/assets/grammars/tree-sitter.wasm +0 -0
  21. package/dist/{auth-O6HYIJ6J.js → auth-IC3K6NIZ.js} +22 -15
  22. package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
  23. package/dist/chunk-3I7MS7N2.js +40 -0
  24. package/dist/chunk-3R73A4XB.js +69 -0
  25. package/dist/{chunk-26BZQOAD.js → chunk-474KN5II.js} +86 -115
  26. package/dist/{chunk-NI4DEJMC.js → chunk-4QKXUHSR.js} +26 -3
  27. package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
  28. package/dist/{chunk-TFSSEXL6.js → chunk-673JJUWJ.js} +14 -4
  29. package/dist/{chunk-GNGDQYDU.js → chunk-7SS2CTV2.js} +27922 -1249
  30. package/dist/{chunk-7RBKDI66.js → chunk-ASND7OZK.js} +104 -12
  31. package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
  32. package/dist/{chunk-RQDWMVRB.js → chunk-BSU2YIWB.js} +9 -3
  33. package/dist/{chunk-CLJ5HLUD.js → chunk-C4PTHK7P.js} +24 -5
  34. package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
  35. package/dist/{chunk-BYEU76JP.js → chunk-DKGKUHFA.js} +34 -9
  36. package/dist/chunk-EYOKLTMF.js +170 -0
  37. package/dist/{chunk-PS4PFJQP.js → chunk-FCIH3BIZ.js} +15258 -14130
  38. package/dist/{chunk-2J63S4SF.js → chunk-FST4FYJB.js} +82 -14
  39. package/dist/{chunk-3DANZDGR.js → chunk-G34LV2PF.js} +34 -9
  40. package/dist/{chunk-BBUH4VAA.js → chunk-GAEBEQVI.js} +34 -21
  41. package/dist/chunk-GB6QRBXN.js +8543 -0
  42. package/dist/chunk-GEP36Y4X.js +12796 -0
  43. package/dist/{chunk-TKHQ4DGZ.js → chunk-H6F6BYOH.js} +496 -121
  44. package/dist/{chunk-UGYAX5YI.js → chunk-HQQID6OA.js} +10 -5
  45. package/dist/chunk-IHXBNWMM.js +137 -0
  46. package/dist/{chunk-ME6DNWIU.js → chunk-IS3ONKU3.js} +7 -1
  47. package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
  48. package/dist/chunk-K2ITRMHZ.js +642 -0
  49. package/dist/{chunk-KBR4MZZR.js → chunk-K5XEMXTI.js} +7 -1
  50. package/dist/{chunk-AMFR5YA3.js → chunk-KKNLWXI6.js} +24 -10
  51. package/dist/{chunk-JWHCJDCI.js → chunk-KY56HMHH.js} +145 -61
  52. package/dist/{chunk-E3NYWENM.js → chunk-LU4TK2PR.js} +52 -7
  53. package/dist/{chunk-UWIJNAOB.js → chunk-M5T5VO65.js} +109 -42
  54. package/dist/{chunk-JPOWPFCU.js → chunk-MAR7Y6HW.js} +38 -16
  55. package/dist/chunk-N6F52NLF.js +6951 -0
  56. package/dist/{chunk-UHTSULZS.js → chunk-NMOX6HFD.js} +20 -7
  57. package/dist/{chunk-WD6AJM35.js → chunk-OLBBMFRD.js} +30 -13
  58. package/dist/{chunk-VOO7NYPP.js → chunk-PFEFKVGL.js} +22 -6
  59. package/dist/{chunk-6CWDTGUC.js → chunk-PIUMUEMV.js} +7 -1
  60. package/dist/chunk-PV4JUBVJ.js +462 -0
  61. package/dist/{chunk-527KG6XR.js → chunk-Q3RUPKEJ.js} +22 -4
  62. package/dist/{chunk-D5YD55AR.js → chunk-Q5WJOSJ7.js} +11 -1
  63. package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
  64. package/dist/{chunk-4UQA7NCT.js → chunk-R5KLMSBV.js} +7 -2
  65. package/dist/{chunk-PIDUD6M2.js → chunk-RDLVBZEO.js} +11 -6
  66. package/dist/{chunk-O4EJEDHO.js → chunk-RPTR2H26.js} +40 -31
  67. package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
  68. package/dist/{chunk-XNISANGE.js → chunk-TEKV33Q5.js} +122 -57
  69. package/dist/chunk-TXOTCRLG.js +15 -0
  70. package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
  71. package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
  72. package/dist/{chunk-UU3R62TT.js → chunk-XYWBQRDM.js} +13 -4
  73. package/dist/{chunk-7BHLZB3A.js → chunk-ZPY3JZ5E.js} +32 -10
  74. package/dist/cli/index.js +39 -33
  75. package/dist/clio-BZVGEUFJ.js +58 -0
  76. package/dist/{components-JVHMUBEB.js → components-DMAOEKFB.js} +26 -9
  77. package/dist/{config-ZFCDBMDC.js → config-IRUQ7SE4.js} +42 -31
  78. package/dist/configure-S7S6F6CL.js +32 -0
  79. package/dist/{context-CDXTP2MP.js → context-3KWFLHJG.js} +17 -11
  80. package/dist/{context-E3KIFVXI.js → context-5RADCKTR.js} +33 -28
  81. package/dist/{context-clear-3F4PLXOS.js → context-clear-7TSNPAAI.js} +36 -28
  82. package/dist/{context-index-Q7YSYTR3.js → context-index-W4RLWOQH.js} +10 -4
  83. package/dist/{docs-YIETIWZI.js → docs-5AWSPS37.js} +16 -10
  84. package/dist/doctor-UC5NAJYQ.js +77 -0
  85. package/dist/{eval-B3KZZESM.js → eval-U6TJHRLX.js} +77 -24
  86. package/dist/{evidence-V67CHM35.js → evidence-YEGUW4L3.js} +34 -26
  87. package/dist/{evolve-YDZSUQYA.js → evolve-TXARCTPG.js} +39 -26
  88. package/dist/{extensions-SRG7XCAH.js → extensions-OZFJ3A3G.js} +13 -7
  89. package/dist/{fleet-CA2CRTVG.js → fleet-6G3DHNYE.js} +45 -37
  90. package/dist/fleet-preflight-DSNT37JK.js +23 -0
  91. package/dist/{init-2OZDJE2D.js → init-KZ5QTF6M.js} +42 -34
  92. package/dist/{memory-3PIQQAKX.js → memory-73ESV5YC.js} +35 -27
  93. package/dist/{models-DY35XI7Y.js → models-A4PVNWJK.js} +34 -23
  94. package/dist/{paths-5OMXW7Z4.js → paths-C4H6IV77.js} +12 -6
  95. package/dist/preload-6WVMHX3A.js +13 -0
  96. package/dist/{reset-PIFYNOS3.js → reset-BGW6OGMV.js} +17 -11
  97. package/dist/{run-3VSPP24F.js → run-YTPEYQOH.js} +60 -48
  98. package/dist/{share-D36RQCXM.js → share-YIFFV4NQ.js} +16 -10
  99. package/dist/{skills-F2MRLELY.js → skills-2V6RA3OQ.js} +18 -11
  100. package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-S2TVJO4F.js} +45 -36
  101. package/dist/{targets-DZMEZAH4.js → targets-TYXLPB23.js} +61 -59
  102. package/dist/{trace-7NYCUI2J.js → trace-GGOJ6Q6Z.js} +9 -3
  103. package/dist/{uninstall-AD3JWHBB.js → uninstall-LLLT4F4W.js} +14 -8
  104. package/dist/{upgrade-WYYBKGDY.js → upgrade-33G2LMM5.js} +45 -23
  105. package/dist/{usage-ULIDAGFF.js → usage-ZAFSXKKG.js} +35 -27
  106. package/dist/version-KGEG7EPO.js +21 -0
  107. package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-NUQCVOQ3.js} +55 -45
  108. package/dist/worker/entry.js +101 -43
  109. package/docs/README.md +12 -9
  110. package/docs/acp.md +28 -5
  111. package/docs/alcf-provider.md +1 -1
  112. package/docs/architecture.md +23 -2
  113. package/docs/artifact-placement.md +101 -0
  114. package/docs/artifact-versions.md +1 -1
  115. package/docs/built-in-agents.md +4 -2
  116. package/docs/capacity-and-scheduling.md +1 -1
  117. package/docs/commands-and-modes.md +125 -41
  118. package/docs/configuration-and-targets.md +88 -18
  119. package/docs/context-engine.md +6 -2
  120. package/docs/development-pipeline.md +77 -0
  121. package/docs/documentation-coverage.md +4 -4
  122. package/docs/documentation-guide.md +3 -3
  123. package/docs/environment-variables.md +2 -1
  124. package/docs/eval-runner.md +3 -3
  125. package/docs/evals-internal.md +2 -2
  126. package/docs/evidence-and-memory.md +6 -2
  127. package/docs/evolution.md +1 -1
  128. package/docs/exit-codes-and-output.md +1 -1
  129. package/docs/extensions-and-sharing.md +18 -11
  130. package/docs/fleet-demo-runbook.md +22 -23
  131. package/docs/fleet-dispatch.md +111 -12
  132. package/docs/glossary.md +107 -15
  133. package/docs/html/agents_blueprint.html +3 -3
  134. package/docs/html/alcf_blueprint.html +3 -3
  135. package/docs/html/architecture_blueprint.html +3 -3
  136. package/docs/html/commands_blueprint.html +187 -42
  137. package/docs/html/configuration_blueprint.html +7 -7
  138. package/docs/html/context_blueprint.html +3 -3
  139. package/docs/html/documentation_blueprint.html +1 -1
  140. package/docs/html/environment_blueprint.html +3 -3
  141. package/docs/html/eval_blueprint.html +4 -4
  142. package/docs/html/evals_internal_blueprint.html +3 -3
  143. package/docs/html/evolution_blueprint.html +3 -3
  144. package/docs/html/extensions_blueprint.html +3 -3
  145. package/docs/html/fleet_dispatch_blueprint.html +8 -8
  146. package/docs/html/index.html +5 -5
  147. package/docs/html/lifecycle_blueprint.html +4 -4
  148. package/docs/html/memory_blueprint.html +3 -3
  149. package/docs/html/middleware_blueprint.html +3 -3
  150. package/docs/html/models_blueprint.html +2 -2
  151. package/docs/html/observability_blueprint.html +2 -2
  152. package/docs/html/provider_adapter_blueprint.html +3 -3
  153. package/docs/html/safety_blueprint.html +3 -3
  154. package/docs/html/skills_blueprint.html +2 -2
  155. package/docs/html/soak_blueprint.html +3 -3
  156. package/docs/html/tool_usage_blueprint.html +4 -4
  157. package/docs/html/tools_blueprint.html +2 -2
  158. package/docs/html/trace_blueprint.html +3 -3
  159. package/docs/html/tui_design_blueprint.html +100 -40
  160. package/docs/html/validation_blueprint.html +1 -1
  161. package/docs/html/worker_dispatch_blueprint.html +3 -3
  162. package/docs/installation-and-lifecycle.md +62 -11
  163. package/docs/middleware-and-components.md +1 -1
  164. package/docs/model-catalog.md +2 -2
  165. package/docs/observability.md +3 -3
  166. package/docs/proactive-memory.md +12 -12
  167. package/docs/prompt-envelope-and-tools.md +2 -2
  168. package/docs/provider-adapter-cookbook.md +1 -1
  169. package/docs/release-cut-checklist.md +4 -0
  170. package/docs/safety-model.md +21 -5
  171. package/docs/scientific-validation.md +3 -3
  172. package/docs/session-lifecycle.md +2 -2
  173. package/docs/skills-marketplace.md +1 -1
  174. package/docs/time-conventions.md +101 -0
  175. package/docs/tool-usage.md +5 -4
  176. package/docs/trace-store.md +1 -1
  177. package/docs/troubleshooting.md +1 -1
  178. package/docs/tui-design.md +83 -27
  179. package/docs/worker-dispatch-mechanics.md +3 -3
  180. package/package.json +16 -16
  181. package/skills/README.md +5 -6
  182. package/skills/git/file-ticket/SKILL.md +107 -0
  183. package/skills/git/file-ticket/evals.md +54 -0
  184. package/skills/git/fix-issue/SKILL.md +106 -0
  185. package/skills/git/fix-issue/evals.md +71 -0
  186. package/skills/git/ship/SKILL.md +92 -0
  187. package/skills/git/ship/evals.md +72 -0
  188. package/skills/skill-marketplace.json +12 -20
  189. package/src/cli/acp.ts +88 -0
  190. package/src/cli/agents.ts +60 -0
  191. package/src/cli/args.ts +280 -0
  192. package/src/cli/argv.ts +170 -0
  193. package/src/cli/ask.ts +34 -0
  194. package/src/cli/auth.ts +468 -0
  195. package/src/cli/bootstrap-generate.ts +498 -0
  196. package/src/cli/clio.ts +34 -0
  197. package/src/cli/components.ts +195 -0
  198. package/src/cli/config-inspect.ts +330 -0
  199. package/src/cli/config.ts +72 -0
  200. package/src/cli/configure-interop.ts +67 -0
  201. package/src/cli/configure-layout.ts +172 -0
  202. package/src/cli/configure.ts +1487 -0
  203. package/src/cli/context-clear.ts +76 -0
  204. package/src/cli/context-index.ts +102 -0
  205. package/src/cli/context.ts +316 -0
  206. package/src/cli/default-target.ts +63 -0
  207. package/src/cli/docs.ts +340 -0
  208. package/src/cli/doctor.ts +54 -0
  209. package/src/cli/eval.ts +315 -0
  210. package/src/cli/evidence.ts +222 -0
  211. package/src/cli/evolve.ts +219 -0
  212. package/src/cli/extensions.ts +205 -0
  213. package/src/cli/fleet.ts +827 -0
  214. package/src/cli/index.ts +309 -0
  215. package/src/cli/init.ts +219 -0
  216. package/src/cli/initial-message.ts +47 -0
  217. package/src/cli/internal-dispatch.ts +55 -0
  218. package/src/cli/memory.ts +180 -0
  219. package/src/cli/models.ts +257 -0
  220. package/src/cli/modes/json-stream.ts +85 -0
  221. package/src/cli/modes/jsonl.ts +9 -0
  222. package/src/cli/modes/print.ts +589 -0
  223. package/src/cli/oauth-manual-input.ts +72 -0
  224. package/src/cli/oauth-select.ts +36 -0
  225. package/src/cli/output-guard.ts +48 -0
  226. package/src/cli/paths.ts +44 -0
  227. package/src/cli/provider-target.ts +113 -0
  228. package/src/cli/removal.ts +72 -0
  229. package/src/cli/reset.ts +253 -0
  230. package/src/cli/run.ts +497 -0
  231. package/src/cli/share.ts +243 -0
  232. package/src/cli/shared.ts +60 -0
  233. package/src/cli/skills-eval.ts +1225 -0
  234. package/src/cli/skills.ts +470 -0
  235. package/src/cli/steer-channel.ts +86 -0
  236. package/src/cli/targets.ts +1150 -0
  237. package/src/cli/text-layout.ts +102 -0
  238. package/src/cli/trace.ts +274 -0
  239. package/src/cli/uninstall.ts +405 -0
  240. package/src/cli/upgrade.ts +270 -0
  241. package/src/cli/usage.ts +869 -0
  242. package/src/cli/validate-model.ts +28 -0
  243. package/src/cli/version.ts +7 -0
  244. package/src/cli/wiki-generate.ts +509 -0
  245. package/src/core/artifact-paths.ts +43 -0
  246. package/src/core/bash-exec.ts +242 -0
  247. package/src/core/boot-trace.ts +37 -0
  248. package/src/core/bus-events.ts +728 -0
  249. package/src/core/bus-trace.ts +53 -0
  250. package/src/core/c-header-language.ts +265 -0
  251. package/src/core/clio-repo.ts +78 -0
  252. package/src/core/config.ts +1593 -0
  253. package/src/core/context-floor.ts +33 -0
  254. package/src/core/defaults.ts +625 -0
  255. package/src/core/domain-loader.ts +170 -0
  256. package/src/core/event-bus.ts +94 -0
  257. package/src/core/file-references.ts +282 -0
  258. package/src/core/guardrails.ts +185 -0
  259. package/src/core/headless-permission.ts +21 -0
  260. package/src/core/init.ts +223 -0
  261. package/src/core/json-payload.ts +58 -0
  262. package/src/core/package-root.ts +54 -0
  263. package/src/core/path-canonical.ts +37 -0
  264. package/src/core/process-identity.ts +41 -0
  265. package/src/core/recent-models.ts +91 -0
  266. package/src/core/release.ts +2 -0
  267. package/src/core/residency-protection.ts +56 -0
  268. package/src/core/resolve-config-value.ts +88 -0
  269. package/src/core/response-schema.ts +279 -0
  270. package/src/core/run-overrides.ts +77 -0
  271. package/src/core/safe-exec.ts +193 -0
  272. package/src/core/safe-id.ts +37 -0
  273. package/src/core/safe-resource-write.ts +162 -0
  274. package/src/core/session-routing.ts +339 -0
  275. package/src/core/settings-layers.ts +220 -0
  276. package/src/core/shared-bus.ts +8 -0
  277. package/src/core/shell-quote.ts +26 -0
  278. package/src/core/skill-activation.ts +190 -0
  279. package/src/core/startup-timer.ts +37 -0
  280. package/src/core/state-file-lock.ts +207 -0
  281. package/src/core/termination.ts +202 -0
  282. package/src/core/timers.ts +38 -0
  283. package/src/core/tool-names.ts +65 -0
  284. package/src/core/verification-scripts.ts +13 -0
  285. package/src/core/workspace-files.ts +492 -0
  286. package/src/core/xdg.ts +177 -0
  287. package/src/domains/agents/builtins/architect.md +4 -4
  288. package/src/domains/agents/builtins/coder.md +3 -2
  289. package/src/domains/agents/builtins/debugger.md +1 -1
  290. package/src/domains/agents/builtins/documenter.md +1 -1
  291. package/src/domains/agents/builtins/git-master.md +3 -3
  292. package/src/domains/agents/builtins/provenance.md +1 -1
  293. package/src/domains/agents/builtins/researcher.md +1 -1
  294. package/src/domains/agents/builtins/scout.md +1 -1
  295. package/src/domains/agents/builtins/tester.md +1 -1
  296. package/src/domains/agents/builtins/verifier.md +1 -1
  297. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  298. package/src/domains/agents/catalog.ts +172 -0
  299. package/src/domains/agents/contract.ts +16 -0
  300. package/src/domains/agents/extension.ts +110 -0
  301. package/src/domains/agents/fleet-commands.ts +154 -0
  302. package/src/domains/agents/fleet-contract.ts +797 -0
  303. package/src/domains/agents/frontmatter.ts +40 -0
  304. package/src/domains/agents/index.ts +102 -0
  305. package/src/domains/agents/manifest.ts +6 -0
  306. package/src/domains/agents/recipe-schema.ts +202 -0
  307. package/src/domains/agents/recipe.ts +125 -0
  308. package/src/domains/agents/registry.ts +111 -0
  309. package/src/domains/agents/result-contract.ts +1265 -0
  310. package/src/domains/agents/spec.ts +371 -0
  311. package/src/domains/agents/write-boundary.ts +109 -0
  312. package/src/domains/components/diff.ts +99 -0
  313. package/src/domains/components/hash.ts +21 -0
  314. package/src/domains/components/index.ts +3 -0
  315. package/src/domains/components/scan.ts +304 -0
  316. package/src/domains/components/snapshot.ts +108 -0
  317. package/src/domains/components/types.ts +82 -0
  318. package/src/domains/config/agent-namespace.ts +13 -0
  319. package/src/domains/config/classify.ts +94 -0
  320. package/src/domains/config/contract.ts +22 -0
  321. package/src/domains/config/extension.ts +136 -0
  322. package/src/domains/config/index.ts +13 -0
  323. package/src/domains/config/keybindings.ts +164 -0
  324. package/src/domains/config/manifest.ts +6 -0
  325. package/src/domains/config/watcher.ts +41 -0
  326. package/src/domains/context/adoption.ts +880 -0
  327. package/src/domains/context/bootstrap-prompt.ts +273 -0
  328. package/src/domains/context/bootstrap.ts +1409 -0
  329. package/src/domains/context/clear.ts +86 -0
  330. package/src/domains/context/clio-md.ts +327 -0
  331. package/src/domains/context/codewiki/cmake.ts +356 -0
  332. package/src/domains/context/codewiki/cooperative.ts +46 -0
  333. package/src/domains/context/codewiki/digest.ts +135 -0
  334. package/src/domains/context/codewiki/grammar-assets.ts +33 -0
  335. package/src/domains/context/codewiki/indexer.ts +1614 -0
  336. package/src/domains/context/codewiki/tree-sitter.ts +771 -0
  337. package/src/domains/context/contract.ts +62 -0
  338. package/src/domains/context/excluded-dirs.ts +1 -0
  339. package/src/domains/context/extension.ts +407 -0
  340. package/src/domains/context/fingerprint.ts +196 -0
  341. package/src/domains/context/index.ts +164 -0
  342. package/src/domains/context/init-options.ts +69 -0
  343. package/src/domains/context/manifest.ts +6 -0
  344. package/src/domains/context/operator-profile.ts +157 -0
  345. package/src/domains/context/project-metadata.ts +510 -0
  346. package/src/domains/context/project-rules.ts +227 -0
  347. package/src/domains/context/prompt-context.ts +62 -0
  348. package/src/domains/context/refresh.ts +170 -0
  349. package/src/domains/context/sibling-files.ts +10 -0
  350. package/src/domains/context/state.ts +237 -0
  351. package/src/domains/context/wiki/assemble.ts +303 -0
  352. package/src/domains/context/wiki/frontmatter.ts +210 -0
  353. package/src/domains/context/wiki/generate.ts +590 -0
  354. package/src/domains/context/wiki/layout.ts +111 -0
  355. package/src/domains/context/wiki/meta.ts +221 -0
  356. package/src/domains/context/wiki/plan-store.ts +217 -0
  357. package/src/domains/context/wiki/plan.ts +250 -0
  358. package/src/domains/context/wiki/prompts.ts +270 -0
  359. package/src/domains/context/wiki/staleness.ts +198 -0
  360. package/src/domains/dispatch/active-route-planner.ts +168 -0
  361. package/src/domains/dispatch/admission-queue.ts +150 -0
  362. package/src/domains/dispatch/admission.ts +334 -0
  363. package/src/domains/dispatch/agent-candidates.ts +307 -0
  364. package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
  365. package/src/domains/dispatch/agent-ledger-store.ts +257 -0
  366. package/src/domains/dispatch/agent-ledger.ts +212 -0
  367. package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
  368. package/src/domains/dispatch/assignment-events.ts +132 -0
  369. package/src/domains/dispatch/assignment-reconcile.ts +76 -0
  370. package/src/domains/dispatch/assignment-store.ts +162 -0
  371. package/src/domains/dispatch/assignment.ts +278 -0
  372. package/src/domains/dispatch/backoff.ts +59 -0
  373. package/src/domains/dispatch/batch-store.ts +134 -0
  374. package/src/domains/dispatch/batch-tracker.ts +66 -0
  375. package/src/domains/dispatch/capability-match.ts +155 -0
  376. package/src/domains/dispatch/capacity-lease.ts +413 -0
  377. package/src/domains/dispatch/code-step-store.ts +52 -0
  378. package/src/domains/dispatch/code-step.ts +368 -0
  379. package/src/domains/dispatch/contract.ts +278 -0
  380. package/src/domains/dispatch/dedup.ts +133 -0
  381. package/src/domains/dispatch/event-pump.ts +251 -0
  382. package/src/domains/dispatch/execution-handoff.ts +29 -0
  383. package/src/domains/dispatch/execution-plan.ts +328 -0
  384. package/src/domains/dispatch/execution-role.ts +277 -0
  385. package/src/domains/dispatch/execution-scheduler.ts +583 -0
  386. package/src/domains/dispatch/extension.ts +5869 -0
  387. package/src/domains/dispatch/failure-classification.ts +141 -0
  388. package/src/domains/dispatch/fleet-plan.ts +225 -0
  389. package/src/domains/dispatch/fleet-preflight.ts +394 -0
  390. package/src/domains/dispatch/gate-decisions.ts +1040 -0
  391. package/src/domains/dispatch/gate-role-prompts.ts +58 -0
  392. package/src/domains/dispatch/heartbeat.ts +27 -0
  393. package/src/domains/dispatch/index.ts +137 -0
  394. package/src/domains/dispatch/joint-route-adapter.ts +114 -0
  395. package/src/domains/dispatch/joint-route-resolver.ts +283 -0
  396. package/src/domains/dispatch/manifest.ts +6 -0
  397. package/src/domains/dispatch/orphan-recovery.ts +224 -0
  398. package/src/domains/dispatch/outcome.ts +109 -0
  399. package/src/domains/dispatch/phase-timing.ts +47 -0
  400. package/src/domains/dispatch/placement.ts +202 -0
  401. package/src/domains/dispatch/receipt-findings.ts +255 -0
  402. package/src/domains/dispatch/receipt-integrity.ts +378 -0
  403. package/src/domains/dispatch/recovery-candidates.ts +74 -0
  404. package/src/domains/dispatch/reproducibility.ts +48 -0
  405. package/src/domains/dispatch/reservation-store.ts +501 -0
  406. package/src/domains/dispatch/route-approval.ts +177 -0
  407. package/src/domains/dispatch/route-candidates.ts +57 -0
  408. package/src/domains/dispatch/route-decision.ts +1079 -0
  409. package/src/domains/dispatch/route-facts.ts +187 -0
  410. package/src/domains/dispatch/route-history.ts +238 -0
  411. package/src/domains/dispatch/route-observer.ts +488 -0
  412. package/src/domains/dispatch/route-policy.ts +327 -0
  413. package/src/domains/dispatch/route-quality.ts +256 -0
  414. package/src/domains/dispatch/route-readiness.ts +120 -0
  415. package/src/domains/dispatch/routing-intent.ts +287 -0
  416. package/src/domains/dispatch/run-identity.ts +56 -0
  417. package/src/domains/dispatch/scout-transition.ts +130 -0
  418. package/src/domains/dispatch/state.ts +277 -0
  419. package/src/domains/dispatch/tool-stats.ts +132 -0
  420. package/src/domains/dispatch/transport.ts +209 -0
  421. package/src/domains/dispatch/types.ts +785 -0
  422. package/src/domains/dispatch/validation-grounding.ts +154 -0
  423. package/src/domains/dispatch/validation.ts +721 -0
  424. package/src/domains/dispatch/worker-protocol.ts +275 -0
  425. package/src/domains/dispatch/worker-spawn.ts +566 -0
  426. package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
  427. package/src/domains/dispatch/write-boundary.ts +426 -0
  428. package/src/domains/eval/artifacts/redact.ts +42 -0
  429. package/src/domains/eval/artifacts/store.ts +173 -0
  430. package/src/domains/eval/compare/compare.ts +33 -0
  431. package/src/domains/eval/compare/gates.ts +66 -0
  432. package/src/domains/eval/compare/thresholds.ts +92 -0
  433. package/src/domains/eval/harness-metrics.ts +62 -0
  434. package/src/domains/eval/index.ts +66 -0
  435. package/src/domains/eval/metrics/chaos-stream.ts +93 -0
  436. package/src/domains/eval/metrics/context.ts +34 -0
  437. package/src/domains/eval/metrics/coverage.ts +21 -0
  438. package/src/domains/eval/metrics/evidence.ts +182 -0
  439. package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
  440. package/src/domains/eval/metrics/invariants.ts +736 -0
  441. package/src/domains/eval/metrics/latency.ts +4 -0
  442. package/src/domains/eval/metrics/token-stream.ts +139 -0
  443. package/src/domains/eval/metrics/tokens.ts +51 -0
  444. package/src/domains/eval/metrics/tool-calls.ts +7 -0
  445. package/src/domains/eval/proactive-memory.ts +279 -0
  446. package/src/domains/eval/provenance.ts +35 -0
  447. package/src/domains/eval/report.ts +234 -0
  448. package/src/domains/eval/reports/json.ts +5 -0
  449. package/src/domains/eval/reports/junit.ts +23 -0
  450. package/src/domains/eval/reports/markdown.ts +20 -0
  451. package/src/domains/eval/reports/swe-jsonl.ts +16 -0
  452. package/src/domains/eval/reports/text.ts +25 -0
  453. package/src/domains/eval/run-compare.ts +274 -0
  454. package/src/domains/eval/runner.ts +244 -0
  455. package/src/domains/eval/runners/clio-run.ts +148 -0
  456. package/src/domains/eval/runners/context-index.ts +56 -0
  457. package/src/domains/eval/runners/context-init.ts +203 -0
  458. package/src/domains/eval/runners/external-command.ts +350 -0
  459. package/src/domains/eval/runtime-paths.ts +171 -0
  460. package/src/domains/eval/schema/artifact.ts +75 -0
  461. package/src/domains/eval/schema/suite.ts +235 -0
  462. package/src/domains/eval/schema/validate.ts +339 -0
  463. package/src/domains/eval/store.ts +392 -0
  464. package/src/domains/eval/suites/load.ts +74 -0
  465. package/src/domains/eval/suites/matrix.ts +19 -0
  466. package/src/domains/eval/suites/resolve.ts +44 -0
  467. package/src/domains/eval/suites/run.ts +325 -0
  468. package/src/domains/eval/task-file.ts +186 -0
  469. package/src/domains/eval/types.ts +141 -0
  470. package/src/domains/eval/verifiers/command.ts +27 -0
  471. package/src/domains/eval/verifiers/file-exists.ts +6 -0
  472. package/src/domains/eval/verifiers/patch.ts +22 -0
  473. package/src/domains/eval/workspaces/git.ts +41 -0
  474. package/src/domains/eval/workspaces/local.ts +17 -0
  475. package/src/domains/eval/workspaces/temp-copy.ts +29 -0
  476. package/src/domains/evidence/build.ts +1714 -0
  477. package/src/domains/evidence/eval.ts +605 -0
  478. package/src/domains/evidence/failure-attribution.ts +54 -0
  479. package/src/domains/evidence/finish-contract-map.ts +42 -0
  480. package/src/domains/evidence/index.ts +55 -0
  481. package/src/domains/evidence/provenance.ts +200 -0
  482. package/src/domains/evidence/redact.ts +81 -0
  483. package/src/domains/evidence/store.ts +291 -0
  484. package/src/domains/evidence/types.ts +325 -0
  485. package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
  486. package/src/domains/evolution/index.ts +26 -0
  487. package/src/domains/evolution/manifest.ts +154 -0
  488. package/src/domains/evolution/validate.ts +304 -0
  489. package/src/domains/extensions/contract.ts +22 -0
  490. package/src/domains/extensions/discovery.ts +193 -0
  491. package/src/domains/extensions/extension.ts +46 -0
  492. package/src/domains/extensions/index.ts +34 -0
  493. package/src/domains/extensions/manager.ts +30 -0
  494. package/src/domains/extensions/manifest.ts +6 -0
  495. package/src/domains/extensions/resources.ts +38 -0
  496. package/src/domains/extensions/state.ts +224 -0
  497. package/src/domains/extensions/types.ts +83 -0
  498. package/src/domains/interop/consent.ts +185 -0
  499. package/src/domains/interop/contract.ts +29 -0
  500. package/src/domains/interop/detect.ts +173 -0
  501. package/src/domains/interop/extension.ts +59 -0
  502. package/src/domains/interop/index.ts +34 -0
  503. package/src/domains/interop/manifest.ts +6 -0
  504. package/src/domains/interop/registry.ts +139 -0
  505. package/src/domains/interop/state.ts +92 -0
  506. package/src/domains/interop/types.ts +109 -0
  507. package/src/domains/lifecycle/contract.ts +11 -0
  508. package/src/domains/lifecycle/doctor.ts +536 -0
  509. package/src/domains/lifecycle/extension.ts +23 -0
  510. package/src/domains/lifecycle/index.ts +21 -0
  511. package/src/domains/lifecycle/install-method.ts +51 -0
  512. package/src/domains/lifecycle/manifest.ts +6 -0
  513. package/src/domains/lifecycle/migrations/index.ts +94 -0
  514. package/src/domains/lifecycle/state.ts +93 -0
  515. package/src/domains/lifecycle/upgrade-notice.ts +35 -0
  516. package/src/domains/lifecycle/version.ts +35 -0
  517. package/src/domains/memory/index.ts +128 -0
  518. package/src/domains/memory/operations.ts +143 -0
  519. package/src/domains/memory/prompt-section.ts +86 -0
  520. package/src/domains/memory/proposal.ts +180 -0
  521. package/src/domains/memory/store.ts +163 -0
  522. package/src/domains/memory/task-bank.ts +229 -0
  523. package/src/domains/memory/task-memory-handoff.ts +222 -0
  524. package/src/domains/memory/task-memory-policy.ts +602 -0
  525. package/src/domains/memory/task-memory-status.ts +58 -0
  526. package/src/domains/memory/task-memory-telemetry.ts +346 -0
  527. package/src/domains/memory/task-memory-trace.ts +89 -0
  528. package/src/domains/memory/types.ts +74 -0
  529. package/src/domains/memory/validate.ts +297 -0
  530. package/src/domains/middleware/budget.ts +216 -0
  531. package/src/domains/middleware/contract.ts +35 -0
  532. package/src/domains/middleware/dispatch-nudge.ts +469 -0
  533. package/src/domains/middleware/extension.ts +129 -0
  534. package/src/domains/middleware/hook-receipts.ts +70 -0
  535. package/src/domains/middleware/hooks-io.ts +174 -0
  536. package/src/domains/middleware/hooks.ts +432 -0
  537. package/src/domains/middleware/index.ts +154 -0
  538. package/src/domains/middleware/manifest.ts +6 -0
  539. package/src/domains/middleware/memory-intervention.ts +701 -0
  540. package/src/domains/middleware/rules.ts +42 -0
  541. package/src/domains/middleware/runtime.ts +333 -0
  542. package/src/domains/middleware/skills-reminder.ts +187 -0
  543. package/src/domains/middleware/snapshot.ts +71 -0
  544. package/src/domains/middleware/stalled-turn.ts +71 -0
  545. package/src/domains/middleware/task-board-reminder.ts +87 -0
  546. package/src/domains/middleware/task-nudge.ts +77 -0
  547. package/src/domains/middleware/tool-choice-control.ts +42 -0
  548. package/src/domains/middleware/types.ts +131 -0
  549. package/src/domains/middleware/validate.ts +329 -0
  550. package/src/domains/observability/accountability.ts +67 -0
  551. package/src/domains/observability/contract.ts +168 -0
  552. package/src/domains/observability/cost.ts +206 -0
  553. package/src/domains/observability/evidence-index.ts +123 -0
  554. package/src/domains/observability/extension.ts +281 -0
  555. package/src/domains/observability/index.ts +78 -0
  556. package/src/domains/observability/manifest.ts +10 -0
  557. package/src/domains/observability/metrics.ts +37 -0
  558. package/src/domains/observability/projection.ts +477 -0
  559. package/src/domains/observability/telemetry.ts +89 -0
  560. package/src/domains/observability/trace-store.ts +1454 -0
  561. package/src/domains/prompts/compiler.ts +556 -0
  562. package/src/domains/prompts/contract.ts +30 -0
  563. package/src/domains/prompts/extension.ts +304 -0
  564. package/src/domains/prompts/fragment-loader.ts +139 -0
  565. package/src/domains/prompts/fragments/identity/clio.md +3 -2
  566. package/src/domains/prompts/fragments/identity/self-awareness.md +63 -0
  567. package/src/domains/prompts/fragments/operating/contract.md +10 -1
  568. package/src/domains/prompts/hash.ts +73 -0
  569. package/src/domains/prompts/index.ts +32 -0
  570. package/src/domains/prompts/manifest.ts +8 -0
  571. package/src/domains/prompts/memory-intervention.ts +57 -0
  572. package/src/domains/prompts/preload.ts +82 -0
  573. package/src/domains/providers/auth/api-key.ts +47 -0
  574. package/src/domains/providers/auth/backend-file.ts +69 -0
  575. package/src/domains/providers/auth/backend-memory.ts +17 -0
  576. package/src/domains/providers/auth/index.ts +37 -0
  577. package/src/domains/providers/auth/oauth.ts +36 -0
  578. package/src/domains/providers/auth/storage.ts +667 -0
  579. package/src/domains/providers/capabilities.ts +50 -0
  580. package/src/domains/providers/catalog.ts +162 -0
  581. package/src/domains/providers/contract.ts +151 -0
  582. package/src/domains/providers/credentials.ts +20 -0
  583. package/src/domains/providers/eligibility.ts +24 -0
  584. package/src/domains/providers/errors.ts +64 -0
  585. package/src/domains/providers/extension.ts +536 -0
  586. package/src/domains/providers/index.ts +142 -0
  587. package/src/domains/providers/knowledge-base-path.ts +102 -0
  588. package/src/domains/providers/manifest.ts +6 -0
  589. package/src/domains/providers/model-capabilities.ts +136 -0
  590. package/src/domains/providers/model-discovery.ts +144 -0
  591. package/src/domains/providers/model-family.ts +32 -0
  592. package/src/domains/providers/model-runtime-capabilities.ts +712 -0
  593. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +2 -2
  594. package/src/domains/providers/plugins.ts +59 -0
  595. package/src/domains/providers/probe/fingerprint.ts +44 -0
  596. package/src/domains/providers/probe/http.ts +114 -0
  597. package/src/domains/providers/probe/reasoning.ts +111 -0
  598. package/src/domains/providers/registry.ts +166 -0
  599. package/src/domains/providers/resolver.ts +156 -0
  600. package/src/domains/providers/runtime-resolution.ts +720 -0
  601. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
  602. package/src/domains/providers/runtimes/builtins.ts +78 -0
  603. package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
  604. package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
  605. package/src/domains/providers/runtimes/claude/common.ts +55 -0
  606. package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
  607. package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
  608. package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
  609. package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
  610. package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
  611. package/src/domains/providers/runtimes/cloud/google.ts +41 -0
  612. package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
  613. package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
  614. package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
  615. package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
  616. package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
  617. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +32 -0
  618. package/src/domains/providers/runtimes/common/local-synth.ts +165 -0
  619. package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
  620. package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
  621. package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
  622. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
  623. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
  624. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
  625. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
  626. package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
  627. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +491 -0
  628. package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
  629. package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
  630. package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
  631. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
  632. package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
  633. package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
  634. package/src/domains/providers/runtimes/protocol/google.ts +27 -0
  635. package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
  636. package/src/domains/providers/support.ts +238 -0
  637. package/src/domains/providers/thinking-control-policy.ts +85 -0
  638. package/src/domains/providers/types/capability-flags.ts +114 -0
  639. package/src/domains/providers/types/cost-provenance.ts +7 -0
  640. package/src/domains/providers/types/inference.ts +41 -0
  641. package/src/domains/providers/types/knowledge-base.ts +156 -0
  642. package/src/domains/providers/types/local-model-quirks.ts +218 -0
  643. package/src/domains/providers/types/runtime-descriptor.ts +170 -0
  644. package/src/domains/providers/types/target-descriptor.ts +38 -0
  645. package/src/domains/resources/collision.ts +92 -0
  646. package/src/domains/resources/common-loader.ts +140 -0
  647. package/src/domains/resources/contract.ts +25 -0
  648. package/src/domains/resources/extension.ts +61 -0
  649. package/src/domains/resources/index.ts +74 -0
  650. package/src/domains/resources/loader.ts +86 -0
  651. package/src/domains/resources/manifest.ts +6 -0
  652. package/src/domains/resources/prompts/loader.ts +232 -0
  653. package/src/domains/resources/prompts/substitute.ts +65 -0
  654. package/src/domains/resources/skills/content-hash.ts +105 -0
  655. package/src/domains/resources/skills/evals.ts +175 -0
  656. package/src/domains/resources/skills/install.ts +410 -0
  657. package/src/domains/resources/skills/loader.ts +978 -0
  658. package/src/domains/resources/skills/marketplace.ts +255 -0
  659. package/src/domains/resources/skills/provenance-pin.ts +115 -0
  660. package/src/domains/safety/action-classifier.ts +268 -0
  661. package/src/domains/safety/approval-axis.ts +23 -0
  662. package/src/domains/safety/audit.ts +487 -0
  663. package/src/domains/safety/autonomy.ts +174 -0
  664. package/src/domains/safety/call-target.ts +59 -0
  665. package/src/domains/safety/contract.ts +65 -0
  666. package/src/domains/safety/damage-control.ts +44 -0
  667. package/src/domains/safety/default-path-policy.ts +117 -0
  668. package/src/domains/safety/extension.ts +383 -0
  669. package/src/domains/safety/finish-contract-registration.ts +128 -0
  670. package/src/domains/safety/finish-contract.ts +554 -0
  671. package/src/domains/safety/index.ts +44 -0
  672. package/src/domains/safety/loop-detector.ts +143 -0
  673. package/src/domains/safety/manifest.ts +6 -0
  674. package/src/domains/safety/path-policy.ts +164 -0
  675. package/src/domains/safety/policy-engine.ts +994 -0
  676. package/src/domains/safety/project-policy.ts +391 -0
  677. package/src/domains/safety/protected-artifacts-registration.ts +189 -0
  678. package/src/domains/safety/protected-artifacts.ts +993 -0
  679. package/src/domains/safety/rejection-feedback.ts +102 -0
  680. package/src/domains/safety/rigor.ts +72 -0
  681. package/src/domains/safety/rule-compiler.ts +48 -0
  682. package/src/domains/safety/rule-pack-loader.ts +92 -0
  683. package/src/domains/safety/run-effects.ts +197 -0
  684. package/src/domains/safety/scope.ts +61 -0
  685. package/src/domains/scheduling/budget.ts +35 -0
  686. package/src/domains/scheduling/cluster.ts +175 -0
  687. package/src/domains/scheduling/contract.ts +30 -0
  688. package/src/domains/scheduling/extension.ts +91 -0
  689. package/src/domains/scheduling/index.ts +12 -0
  690. package/src/domains/scheduling/manifest.ts +6 -0
  691. package/src/domains/session/archive-readers.ts +208 -0
  692. package/src/domains/session/checkpoint.ts +38 -0
  693. package/src/domains/session/compaction/auto.ts +89 -0
  694. package/src/domains/session/compaction/branch-summary.ts +186 -0
  695. package/src/domains/session/compaction/compact.ts +493 -0
  696. package/src/domains/session/compaction/cut-point.ts +171 -0
  697. package/src/domains/session/compaction/defaults.ts +34 -0
  698. package/src/domains/session/compaction/mask-observations.ts +265 -0
  699. package/src/domains/session/compaction/session-entries.ts +18 -0
  700. package/src/domains/session/compaction/tokens.ts +147 -0
  701. package/src/domains/session/context-accounting.ts +583 -0
  702. package/src/domains/session/context-ledger.ts +348 -0
  703. package/src/domains/session/contract.ts +144 -0
  704. package/src/domains/session/cwd-fallback.ts +65 -0
  705. package/src/domains/session/entries.ts +509 -0
  706. package/src/domains/session/extension.ts +322 -0
  707. package/src/domains/session/history.ts +172 -0
  708. package/src/domains/session/index.ts +84 -0
  709. package/src/domains/session/manager.ts +128 -0
  710. package/src/domains/session/manifest.ts +6 -0
  711. package/src/domains/session/migrations/index.ts +27 -0
  712. package/src/domains/session/prompt-manifest.ts +173 -0
  713. package/src/domains/session/protected-artifact-journal.ts +241 -0
  714. package/src/domains/session/protected-artifacts.ts +90 -0
  715. package/src/domains/session/retry.ts +238 -0
  716. package/src/domains/session/task-board.ts +375 -0
  717. package/src/domains/session/tree/active-path.ts +98 -0
  718. package/src/domains/session/tree/fork.ts +160 -0
  719. package/src/domains/session/tree/manager.ts +128 -0
  720. package/src/domains/session/tree/navigator.ts +177 -0
  721. package/src/domains/session/tree/preview.ts +259 -0
  722. package/src/domains/session/usage.ts +148 -0
  723. package/src/domains/session/workspace/git-probe.ts +161 -0
  724. package/src/domains/session/workspace/index.ts +4 -0
  725. package/src/domains/session/workspace/project-type.ts +217 -0
  726. package/src/domains/session/workspace/snapshot.ts +74 -0
  727. package/src/domains/share/archive.ts +684 -0
  728. package/src/domains/share/contract.ts +9 -0
  729. package/src/domains/share/extension.ts +26 -0
  730. package/src/domains/share/index.ts +28 -0
  731. package/src/domains/share/manifest.ts +6 -0
  732. package/src/engine/acp/adapter.ts +397 -0
  733. package/src/engine/acp/errors.ts +32 -0
  734. package/src/engine/acp/event-mapper.ts +154 -0
  735. package/src/engine/acp/server.ts +656 -0
  736. package/src/engine/acp/tool-mediator.ts +686 -0
  737. package/src/engine/acp/transport.ts +654 -0
  738. package/src/engine/acp/types.ts +170 -0
  739. package/src/engine/agent.ts +29 -0
  740. package/src/engine/ai.ts +202 -0
  741. package/src/engine/alcf-oauth.ts +198 -0
  742. package/src/engine/antigravity/subprocess-runtime.ts +205 -0
  743. package/src/engine/apis/degraded-inference.ts +95 -0
  744. package/src/engine/apis/index.ts +20 -0
  745. package/src/engine/apis/llamacpp-residency.ts +252 -0
  746. package/src/engine/apis/lmstudio-native.ts +1438 -0
  747. package/src/engine/apis/lmstudio-residency.ts +92 -0
  748. package/src/engine/apis/ollama-native.ts +507 -0
  749. package/src/engine/apis/openai-completions.ts +716 -0
  750. package/src/engine/apis/output-budget.ts +99 -0
  751. package/src/engine/apis/residency-lock.ts +29 -0
  752. package/src/engine/apis/residency.ts +640 -0
  753. package/src/engine/apis/resident-models.ts +42 -0
  754. package/src/engine/apis/sampling-overrides.ts +38 -0
  755. package/src/engine/apis/thinking-replay.ts +11 -0
  756. package/src/engine/claude/sdk-runtime.ts +685 -0
  757. package/src/engine/claude/session-id.ts +5 -0
  758. package/src/engine/claude/subprocess-runtime.ts +316 -0
  759. package/src/engine/claude/tool-safety.ts +400 -0
  760. package/src/engine/external-subprocess.ts +23 -0
  761. package/src/engine/harmony-response.ts +165 -0
  762. package/src/engine/loop-guard.ts +1127 -0
  763. package/src/engine/oauth.ts +192 -0
  764. package/src/engine/pi-mono-names.ts +13 -0
  765. package/src/engine/provider-payload.ts +315 -0
  766. package/src/engine/select-list.ts +53 -0
  767. package/src/engine/session.ts +834 -0
  768. package/src/engine/strip-tokenizer-sentinels.ts +125 -0
  769. package/src/engine/tui.ts +103 -0
  770. package/src/engine/types.ts +66 -0
  771. package/src/engine/worker-events.ts +100 -0
  772. package/src/engine/worker-runtime.ts +1022 -0
  773. package/src/engine/worker-tools.ts +203 -0
  774. package/src/entry/orchestrator.ts +1873 -0
  775. package/src/interactive/application-controller.ts +346 -0
  776. package/src/interactive/bus-notices.ts +265 -0
  777. package/src/interactive/chat-loop-messages.ts +626 -0
  778. package/src/interactive/chat-loop-policy.ts +18 -0
  779. package/src/interactive/chat-loop.ts +865 -0
  780. package/src/interactive/chat-panel.ts +1694 -0
  781. package/src/interactive/chat-renderer.ts +1038 -0
  782. package/src/interactive/clio-editor.ts +166 -0
  783. package/src/interactive/command-fallbacks.ts +23 -0
  784. package/src/interactive/command-output.ts +85 -0
  785. package/src/interactive/context-activity.ts +203 -0
  786. package/src/interactive/context-meter.ts +223 -0
  787. package/src/interactive/context-overlay.ts +220 -0
  788. package/src/interactive/cost-overlay.ts +279 -0
  789. package/src/interactive/dispatch-board.ts +1319 -0
  790. package/src/interactive/dispatch-steering.ts +86 -0
  791. package/src/interactive/editor-bash.ts +46 -0
  792. package/src/interactive/editor-steer.ts +51 -0
  793. package/src/interactive/editor-submit.ts +303 -0
  794. package/src/interactive/external-editor.ts +67 -0
  795. package/src/interactive/follow-up-queue-panel.ts +75 -0
  796. package/src/interactive/footer/dashboard.ts +534 -0
  797. package/src/interactive/footer/notifications.ts +275 -0
  798. package/src/interactive/footer/widgets.ts +1246 -0
  799. package/src/interactive/footer-panel.ts +187 -0
  800. package/src/interactive/format-time.ts +85 -0
  801. package/src/interactive/index.ts +11 -0
  802. package/src/interactive/interactive-application.ts +755 -0
  803. package/src/interactive/interactive-event-projection.ts +380 -0
  804. package/src/interactive/interactive-input-runtime.ts +261 -0
  805. package/src/interactive/interactive-presentation.ts +452 -0
  806. package/src/interactive/interactive-shell.ts +134 -0
  807. package/src/interactive/interactive-slash-runtime.ts +492 -0
  808. package/src/interactive/interactive-subscriptions.ts +111 -0
  809. package/src/interactive/interactive-tickers.ts +152 -0
  810. package/src/interactive/keybinding-manager.ts +496 -0
  811. package/src/interactive/layout.ts +20 -0
  812. package/src/interactive/leader-key.ts +143 -0
  813. package/src/interactive/loop-guard-interrupt.ts +101 -0
  814. package/src/interactive/memory-overlay.ts +280 -0
  815. package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
  816. package/src/interactive/overlay-auth-lifecycle.ts +308 -0
  817. package/src/interactive/overlay-frame.ts +502 -0
  818. package/src/interactive/overlay-general-openers.ts +217 -0
  819. package/src/interactive/overlay-key-routing.ts +213 -0
  820. package/src/interactive/overlay-lifecycle.ts +413 -0
  821. package/src/interactive/overlay-model-selectors.ts +127 -0
  822. package/src/interactive/overlay-permission-lifecycle.ts +344 -0
  823. package/src/interactive/overlay-resource-openers.ts +112 -0
  824. package/src/interactive/overlay-session-lifecycle.ts +270 -0
  825. package/src/interactive/overlay-transitions.ts +57 -0
  826. package/src/interactive/overlays/agents.ts +69 -0
  827. package/src/interactive/overlays/ask-user.ts +921 -0
  828. package/src/interactive/overlays/auth-dialog.ts +221 -0
  829. package/src/interactive/overlays/context-reset.ts +108 -0
  830. package/src/interactive/overlays/cwd-fallback.ts +141 -0
  831. package/src/interactive/overlays/extensions.ts +54 -0
  832. package/src/interactive/overlays/help-reference.ts +140 -0
  833. package/src/interactive/overlays/interop.ts +139 -0
  834. package/src/interactive/overlays/keybinding-detail.ts +90 -0
  835. package/src/interactive/overlays/list-overlay.ts +606 -0
  836. package/src/interactive/overlays/message-picker.ts +155 -0
  837. package/src/interactive/overlays/model-selector.ts +1091 -0
  838. package/src/interactive/overlays/prompts.ts +72 -0
  839. package/src/interactive/overlays/session-selector-search.ts +31 -0
  840. package/src/interactive/overlays/session-selector.ts +266 -0
  841. package/src/interactive/overlays/settings.ts +3363 -0
  842. package/src/interactive/overlays/skills-hub.ts +237 -0
  843. package/src/interactive/overlays/tree-selector.ts +387 -0
  844. package/src/interactive/permission-overlay.ts +170 -0
  845. package/src/interactive/render-trace.ts +125 -0
  846. package/src/interactive/renderers/branch-summary.ts +86 -0
  847. package/src/interactive/renderers/code-ink.ts +420 -0
  848. package/src/interactive/renderers/compaction-summary.ts +112 -0
  849. package/src/interactive/renderers/diff.ts +126 -0
  850. package/src/interactive/renderers/notice.ts +28 -0
  851. package/src/interactive/renderers/retry-status.ts +31 -0
  852. package/src/interactive/renderers/structured.ts +89 -0
  853. package/src/interactive/renderers/tool-execution.ts +1104 -0
  854. package/src/interactive/renderers/worker-entry.ts +264 -0
  855. package/src/interactive/session-last-turn.ts +186 -0
  856. package/src/interactive/session-transcript.ts +105 -0
  857. package/src/interactive/session-usage-reseed.ts +74 -0
  858. package/src/interactive/slash-autocomplete.ts +364 -0
  859. package/src/interactive/slash-commands.ts +1319 -0
  860. package/src/interactive/slash-spec.ts +453 -0
  861. package/src/interactive/status/controller.ts +256 -0
  862. package/src/interactive/status/index.ts +23 -0
  863. package/src/interactive/status/state-machine.ts +530 -0
  864. package/src/interactive/status/summary.ts +170 -0
  865. package/src/interactive/status/types.ts +121 -0
  866. package/src/interactive/status/verbs.ts +163 -0
  867. package/src/interactive/status/watchdog.ts +24 -0
  868. package/src/interactive/tasks-overlay.ts +186 -0
  869. package/src/interactive/theme/components.ts +55 -0
  870. package/src/interactive/theme/glyphs.ts +70 -0
  871. package/src/interactive/theme/index.ts +15 -0
  872. package/src/interactive/theme/labels.ts +88 -0
  873. package/src/interactive/theme/rules.ts +138 -0
  874. package/src/interactive/theme/segments.ts +88 -0
  875. package/src/interactive/theme/tokens.ts +121 -0
  876. package/src/interactive/thinking-level-policy.ts +6 -0
  877. package/src/interactive/tool-prose-loop.ts +122 -0
  878. package/src/interactive/tool-prose-registration.ts +48 -0
  879. package/src/interactive/turn-context.ts +854 -0
  880. package/src/interactive/turn-middleware.ts +283 -0
  881. package/src/interactive/turn-persistence.ts +441 -0
  882. package/src/interactive/turn-queues.ts +169 -0
  883. package/src/interactive/turn-recovery.ts +306 -0
  884. package/src/interactive/turn-runtime.ts +802 -0
  885. package/src/interactive/turn-state.ts +123 -0
  886. package/src/interactive/view/artifacts.ts +1342 -0
  887. package/src/interactive/view/view-overlay.ts +732 -0
  888. package/src/interactive/welcome-dashboard.ts +536 -0
  889. package/src/interactive/worker-receipts.ts +94 -0
  890. package/src/interactive/worker-replay.ts +111 -0
  891. package/src/interactive/worker-share.ts +100 -0
  892. package/src/interactive/worker-stream.ts +442 -0
  893. package/src/interactive/workspace-facts.ts +141 -0
  894. package/src/tools/agent-tools.ts +382 -0
  895. package/src/tools/artifact.ts +103 -0
  896. package/src/tools/ask-user.ts +656 -0
  897. package/src/tools/bash.ts +176 -0
  898. package/src/tools/bootstrap.ts +474 -0
  899. package/src/tools/codewiki/code-nav.ts +563 -0
  900. package/src/tools/codewiki/shared.ts +115 -0
  901. package/src/tools/compete-worktrees.ts +898 -0
  902. package/src/tools/context/docs-engine.ts +619 -0
  903. package/src/tools/context/index.ts +435 -0
  904. package/src/tools/credential-present.ts +151 -0
  905. package/src/tools/dispatch-arguments.ts +228 -0
  906. package/src/tools/dispatch-plan.ts +741 -0
  907. package/src/tools/dispatch-scout.ts +461 -0
  908. package/src/tools/dispatch.ts +3338 -0
  909. package/src/tools/edit-diff.ts +534 -0
  910. package/src/tools/edit.ts +128 -0
  911. package/src/tools/executables.ts +22 -0
  912. package/src/tools/file-mutation-queue.ts +35 -0
  913. package/src/tools/find.ts +292 -0
  914. package/src/tools/grep.ts +495 -0
  915. package/src/tools/ignore-policy.ts +169 -0
  916. package/src/tools/ledger.ts +206 -0
  917. package/src/tools/ls.ts +110 -0
  918. package/src/tools/monitor.ts +797 -0
  919. package/src/tools/network-policy.ts +29 -0
  920. package/src/tools/observation.ts +421 -0
  921. package/src/tools/observers.ts +99 -0
  922. package/src/tools/path-utils.ts +79 -0
  923. package/src/tools/policy.ts +154 -0
  924. package/src/tools/profiles.ts +108 -0
  925. package/src/tools/read.ts +173 -0
  926. package/src/tools/registry.ts +1157 -0
  927. package/src/tools/result-shaping.ts +204 -0
  928. package/src/tools/safe-exec.ts +128 -0
  929. package/src/tools/spawn-hygiene.ts +182 -0
  930. package/src/tools/steer.ts +88 -0
  931. package/src/tools/string-enum.ts +15 -0
  932. package/src/tools/tasks.ts +168 -0
  933. package/src/tools/truncate-utf8.ts +17 -0
  934. package/src/tools/truncate.ts +202 -0
  935. package/src/tools/verify/frontend.ts +685 -0
  936. package/src/tools/verify/index.ts +66 -0
  937. package/src/tools/verify/scripts.ts +108 -0
  938. package/src/tools/web-fetch.ts +777 -0
  939. package/src/tools/worker-evidence.ts +215 -0
  940. package/src/tools/write.ts +52 -0
  941. package/src/utils/exif-orientation.ts +192 -0
  942. package/src/utils/git.ts +24 -0
  943. package/src/utils/image-resize.ts +148 -0
  944. package/src/utils/photon.ts +103 -0
  945. package/src/worker/control-lane.ts +22 -0
  946. package/src/worker/entry.ts +257 -0
  947. package/src/worker/event-projection.ts +56 -0
  948. package/src/worker/heartbeat.ts +24 -0
  949. package/src/worker/ledger-mirror.ts +95 -0
  950. package/src/worker/ndjson.ts +40 -0
  951. package/src/worker/protocol.ts +529 -0
  952. package/src/worker/resource-facts.ts +79 -0
  953. package/src/worker/runtime-registry.ts +12 -0
  954. package/src/worker/spec-contract.ts +654 -0
  955. package/src/worker/stdin-demux.ts +316 -0
  956. package/dist/acp-UMLFVA3F.js +0 -92
  957. package/dist/chunk-262G75JS.js +0 -35
  958. package/dist/chunk-5LDRNKX2.js +0 -1063
  959. package/dist/chunk-67MTHP2E.js +0 -135
  960. package/dist/chunk-GOTUR54M.js +0 -9
  961. package/dist/chunk-TPOCL34A.js +0 -2876
  962. package/dist/chunk-XV4ZJ6ZM.js +0 -3177
  963. package/dist/clio-KIQ5SNDS.js +0 -53
  964. package/dist/configure-G4E3A2PG.js +0 -27
  965. package/dist/doctor-M5HJJZOL.js +0 -61
  966. package/dist/domains/agents/builtins/architect.md +0 -33
  967. package/dist/domains/agents/builtins/coder.md +0 -31
  968. package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
  969. package/dist/domains/agents/builtins/debugger.md +0 -30
  970. package/dist/domains/agents/builtins/documenter.md +0 -31
  971. package/dist/domains/agents/builtins/git-master.md +0 -30
  972. package/dist/domains/agents/builtins/provenance.md +0 -30
  973. package/dist/domains/agents/builtins/researcher.md +0 -71
  974. package/dist/domains/agents/builtins/scout.md +0 -42
  975. package/dist/domains/agents/builtins/tester.md +0 -31
  976. package/dist/domains/agents/builtins/verifier.md +0 -30
  977. package/dist/domains/agents/builtins/wiki-writer.md +0 -41
  978. package/dist/fleet-preflight-CLIAX7YR.js +0 -21
  979. package/dist/preload-KZVHET2B.js +0 -11
  980. package/dist/version-ROZ6CZKH.js +0 -16
  981. package/skills/git/commit-crafting/SKILL.md +0 -79
  982. package/skills/git/commit-crafting/evals.md +0 -92
  983. package/skills/git/create-pr/SKILL.md +0 -116
  984. package/skills/git/create-pr/evals.md +0 -114
  985. package/skills/git/investigate-issue/SKILL.md +0 -139
  986. package/skills/git/investigate-issue/evals.md +0 -94
  987. package/skills/git/review-changes/SKILL.md +0 -103
  988. package/skills/git/review-changes/evals.md +0 -85
@@ -0,0 +1,1319 @@
1
+ import { BusChannels } from "../core/bus-events.js";
2
+ import { THINKING_LEVELS } from "../core/defaults.js";
3
+ import type { SafeEventBus } from "../core/event-bus.js";
4
+ import type { AgentSpec } from "../domains/agents/spec.js";
5
+ import type { ContextInitOptions } from "../domains/context/init-options.js";
6
+ import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
7
+ import { type AgentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
8
+ import type { ReceiptIntegrityResult } from "../domains/dispatch/receipt-integrity.js";
9
+ import type { RunReceipt } from "../domains/dispatch/types.js";
10
+ import type { JobThinkingLevel } from "../domains/dispatch/validation.js";
11
+ import type { InstalledExtension } from "../domains/extensions/index.js";
12
+ import type { InteropAgentId, InteropProposal, InteropReport } from "../domains/interop/index.js";
13
+ import type { ProvidersContract, ResolvedModelRef } from "../domains/providers/index.js";
14
+ import { resolveModelReference } from "../domains/providers/index.js";
15
+ import type { PromptTemplate, PromptTemplateExpansion, ResourceList } from "../domains/resources/index.js";
16
+ import { parseSkillCommand } from "../domains/resources/index.js";
17
+ import type { ShareImportPlan } from "../domains/share/index.js";
18
+ import { isToolProfileName, TOOL_PROFILE_NAMES, type ToolProfileName } from "../tools/profiles.js";
19
+ import type { NoticeLevel } from "./command-output.js";
20
+ import { SETTINGS_SECTIONS, type SettingsCenterRowId, type SettingsSectionId } from "./overlays/settings.js";
21
+ import type { CommandArgsSpec, CommandPositionalSpec, ParsedArgs } from "./slash-spec.js";
22
+ import { matchFromSpec, usageLine } from "./slash-spec.js";
23
+ import { formatWorkerShareNote, selectWorkerRunToShare, workerShareFactsFromEntry } from "./worker-share.js";
24
+ import type { WorkerEntryState } from "./worker-stream.js";
25
+
26
+ /**
27
+ * Ported from pi-coding-agent's BUILTIN_SLASH_COMMANDS registry. Each entry owns
28
+ * one user-facing slash command: how it parses, which SlashCommand kinds it
29
+ * produces, and how those kinds execute. Adding a new command is one entry
30
+ * rather than extending two parallel switches.
31
+ */
32
+
33
+ type ShareCommandVariant =
34
+ | { kind: "share"; action: "export"; path: string }
35
+ | { kind: "share"; action: "import"; path: string; dryRun: boolean; force: boolean }
36
+ /** Put a finished worker run's answer into the main agent's context. Bare `/share` takes the newest one. */
37
+ | { kind: "share"; action: "worker-run"; runId?: string }
38
+ | { kind: "share"; action: "usage"; subcommand?: "export" | "import"; error?: string };
39
+
40
+ type SlashCommandVariant =
41
+ | { kind: "quit" }
42
+ | { kind: "help"; query?: string }
43
+ | { kind: "init"; options: InitCommandOptions }
44
+ | { kind: "context-clear"; options: ContextClearCommandOptions }
45
+ | { kind: "context-refresh" }
46
+ | { kind: "skill-selector" }
47
+ | { kind: "skill-invocation"; text: string }
48
+ | { kind: "prompts" }
49
+ | { kind: "extensions" }
50
+ | { kind: "interop" }
51
+ | ShareCommandVariant
52
+ /** `source` is the line the operator typed, echoed above the run's transcript block. */
53
+ | { kind: "run"; agentId: string; task: string; options: RunCommandOptions; source: string }
54
+ | { kind: "run-usage" }
55
+ | { kind: "delegate"; agentId: string; task: string; source: string; share?: boolean }
56
+ | { kind: "delegate-usage" }
57
+ | { kind: "agents" }
58
+ | { kind: "cost" }
59
+ | { kind: "context-view" }
60
+ | { kind: "tasks" }
61
+ | { kind: "memory" }
62
+ | { kind: "memory-seed" }
63
+ | { kind: "view"; filter?: string }
64
+ | { kind: "view-verify"; runId: string }
65
+ | { kind: "view-usage" }
66
+ | { kind: "thinking-set"; level: string }
67
+ | { kind: "output-set"; verbosity: string }
68
+ | { kind: "model" }
69
+ | { kind: "model-set"; pattern: string }
70
+ | { kind: "settings"; section?: SettingsSectionId; rowId?: SettingsCenterRowId }
71
+ | { kind: "resume" }
72
+ | { kind: "new" }
73
+ | { kind: "tree" }
74
+ | { kind: "fork" }
75
+ | { kind: "compact"; instructions: string | undefined }
76
+ | { kind: "export"; path: string | undefined }
77
+ | { kind: "unknown"; text: string }
78
+ /** `text` is the whole line, so a token that turns out to name a prompt template keeps its arguments. */
79
+ | { kind: "unknown-command"; token: string; text: string }
80
+ | { kind: "usage-error"; command: string; reason: string }
81
+ | { kind: "empty" };
82
+
83
+ export type SlashCommand = SlashCommandVariant;
84
+
85
+ export type SlashCommandKind = SlashCommand["kind"];
86
+
87
+ export interface RunIo {
88
+ stdout: (s: string) => void;
89
+ stderr: (s: string) => void;
90
+ }
91
+
92
+ export type SetThinkingLevelResult =
93
+ | { status: "applied"; level: string; display: string }
94
+ | { status: "unsupported"; level: string; supported: ReadonlyArray<string> }
95
+ | { status: "unavailable" };
96
+
97
+ export type SetOutputVerbosityResult =
98
+ | { status: "applied"; verbosity: string }
99
+ | { status: "unsupported"; verbosity: string; supported: ReadonlyArray<string> }
100
+ | { status: "unavailable" };
101
+
102
+ export type TaskMemorySeedCommandResult =
103
+ | { status: "seeded"; seeded: number; skipped: number; source: string }
104
+ | { status: "disabled" }
105
+ | { status: "not-found" };
106
+
107
+ export type InitCommandOptions = ContextInitOptions;
108
+
109
+ export interface ContextClearCommandOptions {
110
+ all?: boolean;
111
+ confirmed?: boolean;
112
+ confirmedAll?: boolean;
113
+ }
114
+
115
+ export interface RunCommandOptions {
116
+ workerProfile?: string;
117
+ workerRuntime?: string;
118
+ target?: string;
119
+ model?: string;
120
+ thinkingLevel?: JobThinkingLevel;
121
+ toolProfile?: ToolProfileName;
122
+ requiredCapabilities?: string[];
123
+ /** Hand the receipt's answer to the main agent when the run finishes. Off by default. */
124
+ share?: boolean;
125
+ }
126
+
127
+ export interface HandleRunDeps {
128
+ dispatch: DispatchContract;
129
+ /** Strict recipe facts the run's execution role is derived from. */
130
+ getAgentRoleFacts?: AgentRoleFactsResolver;
131
+ io: RunIo;
132
+ notice: (level: NoticeLevel, text: string) => void;
133
+ /**
134
+ * Optional bus for forwarding per-event worker output. When supplied,
135
+ * every non-heartbeat event is re-emitted on `BusChannels.DispatchProgress`
136
+ * so UI surfaces (dispatch-board overlay) can update their row as the
137
+ * stream arrives instead of waiting for the terminal receipt.
138
+ */
139
+ bus?: SafeEventBus;
140
+ /**
141
+ * Operator-turn sink for `--share`. Absent means the flag has nowhere to put
142
+ * the answer, which is reported rather than silently dropped: an operator who
143
+ * asked for the model to see a result must not be told it did.
144
+ */
145
+ submitOperatorNote?: (text: string) => void;
146
+ }
147
+
148
+ /**
149
+ * Hand a finished run's sealed answer to the main agent. The receipt is the
150
+ * terminal truth here rather than the transcript block: the block is a view of
151
+ * this same text, and the caller already holds the receipt.
152
+ */
153
+ function shareReceipt(agentId: string, receipt: RunReceipt, deps: HandleRunDeps): void {
154
+ if (!deps.submitOperatorNote) {
155
+ deps.notice("error", "--share is not wired in this session; the result stayed local");
156
+ return;
157
+ }
158
+ const note = formatWorkerShareNote({
159
+ agentId,
160
+ runId: receipt.runId,
161
+ outcome: receipt.outcome,
162
+ text: receipt.output?.text ?? "",
163
+ });
164
+ if (note === null) {
165
+ deps.notice("warn", `--share: run ${receipt.runId} produced no text to share`);
166
+ return;
167
+ }
168
+ deps.submitOperatorNote(note);
169
+ }
170
+
171
+ /**
172
+ * The attributed half every operator-started run shares, whether `/run` or
173
+ * `/delegate` built the request. Dispatch it, forward its events for surfaces
174
+ * that do not share the domain's bus, wait for the receipt, keep the notice bar
175
+ * quiet on success because the transcript block is the success signal, and
176
+ * share the sealed answer only when the operator asked. A failed run is still
177
+ * worth sharing when they did: the failure text is what they would want the
178
+ * main agent to work from.
179
+ */
180
+ async function runAttributed(
181
+ command: "run" | "delegate",
182
+ request: DispatchRequest,
183
+ deps: HandleRunDeps,
184
+ share: boolean,
185
+ ): Promise<void> {
186
+ const { dispatch, notice, bus } = deps;
187
+ const progressBus = dispatch.ownsProgressBus?.(bus) === true ? undefined : bus;
188
+ try {
189
+ const handle = await dispatch.dispatch(request);
190
+ for await (const event of handle.events) {
191
+ const e = event as { type?: string };
192
+ if (!e.type || e.type === "heartbeat") continue;
193
+ progressBus?.emit(BusChannels.DispatchProgress, { runId: handle.runId, agentId: request.agentId, event });
194
+ }
195
+ const receipt = await handle.finalPromise;
196
+ if (receipt.exitCode !== 0 || receipt.failureMessage) {
197
+ const failure = receipt.failureMessage ? ` ${receipt.failureMessage}` : "";
198
+ notice("error", `${command} failed: exit=${receipt.exitCode}${failure}`);
199
+ }
200
+ if (share) shareReceipt(request.agentId, receipt, deps);
201
+ } catch (err) {
202
+ const msg = err instanceof Error ? err.message : String(err);
203
+ notice("error", `${command} failed: ${msg}`);
204
+ }
205
+ }
206
+
207
+ /**
208
+ * Dispatches /run through the dispatch contract and streams events to stdout.
209
+ * Target + model are resolved by the dispatch domain from request overrides,
210
+ * worker profiles, recipe hints, and `settings.workers.default`.
211
+ */
212
+ export async function handleRun(
213
+ agentId: string,
214
+ task: string,
215
+ deps: HandleRunDeps,
216
+ options: RunCommandOptions = {},
217
+ ): Promise<void> {
218
+ if (options.target && options.workerProfile) {
219
+ deps.notice("warn", `--target ${options.target} takes precedence; --worker ${options.workerProfile} will be ignored`);
220
+ }
221
+ if (options.target && options.workerRuntime) {
222
+ deps.notice(
223
+ "warn",
224
+ `--target ${options.target} takes precedence; --runtime ${options.workerRuntime} will be ignored`,
225
+ );
226
+ }
227
+ await runAttributed(
228
+ "run",
229
+ {
230
+ agentId,
231
+ task,
232
+ executionRole: requestExecutionRole({
233
+ agentId,
234
+ ...(deps.getAgentRoleFacts ? { resolveFacts: deps.getAgentRoleFacts } : {}),
235
+ }),
236
+ requestOrigin: "user",
237
+ ...(options.workerProfile ? { workerProfile: options.workerProfile } : {}),
238
+ ...(options.workerRuntime ? { workerRuntime: options.workerRuntime } : {}),
239
+ ...(options.target ? { target: options.target } : {}),
240
+ ...(options.model ? { model: options.model } : {}),
241
+ ...(options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),
242
+ ...(options.toolProfile ? { toolProfile: options.toolProfile } : {}),
243
+ ...(options.requiredCapabilities && options.requiredCapabilities.length > 0
244
+ ? { requiredCapabilities: options.requiredCapabilities }
245
+ : {}),
246
+ },
247
+ deps,
248
+ options.share === true,
249
+ );
250
+ }
251
+
252
+ async function handleDelegate(
253
+ agentId: string,
254
+ task: string,
255
+ deps: HandleRunDeps,
256
+ options: { share?: boolean } = {},
257
+ ): Promise<void> {
258
+ await runAttributed(
259
+ "delegate",
260
+ { agentId, delegationAgentId: agentId, executionRole: "builder", requestOrigin: "user", task },
261
+ deps,
262
+ options.share === true,
263
+ );
264
+ }
265
+
266
+ /**
267
+ * `/share [runId]`: hand a finished worker run's answer to the main agent.
268
+ *
269
+ * Nothing here is implicit. The operator either typed the command or passed
270
+ * `--share`, and the note travels the ordinary user-turn path, so the model
271
+ * receives it exactly as it receives anything else the operator writes.
272
+ */
273
+ function shareWorkerRun(runId: string | undefined, ctx: SlashCommandContext): void {
274
+ if (!ctx.submitOperatorNote) {
275
+ ctx.notice("error", "share is not wired; the worker transcript is unavailable in this session");
276
+ return;
277
+ }
278
+ const entry = selectWorkerRunToShare(ctx.listWorkerRuns?.() ?? [], runId);
279
+ if (!entry) {
280
+ ctx.notice(
281
+ "error",
282
+ runId === undefined
283
+ ? "no finished /run or /delegate result to share yet"
284
+ : `no finished run ${runId} in this session`,
285
+ );
286
+ return;
287
+ }
288
+ const facts = workerShareFactsFromEntry(entry);
289
+ const note = facts === null ? null : formatWorkerShareNote(facts);
290
+ if (note === null) {
291
+ ctx.notice("error", `run ${entry.runId} produced no text to share`);
292
+ return;
293
+ }
294
+ ctx.submitOperatorNote(note);
295
+ }
296
+
297
+ /**
298
+ * Runtime dependencies every slash-command handler may need. Every field is
299
+ * injected at startInteractive construction time; handlers never reach into
300
+ * the TUI, chat loop, or overlay module graph directly.
301
+ */
302
+ export interface SlashCommandContext {
303
+ io: RunIo;
304
+ notice: (level: NoticeLevel, text: string) => void;
305
+ dispatch: DispatchContract;
306
+ bus: SafeEventBus;
307
+ /** Strict recipe facts used to keep interactive /run role-equivalent with the CLI. */
308
+ getAgentRoleFacts?: AgentRoleFactsResolver;
309
+ /**
310
+ * Echo the typed command line into the transcript, dimmed, before the block
311
+ * it starts. `/run` and `/delegate` use it so a worker's attributed block has
312
+ * the request above it. Transcript-only; the line never enters model context.
313
+ */
314
+ echoOperatorCommand?: (text: string) => void;
315
+ /**
316
+ * Put operator-authored text into the session the way typed text enters it:
317
+ * a user turn, persisted in the ledger, visible in the transcript. Used only
318
+ * by `--share` and `/share`, and never with expansion, because a worker's
319
+ * answer is literal text and must not be re-read as file or skill syntax.
320
+ */
321
+ submitOperatorNote?: (text: string) => void;
322
+ /** Worker blocks this session folded, oldest first. `/share` picks from these. */
323
+ listWorkerRuns?: () => ReadonlyArray<WorkerEntryState>;
324
+ /** Fire-and-forget shutdown. Handler must not await. */
325
+ shutdown: () => void;
326
+ runInit: (options: InitCommandOptions) => void;
327
+ /** Write the current session transcript (all tool segments expanded, ANSI-stripped) to a Markdown file. */
328
+ exportTranscript: (path?: string) => void;
329
+ runContextClear: (options: ContextClearCommandOptions) => void;
330
+ /**
331
+ * Re-index the codewiki and refresh `.clio-coder` state without touching CLIO-CODER.md.
332
+ * Optional until the host wires onContextRefresh.
333
+ */
334
+ runContextRefresh?: () => void;
335
+ openSkillsHub?: () => void;
336
+ listPrompts: () => ResourceList<PromptTemplate>;
337
+ /**
338
+ * Resolve a `/name` against the loaded prompt templates. Absent when the host
339
+ * wired no resources, in which case a command-shaped token that names no
340
+ * builtin is simply not a command.
341
+ */
342
+ expandPromptTemplate?: (text: string) => PromptTemplateExpansion;
343
+ listExtensions?: () => ReadonlyArray<InstalledExtension>;
344
+ /** Detection report, pending proposals, and the two consent actions `/interop` drives. */
345
+ interop?: {
346
+ report: () => InteropReport | null;
347
+ proposals: () => ReadonlyArray<InteropProposal>;
348
+ configured: () => ReadonlyArray<{ id: string; command: string; args: ReadonlyArray<string> }>;
349
+ accept: (kind: InteropAgentId) => void;
350
+ decline: (kind: InteropAgentId) => void;
351
+ };
352
+ listAgents: () => ReadonlyArray<AgentSpec>;
353
+ listDelegationAgents: () => ReadonlyArray<{
354
+ id: string;
355
+ command: string;
356
+ args: ReadonlyArray<string>;
357
+ toolGovernance?: string;
358
+ labels?: Record<string, string>;
359
+ }>;
360
+ exportShareArchive?: (outPath: string) => { fileCount: number; path: string };
361
+ importShareArchive?: (path: string, options: { dryRun?: boolean; force?: boolean }) => ShareImportPlan;
362
+ openCost: () => void;
363
+ /** Open the read-only `/context` overlay: categorized context-window ledger. */
364
+ openContextView: () => void;
365
+ /** Open the read-only `/tasks` overlay: the session task board with receipts. */
366
+ openTasks: () => void;
367
+ /** Open the read-only `/memory` overlay: approved lessons and the live task bank. */
368
+ openMemory: () => void;
369
+ /** Opt-in import from the newest structured handoff; absent when the host has no task bank. */
370
+ seedTaskMemory?: () => TaskMemorySeedCommandResult;
371
+ /** Open `/view`, the full observability artifact viewer. */
372
+ openView: (filter?: string) => void;
373
+ /**
374
+ * Apply a thinking level named on the command line. Returns why it was
375
+ * refused so the caller can say so, because the level the operator typed may
376
+ * not be one the active target supports.
377
+ */
378
+ setThinkingLevel?: (level: string) => SetThinkingLevelResult;
379
+ /** Apply a transcript verbosity named on the command line; refused values are reported by the caller. */
380
+ setOutputVerbosity?: (verbosity: string) => SetOutputVerbosityResult;
381
+ openModel: () => void;
382
+ /** Live providers contract used by `/model <pattern>` to resolve directly. */
383
+ providers: ProvidersContract;
384
+ /** Apply a resolved model reference to settings (and optionally thinking level). */
385
+ applyModelRef: (ref: ResolvedModelRef) => void;
386
+ openSettings: (section?: SettingsSectionId, rowId?: SettingsCenterRowId) => void;
387
+ openResume: () => void;
388
+ startNewSession: () => void;
389
+ openTree: () => void;
390
+ openMessagePicker: () => void;
391
+ openHelp: (query?: string) => void;
392
+ openAgents: () => void;
393
+ openPrompts: () => void;
394
+ openExtensions: () => void;
395
+ openInterop?: () => void;
396
+ setEditorText?: (text: string) => void;
397
+ /**
398
+ * Run compaction for the current session. Handler resolves the target
399
+ * model, reads session entries, calls session/compaction/compact, and
400
+ * appends a compactionSummary entry. No-op when no session is open, so the
401
+ * handler prints an actionable stderr line instead.
402
+ */
403
+ runCompact: (instructions: string | undefined) => void;
404
+ /**
405
+ * Escape hatch for the `view verify` entry: verify a receipt file on disk
406
+ * and emit a single status line. Kept on the context so the registry does
407
+ * not import the overlay module.
408
+ */
409
+ verifyReceipt: (runId: string) => ReceiptIntegrityResult;
410
+ /**
411
+ * Handles the "unknown" case: append the text to the chat panel as a user
412
+ * turn, submit to the chat loop, and schedule a re-render. Handlers for
413
+ * {kind:"unknown"} defer to this so the chat-panel reference stays scoped
414
+ * to startInteractive.
415
+ */
416
+ submitChat: (text: string) => void;
417
+ /** Re-render request; wraps tui.requestRender so handlers do not import TUI. */
418
+ render: () => void;
419
+ }
420
+
421
+ /** The verb a command performs, in the order /help lists the groups. */
422
+ export const SLASH_COMMAND_GROUPS = ["Run", "Inspect", "Configure", "Sessions"] as const;
423
+ export type SlashCommandGroup = (typeof SLASH_COMMAND_GROUPS)[number];
424
+
425
+ export interface BuiltinSlashCommand {
426
+ name: string;
427
+ description: string;
428
+ group: SlashCommandGroup;
429
+ aliases?: ReadonlyArray<string>;
430
+ /**
431
+ * Argument text an alias stands in for, prepended to whatever the operator
432
+ * typed after it. `/compact` names a subcommand of `/context`, not the
433
+ * command itself, so it cannot be spelled as a bare alias.
434
+ */
435
+ aliasArgs?: Readonly<Record<string, string>>;
436
+ /** Excluded from /help, autocomplete, and the docs command table. */
437
+ hidden?: boolean;
438
+ args?: CommandArgsSpec;
439
+ /** Stable copy shown beside first-token subcommand completions. */
440
+ subcommandDescriptions?: Readonly<Record<string, string>>;
441
+ /** The set of SlashCommand kinds this entry is responsible for dispatching. */
442
+ kinds: ReadonlyArray<SlashCommandKind>;
443
+ /** Return the parsed SlashCommand for `trimmed` or null if this entry does not match. */
444
+ match?(trimmed: string): SlashCommand | null;
445
+ fromArgs?(parsed: ParsedArgs, trimmed: string): SlashCommand;
446
+ /** Execute `command` against `ctx`. Called only for kinds declared in `kinds`. */
447
+ handle(command: SlashCommand, ctx: SlashCommandContext): void;
448
+ }
449
+
450
+ const RUN_THINKING_LEVELS: ReadonlyArray<JobThinkingLevel> = THINKING_LEVELS;
451
+
452
+ function isRunThinkingLevel(value: string): value is JobThinkingLevel {
453
+ return RUN_THINKING_LEVELS.some((level) => level === value);
454
+ }
455
+
456
+ function isSettingsSectionId(value: string): value is SettingsSectionId {
457
+ return SETTINGS_SECTIONS.some((section) => section.id === value);
458
+ }
459
+
460
+ /** `/context compact` alone keeps a free-form optional instruction tail. */
461
+ const COMPACT_POSITIONALS: ReadonlyArray<CommandPositionalSpec> = [
462
+ { name: "instructions", required: false, rest: true },
463
+ ];
464
+
465
+ /**
466
+ * A registered command whose arguments do not parse is a mistake to report,
467
+ * not a chat message to send. Falling through to `unknown` submitted the raw
468
+ * text to the model, which then answered it conversationally while the
469
+ * operator believed a setting had changed and nothing had. `unknown` stays
470
+ * reserved for input that matched no command at all, so pasted text beginning
471
+ * with a slash still reaches the model.
472
+ */
473
+ function fromArgsOrUsage(name: string, command: SlashCommand): (parsed: ParsedArgs) => SlashCommand {
474
+ return (parsed) => (parsed.error ? { kind: "usage-error", command: name, reason: parsed.error } : command);
475
+ }
476
+
477
+ /**
478
+ * A configuration-shaped command that is a shortcut into one settings section.
479
+ * It parses to the same `settings` command `/settings <section>` produces, so
480
+ * the settings entry dispatches it and this entry owns no kind of its own.
481
+ */
482
+ function settingsDeepLink(
483
+ name: string,
484
+ section: SettingsSectionId,
485
+ description: string,
486
+ rowId?: SettingsCenterRowId,
487
+ ): BuiltinSlashCommand {
488
+ return {
489
+ name,
490
+ description,
491
+ group: "Configure",
492
+ kinds: [],
493
+ args: {},
494
+ fromArgs: fromArgsOrUsage(name, { kind: "settings", section, ...(rowId ? { rowId } : {}) }),
495
+ handle: () => undefined,
496
+ };
497
+ }
498
+
499
+ function usageNotice(entry: BuiltinSlashCommand, subcommand?: string): string {
500
+ return usageLine(entry, subcommand).trim();
501
+ }
502
+
503
+ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
504
+ {
505
+ name: "quit",
506
+ description: "Exit Clio Coder",
507
+ group: "Sessions",
508
+ aliases: ["exit"],
509
+ kinds: ["quit"],
510
+ args: {},
511
+ fromArgs: fromArgsOrUsage("quit", { kind: "quit" }),
512
+ handle(_command, ctx) {
513
+ ctx.shutdown();
514
+ },
515
+ },
516
+ {
517
+ name: "help",
518
+ description: "Open the interactive help center showing commands and keys",
519
+ group: "Inspect",
520
+ kinds: ["help"],
521
+ args: {
522
+ positionals: [{ name: "query", required: false, rest: true }],
523
+ },
524
+ fromArgs(parsed) {
525
+ return { kind: "help", ...(parsed.rest ? { query: parsed.rest } : {}) };
526
+ },
527
+ handle(command, ctx) {
528
+ ctx.openHelp(command.kind === "help" ? command.query : undefined);
529
+ },
530
+ },
531
+ {
532
+ name: "skill",
533
+ description: "Open the Skills Hub or invoke a skill",
534
+ group: "Run",
535
+ aliases: ["skill:", "skills:"],
536
+ kinds: ["skill-selector", "skill-invocation"],
537
+ args: {
538
+ positionals: [
539
+ { name: "name", required: false },
540
+ { name: "task", required: false, rest: true },
541
+ ],
542
+ },
543
+ match(trimmed) {
544
+ if (trimmed === "/skill" || trimmed === "/skill:" || trimmed === "/skills:") {
545
+ return { kind: "skill-selector" };
546
+ }
547
+ const command = parseSkillCommand(trimmed);
548
+ if (command) {
549
+ return { kind: "skill-invocation", text: trimmed };
550
+ }
551
+ return null;
552
+ },
553
+ handle(command, ctx) {
554
+ if (command.kind === "skill-selector") {
555
+ ctx.openSkillsHub?.();
556
+ } else if (command.kind === "skill-invocation") {
557
+ ctx.submitChat(command.text);
558
+ }
559
+ },
560
+ },
561
+ {
562
+ name: "prompts",
563
+ description: "List prompt templates",
564
+ group: "Inspect",
565
+ kinds: ["prompts"],
566
+ args: {},
567
+ fromArgs: fromArgsOrUsage("prompts", { kind: "prompts" }),
568
+ handle(_command, ctx) {
569
+ ctx.openPrompts();
570
+ },
571
+ },
572
+ {
573
+ name: "extensions",
574
+ description: "List installed extensions",
575
+ group: "Inspect",
576
+ kinds: ["extensions"],
577
+ args: {},
578
+ fromArgs: fromArgsOrUsage("extensions", { kind: "extensions" }),
579
+ handle(_command, ctx) {
580
+ ctx.openExtensions?.();
581
+ },
582
+ },
583
+ {
584
+ name: "interop",
585
+ description: "Review other coding agents detected on this machine",
586
+ group: "Inspect",
587
+ kinds: ["interop"],
588
+ args: {},
589
+ fromArgs: fromArgsOrUsage("interop", { kind: "interop" }),
590
+ handle(_command, ctx) {
591
+ ctx.openInterop?.();
592
+ },
593
+ },
594
+ {
595
+ name: "share",
596
+ description: "Share a worker result with the main agent, or export and import Clio archives",
597
+ group: "Sessions",
598
+ kinds: ["share"],
599
+ args: {
600
+ positionals: [{ name: "runId", required: false }],
601
+ subcommands: {
602
+ export: {
603
+ positionals: [{ name: "path", required: true }],
604
+ },
605
+ import: {
606
+ flags: [{ name: "--dry-run" }, { name: "--force" }],
607
+ positionals: [{ name: "path", required: true }],
608
+ },
609
+ },
610
+ },
611
+ fromArgs(parsed) {
612
+ const subcommand = parsed.subcommand === "export" || parsed.subcommand === "import" ? parsed.subcommand : undefined;
613
+ if (parsed.error) {
614
+ return {
615
+ kind: "share",
616
+ action: "usage",
617
+ ...(subcommand !== undefined ? { subcommand } : {}),
618
+ error: parsed.error,
619
+ };
620
+ }
621
+ const path = parsed.positionals[0];
622
+ if (subcommand === "export" && path !== undefined) return { kind: "share", action: "export", path };
623
+ if (subcommand === "import" && path !== undefined) {
624
+ return {
625
+ kind: "share",
626
+ action: "import",
627
+ path,
628
+ dryRun: parsed.flags.has("--dry-run"),
629
+ force: parsed.flags.has("--force"),
630
+ };
631
+ }
632
+ // No subcommand means the worker-result sense of the word, with or
633
+ // without a run id. `export` and `import` are the archive senses and are
634
+ // matched above, so neither reading can swallow the other.
635
+ if (subcommand === undefined) {
636
+ return { kind: "share", action: "worker-run", ...(path !== undefined ? { runId: path } : {}) };
637
+ }
638
+ return { kind: "share", action: "usage", ...(subcommand !== undefined ? { subcommand } : {}) };
639
+ },
640
+ handle(command, ctx) {
641
+ if (command.kind !== "share") return;
642
+ if (command.action === "worker-run") {
643
+ shareWorkerRun(command.runId, ctx);
644
+ return;
645
+ }
646
+ if (command.action === "usage") {
647
+ const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "share");
648
+ if (!entry) return;
649
+ const usage = usageNotice(entry, command.subcommand);
650
+ ctx.notice("info", command.error ? `${command.error}\n${usage}` : usage);
651
+ return;
652
+ }
653
+ if (command.action === "export") {
654
+ if (!ctx.exportShareArchive) {
655
+ ctx.notice("error", "share export is not wired");
656
+ return;
657
+ }
658
+ const result = ctx.exportShareArchive(command.path);
659
+ ctx.notice("success", `exported ${result.fileCount} item(s) to ${result.path}`);
660
+ return;
661
+ }
662
+ if (command.action === "import") {
663
+ if (!ctx.importShareArchive) {
664
+ ctx.notice("error", "share import is not wired");
665
+ return;
666
+ }
667
+ const plan = ctx.importShareArchive(command.path, { dryRun: command.dryRun, force: command.force });
668
+ for (const diag of plan.diagnostics) {
669
+ const detail = diag.path ? `${diag.message}: ${diag.path}` : diag.message;
670
+ ctx.notice("warn", `${diag.type}: ${detail}`);
671
+ }
672
+ const write = plan.actions.filter((action) => action.action === "write").length;
673
+ const overwrite = plan.actions.filter((action) => action.action === "overwrite").length;
674
+ const skip = plan.actions.filter((action) => action.action === "skip").length;
675
+ ctx.notice(
676
+ command.dryRun ? "info" : "success",
677
+ `${command.dryRun ? "dry-run" : "import"} write=${write} overwrite=${overwrite} skip=${skip} settings=${plan.actions.filter((action) => action.action === "settings").length}`,
678
+ );
679
+ }
680
+ },
681
+ },
682
+ {
683
+ name: "run",
684
+ description: "Run a fleet agent",
685
+ group: "Run",
686
+ kinds: ["run", "run-usage"],
687
+ args: {
688
+ parseFlagsBeforeRest: true,
689
+ flags: [
690
+ { name: "--agent-profile", aliases: ["--worker-profile", "--worker"], takesValue: true, valueName: "profile" },
691
+ { name: "--runtime", aliases: ["--agent-runtime", "--worker-runtime"], takesValue: true, valueName: "runtimeId" },
692
+ { name: "--target", takesValue: true, valueName: "id" },
693
+ { name: "--model", takesValue: true, valueName: "id" },
694
+ { name: "--thinking", takesValue: true, values: RUN_THINKING_LEVELS, valueName: "level" },
695
+ { name: "--tool-profile", takesValue: true, values: TOOL_PROFILE_NAMES },
696
+ { name: "--require", takesValue: true, repeatable: true, valueName: "cap" },
697
+ { name: "--share" },
698
+ ],
699
+ positionals: [
700
+ { name: "agent", required: true },
701
+ { name: "task", required: true, rest: true },
702
+ ],
703
+ },
704
+ fromArgs(parsed, trimmed) {
705
+ if (parsed.error) return { kind: "run-usage" };
706
+ const options: RunCommandOptions = {};
707
+
708
+ const workerProfile = parsed.flags.get("--agent-profile");
709
+ if (typeof workerProfile === "string") options.workerProfile = workerProfile;
710
+
711
+ const workerRuntime = parsed.flags.get("--runtime");
712
+ if (typeof workerRuntime === "string") options.workerRuntime = workerRuntime;
713
+
714
+ const target = parsed.flags.get("--target");
715
+ if (typeof target === "string") options.target = target;
716
+
717
+ const model = parsed.flags.get("--model");
718
+ if (typeof model === "string") options.model = model;
719
+
720
+ const thinking = parsed.flags.get("--thinking");
721
+ if (typeof thinking === "string") {
722
+ if (!isRunThinkingLevel(thinking)) return { kind: "run-usage" };
723
+ options.thinkingLevel = thinking;
724
+ }
725
+
726
+ const toolProfile = parsed.flags.get("--tool-profile");
727
+ if (typeof toolProfile === "string") {
728
+ if (!isToolProfileName(toolProfile)) return { kind: "run-usage" };
729
+ options.toolProfile = toolProfile;
730
+ }
731
+
732
+ const requiredCapabilities = parsed.flagValues.get("--require");
733
+ if (requiredCapabilities && requiredCapabilities.length > 0) {
734
+ options.requiredCapabilities = [...requiredCapabilities];
735
+ }
736
+
737
+ if (parsed.flags.has("--share")) options.share = true;
738
+
739
+ const agentId = parsed.positionals[0] ?? "";
740
+ const task = parsed.positionals[1] ?? "";
741
+
742
+ return { kind: "run", agentId, task, options, source: trimmed };
743
+ },
744
+ handle(command, ctx) {
745
+ if (command.kind === "run-usage") {
746
+ const entry = BUILTIN_SLASH_COMMANDS.find((e) => e.name === "run");
747
+ if (entry) {
748
+ ctx.notice("info", usageNotice(entry));
749
+ }
750
+ return;
751
+ }
752
+ if (command.kind !== "run") return;
753
+ const { agentId, task, options } = command;
754
+ ctx.echoOperatorCommand?.(command.source);
755
+ void (async () => {
756
+ await handleRun(
757
+ agentId,
758
+ task,
759
+ {
760
+ dispatch: ctx.dispatch,
761
+ ...(ctx.getAgentRoleFacts ? { getAgentRoleFacts: ctx.getAgentRoleFacts } : {}),
762
+ io: ctx.io,
763
+ notice: ctx.notice,
764
+ bus: ctx.bus,
765
+ ...(ctx.submitOperatorNote ? { submitOperatorNote: ctx.submitOperatorNote } : {}),
766
+ },
767
+ options,
768
+ );
769
+ ctx.render();
770
+ })();
771
+ },
772
+ },
773
+ {
774
+ name: "delegate",
775
+ description: "Run an ACP delegation agent",
776
+ group: "Run",
777
+ kinds: ["delegate", "delegate-usage"],
778
+ args: {
779
+ parseFlagsBeforeRest: true,
780
+ flags: [{ name: "--share" }],
781
+ positionals: [
782
+ { name: "agent-id", required: true },
783
+ { name: "task", required: true, rest: true },
784
+ ],
785
+ },
786
+ fromArgs(parsed, trimmed) {
787
+ if (parsed.error) return { kind: "delegate-usage" };
788
+ const agentId = parsed.positionals[0] ?? "";
789
+ const task = parsed.positionals[1] ?? "";
790
+ return { kind: "delegate", agentId, task, source: trimmed, ...(parsed.flags.has("--share") ? { share: true } : {}) };
791
+ },
792
+ handle(command, ctx) {
793
+ if (command.kind === "delegate-usage") {
794
+ const entry = BUILTIN_SLASH_COMMANDS.find((e) => e.name === "delegate");
795
+ if (entry) {
796
+ ctx.notice("info", usageNotice(entry));
797
+ }
798
+ return;
799
+ }
800
+ if (command.kind !== "delegate") return;
801
+ ctx.echoOperatorCommand?.(command.source);
802
+ const share = command.share === true;
803
+ void (async () => {
804
+ await handleDelegate(
805
+ command.agentId,
806
+ command.task,
807
+ {
808
+ dispatch: ctx.dispatch,
809
+ io: ctx.io,
810
+ notice: ctx.notice,
811
+ bus: ctx.bus,
812
+ ...(ctx.submitOperatorNote ? { submitOperatorNote: ctx.submitOperatorNote } : {}),
813
+ },
814
+ { share },
815
+ );
816
+ ctx.render();
817
+ })();
818
+ },
819
+ },
820
+ {
821
+ name: "agents",
822
+ description: "List Clio agents and ACP delegation agents",
823
+ group: "Inspect",
824
+ kinds: ["agents"],
825
+ args: {},
826
+ fromArgs: fromArgsOrUsage("agents", { kind: "agents" }),
827
+ handle(_command, ctx) {
828
+ ctx.openAgents();
829
+ },
830
+ },
831
+ settingsDeepLink("targets", "targets", "Open Settings → Targets: health, use, connect, probe, remove"),
832
+ {
833
+ name: "cost",
834
+ description: "Show session token and cost totals",
835
+ group: "Inspect",
836
+ kinds: ["cost"],
837
+ args: {},
838
+ fromArgs: fromArgsOrUsage("cost", { kind: "cost" }),
839
+ handle(_command, ctx) {
840
+ ctx.openCost();
841
+ },
842
+ },
843
+ {
844
+ name: "context",
845
+ description: "Context hub: window overlay plus compact, init, refresh, and reset",
846
+ group: "Inspect",
847
+ aliases: ["ctx", "compact"],
848
+ aliasArgs: { compact: "compact" },
849
+ kinds: ["context-view", "compact", "init", "context-clear", "context-refresh"],
850
+ subcommandDescriptions: {
851
+ compact: "Compact session context",
852
+ init: "Initialize project context",
853
+ refresh: "Refresh project context",
854
+ reset: "Reset project context",
855
+ },
856
+ args: {
857
+ subcommands: {
858
+ compact: { positionals: [...COMPACT_POSITIONALS] },
859
+ init: {},
860
+ refresh: {},
861
+ reset: {},
862
+ },
863
+ },
864
+ fromArgs(parsed) {
865
+ if (parsed.error) return { kind: "usage-error", command: "context", reason: parsed.error };
866
+ switch (parsed.subcommand) {
867
+ case "compact":
868
+ return { kind: "compact", instructions: parsed.rest };
869
+ case "init":
870
+ return { kind: "init", options: {} };
871
+ case "refresh":
872
+ return { kind: "context-refresh" };
873
+ case "reset":
874
+ return { kind: "context-clear", options: {} };
875
+ default:
876
+ return { kind: "context-view" };
877
+ }
878
+ },
879
+ handle(command, ctx) {
880
+ switch (command.kind) {
881
+ case "context-view":
882
+ ctx.openContextView();
883
+ return;
884
+ case "compact":
885
+ ctx.runCompact(command.instructions);
886
+ return;
887
+ case "init":
888
+ ctx.runInit(command.options);
889
+ return;
890
+ case "context-clear":
891
+ ctx.runContextClear(command.options);
892
+ return;
893
+ case "context-refresh":
894
+ if (ctx.runContextRefresh) {
895
+ ctx.runContextRefresh();
896
+ } else {
897
+ ctx.notice("error", "context refresh is not wired; pass onContextRefresh to startInteractive");
898
+ }
899
+ return;
900
+ default:
901
+ return;
902
+ }
903
+ },
904
+ },
905
+ settingsDeepLink("fleet", "fleet", "Open Settings → Fleet: defaults, profiles, agent bindings, nodes"),
906
+ {
907
+ name: "tasks",
908
+ description: "Show the session task board the agent tracks with the tasks tool",
909
+ group: "Inspect",
910
+ kinds: ["tasks"],
911
+ args: {},
912
+ fromArgs: fromArgsOrUsage("tasks", { kind: "tasks" }),
913
+ handle(_command, ctx) {
914
+ ctx.openTasks();
915
+ },
916
+ },
917
+ {
918
+ name: "memory",
919
+ description: "Inspect task memory or seed it from the newest handoff",
920
+ group: "Inspect",
921
+ kinds: ["memory", "memory-seed"],
922
+ subcommandDescriptions: { seed: "Seed the task bank from the newest handoff" },
923
+ args: { subcommands: { seed: {} } },
924
+ fromArgs(parsed) {
925
+ if (parsed.error) return { kind: "usage-error", command: "memory", reason: parsed.error };
926
+ return parsed.subcommand === "seed" ? { kind: "memory-seed" } : { kind: "memory" };
927
+ },
928
+ handle(command, ctx) {
929
+ if (command.kind === "memory") {
930
+ ctx.openMemory();
931
+ return;
932
+ }
933
+ if (command.kind !== "memory-seed") return;
934
+ const result = ctx.seedTaskMemory?.() ?? { status: "not-found" as const };
935
+ switch (result.status) {
936
+ case "seeded":
937
+ ctx.notice(
938
+ "success",
939
+ `task memory seeded ${result.seeded} entr${result.seeded === 1 ? "y" : "ies"} from ${result.source}${result.skipped > 0 ? `; skipped ${result.skipped} duplicate${result.skipped === 1 ? "" : "s"}` : ""}`,
940
+ );
941
+ return;
942
+ case "disabled":
943
+ ctx.notice("warn", "task memory is disabled; enable memory.intervention before seeding");
944
+ return;
945
+ case "not-found":
946
+ ctx.notice("info", "no structured task-memory snapshot found in the newest handoff");
947
+ }
948
+ },
949
+ },
950
+ {
951
+ name: "view",
952
+ description: "Browse session artifacts and verify receipts",
953
+ group: "Inspect",
954
+ kinds: ["view", "view-verify", "view-usage"],
955
+ args: {
956
+ positionals: [{ name: "filter", required: false, rest: true }],
957
+ subcommands: {
958
+ verify: {
959
+ positionals: [{ name: "runId", required: true }],
960
+ },
961
+ },
962
+ },
963
+ fromArgs(parsed) {
964
+ if (parsed.error) return { kind: "view-usage" };
965
+ if (parsed.subcommand === "verify") {
966
+ const runId = parsed.positionals[0] ?? "";
967
+ return { kind: "view-verify", runId };
968
+ }
969
+ return parsed.rest ? { kind: "view", filter: parsed.rest } : { kind: "view" };
970
+ },
971
+ handle(command, ctx) {
972
+ const entry = BUILTIN_SLASH_COMMANDS.find((e) => e.name === "view");
973
+ if (!entry) return;
974
+ if (command.kind === "view") {
975
+ ctx.openView(command.filter);
976
+ return;
977
+ }
978
+ if (command.kind === "view-usage") {
979
+ ctx.notice("info", usageNotice(entry, "verify"));
980
+ return;
981
+ }
982
+ if (command.kind !== "view-verify") return;
983
+ const result = ctx.verifyReceipt(command.runId);
984
+ if (result.ok) {
985
+ ctx.notice("success", `verify ok ${command.runId}`);
986
+ } else {
987
+ ctx.notice("error", `verify fail ${command.runId} ${result.reason}`);
988
+ }
989
+ },
990
+ },
991
+ {
992
+ name: "thinking",
993
+ description: "Set the chat thinking level, or open Settings → Orchestrator",
994
+ group: "Configure",
995
+ kinds: ["thinking-set"],
996
+ args: { positionals: [{ name: "level", required: false }] },
997
+ fromArgs(parsed) {
998
+ if (parsed.error) return { kind: "usage-error", command: "thinking", reason: parsed.error };
999
+ const level = parsed.positionals[0];
1000
+ return level
1001
+ ? { kind: "thinking-set", level }
1002
+ : { kind: "settings", section: "orchestrator", rowId: "orchestrator.thinkingLevel" };
1003
+ },
1004
+ handle(command, ctx) {
1005
+ if (command.kind !== "thinking-set") return;
1006
+ const result = ctx.setThinkingLevel?.(command.level) ?? { status: "unavailable" as const };
1007
+ if (result.status === "applied") {
1008
+ ctx.notice("success", `thinking: ${result.display}`);
1009
+ } else if (result.status === "unsupported") {
1010
+ ctx.notice("error", `thinking level "${result.level}" is not available here; try ${result.supported.join(", ")}`);
1011
+ } else {
1012
+ ctx.notice("error", "thinking level cannot be set right now");
1013
+ }
1014
+ ctx.render();
1015
+ },
1016
+ },
1017
+ {
1018
+ name: "output",
1019
+ description: "Set transcript detail (minimal, default, verbose), or open Settings → Terminal",
1020
+ group: "Configure",
1021
+ kinds: ["output-set"],
1022
+ args: { positionals: [{ name: "verbosity", required: false }] },
1023
+ fromArgs(parsed) {
1024
+ if (parsed.error) return { kind: "usage-error", command: "output", reason: parsed.error };
1025
+ const verbosity = parsed.positionals[0];
1026
+ return verbosity
1027
+ ? { kind: "output-set", verbosity }
1028
+ : { kind: "settings", section: "terminal", rowId: "terminal.outputVerbosity" };
1029
+ },
1030
+ handle(command, ctx) {
1031
+ if (command.kind !== "output-set") return;
1032
+ const result = ctx.setOutputVerbosity?.(command.verbosity) ?? { status: "unavailable" as const };
1033
+ if (result.status === "applied") {
1034
+ ctx.notice("success", `output detail: ${result.verbosity}`);
1035
+ } else if (result.status === "unsupported") {
1036
+ ctx.notice("error", `output detail "${result.verbosity}" is not one of ${result.supported.join(", ")}`);
1037
+ } else {
1038
+ ctx.notice("error", "output detail cannot be set right now");
1039
+ }
1040
+ ctx.render();
1041
+ },
1042
+ },
1043
+ {
1044
+ name: "model",
1045
+ description: "Open model selector or set a model",
1046
+ group: "Configure",
1047
+ aliases: ["models"],
1048
+ kinds: ["model", "model-set"],
1049
+ args: {
1050
+ positionals: [{ name: "pattern", required: false, rest: true }],
1051
+ },
1052
+ fromArgs(parsed) {
1053
+ const pattern = parsed.positionals[0];
1054
+ if (pattern) {
1055
+ return { kind: "model-set", pattern };
1056
+ }
1057
+ return { kind: "model" };
1058
+ },
1059
+ handle(command, ctx) {
1060
+ if (command.kind === "model") {
1061
+ ctx.openModel();
1062
+ return;
1063
+ }
1064
+ if (command.kind !== "model-set") return;
1065
+ void (async () => {
1066
+ try {
1067
+ await ctx.providers.probeAllLive();
1068
+ } catch (err) {
1069
+ const msg = err instanceof Error ? err.message : String(err);
1070
+ ctx.notice("warn", `model refresh failed; resolving cached catalog: ${msg}`);
1071
+ }
1072
+ const result = resolveModelReference(command.pattern, ctx.providers);
1073
+ if (!result.ref) {
1074
+ ctx.notice("error", result.error ?? `no match for "${command.pattern}"`);
1075
+ ctx.render();
1076
+ return;
1077
+ }
1078
+ if (result.warning) ctx.notice("warn", result.warning);
1079
+ ctx.applyModelRef(result.ref);
1080
+ const suffix = result.ref.thinkingLevel ? ` thinking=${result.ref.thinkingLevel}` : "";
1081
+ ctx.notice("success", `active: ${result.ref.target}/${result.ref.model}${suffix}`);
1082
+ ctx.render();
1083
+ })();
1084
+ },
1085
+ },
1086
+ settingsDeepLink(
1087
+ "scoped-models",
1088
+ "models",
1089
+ "Open Settings → Models: the Alt+J / Alt+K cycle set and favorites",
1090
+ "scope",
1091
+ ),
1092
+ {
1093
+ name: "settings",
1094
+ description: "Open interactive settings",
1095
+ group: "Configure",
1096
+ aliases: ["config"],
1097
+ kinds: ["settings"],
1098
+ args: { positionals: [{ name: "section", required: false }] },
1099
+ fromArgs(parsed) {
1100
+ if (parsed.error) return { kind: "usage-error", command: "settings", reason: parsed.error };
1101
+ const section = parsed.positionals[0];
1102
+ if (section === undefined) return { kind: "settings" };
1103
+ if (!isSettingsSectionId(section)) {
1104
+ const known = SETTINGS_SECTIONS.map((entry) => entry.id).join(", ");
1105
+ return { kind: "usage-error", command: "settings", reason: `Unknown section: ${section} (one of ${known})` };
1106
+ }
1107
+ return { kind: "settings", section };
1108
+ },
1109
+ handle(command, ctx) {
1110
+ if (command.kind === "settings") ctx.openSettings(command.section, command.rowId);
1111
+ },
1112
+ },
1113
+ {
1114
+ name: "resume",
1115
+ description: "Resume a past session",
1116
+ group: "Sessions",
1117
+ kinds: ["resume"],
1118
+ args: {},
1119
+ fromArgs: fromArgsOrUsage("resume", { kind: "resume" }),
1120
+ handle(_command, ctx) {
1121
+ ctx.openResume();
1122
+ },
1123
+ },
1124
+ {
1125
+ name: "new",
1126
+ description: "Start a fresh session",
1127
+ group: "Sessions",
1128
+ kinds: ["new"],
1129
+ args: {},
1130
+ fromArgs: fromArgsOrUsage("new", { kind: "new" }),
1131
+ handle(_command, ctx) {
1132
+ ctx.startNewSession();
1133
+ },
1134
+ },
1135
+ {
1136
+ name: "tree",
1137
+ description: "Open session tree navigator",
1138
+ group: "Sessions",
1139
+ kinds: ["tree"],
1140
+ args: {},
1141
+ fromArgs: fromArgsOrUsage("tree", { kind: "tree" }),
1142
+ handle(_command, ctx) {
1143
+ ctx.openTree();
1144
+ },
1145
+ },
1146
+ {
1147
+ name: "fork",
1148
+ description: "Fork from an assistant turn",
1149
+ group: "Sessions",
1150
+ kinds: ["fork"],
1151
+ args: {},
1152
+ fromArgs: fromArgsOrUsage("fork", { kind: "fork" }),
1153
+ handle(_command, ctx) {
1154
+ ctx.openMessagePicker();
1155
+ },
1156
+ },
1157
+ {
1158
+ name: "export",
1159
+ description: "Export the session transcript to Markdown",
1160
+ group: "Sessions",
1161
+ kinds: ["export"],
1162
+ args: {
1163
+ positionals: [{ name: "path", required: false }],
1164
+ },
1165
+ fromArgs(parsed) {
1166
+ return { kind: "export", path: parsed.positionals[0] };
1167
+ },
1168
+ handle(command, ctx) {
1169
+ if (command.kind !== "export") return;
1170
+ ctx.exportTranscript(command.path);
1171
+ },
1172
+ },
1173
+ ];
1174
+
1175
+ const HANDLER_BY_KIND = new Map<SlashCommandKind, BuiltinSlashCommand>();
1176
+ const COMMAND_TERM_OWNER = new Map<string, string>();
1177
+ for (const entry of BUILTIN_SLASH_COMMANDS) {
1178
+ for (const term of [entry.name, ...(entry.aliases ?? [])]) {
1179
+ const owner = COMMAND_TERM_OWNER.get(term);
1180
+ if (owner) {
1181
+ throw new Error(`BUILTIN_SLASH_COMMANDS: command term "${term}" is owned by both "${owner}" and "${entry.name}"`);
1182
+ }
1183
+ COMMAND_TERM_OWNER.set(term, entry.name);
1184
+ }
1185
+ for (const kind of entry.kinds) {
1186
+ if (HANDLER_BY_KIND.has(kind)) {
1187
+ throw new Error(`BUILTIN_SLASH_COMMANDS: kind "${kind}" is owned by multiple entries`);
1188
+ }
1189
+ HANDLER_BY_KIND.set(kind, entry);
1190
+ }
1191
+ }
1192
+
1193
+ /**
1194
+ * A token that could only have been meant as a command: one word of letters,
1195
+ * digits, and hyphens after the leading slash.
1196
+ *
1197
+ * A spelling that names no command used to match nothing and fall through to
1198
+ * the model as prose. Measured: `/compact` was answered "/compact (completed)"
1199
+ * in six output tokens while context stayed at 9%, no compaction summary was
1200
+ * written, and no hook fired. The operator read a completion that never
1201
+ * happened, which is the same failure `/thinking off` had. Only active commands
1202
+ * run, so anything command-shaped that the registry does not claim fails here
1203
+ * rather than being answered by a model that will invent a result.
1204
+ *
1205
+ * The shape test is what keeps that from swallowing ordinary text, because a
1206
+ * leading slash is also how an absolute path starts. `/home/user/notes` and
1207
+ * `/not/a/command` carry a separator, so they are not one word and still reach
1208
+ * the model unchanged.
1209
+ *
1210
+ * One word followed by prose stays ambiguous: `/compact tidy up` is the defect
1211
+ * and `/tmp is full` is a sentence, and nothing in the text separates them. It
1212
+ * resolves as a command, so a sentence that has to open this way needs
1213
+ * COMMAND_ESCAPE.
1214
+ */
1215
+ const COMMAND_SHAPED_TOKEN = /^[A-Za-z][A-Za-z0-9-]*$/u;
1216
+
1217
+ /**
1218
+ * Prefix that sends a command-shaped line to the model as text.
1219
+ *
1220
+ * This used to be a leading space, guarded by testing the raw input rather than
1221
+ * the trimmed one. No operator could ever reach it: the terminal engine trims
1222
+ * the submitted line inside its own submit path, so the parser only ever sees
1223
+ * text with the whitespace already gone. Typing ` /tmp is full` in the TUI
1224
+ * failed with "/tmp is not a command" exactly like the unescaped spelling, and
1225
+ * a contract test asserted the unreachable branch.
1226
+ *
1227
+ * A backslash survives the trim. It claims one character and only in front of a
1228
+ * slash, so `\\server\share` and `\note to self` are still ordinary text.
1229
+ */
1230
+ const COMMAND_ESCAPE = "\\/";
1231
+
1232
+ /** Pure slash-command parser: no I/O, no side effects. Walks the registry in order. */
1233
+ export function parseSlashCommand(input: string): SlashCommand {
1234
+ const trimmed = input.trim();
1235
+ if (trimmed.length === 0) return { kind: "empty" };
1236
+ if (trimmed.startsWith(COMMAND_ESCAPE)) return { kind: "unknown", text: trimmed.slice(1) };
1237
+ for (const entry of BUILTIN_SLASH_COMMANDS) {
1238
+ const match = entry.match ? entry.match(trimmed) : matchFromSpec(entry, trimmed);
1239
+ if (match) return match;
1240
+ }
1241
+ if (trimmed.startsWith("/")) {
1242
+ const token = trimmed.slice(1).split(/\s+/u)[0] ?? "";
1243
+ if (COMMAND_SHAPED_TOKEN.test(token)) return { kind: "unknown-command", token, text: trimmed };
1244
+ }
1245
+ return { kind: "unknown", text: trimmed };
1246
+ }
1247
+
1248
+ /**
1249
+ * Dispatches a parsed SlashCommand to its owning registry entry. `empty` is a
1250
+ * no-op and `unknown` falls through to chat submission; every other kind
1251
+ * resolves to exactly one registry entry at module load.
1252
+ */
1253
+ export function dispatchSlashCommand(command: SlashCommand, ctx: SlashCommandContext): void {
1254
+ if (command.kind === "empty") return;
1255
+ if (command.kind === "unknown") {
1256
+ ctx.submitChat(command.text);
1257
+ return;
1258
+ }
1259
+ if (command.kind === "unknown-command") {
1260
+ // The registry does not own the token, but a prompt template might. The
1261
+ // parser stays pure, so the lookup happens here, and only for a spelling
1262
+ // that matched no command: `/name` is how every other agent invokes the
1263
+ // commands sitting in the roots Clio reads, and answering "not a command"
1264
+ // for one that is loaded made the whole foreign prompt surface unreachable.
1265
+ const expansion = ctx.expandPromptTemplate?.(command.text);
1266
+ if (expansion?.expanded === true) {
1267
+ ctx.submitChat(command.text);
1268
+ return;
1269
+ }
1270
+ // A template that exists and refused is not a typo. Its reason reaches the
1271
+ // operator and nothing reaches the model.
1272
+ const refusal = expansion?.expanded === false ? expansion.refusal : undefined;
1273
+ ctx.notice("error", refusal ? refusal.message : `/${command.token} is not a command. Type /help for the list.`);
1274
+ ctx.render();
1275
+ return;
1276
+ }
1277
+ if (command.kind === "usage-error") {
1278
+ const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === command.command);
1279
+ const usage = entry ? ` ${usageNotice(entry)}` : "";
1280
+ ctx.notice("error", `${command.reason}.${usage}`);
1281
+ ctx.render();
1282
+ return;
1283
+ }
1284
+ const entry = HANDLER_BY_KIND.get(command.kind);
1285
+ if (!entry) return;
1286
+ entry.handle(command, ctx);
1287
+ }
1288
+
1289
+ export interface CommandReferenceEntry {
1290
+ name: string;
1291
+ aliases: ReadonlyArray<string>;
1292
+ /** Argument text each alias in `aliases` stands in for, when it stands for any. */
1293
+ aliasArgs?: Readonly<Record<string, string>>;
1294
+ usage: string;
1295
+ description: string;
1296
+ group: SlashCommandGroup;
1297
+ /** The command's args grammar, carried through for argument autocomplete. */
1298
+ args?: CommandArgsSpec;
1299
+ /** Stable copy shown beside first-token subcommand completions. */
1300
+ subcommandDescriptions?: Readonly<Record<string, string>>;
1301
+ }
1302
+
1303
+ export function commandReference(): ReadonlyArray<CommandReferenceEntry> {
1304
+ return BUILTIN_SLASH_COMMANDS.filter((entry) => entry.hidden !== true).map((entry) => {
1305
+ const usage = usageLine(entry)
1306
+ .replace(/^\nusage:\s*/, "")
1307
+ .replace(/\n$/, "");
1308
+ return {
1309
+ name: entry.name,
1310
+ aliases: entry.aliases ?? [],
1311
+ ...(entry.aliasArgs ? { aliasArgs: entry.aliasArgs } : {}),
1312
+ usage,
1313
+ description: entry.description,
1314
+ group: entry.group,
1315
+ ...(entry.args ? { args: entry.args } : {}),
1316
+ ...(entry.subcommandDescriptions ? { subcommandDescriptions: entry.subcommandDescriptions } : {}),
1317
+ };
1318
+ });
1319
+ }