@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,1154 @@
1
+ import chalk from "chalk";
2
+ import {
3
+ bindAgentProfileInSettings,
4
+ type ClioSettings,
5
+ readSettings,
6
+ removeFleetProfileFromSettings,
7
+ setFleetProfileInSettings,
8
+ updateSettings,
9
+ useTargetInSettings,
10
+ } from "../core/config.js";
11
+ import { THINKING_LEVELS, type ThinkingLevel } from "../core/defaults.js";
12
+ import { loadDomains } from "../core/domain-loader.js";
13
+ import { ConfigDomainModule } from "../domains/config/index.js";
14
+ import { ensureClioState } from "../domains/lifecycle/index.js";
15
+ import type { ProvidersContract, TargetStatus } from "../domains/providers/contract.js";
16
+ import {
17
+ isDispatchEligibleRuntime,
18
+ isOrchestratorEligibleRuntime,
19
+ ProvidersDomainModule,
20
+ } from "../domains/providers/index.js";
21
+ import { getRuntimeRegistry } from "../domains/providers/registry.js";
22
+ import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
23
+ import type { CapabilityFlags } from "../domains/providers/types/capability-flags.js";
24
+ import type { RuntimeTier } from "../domains/providers/types/runtime-descriptor.js";
25
+ import { runConfigureCommand, runTargetRemove, runTargetRename } from "./configure.js";
26
+ import { printError, printOk } from "./shared.js";
27
+ import { column, terminalColumns, truncate } from "./text-layout.js";
28
+
29
+ const HEADER: ReadonlyArray<string> = ["id", "tier", "runtime", "auth", "url", "model", "health", "caps", "notes"];
30
+ type ProviderOutputTier = RuntimeTier | "unknown";
31
+
32
+ const HELP = `clio-coder targets
33
+
34
+ List and manage configured model targets.
35
+
36
+ Usage:
37
+ clio-coder targets [--json] [--probe] [--target <id>]
38
+ clio-coder targets add [configure flags]
39
+ clio-coder targets use <id> [--model <id>] [--orchestrator-model <id>] [--background-model <id>]
40
+ [--fleet-target <id>] [--fleet-model <id>]
41
+ clio-coder targets fleet [--json]
42
+ clio-coder targets profile list [--json]
43
+ clio-coder targets profile set <name> <id> [--model <id>] [--thinking <level>]
44
+ clio-coder targets profile <name> <id> [--model <id>] [--thinking <level>]
45
+ clio-coder targets profile remove <name> [--force]
46
+ clio-coder targets profile rename <old> <new>
47
+ clio-coder targets profile bind <agentId> <profileName>
48
+ clio-coder targets profile unbind <agentId>
49
+ clio-coder targets profile bindings [--json]
50
+ clio-coder targets convert <id> --runtime <runtimeId>
51
+ clio-coder targets remove <id>
52
+ clio-coder targets rename <old> <new>
53
+
54
+ Aliases:
55
+ --worker-target and --worker-model are accepted for --fleet-target and
56
+ --fleet-model, carried over from before the worker/fleet rename.
57
+ `;
58
+
59
+ const USE_USAGE =
60
+ "clio-coder targets use <id> [--model <id>] [--orchestrator-model <id>] [--background-model <id>] [--fleet-target <id>] [--fleet-model <id>]";
61
+
62
+ /**
63
+ * `--help` anywhere on a targets subcommand is a question, not an argument.
64
+ *
65
+ * `use --help` and `remove --help` read it as the target id and answered
66
+ * `no target with id --help`; `rename`, `profile`, and `convert` answered their
67
+ * usage as an error on stderr. Each now prints the same usage on stdout with
68
+ * status 0 and executes nothing.
69
+ */
70
+ function wantsHelp(args: ReadonlyArray<string>): boolean {
71
+ return args.includes("--help") || args.includes("-h");
72
+ }
73
+
74
+ function printUsage(usage: string): number {
75
+ process.stdout.write(`usage: ${usage}\n`);
76
+ return 0;
77
+ }
78
+
79
+ interface ListArgs {
80
+ json: boolean;
81
+ probe: boolean;
82
+ target?: string;
83
+ help: boolean;
84
+ }
85
+
86
+ interface UseArgs {
87
+ id: string;
88
+ model?: string;
89
+ orchestratorModel?: string;
90
+ backgroundModel?: string;
91
+ workerModel?: string;
92
+ workerTarget?: string;
93
+ }
94
+
95
+ type WorkerThinkingLevel = ThinkingLevel;
96
+
97
+ const VALID_THINKING = new Set<WorkerThinkingLevel>(THINKING_LEVELS);
98
+
99
+ interface WorkerProfileArgs {
100
+ name: string;
101
+ targetId: string;
102
+ model?: string;
103
+ thinkingLevel?: WorkerThinkingLevel;
104
+ }
105
+
106
+ interface ProfileRemoveArgs {
107
+ name: string;
108
+ force: boolean;
109
+ }
110
+
111
+ interface ProfileRenameArgs {
112
+ oldName: string;
113
+ newName: string;
114
+ }
115
+
116
+ interface ProfileBindArgs {
117
+ agentId: string;
118
+ profileName: string;
119
+ }
120
+
121
+ const PROFILE_SUBCOMMANDS = new Set(["list", "set", "remove", "rename", "bind", "unbind", "bindings"]);
122
+
123
+ function parseListArgs(args: ReadonlyArray<string>): ListArgs {
124
+ const parsed: ListArgs = { json: false, probe: false, help: false };
125
+ for (let i = 0; i < args.length; i += 1) {
126
+ const arg = args[i];
127
+ if (arg === "--help" || arg === "-h") {
128
+ parsed.help = true;
129
+ continue;
130
+ }
131
+ if (arg === "--json") {
132
+ parsed.json = true;
133
+ continue;
134
+ }
135
+ if (arg === "--probe") {
136
+ parsed.probe = true;
137
+ continue;
138
+ }
139
+ if (arg === "--target") {
140
+ const value = args[i + 1];
141
+ if (!value) throw new Error("--target requires a value");
142
+ parsed.target = value;
143
+ i += 1;
144
+ continue;
145
+ }
146
+ if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
147
+ throw new Error(`unknown targets argument: ${arg}`);
148
+ }
149
+ return parsed;
150
+ }
151
+
152
+ export async function runTargetsCommand(args: ReadonlyArray<string>): Promise<number> {
153
+ const subcommand = args[0];
154
+ if (subcommand === "add") return runConfigureCommand(args.slice(1));
155
+ if (subcommand === "use") return runUse(args.slice(1));
156
+ if (subcommand === "fleet" || subcommand === "workers") return runFleet(args.slice(1));
157
+ if (subcommand === "profile" || subcommand === "worker") return runProfile(args.slice(1));
158
+ if (subcommand === "remove") return runRemove(args.slice(1));
159
+ if (subcommand === "rename") return runRename(args.slice(1));
160
+ if (subcommand === "convert") return runConvert(args.slice(1));
161
+ if (subcommand === "--help" || subcommand === "-h") {
162
+ process.stdout.write(HELP);
163
+ return 0;
164
+ }
165
+
166
+ let parsed: ListArgs;
167
+ try {
168
+ parsed = parseListArgs(args);
169
+ } catch (error) {
170
+ printError(error instanceof Error ? error.message : String(error));
171
+ process.stderr.write(HELP);
172
+ return 2;
173
+ }
174
+ if (parsed.help) {
175
+ process.stdout.write(HELP);
176
+ return 0;
177
+ }
178
+
179
+ ensureClioState();
180
+ const loaded = await loadDomains([ConfigDomainModule, ProvidersDomainModule]);
181
+ const providers = loaded.getContract<ProvidersContract>("providers");
182
+ if (!providers) {
183
+ process.stderr.write("targets: provider domain not loaded\n");
184
+ await loaded.stop();
185
+ return 1;
186
+ }
187
+ if (parsed.probe) {
188
+ try {
189
+ await providers.probeAllLive();
190
+ } catch (err) {
191
+ process.stderr.write(`targets: live probe failed: ${err instanceof Error ? err.message : String(err)}\n`);
192
+ }
193
+ }
194
+ const entries = providers.list();
195
+ if (parsed.target !== undefined && !entries.some((e) => e.target.id === parsed.target)) {
196
+ printError(
197
+ `no target with id ${parsed.target}. ${entries.length} target${entries.length === 1 ? "" : "s"} configured.`,
198
+ );
199
+ await loaded.stop();
200
+ return 2;
201
+ }
202
+ const filtered = parsed.target ? entries.filter((e) => e.target.id === parsed.target) : entries;
203
+
204
+ if (parsed.json) {
205
+ const settings = readSettings();
206
+ const candidateFor = (status: TargetStatus): string | null => {
207
+ const orchestratorModel =
208
+ settings.orchestrator?.target === status.target.id ? (settings.orchestrator?.model ?? null) : null;
209
+ return orchestratorModel ?? status.target.defaultModel ?? null;
210
+ };
211
+ const rows = filtered.map((status) => {
212
+ const candidate = candidateFor(status);
213
+ const detectedReasoning = candidate ? providers.getDetectedReasoning(status.target.id, candidate) : null;
214
+ return serializeStatus(status, { detectedReasoning, candidateModelId: candidate });
215
+ });
216
+ process.stdout.write(`${JSON.stringify({ targets: rows }, null, 2)}\n`);
217
+ } else if (filtered.length === 0) {
218
+ process.stdout.write(
219
+ "no targets configured. run `clio-coder configure` or `clio-coder targets add` to register one.\n",
220
+ );
221
+ } else {
222
+ renderTable(providers, filtered);
223
+ }
224
+ await loaded.stop();
225
+ return 0;
226
+ }
227
+
228
+ function parseUseArgs(args: ReadonlyArray<string>): UseArgs | null {
229
+ const id = args[0];
230
+ if (!id) return null;
231
+ const parsed: UseArgs = { id };
232
+ for (let i = 1; i < args.length; i += 1) {
233
+ const arg = args[i];
234
+ const need = (): string => {
235
+ const value = args[i + 1];
236
+ if (!value) throw new Error(`${arg} requires a value`);
237
+ i += 1;
238
+ return value;
239
+ };
240
+ if (arg === "--model") {
241
+ parsed.model = need();
242
+ continue;
243
+ }
244
+ if (arg === "--orchestrator-model") {
245
+ parsed.orchestratorModel = need();
246
+ continue;
247
+ }
248
+ if (arg === "--background-model") {
249
+ parsed.backgroundModel = need();
250
+ continue;
251
+ }
252
+ if (arg === "--fleet-model" || arg === "--worker-model") {
253
+ parsed.workerModel = need();
254
+ continue;
255
+ }
256
+ if (arg === "--fleet-target" || arg === "--worker-target") {
257
+ parsed.workerTarget = need();
258
+ continue;
259
+ }
260
+ if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
261
+ throw new Error(`unknown targets use argument: ${arg}`);
262
+ }
263
+ return parsed;
264
+ }
265
+
266
+ function runUse(args: ReadonlyArray<string>): number {
267
+ if (wantsHelp(args)) return printUsage(USE_USAGE);
268
+ let parsed: UseArgs | null;
269
+ try {
270
+ parsed = parseUseArgs(args);
271
+ } catch (error) {
272
+ printError(error instanceof Error ? error.message : String(error));
273
+ return 2;
274
+ }
275
+ if (!parsed) {
276
+ printError(`usage: ${USE_USAGE}`);
277
+ return 2;
278
+ }
279
+ ensureClioState();
280
+ const settings = readSettings();
281
+ const target = settings.targets.find((entry) => entry.id === parsed.id);
282
+ if (!target) {
283
+ printError(`no target with id ${parsed.id}`);
284
+ return 1;
285
+ }
286
+ const registry = getRuntimeRegistry();
287
+ if (registry.list().length === 0) registerBuiltinRuntimes(registry);
288
+ const runtime = registry.get(target.runtime);
289
+ if (!runtime) {
290
+ printError(
291
+ `cannot use target '${target.id}' as orchestrator target because runtime '${target.runtime}' is not registered`,
292
+ );
293
+ return 1;
294
+ }
295
+ if (!isOrchestratorEligibleRuntime(runtime)) {
296
+ printError(
297
+ `cannot use target '${target.id}' as orchestrator target because runtime '${runtime.id}' is not an HTTP/native runtime`,
298
+ );
299
+ return 1;
300
+ }
301
+ let workerTarget = target;
302
+ if (parsed.workerTarget !== undefined && parsed.workerTarget !== target.id) {
303
+ const resolved = resolveDispatchProfileTarget(settings, parsed.workerTarget, "fleet worker target");
304
+ if ("exitCode" in resolved) return resolved.exitCode;
305
+ workerTarget = resolved.target;
306
+ }
307
+ const backgroundModel = parsed.backgroundModel;
308
+ // Locked read-modify-write so a concurrent session's field-level
309
+ // write-through (Shift+Tab, Alt+L, …) cannot be lost between our read
310
+ // above and this save.
311
+ updateSettings((fresh) => {
312
+ useTargetInSettings(fresh, target.id, {
313
+ ...(parsed.model !== undefined ? { model: parsed.model } : {}),
314
+ ...(parsed.orchestratorModel !== undefined ? { orchestratorModel: parsed.orchestratorModel } : {}),
315
+ ...(parsed.workerModel !== undefined ? { workerModel: parsed.workerModel } : {}),
316
+ workerTargetId: workerTarget.id,
317
+ ...(backgroundModel !== undefined ? { backgroundModel } : {}),
318
+ });
319
+ });
320
+ const dispatchWhere = workerTarget === target ? "" : ` and ${workerTarget.id} for fleet dispatch`;
321
+ const chatWhere = workerTarget === target ? "for chat and fleet dispatch" : "for chat";
322
+ printOk(
323
+ `using target ${target.id} ${chatWhere}${dispatchWhere}${backgroundModel === undefined ? "" : ", and background memory"}`,
324
+ );
325
+ return 0;
326
+ }
327
+
328
+ function parseWorkerArgs(args: ReadonlyArray<string>): WorkerProfileArgs | null {
329
+ const name = args[0];
330
+ const targetId = args[1];
331
+ if (!name || !targetId) return null;
332
+ const parsed: WorkerProfileArgs = { name, targetId };
333
+ for (let i = 2; i < args.length; i += 1) {
334
+ const arg = args[i];
335
+ const need = (): string => {
336
+ const value = args[i + 1];
337
+ if (!value) throw new Error(`${arg} requires a value`);
338
+ i += 1;
339
+ return value;
340
+ };
341
+ if (arg === "--model") {
342
+ parsed.model = need();
343
+ continue;
344
+ }
345
+ if (arg === "--thinking") {
346
+ const value = need();
347
+ if (!VALID_THINKING.has(value as WorkerThinkingLevel)) {
348
+ throw new Error("--thinking must be one of: off|minimal|low|medium|high|xhigh|max");
349
+ }
350
+ parsed.thinkingLevel = value as WorkerThinkingLevel;
351
+ continue;
352
+ }
353
+ if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
354
+ throw new Error(`unknown targets profile argument: ${arg}`);
355
+ }
356
+ return parsed;
357
+ }
358
+
359
+ function requireTrimmed(value: string | undefined, label: string): string {
360
+ const trimmed = value?.trim() ?? "";
361
+ if (trimmed.length === 0) throw new Error(`${label} must be non-empty`);
362
+ return trimmed;
363
+ }
364
+
365
+ function parseProfileRemoveArgs(args: ReadonlyArray<string>): ProfileRemoveArgs | null {
366
+ const name = args[0];
367
+ if (!name) return null;
368
+ const parsed: ProfileRemoveArgs = { name: name.trim(), force: false };
369
+ if (parsed.name.length === 0) throw new Error("profile name must be non-empty");
370
+ for (let i = 1; i < args.length; i += 1) {
371
+ const arg = args[i];
372
+ if (arg === "--force") {
373
+ parsed.force = true;
374
+ continue;
375
+ }
376
+ if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
377
+ throw new Error(`unknown targets profile remove argument: ${arg}`);
378
+ }
379
+ return parsed;
380
+ }
381
+
382
+ function parseProfileRenameArgs(args: ReadonlyArray<string>): ProfileRenameArgs | null {
383
+ if (args.length !== 2) return null;
384
+ const oldName = requireTrimmed(args[0], "old profile name");
385
+ const newName = requireTrimmed(args[1], "new profile name");
386
+ return { oldName, newName };
387
+ }
388
+
389
+ function parseProfileBindArgs(args: ReadonlyArray<string>): ProfileBindArgs | null {
390
+ if (args.length !== 2) return null;
391
+ return {
392
+ agentId: requireTrimmed(args[0], "agent id"),
393
+ profileName: requireTrimmed(args[1], "profile name"),
394
+ };
395
+ }
396
+
397
+ function resolveDispatchProfileTarget(
398
+ settings: ClioSettings,
399
+ targetId: string,
400
+ role = "fleet profile target",
401
+ ): { target: ClioSettings["targets"][number] } | { exitCode: number } {
402
+ const target = settings.targets.find((entry) => entry.id === targetId);
403
+ if (!target) {
404
+ printError(`no target with id ${targetId}`);
405
+ return { exitCode: 2 };
406
+ }
407
+ const registry = getRuntimeRegistry();
408
+ if (registry.list().length === 0) registerBuiltinRuntimes(registry);
409
+ const runtime = registry.get(target.runtime);
410
+ if (!runtime) {
411
+ printError(`cannot use target '${target.id}' as ${role} because runtime '${target.runtime}' is not registered`);
412
+ return { exitCode: 1 };
413
+ }
414
+ if (!isDispatchEligibleRuntime(runtime)) {
415
+ printError(
416
+ `cannot use target '${target.id}' as ${role} because runtime '${runtime.id}' is not a fleet-dispatch target`,
417
+ );
418
+ return { exitCode: 1 };
419
+ }
420
+ return { target };
421
+ }
422
+
423
+ function runProfileSet(
424
+ args: ReadonlyArray<string>,
425
+ usage = "clio-coder targets profile <name> <id> [--model <id>] [--thinking <level>]",
426
+ ): number {
427
+ if (wantsHelp(args)) return printUsage(usage);
428
+ let parsed: WorkerProfileArgs | null;
429
+ try {
430
+ parsed = parseWorkerArgs(args);
431
+ } catch (error) {
432
+ printError(error instanceof Error ? error.message : String(error));
433
+ return 2;
434
+ }
435
+ if (!parsed) {
436
+ printError(`usage: ${usage}`);
437
+ return 2;
438
+ }
439
+ ensureClioState();
440
+ const settings = readSettings();
441
+ const resolved = resolveDispatchProfileTarget(settings, parsed.targetId);
442
+ if ("exitCode" in resolved) return resolved.exitCode;
443
+ const { target } = resolved;
444
+ updateSettings((fresh) => {
445
+ setFleetProfileInSettings(fresh, parsed.name, target.id, {
446
+ ...(parsed.model !== undefined ? { model: parsed.model } : {}),
447
+ ...(parsed.thinkingLevel !== undefined ? { thinkingLevel: parsed.thinkingLevel } : {}),
448
+ });
449
+ });
450
+ printOk(`fleet profile ${parsed.name} -> ${target.id}`);
451
+ return 0;
452
+ }
453
+
454
+ function runProfileRemove(args: ReadonlyArray<string>): number {
455
+ if (wantsHelp(args)) return printUsage("clio-coder targets profile remove <name> [--force]");
456
+ let parsed: ProfileRemoveArgs | null;
457
+ try {
458
+ parsed = parseProfileRemoveArgs(args);
459
+ } catch (error) {
460
+ printError(error instanceof Error ? error.message : String(error));
461
+ return 2;
462
+ }
463
+ if (!parsed) {
464
+ printError("usage: clio-coder targets profile remove <name> [--force]");
465
+ return 2;
466
+ }
467
+ ensureClioState();
468
+ const settings = readSettings();
469
+ if (!settings.workers.profiles[parsed.name]) {
470
+ printError(`no fleet profile named ${parsed.name}`);
471
+ return 1;
472
+ }
473
+ const boundAgents = Object.entries(settings.workers.agentBindings)
474
+ .filter(([, profileName]) => profileName === parsed.name)
475
+ .map(([agentId]) => agentId);
476
+ if (boundAgents.length > 0 && !parsed.force) {
477
+ printError(
478
+ `fleet profile ${parsed.name} is bound to ${boundAgents.length} agent${boundAgents.length === 1 ? "" : "s"}; use --force to remove profile and bindings`,
479
+ boundAgents.join(", "),
480
+ );
481
+ return 1;
482
+ }
483
+ let removedBindings = 0;
484
+ updateSettings((fresh) => {
485
+ removedBindings = removeFleetProfileFromSettings(fresh, parsed.name);
486
+ });
487
+ printOk(
488
+ `removed fleet profile ${parsed.name} (${removedBindings} binding${removedBindings === 1 ? "" : "s"} removed)`,
489
+ );
490
+ return 0;
491
+ }
492
+
493
+ function runProfileRename(args: ReadonlyArray<string>): number {
494
+ if (wantsHelp(args)) return printUsage("clio-coder targets profile rename <old> <new>");
495
+ let parsed: ProfileRenameArgs | null;
496
+ try {
497
+ parsed = parseProfileRenameArgs(args);
498
+ } catch (error) {
499
+ printError(error instanceof Error ? error.message : String(error));
500
+ return 2;
501
+ }
502
+ if (!parsed) {
503
+ printError("usage: clio-coder targets profile rename <old> <new>");
504
+ return 2;
505
+ }
506
+ if (parsed.oldName === parsed.newName) {
507
+ printError("old and new profile names are identical");
508
+ return 2;
509
+ }
510
+ ensureClioState();
511
+ const settings = readSettings();
512
+ if (!settings.workers.profiles[parsed.oldName]) {
513
+ printError(`no fleet profile named ${parsed.oldName}`);
514
+ return 1;
515
+ }
516
+ if (settings.workers.profiles[parsed.newName]) {
517
+ printError(`fleet profile already exists: ${parsed.newName}`);
518
+ return 2;
519
+ }
520
+ let updatedBindings = 0;
521
+ updateSettings((fresh) => {
522
+ const profile = fresh.workers.profiles[parsed.oldName];
523
+ if (!profile) return;
524
+ fresh.workers.profiles[parsed.newName] = profile;
525
+ delete fresh.workers.profiles[parsed.oldName];
526
+ for (const [agentId, profileName] of Object.entries(fresh.workers.agentBindings)) {
527
+ if (profileName !== parsed.oldName) continue;
528
+ fresh.workers.agentBindings[agentId] = parsed.newName;
529
+ updatedBindings += 1;
530
+ }
531
+ });
532
+ printOk(
533
+ `renamed fleet profile ${parsed.oldName} to ${parsed.newName} (${updatedBindings} binding${updatedBindings === 1 ? "" : "s"} updated)`,
534
+ );
535
+ return 0;
536
+ }
537
+
538
+ function runProfileBind(args: ReadonlyArray<string>): number {
539
+ if (wantsHelp(args)) return printUsage("clio-coder targets profile bind <agentId> <profileName>");
540
+ let parsed: ProfileBindArgs | null;
541
+ try {
542
+ parsed = parseProfileBindArgs(args);
543
+ } catch (error) {
544
+ printError(error instanceof Error ? error.message : String(error));
545
+ return 2;
546
+ }
547
+ if (!parsed) {
548
+ printError("usage: clio-coder targets profile bind <agentId> <profileName>");
549
+ return 2;
550
+ }
551
+ ensureClioState();
552
+ const settings = readSettings();
553
+ if (settings.delegation.agents.some((agent) => agent.id === parsed.agentId)) {
554
+ printError(
555
+ `cannot bind ACP delegation agent '${parsed.agentId}' to a fleet profile; ACP agents use their own runner and ignore native target routing`,
556
+ );
557
+ return 1;
558
+ }
559
+ if (!settings.workers.profiles[parsed.profileName]) {
560
+ process.stderr.write(
561
+ `${chalk.yellow("warning:")} fleet profile '${parsed.profileName}' is not configured; binding will resolve after the profile exists\n`,
562
+ );
563
+ }
564
+ updateSettings((fresh) => {
565
+ bindAgentProfileInSettings(fresh, parsed.agentId, parsed.profileName);
566
+ });
567
+ printOk(`bound agent ${parsed.agentId} -> fleet profile ${parsed.profileName}`);
568
+ return 0;
569
+ }
570
+
571
+ function runProfileUnbind(args: ReadonlyArray<string>): number {
572
+ if (wantsHelp(args)) return printUsage("clio-coder targets profile unbind <agentId>");
573
+ let parsed: string;
574
+ try {
575
+ if (args.length !== 1) throw new Error("usage: clio-coder targets profile unbind <agentId>");
576
+ parsed = requireTrimmed(args[0], "agent id");
577
+ } catch (error) {
578
+ printError(error instanceof Error ? error.message : String(error));
579
+ return 2;
580
+ }
581
+ ensureClioState();
582
+ const settings = readSettings();
583
+ if (!settings.workers.agentBindings[parsed]) {
584
+ printError(`agent ${parsed} is not bound to a fleet profile`);
585
+ return 1;
586
+ }
587
+ updateSettings((fresh) => {
588
+ delete fresh.workers.agentBindings[parsed];
589
+ });
590
+ printOk(`unbound agent ${parsed}`);
591
+ return 0;
592
+ }
593
+
594
+ function runProfileBindings(args: ReadonlyArray<string>): number {
595
+ let json = false;
596
+ for (const arg of args) {
597
+ if (arg === "--json") {
598
+ json = true;
599
+ continue;
600
+ }
601
+ if (arg === "--help" || arg === "-h") {
602
+ process.stdout.write("usage: clio-coder targets profile bindings [--json]\n");
603
+ return 0;
604
+ }
605
+ printError(`unknown targets profile bindings argument: ${arg}`);
606
+ return 2;
607
+ }
608
+ ensureClioState();
609
+ const settings = readSettings();
610
+ const rows = Object.entries(settings.workers.agentBindings)
611
+ .sort(([a], [b]) => a.localeCompare(b))
612
+ .map(([agentId, profileName]) => {
613
+ const profile = settings.workers.profiles[profileName];
614
+ return {
615
+ agentId,
616
+ profile: profileName,
617
+ target: profile?.target ?? null,
618
+ model: profile?.model ?? null,
619
+ warning: profile ? null : "missing profile",
620
+ };
621
+ });
622
+ if (json) {
623
+ process.stdout.write(`${JSON.stringify(rows, null, 2)}\n`);
624
+ return 0;
625
+ }
626
+ if (rows.length === 0) {
627
+ process.stdout.write(
628
+ "no agent profile bindings configured. run `clio-coder targets profile bind <agentId> <profile>` to add one.\n",
629
+ );
630
+ return 0;
631
+ }
632
+ process.stdout.write(
633
+ `${column("agent", 18)}${column("profile", 20)}${column("target", 16)}${column("model", 30)}warning\n`,
634
+ );
635
+ for (const row of rows) {
636
+ process.stdout.write(
637
+ `${column(row.agentId, 18)}${column(row.profile, 20)}${column(row.target ?? "-", 16)}${column(row.model ?? "-", 30)}${row.warning ?? "-"}\n`,
638
+ );
639
+ }
640
+ return 0;
641
+ }
642
+
643
+ function runProfile(args: ReadonlyArray<string>): number {
644
+ const subcommand = args[0];
645
+ // Ambiguity: a profile literally named like a subcommand must use
646
+ // `clio-coder targets profile set <name> ...`.
647
+ if (subcommand && PROFILE_SUBCOMMANDS.has(subcommand)) {
648
+ switch (subcommand) {
649
+ case "list":
650
+ return runFleet(args.slice(1), "clio-coder targets profile list [--json]");
651
+ case "set":
652
+ return runProfileSet(
653
+ args.slice(1),
654
+ "clio-coder targets profile set <name> <id> [--model <id>] [--thinking <level>]",
655
+ );
656
+ case "remove":
657
+ return runProfileRemove(args.slice(1));
658
+ case "rename":
659
+ return runProfileRename(args.slice(1));
660
+ case "bind":
661
+ return runProfileBind(args.slice(1));
662
+ case "unbind":
663
+ return runProfileUnbind(args.slice(1));
664
+ case "bindings":
665
+ return runProfileBindings(args.slice(1));
666
+ }
667
+ }
668
+ return runProfileSet(args);
669
+ }
670
+
671
+ function runFleet(args: ReadonlyArray<string>, usage = "clio-coder targets fleet [--json]"): number {
672
+ let json = false;
673
+ for (const arg of args) {
674
+ if (arg === "--json") {
675
+ json = true;
676
+ continue;
677
+ }
678
+ if (arg === "--help" || arg === "-h") {
679
+ process.stdout.write(`usage: ${usage}\n`);
680
+ return 0;
681
+ }
682
+ printError(`unknown targets fleet argument: ${arg}`);
683
+ return 2;
684
+ }
685
+ ensureClioState();
686
+ const settings = readSettings();
687
+ const byId = new Map(settings.targets.map((target) => [target.id, target] as const));
688
+ const rows = Object.entries(settings.workers.profiles).map(([name, profile]) => {
689
+ const target = profile.target ? byId.get(profile.target) : undefined;
690
+ return {
691
+ name,
692
+ target: profile.target,
693
+ runtime: target?.runtime ?? null,
694
+ model: profile.model,
695
+ thinkingLevel: profile.thinkingLevel,
696
+ };
697
+ });
698
+ if (json) {
699
+ process.stdout.write(`${JSON.stringify(rows, null, 2)}\n`);
700
+ return 0;
701
+ }
702
+ if (rows.length === 0) {
703
+ process.stdout.write("no fleet profiles configured. run `clio-coder targets profile <name> <id>` to add one.\n");
704
+ return 0;
705
+ }
706
+ process.stdout.write(
707
+ `${column("profile", 18)}${column("target", 16)}${column("runtime", 20)}${column("model", 30)}thinking\n`,
708
+ );
709
+ for (const row of rows) {
710
+ process.stdout.write(
711
+ `${column(row.name, 18)}${column(row.target ?? "-", 16)}${column(row.runtime ?? "-", 20)}${column(row.model ?? "-", 30)}${row.thinkingLevel}\n`,
712
+ );
713
+ }
714
+ return 0;
715
+ }
716
+
717
+ function runRemove(args: ReadonlyArray<string>): number {
718
+ if (wantsHelp(args)) return printUsage("clio-coder targets remove <id>");
719
+ if (args.length !== 1 || !args[0]) {
720
+ printError("usage: clio-coder targets remove <id>");
721
+ return 2;
722
+ }
723
+ ensureClioState();
724
+ return runTargetRemove(args[0]);
725
+ }
726
+
727
+ function runRename(args: ReadonlyArray<string>): number {
728
+ if (wantsHelp(args)) return printUsage("clio-coder targets rename <old> <new>");
729
+ if (args.length !== 2 || !args[0] || !args[1]) {
730
+ printError("usage: clio-coder targets rename <old> <new>");
731
+ return 2;
732
+ }
733
+ ensureClioState();
734
+ return runTargetRename(args[0], args[1]);
735
+ }
736
+
737
+ const CONVERT_USAGE = "clio-coder targets convert <id> --runtime <runtimeId>";
738
+
739
+ function runConvert(args: ReadonlyArray<string>): number {
740
+ if (wantsHelp(args)) return printUsage(CONVERT_USAGE);
741
+ const id = args[0];
742
+ if (!id || id.startsWith("-")) {
743
+ printError(`usage: ${CONVERT_USAGE}`);
744
+ return 2;
745
+ }
746
+ let runtimeId: string | undefined;
747
+ for (let i = 1; i < args.length; i += 1) {
748
+ const arg = args[i];
749
+ if (arg === "--runtime") {
750
+ const value = args[i + 1];
751
+ if (!value) {
752
+ printError("--runtime requires a value");
753
+ return 2;
754
+ }
755
+ runtimeId = value;
756
+ i += 1;
757
+ continue;
758
+ }
759
+ printError(`unknown convert argument: ${arg}`);
760
+ return 2;
761
+ }
762
+ if (!runtimeId) {
763
+ printError("--runtime is required");
764
+ return 2;
765
+ }
766
+ ensureClioState();
767
+ const registry = getRuntimeRegistry();
768
+ if (registry.list().length === 0) registerBuiltinRuntimes(registry);
769
+ const runtime = registry.get(runtimeId);
770
+ if (!runtime) {
771
+ printError(`unknown runtime id: ${runtimeId} (run \`clio-coder configure --list\` to see registered runtimes)`);
772
+ return 2;
773
+ }
774
+ const settings = readSettings();
775
+ const target = settings.targets.find((entry) => entry.id === id);
776
+ if (!target) {
777
+ printError(`no target with id ${id}`);
778
+ return 1;
779
+ }
780
+ if (target.runtime === runtimeId) {
781
+ printOk(`target ${id} already uses runtime ${runtimeId}`);
782
+ return 0;
783
+ }
784
+ if (settings.orchestrator.target === id && !isOrchestratorEligibleRuntime(runtime)) {
785
+ printError(`cannot convert orchestrator target '${id}' to non-HTTP/native runtime '${runtime.id}'`);
786
+ return 1;
787
+ }
788
+ const previousRuntime = target.runtime;
789
+ updateSettings((fresh) => {
790
+ const entry = fresh.targets.find((candidate) => candidate.id === id);
791
+ if (entry) entry.runtime = runtimeId;
792
+ });
793
+ printOk(`converted target ${id}: ${previousRuntime} -> ${runtimeId}`);
794
+ return 0;
795
+ }
796
+
797
+ /** One row's cells as plain text, before any width has been applied. */
798
+ export interface TargetTableRow {
799
+ id: string;
800
+ tier: string;
801
+ runtime: string;
802
+ auth: string;
803
+ url: string;
804
+ model: string;
805
+ health: string;
806
+ caps: string;
807
+ notes: string;
808
+ }
809
+
810
+ type TargetTableColumn = keyof TargetTableRow;
811
+ type TargetTableWidths = Record<TargetTableColumn, number>;
812
+
813
+ const TABLE_COLUMNS: ReadonlyArray<TargetTableColumn> = [
814
+ "id",
815
+ "tier",
816
+ "runtime",
817
+ "auth",
818
+ "url",
819
+ "model",
820
+ "health",
821
+ "caps",
822
+ "notes",
823
+ ];
824
+ const TABLE_GAP = 1;
825
+
826
+ /**
827
+ * The order the columns give room back in, each down to the floor beside it.
828
+ *
829
+ * `id` and `caps` are absent on purpose. A cut id is not an id: it cannot be
830
+ * passed back to `clio-coder targets use`, so shortening it turns the column into
831
+ * something that reads like an identifier and is not one. The badges are one
832
+ * letter per capability and mean nothing partially printed.
833
+ *
834
+ * `notes` appears twice. It is free-form and the widest column, so it gives up
835
+ * everything above a readable remainder before url and model are touched at
836
+ * all, and gives up the rest only once both of those are at their floors.
837
+ */
838
+ const TABLE_SHRINK_ORDER: ReadonlyArray<readonly [TargetTableColumn, number]> = [
839
+ ["notes", 16],
840
+ ["url", 12],
841
+ ["model", 12],
842
+ ["notes", 0],
843
+ ["auth", 6],
844
+ ["runtime", 6],
845
+ ["tier", 4],
846
+ ];
847
+
848
+ /**
849
+ * The order width above the minimum layout is handed back in, each up to what
850
+ * its own content needs.
851
+ *
852
+ * Shrinking in {@link TABLE_SHRINK_ORDER} until the row fits stops at the first
853
+ * width that happens to work, and where it stopped was wrong. At 120 columns it
854
+ * had taken url and model down to their floors and had not yet asked auth,
855
+ * runtime, or tier for anything, so four targets on different hosts all printed
856
+ * `http://127.…` while the auth column spent 20 columns on one env var name. A
857
+ * url that cannot be told from the next url is not a url.
858
+ *
859
+ * So the layout is built the other way around: every column drops to its floor,
860
+ * and whatever the terminal has above that minimum is given back here. url and
861
+ * model lead because they are the two columns whose whole job is to be told
862
+ * apart. `notes` appears twice for the same reason it does above: it takes a
863
+ * readable remainder before the categorical columns are restored, and the rest
864
+ * only once they are whole.
865
+ */
866
+ const TABLE_GROW_ORDER: ReadonlyArray<readonly [TargetTableColumn, number]> = [
867
+ ["url", Number.POSITIVE_INFINITY],
868
+ ["model", Number.POSITIVE_INFINITY],
869
+ ["notes", 16],
870
+ ["auth", Number.POSITIVE_INFINITY],
871
+ ["runtime", Number.POSITIVE_INFINITY],
872
+ ["tier", Number.POSITIVE_INFINITY],
873
+ ["notes", Number.POSITIVE_INFINITY],
874
+ ];
875
+
876
+ function tableWidths(rows: ReadonlyArray<TargetTableRow>, width: number): TargetTableWidths {
877
+ const natural = {} as TargetTableWidths;
878
+ for (const [index, key] of TABLE_COLUMNS.entries()) {
879
+ natural[key] = rows.reduce((widest, row) => Math.max(widest, row[key].length), (HEADER[index] ?? key).length);
880
+ }
881
+ // The minimum layout: every shrinkable column at the lowest floor it is
882
+ // given, which for `notes` is the second of its two entries.
883
+ const widths = { ...natural };
884
+ for (const [key, floor] of TABLE_SHRINK_ORDER) widths[key] = Math.min(widths[key], floor);
885
+ const total = (): number =>
886
+ TABLE_COLUMNS.reduce((sum, key) => sum + widths[key], 0) + TABLE_GAP * (TABLE_COLUMNS.length - 1);
887
+ // A terminal too narrow for even the minimum keeps it and takes the row cut
888
+ // that formatTargetTable applies; there is nothing left to give back.
889
+ let surplus = width - total();
890
+ for (const [key, ceiling] of TABLE_GROW_ORDER) {
891
+ if (surplus <= 0) break;
892
+ const take = Math.min(surplus, Math.max(0, Math.min(natural[key], ceiling) - widths[key]));
893
+ widths[key] += take;
894
+ surplus -= take;
895
+ }
896
+ return widths;
897
+ }
898
+
899
+ /**
900
+ * The probe table sized to the terminal it is being written to.
901
+ *
902
+ * Every column was a fixed width summing to 164, so the table wrote 141 to 195
903
+ * column rows into whatever terminal it was given and the shell wrapped them
904
+ * into fragments. Worse, the fixed widths cut each cell with a bare `slice`, so
905
+ * a 20-character target id printed as 13 characters and a space: a string that
906
+ * reads like an id, is not one, and cannot be pasted back into any command that
907
+ * takes one.
908
+ *
909
+ * `--json` is the interface for the full values and is left untouched. Only the
910
+ * human table is sized, ids are never cut, and every cell that is cut ends in an
911
+ * ellipsis so a shortened url or model can never be mistaken for a whole one.
912
+ *
913
+ * A terminal too narrow to hold the id beside every floor takes the whole row
914
+ * cut to its width, marked the same way. Colour is dropped on those rows because
915
+ * the ansi bytes would sit inside the cut; a wrapped row costs more than colour.
916
+ */
917
+ export function formatTargetTable(
918
+ rows: ReadonlyArray<TargetTableRow>,
919
+ width: number,
920
+ paintHealth: (cell: string, row: TargetTableRow) => string = (cell) => cell,
921
+ ): { header: string; rows: ReadonlyArray<string> } {
922
+ const widths = tableWidths(rows, width);
923
+ const line = (cells: ReadonlyArray<string>): string => cells.join(" ".repeat(TABLE_GAP)).trimEnd();
924
+ return {
925
+ header: truncate(line(TABLE_COLUMNS.map((key, index) => column(HEADER[index] ?? key, widths[key]))), width),
926
+ rows: rows.map((row) => {
927
+ const cells = TABLE_COLUMNS.map((key) => column(row[key], widths[key]));
928
+ const plain = line(cells);
929
+ if (plain.length > width) return truncate(plain, width);
930
+ return line(cells.map((cell, index) => (TABLE_COLUMNS[index] === "health" ? paintHealth(cell, row) : cell)));
931
+ }),
932
+ };
933
+ }
934
+
935
+ function renderTable(providers: ProvidersContract, entries: ReadonlyArray<TargetStatus>): void {
936
+ const sorted = [...entries].sort(compareStatusByTier);
937
+ const table = formatTargetTable(
938
+ sorted.map((status) => targetTableRow(providers, status)),
939
+ terminalColumns(),
940
+ // The cell is padded before it is painted, so the ansi bytes land outside
941
+ // the width arithmetic instead of having to be guessed at with slack.
942
+ (cell, row) => healthColor(row.health)(cell),
943
+ );
944
+ let currentTier: ProviderOutputTier | null = null;
945
+ for (const [index, status] of sorted.entries()) {
946
+ const tier = statusTier(status);
947
+ if (tier !== currentTier) {
948
+ currentTier = tier;
949
+ process.stdout.write(`${chalk.bold(tierLabel(tier))}\n`);
950
+ process.stdout.write(`${chalk.bold(table.header)}\n`);
951
+ }
952
+ process.stdout.write(`${table.rows[index] ?? ""}\n`);
953
+ }
954
+ }
955
+
956
+ function targetTableRow(providers: ProvidersContract, status: TargetStatus): TargetTableRow {
957
+ return {
958
+ id: status.target.id,
959
+ tier: statusTier(status),
960
+ runtime: status.runtime ? status.runtime.id : status.target.runtime,
961
+ auth: formatAuth(providers, status),
962
+ url: formatUrl(status),
963
+ model: status.target.defaultModel ?? "-",
964
+ health: status.health.status,
965
+ caps: capabilityBadges(status.capabilities),
966
+ notes: formatNotes(status),
967
+ };
968
+ }
969
+
970
+ function healthColor(status: string): (text: string) => string {
971
+ switch (status) {
972
+ case "healthy":
973
+ return chalk.green;
974
+ case "degraded":
975
+ return chalk.yellow;
976
+ case "down":
977
+ return chalk.red;
978
+ default:
979
+ return chalk.dim;
980
+ }
981
+ }
982
+
983
+ function formatUrl(status: TargetStatus): string {
984
+ if (status.target.url) return status.target.url;
985
+ return "(built-in)";
986
+ }
987
+
988
+ function formatAuth(providers: ProvidersContract, status: TargetStatus): string {
989
+ if (!status.runtime) return "-";
990
+ if (status.runtime.auth !== "api-key" && status.runtime.auth !== "oauth") return status.runtime.auth;
991
+ const auth = providers.auth.statusForTarget(status.target, status.runtime);
992
+ if (!auth.available) return "disconnected";
993
+ if (auth.source === "environment") return auth.detail ? `env:${auth.detail}` : "environment";
994
+ return auth.source.replace("stored-", "");
995
+ }
996
+
997
+ function capabilityBadges(caps: CapabilityFlags): string {
998
+ const badge = (on: boolean, letter: string): string => (on ? letter : "-");
999
+ return [
1000
+ badge(caps.chat, "C"),
1001
+ badge(caps.tools, "T"),
1002
+ badge(caps.reasoning, "R"),
1003
+ badge(caps.vision, "V"),
1004
+ badge(caps.embeddings, "E"),
1005
+ badge(caps.rerank, "K"),
1006
+ badge(caps.fim, "F"),
1007
+ ].join("");
1008
+ }
1009
+
1010
+ /**
1011
+ * One-word residency summary for the probe notes column, from the per-model
1012
+ * load states local runtimes already report. Null when the runtime exposed
1013
+ * no states (cloud targets); "resident: none" when states are known and
1014
+ * nothing is loaded, so a cold box is distinguishable from an unknown one.
1015
+ */
1016
+ export function residentModelsSummary(states: TargetStatus["discoveredModelStates"]): string | null {
1017
+ if (!states) return null;
1018
+ const entries = Object.entries(states);
1019
+ if (entries.length === 0) return null;
1020
+ const resident = entries
1021
+ .filter(([, status]) => status.state === "loaded" || status.state === "loading")
1022
+ .map(([id, status]) => (status.state === "loading" ? `${id} (loading)` : id));
1023
+ return resident.length > 0 ? `resident: ${resident.join(", ")}` : "resident: none";
1024
+ }
1025
+
1026
+ /**
1027
+ * A window nothing declared is the runtime descriptor's placeholder, not a
1028
+ * capability the target reported. Saying so is the difference between a number
1029
+ * a user can plan against and one they cannot.
1030
+ */
1031
+ export function formatContextWindow(status: Pick<TargetStatus, "capabilities" | "contextWindowProvenance">): string {
1032
+ const window = status.capabilities.contextWindow;
1033
+ return status.contextWindowProvenance === "runtime-default"
1034
+ ? `ctx ${window} (unverified runtime default)`
1035
+ : `ctx ${window}`;
1036
+ }
1037
+
1038
+ function formatNotes(status: TargetStatus): string {
1039
+ const parts: string[] = [];
1040
+ if (status.target.gateway) parts.push("gateway");
1041
+ if (status.runtime?.auth === "oauth") parts.push("oauth");
1042
+ if (status.runtime?.auth === "claude-cli") parts.push("claude-cli");
1043
+ if (status.capabilities.contextWindow > 0) parts.push(formatContextWindow(status));
1044
+ if (!status.available && status.reason) parts.push(status.reason);
1045
+ const residency = residentModelsSummary(status.discoveredModelStates);
1046
+ if (residency) parts.push(residency);
1047
+ if (status.probeNotes && status.probeNotes.length > 0) parts.push(`note: ${status.probeNotes.join("; ")}`);
1048
+ return parts.join(" ");
1049
+ }
1050
+
1051
+ function statusTier(status: TargetStatus): ProviderOutputTier {
1052
+ return status.runtime?.tier ?? "unknown";
1053
+ }
1054
+
1055
+ function tierLabel(tier: ProviderOutputTier): string {
1056
+ switch (tier) {
1057
+ case "protocol":
1058
+ return "Protocol";
1059
+ case "cloud":
1060
+ return "Cloud";
1061
+ case "subscription":
1062
+ return "Subscription";
1063
+ case "local-native":
1064
+ return "Local native";
1065
+ case "unknown":
1066
+ return "Unknown";
1067
+ }
1068
+ }
1069
+
1070
+ function tierRank(tier: ProviderOutputTier): number {
1071
+ switch (tier) {
1072
+ case "protocol":
1073
+ return 0;
1074
+ case "cloud":
1075
+ return 1;
1076
+ case "subscription":
1077
+ return 2;
1078
+ case "local-native":
1079
+ return 3;
1080
+ case "unknown":
1081
+ return 4;
1082
+ }
1083
+ }
1084
+
1085
+ function compareStatusByTier(a: TargetStatus, b: TargetStatus): number {
1086
+ return (
1087
+ tierRank(statusTier(a)) - tierRank(statusTier(b)) ||
1088
+ a.target.id.localeCompare(b.target.id) ||
1089
+ a.target.runtime.localeCompare(b.target.runtime)
1090
+ );
1091
+ }
1092
+
1093
+ interface SerializedStatus {
1094
+ target: TargetStatus["target"];
1095
+ runtime: TargetStatus["runtime"];
1096
+ available: boolean;
1097
+ reason: string;
1098
+ health: TargetStatus["health"];
1099
+ capabilities: TargetStatus["capabilities"];
1100
+ contextWindowProvenance?: TargetStatus["contextWindowProvenance"];
1101
+ probeCapabilities?: TargetStatus["probeCapabilities"];
1102
+ probeModelId?: TargetStatus["probeModelId"];
1103
+ probeNotes?: TargetStatus["probeNotes"];
1104
+ probeSurfaces?: TargetStatus["probeSurfaces"];
1105
+ discoveredModels: TargetStatus["discoveredModels"];
1106
+ discoveredModelsSource?: TargetStatus["discoveredModelsSource"];
1107
+ discoveredModelStates?: TargetStatus["discoveredModelStates"];
1108
+ tier: ProviderOutputTier;
1109
+ detectedReasoning: boolean | null;
1110
+ reasoningCandidateModelId: string | null;
1111
+ }
1112
+
1113
+ function serializeStatus(
1114
+ status: TargetStatus,
1115
+ extras: { detectedReasoning: boolean | null; candidateModelId: string | null } = {
1116
+ detectedReasoning: null,
1117
+ candidateModelId: null,
1118
+ },
1119
+ ): SerializedStatus {
1120
+ const out: SerializedStatus = {
1121
+ target: status.target,
1122
+ runtime: status.runtime,
1123
+ available: status.available,
1124
+ reason: status.reason,
1125
+ health: status.health,
1126
+ capabilities: status.capabilities,
1127
+ discoveredModels: status.discoveredModels,
1128
+ tier: statusTier(status),
1129
+ detectedReasoning: extras.detectedReasoning,
1130
+ reasoningCandidateModelId: extras.candidateModelId,
1131
+ };
1132
+ if (status.contextWindowProvenance !== undefined) {
1133
+ out.contextWindowProvenance = status.contextWindowProvenance;
1134
+ }
1135
+ if (status.discoveredModelsSource !== undefined) {
1136
+ out.discoveredModelsSource = status.discoveredModelsSource;
1137
+ }
1138
+ if (status.discoveredModelStates !== undefined) {
1139
+ out.discoveredModelStates = status.discoveredModelStates;
1140
+ }
1141
+ if (status.probeCapabilities !== undefined) {
1142
+ out.probeCapabilities = status.probeCapabilities;
1143
+ }
1144
+ if (status.probeModelId !== undefined) {
1145
+ out.probeModelId = status.probeModelId;
1146
+ }
1147
+ if (status.probeNotes !== undefined) {
1148
+ out.probeNotes = status.probeNotes;
1149
+ }
1150
+ if (status.probeSurfaces !== undefined) {
1151
+ out.probeSurfaces = status.probeSurfaces;
1152
+ }
1153
+ return out;
1154
+ }