@iowarp/clio-coder 0.3.0 → 0.3.2

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