@iowarp/clio-coder 0.3.1 → 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 (595) hide show
  1. package/CHANGELOG.md +90 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.js} +43 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
  8. package/dist/{chunk-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/chunk-2VTFPG5O.js +48 -0
  12. package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4KLWL3UC.js +18 -0
  16. package/dist/chunk-4VP4KH3K.js +962 -0
  17. package/dist/chunk-4ZG3XFUR.js +77 -0
  18. package/dist/chunk-5B2AEOW5.js +5407 -0
  19. package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
  20. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  21. package/dist/chunk-65DEGPJ6.js +52 -0
  22. package/dist/chunk-6EJMN2Y3.js +17 -0
  23. package/dist/chunk-6EJV5X2W.js +16405 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6XLNIQDB.js +27 -0
  26. package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
  29. package/dist/chunk-7MNJORFF.js +22 -0
  30. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  31. package/dist/chunk-AGYYIBLL.js +1069 -0
  32. package/dist/chunk-AO4RKG4M.js +277 -0
  33. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  34. package/dist/chunk-ARBGF5F7.js +174 -0
  35. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  36. package/dist/chunk-CBCAPZAA.js +229 -0
  37. package/dist/chunk-CMZWFGD2.js +352 -0
  38. package/dist/chunk-ECH6PKUQ.js +39 -0
  39. package/dist/chunk-ED4KHGC3.js +143 -0
  40. package/dist/chunk-EKMEHE4H.js +340 -0
  41. package/dist/{chunk-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
  42. package/dist/chunk-FCSXB6T2.js +338 -0
  43. package/dist/chunk-FJ3H4MN5.js +48 -0
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G2DE3C7R.js +644 -0
  46. package/dist/chunk-G4BMMOKF.js +182 -0
  47. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  48. package/dist/chunk-HC4CLZ2Y.js +68 -0
  49. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  50. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  51. package/dist/chunk-I4HZDVNP.js +73 -0
  52. package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
  53. package/dist/chunk-IKCO5N3L.js +162 -0
  54. package/dist/chunk-IR4CFBFN.js +56 -0
  55. package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
  56. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  57. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  58. package/dist/chunk-KJ5LWLOE.js +1077 -0
  59. package/dist/chunk-LBMZMYH2.js +285 -0
  60. package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
  61. package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
  62. package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
  63. package/dist/chunk-MAW544W2.js +1882 -0
  64. package/dist/chunk-MBS4V7ZP.js +217 -0
  65. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  66. package/dist/chunk-MNA4JGU4.js +255 -0
  67. package/dist/chunk-MQSRRFWA.js +3428 -0
  68. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  69. package/dist/chunk-OAO4GE4M.js +619 -0
  70. package/dist/chunk-OHHN2SO4.js +5135 -0
  71. package/dist/chunk-OKGUZO2U.js +34 -0
  72. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  73. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  74. package/dist/chunk-OQE5J4C6.js +73 -0
  75. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  76. package/dist/chunk-POHLU5DW.js +1186 -0
  77. package/dist/chunk-QKMUKYO7.js +4961 -0
  78. package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
  79. package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
  80. package/dist/chunk-SST6Z5JA.js +80 -0
  81. package/dist/chunk-STBPMHSX.js +2456 -0
  82. package/dist/chunk-T6YILFSB.js +80 -0
  83. package/dist/chunk-TZTZS7QK.js +227 -0
  84. package/dist/chunk-UOV2BYIW.js +107 -0
  85. package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
  86. package/dist/chunk-VAKQQHWR.js +434 -0
  87. package/dist/chunk-VG7TBQIY.js +128 -0
  88. package/dist/chunk-VJWL6YS5.js +244 -0
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-WMSVI4G2.js +2095 -0
  91. package/dist/chunk-WVO7V2QY.js +797 -0
  92. package/dist/chunk-X4RCMKVQ.js +641 -0
  93. package/dist/chunk-X75S7HFS.js +374 -0
  94. package/dist/chunk-XN3L4EYL.js +46 -0
  95. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  96. package/dist/chunk-YHZX5GEU.js +193 -0
  97. package/dist/chunk-YXLYO42X.js +91 -0
  98. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  99. package/dist/chunk-ZI647VB5.js +37 -0
  100. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-4LY5K2AC.js +25 -0
  103. package/dist/code-nav-7AX6FYE6.js +600 -0
  104. package/dist/codewiki/build-worker.js +66 -0
  105. package/dist/compile-cache-CVJMMODC.js +18 -0
  106. package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
  107. package/dist/{config-IRUQ7SE4.js → config-GTLUW2PR.js} +92 -55
  108. package/dist/configure-R6A64DHX.js +42 -0
  109. package/dist/context-5VKGUVJJ.js +866 -0
  110. package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
  111. package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
  126. package/dist/monitor-MEQA5C3I.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
  128. package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
  129. package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
  130. package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
  131. package/dist/{run-YTPEYQOH.js → run-IV4Q6RLN.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
  137. package/dist/terminal-lease-IT5JW2NR.js +395 -0
  138. package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
  139. package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
  140. package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
  141. package/dist/{upgrade-33G2LMM5.js → upgrade-7TT7SQ3G.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
  143. package/dist/verify-G6V4D2G7.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.js} +74 -34
  146. package/dist/worker/entry.js +221 -36
  147. package/dist/workspace-G4ZWUIPR.js +22 -0
  148. package/docs/README.md +22 -17
  149. package/docs/acp.md +168 -16
  150. package/docs/alcf-provider.md +1 -1
  151. package/docs/architecture.md +136 -7
  152. package/docs/artifact-versions.md +1 -1
  153. package/docs/built-in-agents.md +1 -1
  154. package/docs/capacity-and-scheduling.md +1 -1
  155. package/docs/commands-and-modes.md +114 -71
  156. package/docs/config-knobs-audit.md +1 -3
  157. package/docs/configuration-and-targets.md +174 -46
  158. package/docs/context-engine.md +29 -6
  159. package/docs/development-pipeline.md +26 -1
  160. package/docs/dispatch-architecture-rationale.md +1 -1
  161. package/docs/documentation-coverage.md +2 -2
  162. package/docs/documentation-guide.md +1 -1
  163. package/docs/environment-variables.md +13 -5
  164. package/docs/eval-runner.md +1 -1
  165. package/docs/evals-internal.md +1 -1
  166. package/docs/evidence-and-memory.md +6 -2
  167. package/docs/evolution.md +2 -2
  168. package/docs/exit-codes-and-output.md +15 -9
  169. package/docs/extensions-and-sharing.md +9 -9
  170. package/docs/fleet-dispatch.md +7 -5
  171. package/docs/git-commit-provenance.md +120 -0
  172. package/docs/glossary.md +1 -1
  173. package/docs/installation-and-lifecycle.md +34 -27
  174. package/docs/middleware-and-components.md +1 -1
  175. package/docs/model-catalog.md +45 -14
  176. package/docs/observability.md +8 -5
  177. package/docs/performance-methodology.md +491 -0
  178. package/docs/pi-boundary.md +72 -0
  179. package/docs/proactive-memory.md +3 -3
  180. package/docs/prompt-envelope-and-tools.md +24 -3
  181. package/docs/provider-adapter-cookbook.md +57 -4
  182. package/docs/release-cut-checklist.md +129 -115
  183. package/docs/safety-model.md +9 -5
  184. package/docs/scientific-validation.md +3 -3
  185. package/docs/session-lifecycle.md +55 -12
  186. package/docs/skills-marketplace.md +12 -8
  187. package/docs/time-conventions.md +1 -1
  188. package/docs/tool-usage.md +3 -3
  189. package/docs/trace-store.md +1 -1
  190. package/docs/troubleshooting.md +10 -7
  191. package/docs/tui-design.md +47 -10
  192. package/docs/worker-dispatch-mechanics.md +1 -1
  193. package/package.json +19 -22
  194. package/skills/coding/ast-grep/SKILL.md +136 -0
  195. package/skills/coding/ast-grep/evals.md +56 -0
  196. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  197. package/skills/coding/coding-standards/SKILL.md +113 -0
  198. package/skills/coding/coding-standards/evals.md +34 -0
  199. package/skills/coding/prototype/SKILL.md +86 -0
  200. package/skills/coding/prototype/evals.md +42 -0
  201. package/skills/coding/prototype/references/LOGIC.md +67 -0
  202. package/skills/coding/prototype/references/UI.md +112 -0
  203. package/skills/coding/tdd/SKILL.md +101 -0
  204. package/skills/coding/tdd/evals.md +41 -0
  205. package/skills/coding/tdd/references/mocking.md +59 -0
  206. package/skills/coding/tdd/references/tests.md +77 -0
  207. package/skills/context/context-handoff/SKILL.md +126 -0
  208. package/skills/context/context-handoff/evals.md +57 -0
  209. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  210. package/skills/context/context-prime/SKILL.md +95 -0
  211. package/skills/context/context-prime/evals.md +54 -0
  212. package/skills/meta/clio-dev/SKILL.md +91 -0
  213. package/skills/meta/clio-dev/evals.md +45 -0
  214. package/skills/meta/clio-test/SKILL.md +130 -0
  215. package/skills/meta/clio-test/evals.md +43 -0
  216. package/skills/meta/clio-test/references/harness.md +97 -0
  217. package/skills/meta/clio-test/references/test-map.md +59 -0
  218. package/skills/meta/credentials/SKILL.md +125 -0
  219. package/skills/meta/credentials/evals.md +104 -0
  220. package/skills/meta/find-skills/SKILL.md +72 -0
  221. package/skills/meta/find-skills/evals.md +47 -0
  222. package/skills/meta/herdr/SKILL.md +127 -0
  223. package/skills/meta/herdr/evals.md +38 -0
  224. package/skills/meta/skill-craft/SKILL.md +102 -0
  225. package/skills/meta/skill-craft/evals.md +41 -0
  226. package/skills/planning/architecture/SKILL.md +129 -0
  227. package/skills/planning/architecture/evals.md +36 -0
  228. package/skills/planning/backlog/SKILL.md +90 -0
  229. package/skills/planning/backlog/evals.md +43 -0
  230. package/skills/planning/prd/SKILL.md +82 -0
  231. package/skills/planning/prd/evals.md +49 -0
  232. package/skills/planning/product-intent/SKILL.md +112 -0
  233. package/skills/planning/product-intent/evals.md +36 -0
  234. package/skills/planning/tech-spec/SKILL.md +115 -0
  235. package/skills/planning/tech-spec/evals.md +47 -0
  236. package/skills/registry.yaml +136 -0
  237. package/skills/research/arxiv-literature/SKILL.md +104 -0
  238. package/skills/research/arxiv-literature/evals.md +58 -0
  239. package/skills/research/experiment-protocol/SKILL.md +122 -0
  240. package/skills/research/experiment-protocol/evals.md +91 -0
  241. package/skills/research/scientific-debugging/SKILL.md +119 -0
  242. package/skills/research/scientific-debugging/evals.md +138 -0
  243. package/skills/research/scientific-modernization/SKILL.md +138 -0
  244. package/skills/research/scientific-modernization/evals.md +84 -0
  245. package/skills/workflow/design-council/SKILL.md +139 -0
  246. package/skills/workflow/design-council/evals.md +97 -0
  247. package/skills/workflow/grill-me/SKILL.md +186 -0
  248. package/skills/workflow/grill-me/evals.md +78 -0
  249. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  250. package/skills/workflow/workflow-distiller/evals.md +107 -0
  251. package/src/cli/acp.ts +31 -4
  252. package/src/cli/clio.ts +68 -6
  253. package/src/cli/config-inspect.ts +28 -22
  254. package/src/cli/configure.ts +47 -9
  255. package/src/cli/context-clear.ts +2 -2
  256. package/src/cli/context-index.ts +21 -23
  257. package/src/cli/context.ts +13 -8
  258. package/src/cli/default-target.ts +9 -17
  259. package/src/cli/docs.ts +11 -5
  260. package/src/cli/evidence.ts +4 -1
  261. package/src/cli/extensions.ts +10 -1
  262. package/src/cli/fleet.ts +47 -6
  263. package/src/cli/index.ts +55 -26
  264. package/src/cli/memory.ts +3 -1
  265. package/src/cli/models.ts +1 -1
  266. package/src/cli/modes/json-stream.ts +37 -1
  267. package/src/cli/modes/print.ts +24 -9
  268. package/src/cli/run.ts +2 -2
  269. package/src/cli/skills-eval.ts +23 -8
  270. package/src/cli/skills.ts +19 -4
  271. package/src/cli/targets.ts +4 -0
  272. package/src/cli/text-layout.ts +15 -5
  273. package/src/cli/trace.ts +62 -14
  274. package/src/cli/upgrade.ts +18 -2
  275. package/src/cli/usage.ts +10 -3
  276. package/src/cli/wiki-generate.ts +2 -1
  277. package/src/core/agent-environment.ts +7 -0
  278. package/src/core/bash-exec.ts +72 -1
  279. package/src/core/boot-trace.ts +9 -4
  280. package/src/core/bus-events.ts +20 -4
  281. package/src/core/commit-attribution.ts +157 -0
  282. package/src/core/compile-cache.ts +159 -0
  283. package/src/core/config.ts +131 -2
  284. package/src/core/defaults.ts +39 -5
  285. package/src/core/domain-loader.ts +12 -5
  286. package/src/core/git-commit-attribution.ts +362 -0
  287. package/src/core/incomplete-installation.ts +45 -0
  288. package/src/core/response-schema.ts +1 -1
  289. package/src/core/safe-exec.ts +13 -1
  290. package/src/core/settings-layers.ts +155 -21
  291. package/src/core/skill-activation.ts +1 -1
  292. package/src/core/startup-timer.ts +3 -3
  293. package/src/core/state-file-lock.ts +13 -1
  294. package/src/core/termination.ts +78 -5
  295. package/src/domains/config/classify.ts +15 -3
  296. package/src/domains/config/extension.ts +19 -13
  297. package/src/domains/config/index.ts +10 -0
  298. package/src/domains/config/keybindings.ts +42 -6
  299. package/src/domains/context/bootstrap-prompt.ts +1 -1
  300. package/src/domains/context/bootstrap.ts +111 -18
  301. package/src/domains/context/clear.ts +16 -11
  302. package/src/domains/context/clio-md.ts +111 -9
  303. package/src/domains/context/codewiki/artifact.ts +400 -0
  304. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  305. package/src/domains/context/codewiki/build-worker.ts +54 -0
  306. package/src/domains/context/codewiki/coordinator.ts +182 -0
  307. package/src/domains/context/codewiki/indexer.ts +59 -144
  308. package/src/domains/context/codewiki/paths.ts +67 -0
  309. package/src/domains/context/codewiki/schema.ts +80 -0
  310. package/src/domains/context/codewiki/tree-sitter.ts +1 -1
  311. package/src/domains/context/contract.ts +11 -5
  312. package/src/domains/context/extension.ts +94 -143
  313. package/src/domains/context/fingerprint.ts +3 -1
  314. package/src/domains/context/index.ts +12 -22
  315. package/src/domains/context/project-metadata.ts +19 -0
  316. package/src/domains/context/prompt-context.ts +9 -10
  317. package/src/domains/context/refresh.ts +29 -21
  318. package/src/domains/context/runtime.ts +17 -0
  319. package/src/domains/context/wiki/generate.ts +39 -34
  320. package/src/domains/context/wiki/plan.ts +1 -1
  321. package/src/domains/context/wiki/prompts.ts +21 -8
  322. package/src/domains/dispatch/code-step.ts +20 -1
  323. package/src/domains/dispatch/extension.ts +158 -21
  324. package/src/domains/dispatch/failure-classification.ts +6 -0
  325. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  326. package/src/domains/dispatch/orphan-recovery.ts +50 -8
  327. package/src/domains/dispatch/receipt-integrity.ts +5 -0
  328. package/src/domains/dispatch/state.ts +31 -6
  329. package/src/domains/dispatch/transport.ts +2 -1
  330. package/src/domains/dispatch/types.ts +14 -0
  331. package/src/domains/dispatch/worker-spawn.ts +21 -2
  332. package/src/domains/eval/metrics/context.ts +1 -1
  333. package/src/domains/eval/types.ts +0 -1
  334. package/src/domains/evidence/build.ts +41 -1
  335. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  336. package/src/domains/lifecycle/migrations/index.ts +24 -4
  337. package/src/domains/middleware/hooks-io.ts +12 -0
  338. package/src/domains/middleware/skills-reminder.ts +30 -15
  339. package/src/domains/prompts/compiler.ts +142 -84
  340. package/src/domains/prompts/contract.ts +18 -2
  341. package/src/domains/prompts/extension.ts +39 -7
  342. package/src/domains/prompts/fragment-loader.ts +0 -1
  343. package/src/domains/prompts/fragments/identity/clio.md +2 -4
  344. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  345. package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
  346. package/src/domains/prompts/fragments/operating/contract.md +4 -50
  347. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  348. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  349. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  350. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  351. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  352. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  353. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  354. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  355. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  356. package/src/domains/prompts/preload.ts +3 -3
  357. package/src/domains/providers/auth/api-key.ts +1 -1
  358. package/src/domains/providers/auth/backend-file.ts +20 -10
  359. package/src/domains/providers/auth/backend-memory.ts +59 -4
  360. package/src/domains/providers/auth/boot-status.ts +65 -0
  361. package/src/domains/providers/auth/oauth.ts +2 -1
  362. package/src/domains/providers/auth/storage.ts +97 -38
  363. package/src/domains/providers/capabilities.ts +12 -4
  364. package/src/domains/providers/contract.ts +15 -4
  365. package/src/domains/providers/extension.ts +18 -6
  366. package/src/domains/providers/model-runtime-capabilities.ts +15 -4
  367. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
  368. package/src/domains/providers/plugins.ts +5 -3
  369. package/src/domains/providers/probe/fingerprint.ts +25 -5
  370. package/src/domains/providers/registry.ts +31 -10
  371. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  372. package/src/domains/providers/runtimes/builtins.ts +2 -2
  373. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  374. package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
  375. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  376. package/src/domains/providers/support.ts +6 -3
  377. package/src/domains/providers/types/local-model-quirks.ts +7 -9
  378. package/src/domains/providers/types/runtime-descriptor.ts +12 -1
  379. package/src/domains/providers/types/target-descriptor.ts +22 -0
  380. package/src/domains/resources/contract.ts +0 -1
  381. package/src/domains/resources/extension.ts +1 -3
  382. package/src/domains/resources/loader.ts +3 -4
  383. package/src/domains/resources/prompts/loader.ts +16 -2
  384. package/src/domains/resources/prompts/substitute.ts +1 -65
  385. package/src/domains/resources/skills/content-hash.ts +2 -0
  386. package/src/domains/resources/skills/install.ts +17 -0
  387. package/src/domains/resources/skills/loader.ts +17 -10
  388. package/src/domains/resources/skills/marketplace.ts +55 -9
  389. package/src/domains/safety/action-classifier.ts +4 -2
  390. package/src/domains/safety/audit.ts +8 -2
  391. package/src/domains/safety/extension.ts +1 -1
  392. package/src/domains/session/compaction/branch-summary.ts +3 -2
  393. package/src/domains/session/compaction/cut-point.ts +2 -1
  394. package/src/domains/session/compaction/tokens.ts +2 -1
  395. package/src/domains/session/context-ledger.ts +14 -0
  396. package/src/domains/session/contract.ts +15 -0
  397. package/src/domains/session/decision-board.ts +190 -0
  398. package/src/domains/session/entries.ts +66 -3
  399. package/src/domains/session/extension.ts +93 -12
  400. package/src/domains/session/retry.ts +10 -18
  401. package/src/domains/session/session-artifacts.ts +107 -0
  402. package/src/domains/session/task-board.ts +207 -13
  403. package/src/domains/session/tree/active-path.ts +44 -5
  404. package/src/domains/session/tree/fork.ts +26 -27
  405. package/src/domains/session/tree/preview.ts +2 -2
  406. package/src/domains/session/workspace/git-probe.ts +17 -11
  407. package/src/domains/user-tasks/store.ts +297 -0
  408. package/src/engine/acp/errors.ts +96 -0
  409. package/src/engine/acp/server.ts +1728 -146
  410. package/src/engine/acp/transport.ts +135 -14
  411. package/src/engine/acp/types.ts +26 -0
  412. package/src/engine/agent.ts +3 -3
  413. package/src/engine/ai.ts +32 -27
  414. package/src/engine/alcf-oauth.ts +26 -19
  415. package/src/engine/api-registry.ts +223 -0
  416. package/src/engine/apis/index.ts +3 -7
  417. package/src/engine/apis/llamacpp-residency.ts +49 -9
  418. package/src/engine/apis/lmstudio-residency.ts +5 -21
  419. package/src/engine/apis/lmstudio.ts +243 -0
  420. package/src/engine/apis/ollama-native.ts +24 -3
  421. package/src/engine/apis/openai-completions.ts +170 -91
  422. package/src/engine/apis/residency.ts +139 -3
  423. package/src/engine/apis/types.ts +16 -0
  424. package/src/engine/env-api-keys.ts +98 -0
  425. package/src/engine/gemma-channel-filter.ts +223 -0
  426. package/src/engine/instrumented-tui.ts +192 -0
  427. package/src/engine/messages.ts +14 -0
  428. package/src/engine/models.ts +42 -0
  429. package/src/engine/oauth.ts +16 -12
  430. package/src/engine/prompt-templates.ts +1 -0
  431. package/src/engine/provider-payload.ts +16 -59
  432. package/src/engine/strip-tokenizer-sentinels.ts +1 -1
  433. package/src/engine/truncate.ts +9 -0
  434. package/src/engine/tui.ts +17 -9
  435. package/src/engine/types.ts +3 -6
  436. package/src/engine/worker-runtime-capabilities.ts +5 -0
  437. package/src/engine/worker-runtime.ts +1 -1
  438. package/src/engine/worker-tools.ts +9 -4
  439. package/src/entry/boot-options.ts +50 -0
  440. package/src/entry/orchestrator.ts +288 -150
  441. package/src/interactive/application-controller.ts +89 -2
  442. package/src/interactive/chat-loop.ts +266 -41
  443. package/src/interactive/chat-panel.ts +173 -47
  444. package/src/interactive/chat-renderer.ts +262 -72
  445. package/src/interactive/clio-editor.ts +3 -8
  446. package/src/interactive/command-fallbacks.ts +2 -2
  447. package/src/interactive/context-overlay.ts +27 -1
  448. package/src/interactive/editor-submit.ts +228 -24
  449. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  450. package/src/interactive/export-html/index.ts +51 -0
  451. package/src/interactive/export-html/template.ts +45 -0
  452. package/src/interactive/export-html/tool-renderer.ts +54 -0
  453. package/src/interactive/footer/dashboard.ts +4 -0
  454. package/src/interactive/footer/notifications.ts +1 -1
  455. package/src/interactive/footer/widgets.ts +20 -2
  456. package/src/interactive/footer-panel.ts +2 -2
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +201 -17
  459. package/src/interactive/interactive-event-projection.ts +6 -1
  460. package/src/interactive/interactive-input-runtime.ts +50 -4
  461. package/src/interactive/interactive-presentation.ts +151 -19
  462. package/src/interactive/interactive-shell.ts +268 -14
  463. package/src/interactive/interactive-slash-runtime.ts +176 -114
  464. package/src/interactive/interactive-tickers.ts +38 -7
  465. package/src/interactive/keybinding-manager.ts +1 -1
  466. package/src/interactive/layout.ts +40 -3
  467. package/src/interactive/overlay-frame.ts +1 -1
  468. package/src/interactive/overlay-general-openers.ts +58 -1
  469. package/src/interactive/overlay-key-routing.ts +3 -0
  470. package/src/interactive/overlay-lifecycle.ts +13 -0
  471. package/src/interactive/overlay-permission-lifecycle.ts +2 -1
  472. package/src/interactive/overlay-session-lifecycle.ts +69 -12
  473. package/src/interactive/overlays/decisions.ts +300 -0
  474. package/src/interactive/overlays/help-reference.ts +15 -10
  475. package/src/interactive/overlays/model-selector.ts +34 -16
  476. package/src/interactive/overlays/session-selector.ts +18 -0
  477. package/src/interactive/overlays/settings.ts +105 -17
  478. package/src/interactive/overlays/skills-hub.ts +4 -4
  479. package/src/interactive/overlays/tree-selector.ts +41 -6
  480. package/src/interactive/render-trace.ts +499 -90
  481. package/src/interactive/renderers/compaction-summary.ts +2 -2
  482. package/src/interactive/renderers/diff.ts +115 -104
  483. package/src/interactive/renderers/mermaid.ts +53 -0
  484. package/src/interactive/renderers/tool-execution.ts +386 -133
  485. package/src/interactive/renderers/worker-entry.ts +20 -4
  486. package/src/interactive/session-switch-settlement.ts +10 -0
  487. package/src/interactive/slash-autocomplete.ts +6 -114
  488. package/src/interactive/slash-commands.ts +135 -47
  489. package/src/interactive/slash-spec.ts +9 -38
  490. package/src/interactive/status/controller.ts +5 -1
  491. package/src/interactive/stdout-backpressure.ts +99 -0
  492. package/src/interactive/stream-pacer.ts +530 -0
  493. package/src/interactive/stream-pacing-policy.ts +66 -0
  494. package/src/interactive/tasks-overlay.ts +368 -14
  495. package/src/interactive/terminal-lease.ts +485 -0
  496. package/src/interactive/theme/tokens.ts +1 -1
  497. package/src/interactive/turn-context.ts +4 -3
  498. package/src/interactive/turn-persistence.ts +30 -13
  499. package/src/interactive/turn-queues.ts +12 -0
  500. package/src/interactive/turn-recovery.ts +25 -8
  501. package/src/interactive/turn-runtime.ts +79 -12
  502. package/src/interactive/turn-state.ts +10 -0
  503. package/src/interactive/view/artifacts.ts +114 -4
  504. package/src/interactive/view/view-overlay.ts +3 -0
  505. package/src/interactive/welcome-dashboard.ts +17 -16
  506. package/src/interactive/worker-receipts.ts +52 -3
  507. package/src/interactive/worker-stream.ts +5 -1
  508. package/src/tools/agent-tools.ts +23 -3
  509. package/src/tools/artifact.ts +2 -2
  510. package/src/tools/ask-user.ts +23 -13
  511. package/src/tools/bash.ts +30 -2
  512. package/src/tools/bootstrap.ts +34 -431
  513. package/src/tools/builtin-tool-catalog.ts +265 -0
  514. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  515. package/src/tools/codewiki/code-nav.ts +8 -22
  516. package/src/tools/codewiki/shared.ts +41 -38
  517. package/src/tools/context/docs-engine.ts +14 -3
  518. package/src/tools/context/index.ts +107 -28
  519. package/src/tools/context/surface.ts +19 -0
  520. package/src/tools/core-bootstrap.ts +168 -0
  521. package/src/tools/credential-present.ts +5 -5
  522. package/src/tools/dispatch-admission.ts +533 -0
  523. package/src/tools/dispatch-background.ts +54 -0
  524. package/src/tools/dispatch-event-text.ts +6 -0
  525. package/src/tools/dispatch-plan.ts +9 -4
  526. package/src/tools/dispatch-run-events.ts +238 -0
  527. package/src/tools/dispatch-runner.ts +2370 -0
  528. package/src/tools/dispatch-scout-admission.ts +295 -0
  529. package/src/tools/dispatch-types.ts +77 -0
  530. package/src/tools/dispatch.ts +67 -3161
  531. package/src/tools/find.ts +4 -2
  532. package/src/tools/grep.ts +2 -2
  533. package/src/tools/lazy-tool.ts +60 -0
  534. package/src/tools/ledger.ts +3 -3
  535. package/src/tools/monitor-surface.ts +36 -0
  536. package/src/tools/monitor.ts +2 -32
  537. package/src/tools/observers.ts +2 -2
  538. package/src/tools/registry.ts +39 -27
  539. package/src/tools/safe-exec.ts +2 -2
  540. package/src/tools/steer-surface.ts +17 -0
  541. package/src/tools/steer.ts +2 -13
  542. package/src/tools/tasks.ts +108 -11
  543. package/src/tools/truncate.ts +25 -184
  544. package/src/tools/verify/frontend.ts +3 -1
  545. package/src/tools/verify/index.ts +3 -38
  546. package/src/tools/verify/surface.ts +46 -0
  547. package/src/tools/web-fetch-surface.ts +23 -0
  548. package/src/tools/web-fetch.ts +2 -20
  549. package/src/tools/write.ts +7 -2
  550. package/src/worker/entry.ts +39 -2
  551. package/src/worker/spec-contract.ts +26 -5
  552. package/dist/chunk-7SS2CTV2.js +0 -61361
  553. package/dist/chunk-DKGKUHFA.js +0 -924
  554. package/dist/chunk-GEP36Y4X.js +0 -12796
  555. package/dist/chunk-XYWBQRDM.js +0 -137
  556. package/dist/clio-BZVGEUFJ.js +0 -58
  557. package/dist/configure-S7S6F6CL.js +0 -32
  558. package/docs/html/agents_blueprint.html +0 -936
  559. package/docs/html/alcf_blueprint.html +0 -324
  560. package/docs/html/architecture_blueprint.html +0 -850
  561. package/docs/html/commands_blueprint.html +0 -939
  562. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  563. package/docs/html/configuration_blueprint.html +0 -1080
  564. package/docs/html/context_blueprint.html +0 -603
  565. package/docs/html/documentation_blueprint.html +0 -832
  566. package/docs/html/environment_blueprint.html +0 -404
  567. package/docs/html/eval_blueprint.html +0 -743
  568. package/docs/html/evals_internal_blueprint.html +0 -190
  569. package/docs/html/evolution_blueprint.html +0 -674
  570. package/docs/html/extensions_blueprint.html +0 -2065
  571. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  572. package/docs/html/index.html +0 -919
  573. package/docs/html/lifecycle_blueprint.html +0 -723
  574. package/docs/html/memory_blueprint.html +0 -699
  575. package/docs/html/middleware_blueprint.html +0 -664
  576. package/docs/html/models_blueprint.html +0 -2366
  577. package/docs/html/observability_blueprint.html +0 -683
  578. package/docs/html/provider_adapter_blueprint.html +0 -245
  579. package/docs/html/safety_blueprint.html +0 -1386
  580. package/docs/html/shared.css +0 -571
  581. package/docs/html/shared.js +0 -143
  582. package/docs/html/skills_blueprint.html +0 -671
  583. package/docs/html/soak_blueprint.html +0 -182
  584. package/docs/html/tool_usage_blueprint.html +0 -350
  585. package/docs/html/tools_blueprint.html +0 -2249
  586. package/docs/html/trace_blueprint.html +0 -235
  587. package/docs/html/tui_design_blueprint.html +0 -374
  588. package/docs/html/validation_blueprint.html +0 -961
  589. package/docs/html/worker_dispatch_blueprint.html +0 -231
  590. package/src/core/release.ts +0 -2
  591. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  592. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  593. package/src/engine/apis/lmstudio-native.ts +0 -1438
  594. package/src/engine/apis/thinking-replay.ts +0 -11
  595. package/src/tools/string-enum.ts +0 -15
@@ -26,6 +26,7 @@ import { probeCapabilitiesForModel } from "../domains/providers/model-capabiliti
26
26
  import { fingerprintNativeRuntime } from "../domains/providers/probe/fingerprint.js";
27
27
  import { getRuntimeRegistry } from "../domains/providers/registry.js";
28
28
  import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
29
+ import { greetLmStudio } from "../domains/providers/runtimes/common/lmstudio-http.js";
29
30
  import type { ProbeContext, ProbeResult, RuntimeDescriptor } from "../domains/providers/types/runtime-descriptor.js";
30
31
  import type { TargetDescriptor } from "../domains/providers/types/target-descriptor.js";
31
32
  import { registerClioOAuthProviders } from "../engine/oauth.js";
@@ -88,6 +89,7 @@ const DEFAULT_PORTS: Record<string, number> = {
88
89
  "llamacpp-embed": 8080,
89
90
  "llamacpp-rerank": 8080,
90
91
  "lmstudio-native": 1234,
92
+ lmstudio: 1234,
91
93
  "ollama-native": 11434,
92
94
  vllm: 8000,
93
95
  sglang: 30000,
@@ -270,7 +272,8 @@ function normalizeUrl(input: string, runtimeId: string): string {
270
272
  const trimmed = input.trim();
271
273
  if (trimmed.length === 0) return defaultUrlFor(runtimeId);
272
274
  const hasScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed);
273
- const withScheme = hasScheme ? trimmed : `http://${trimmed}`;
275
+ let withScheme = hasScheme ? trimmed : `http://${trimmed}`;
276
+ if (runtimeId === "lmstudio") withScheme = withScheme.replace(/^ws:/u, "http:").replace(/^wss:/u, "https:");
274
277
  try {
275
278
  const parsed = new URL(withScheme);
276
279
  if (!hasScheme && !parsed.port && DEFAULT_PORTS[runtimeId]) {
@@ -418,10 +421,15 @@ async function runtimeProbe(runtime: RuntimeDescriptor, target: TargetDescriptor
418
421
  }
419
422
  }
420
423
 
421
- async function runtimeProbeModels(runtime: RuntimeDescriptor, target: TargetDescriptor): Promise<string[]> {
424
+ async function runtimeProbeModels(
425
+ runtime: RuntimeDescriptor,
426
+ target: TargetDescriptor,
427
+ authToken?: string,
428
+ ): Promise<string[]> {
422
429
  if (typeof runtime.probeModels !== "function") return [];
423
430
  try {
424
- return await runtime.probeModels(target, await buildProbeContext(runtime, target));
431
+ const context = await buildProbeContext(runtime, target);
432
+ return await runtime.probeModels(target, authToken === undefined ? context : { ...context, authToken });
425
433
  } catch {
426
434
  return [];
427
435
  }
@@ -591,6 +599,7 @@ function buildDescriptor(
591
599
  contextWindow?: number;
592
600
  maxTokens?: number;
593
601
  reasoning?: boolean;
602
+ lmstudio?: TargetDescriptor["lmstudio"];
594
603
  },
595
604
  ): TargetDescriptor {
596
605
  const descriptor: TargetDescriptor = { id, runtime: runtime.id };
@@ -615,6 +624,7 @@ function buildDescriptor(
615
624
  if (parts.maxTokens !== undefined) caps.maxTokens = parts.maxTokens;
616
625
  if (parts.reasoning !== undefined) caps.reasoning = parts.reasoning;
617
626
  if (Object.keys(caps).length > 0) descriptor.capabilities = caps;
627
+ if (parts.lmstudio) descriptor.lmstudio = parts.lmstudio;
618
628
  return descriptor;
619
629
  }
620
630
 
@@ -673,10 +683,11 @@ async function resolveSupportedWireModels(
673
683
  runtime: RuntimeDescriptor,
674
684
  target: TargetDescriptor,
675
685
  existing?: TargetDescriptor,
686
+ authToken?: string,
676
687
  ): Promise<string[]> {
677
688
  const known = listKnownModelsForRuntime(runtime.id);
678
689
  if (known.length > 0) return known;
679
- const discovered = runtime.kind === "http" ? await runtimeProbeModels(runtime, target) : [];
690
+ const discovered = runtime.kind === "http" ? await runtimeProbeModels(runtime, target, authToken) : [];
680
691
  if (discovered.length > 0) return discovered;
681
692
  return existing?.wireModels ? [...existing.wireModels] : [];
682
693
  }
@@ -712,7 +723,7 @@ async function askModelChoice(
712
723
  */
713
724
  function refuseCatalogSeededModel(runtime: RuntimeDescriptor, support: ProviderSupportEntry): void {
714
725
  printError(
715
- `--model is required for ${runtime.id}: its ${support.modelHints.length} model ids come from the pi-ai catalog in name order, which recommends none of them`,
726
+ `--model is required for ${runtime.id}: its ${support.modelHints.length} model ids come from the provider catalog in name order, which recommends none of them`,
716
727
  );
717
728
  process.stderr.write(
718
729
  ` run \`clio-coder configure --runtime ${runtime.id}\` with no other flags to choose from the full list\n`,
@@ -742,7 +753,7 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
742
753
  const auth = openAuthStorage();
743
754
  const support = buildProviderSupportEntry(runtime);
744
755
  const existing = settings.targets.find((e) => e.id === args.id);
745
- if (existing && existing.runtime !== runtime.id) {
756
+ if (existing && (getRuntimeRegistry().get(existing.runtime)?.id ?? existing.runtime) !== runtime.id) {
746
757
  printError(`target ${args.id} already exists with runtime ${existing.runtime}`);
747
758
  return 2;
748
759
  }
@@ -750,6 +761,16 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
750
761
  if (!url && support.supportsCustomUrl) {
751
762
  url = defaultUrlFor(runtime.id);
752
763
  }
764
+ if (url && runtime.id === "lmstudio") {
765
+ const greeting = await greetLmStudio(
766
+ { id: args.id, runtime: runtime.id, url },
767
+ { credentialsPresent: new Set(), httpTimeoutMs: 750 },
768
+ );
769
+ if (!greeting.ok) {
770
+ printError(`refusing to save LM Studio target '${args.id}': ${url} did not return the LM Studio greeting`);
771
+ return 2;
772
+ }
773
+ }
753
774
  if (url && (runtime.id === "openai-compat" || runtime.id === "anthropic-compat")) {
754
775
  const fingerprint = await fingerprintNativeRuntime(url);
755
776
  if (fingerprint) {
@@ -787,8 +808,9 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
787
808
  ...(args.contextWindow !== undefined ? { contextWindow: args.contextWindow } : {}),
788
809
  ...(args.maxTokens !== undefined ? { maxTokens: args.maxTokens } : {}),
789
810
  ...(args.reasoning !== undefined ? { reasoning: args.reasoning } : {}),
811
+ ...(existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}),
790
812
  });
791
- const wireModels = await resolveSupportedWireModels(runtime, seed, existing);
813
+ const wireModels = await resolveSupportedWireModels(runtime, seed, existing, args.apiKey);
792
814
  const model =
793
815
  args.model ??
794
816
  existing?.defaultModel ??
@@ -816,6 +838,7 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
816
838
  ...(args.contextWindow !== undefined ? { contextWindow: args.contextWindow } : {}),
817
839
  ...(args.maxTokens !== undefined ? { maxTokens: args.maxTokens } : {}),
818
840
  ...(args.reasoning !== undefined ? { reasoning: args.reasoning } : {}),
841
+ ...(existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}),
819
842
  });
820
843
  const setOrchestrator = args.setOrchestrator || args.orchestratorModel !== undefined;
821
844
  const setBackground = args.setBackground || args.backgroundModel !== undefined;
@@ -933,7 +956,7 @@ async function pickRuntimeFromEntries(
933
956
  }
934
957
  }
935
958
 
936
- const LOCAL_APP_RUNTIME_IDS: ReadonlySet<string> = new Set(["ollama-native", "lmstudio-native"]);
959
+ const LOCAL_APP_RUNTIME_IDS: ReadonlySet<string> = new Set(["ollama-native", "lmstudio"]);
937
960
 
938
961
  // Generic protocol-compatible runtimes. They are classified local-http (they
939
962
  // carry a probe and no cloud catalog entry), but a hosted endpoint such as
@@ -1099,6 +1122,16 @@ async function runInteractive(
1099
1122
  runtime = steered;
1100
1123
  support = buildProviderSupportEntry(runtime);
1101
1124
  }
1125
+ if (runtime.id === "lmstudio") {
1126
+ const greeting = await greetLmStudio(
1127
+ { id: targetId, runtime: runtime.id, url },
1128
+ { credentialsPresent: new Set(), httpTimeoutMs: 750 },
1129
+ );
1130
+ if (!greeting.ok) {
1131
+ printError(`refusing to save LM Studio target '${targetId}': ${url} did not return the LM Studio greeting`);
1132
+ return 2;
1133
+ }
1134
+ }
1102
1135
  }
1103
1136
 
1104
1137
  let apiKeyEnv: string | undefined;
@@ -1174,6 +1207,7 @@ async function runInteractive(
1174
1207
  ...(defaults.contextWindow !== undefined ? { contextWindow: defaults.contextWindow } : {}),
1175
1208
  ...(defaults.maxTokens !== undefined ? { maxTokens: defaults.maxTokens } : {}),
1176
1209
  ...(defaults.reasoning !== undefined ? { reasoning: defaults.reasoning } : {}),
1210
+ ...(existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}),
1177
1211
  });
1178
1212
 
1179
1213
  if (runtime.kind === "http") {
@@ -1190,7 +1224,7 @@ async function runInteractive(
1190
1224
  process.stdout.write(` ${index + 1}. ${wireModel}${wireModel === model ? " [default]" : ""}\n`);
1191
1225
  }
1192
1226
  if (!model && catalogOrdered) {
1193
- process.stdout.write(` listed in pi-ai catalog order, which recommends none of them; pick one.\n`);
1227
+ process.stdout.write(` listed in provider catalog order, which recommends none of them; pick one.\n`);
1194
1228
  }
1195
1229
  for (;;) {
1196
1230
  const pickedModel = await askModelChoice(rl, "Default target model", wireModels, model);
@@ -1259,6 +1293,7 @@ async function runInteractive(
1259
1293
  ...(contextWindowChoice !== undefined ? { contextWindow: contextWindowChoice } : {}),
1260
1294
  ...(defaults.maxTokens !== undefined ? { maxTokens: defaults.maxTokens } : {}),
1261
1295
  ...(reasoningChoice !== undefined ? { reasoning: reasoningChoice } : {}),
1296
+ ...(existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}),
1262
1297
  });
1263
1298
  try {
1264
1299
  assertOrchestratorReplacementEligible(settings, descriptor);
@@ -1441,6 +1476,9 @@ export async function runConfigureCommand(argv: ReadonlyArray<string>): Promise<
1441
1476
  process.stdout.write("run `clio-coder configure --list` to see registered runtimes\n");
1442
1477
  return 2;
1443
1478
  }
1479
+ if (runtimeId === "lmstudio-native" && runtime.id === "lmstudio") {
1480
+ process.stderr.write("warning: runtime 'lmstudio-native' is deprecated; using 'lmstudio'\n");
1481
+ }
1444
1482
  }
1445
1483
  const hasTargetSetupFlag =
1446
1484
  args.id !== undefined ||
@@ -9,10 +9,10 @@ const HELP = `Usage:
9
9
  Clear accumulated project context owned by the context engine:
10
10
  .clio-coder/codewiki.json, .clio-coder/state.json, .clio-coder/handoffs/, and .clio-coder/proposals/.
11
11
 
12
- Preserves by default: CLIO-CODER.md, .clio-coder/agents/, .clio-coder/skills/, and .clio-coder/wiki/.
12
+ Preserves by default: CLIO-CODER.md, CLIO-CODER.override.md, .clio-coder/agents/, .clio-coder/skills/, and .clio-coder/wiki/.
13
13
 
14
14
  Options:
15
- --all also remove CLIO-CODER.md after a second confirmation
15
+ --all also remove the local CLIO-CODER.md after a second confirmation; overrides stay human-owned
16
16
  --yes, -y answer every confirmation, required when stdin is not a terminal
17
17
  `;
18
18
 
@@ -1,11 +1,6 @@
1
- import {
2
- buildCodewiki,
3
- type Codewiki,
4
- codewikiPath,
5
- structuralCodewikiHash,
6
- writeCodewiki,
7
- } from "../domains/context/codewiki/indexer.js";
8
- import { computeFingerprint } from "../domains/context/fingerprint.js";
1
+ import { codewikiPath, structuralCodewikiHash } from "../domains/context/codewiki/artifact.js";
2
+ import { coordinateCodewikiWrite } from "../domains/context/codewiki/coordinator.js";
3
+ import type { Codewiki } from "../domains/context/codewiki/schema.js";
9
4
  import { readClioState, statePath, writeClioState } from "../domains/context/state.js";
10
5
  import { detectProjectProfile } from "../domains/session/workspace/project-type.js";
11
6
 
@@ -55,22 +50,25 @@ export async function runContextIndexCommand(args: string[]): Promise<number> {
55
50
  const cwd = process.cwd();
56
51
  const now = new Date().toISOString();
57
52
  const profile = detectProjectProfile(cwd);
58
- const codewiki = await buildCodewiki({ cwd, language: profile.projectType });
59
- writeCodewiki(cwd, codewiki);
60
- const prev = readClioState(cwd);
61
- const fingerprint = computeFingerprint(cwd, codewiki);
62
- writeClioState(cwd, {
63
- version: 1,
64
- projectType: profile.projectType,
65
- fingerprint,
66
- codewikiVersion: codewiki.version,
67
- ...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
68
- ...(prev?.contextSourceHash ? { contextSourceHash: prev.contextSourceHash } : {}),
69
- ...(prev?.lastBootstrap ? { lastBootstrap: prev.lastBootstrap } : {}),
70
- ...(prev?.lastInitAt ? { lastInitAt: prev.lastInitAt } : {}),
71
- lastSessionAt: prev?.lastSessionAt ?? now,
72
- lastIndexedAt: now,
53
+ const coordinated = await coordinateCodewikiWrite(cwd, () => ({ kind: "build", cwd, language: profile.projectType }), {
54
+ afterCommit: ({ codewiki, fingerprint }, workspace) => {
55
+ const prev = readClioState(workspace);
56
+ writeClioState(workspace, {
57
+ version: 1,
58
+ projectType: profile.projectType,
59
+ fingerprint,
60
+ codewikiVersion: codewiki.version,
61
+ ...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
62
+ ...(prev?.contextSourceHash ? { contextSourceHash: prev.contextSourceHash } : {}),
63
+ ...(prev?.lastBootstrap ? { lastBootstrap: prev.lastBootstrap } : {}),
64
+ ...(prev?.lastInitAt ? { lastInitAt: prev.lastInitAt } : {}),
65
+ lastSessionAt: prev?.lastSessionAt ?? now,
66
+ lastIndexedAt: now,
67
+ });
68
+ },
73
69
  });
70
+ if (!coordinated) throw new Error("codewiki index transaction did not commit");
71
+ const codewiki = coordinated.codewiki;
74
72
  const indexed = indexedSourceCount(codewiki);
75
73
  const coverage = profile.sourceFiles === 0 ? 1 : indexed / profile.sourceFiles;
76
74
  const counts = languageCounts(profile);
@@ -1,3 +1,4 @@
1
+ import { join, resolve } from "node:path";
1
2
  import type { BootstrapProgressEvent } from "../domains/context/index.js";
2
3
  import type { BootstrapGenerationState } from "../domains/context/state.js";
3
4
 
@@ -60,15 +61,19 @@ async function printContextStatus(): Promise<number> {
60
61
  const preload = await import("../domains/prompts/preload.js");
61
62
  const cwd = process.cwd();
62
63
 
63
- const clio = context.tryReadClioMd(cwd);
64
+ const clio = context.loadProjectClioMd(cwd);
64
65
  const state = context.readClioState(cwd);
65
- const clioMdState = !clio
66
- ? "none"
67
- : !clio.ok
68
- ? "malformed"
69
- : state?.contextSources !== undefined && context.adoptionSourcesChanged(state.contextSources, { cwd })
70
- ? "stale"
71
- : "ok";
66
+ const localStandardIsEffective = clio.files.some((file) => file.path === join(resolve(cwd), "CLIO-CODER.md"));
67
+ const clioMdState =
68
+ clio.files.length === 0 && clio.errors.length === 0
69
+ ? "none"
70
+ : clio.errors.length > 0
71
+ ? "malformed"
72
+ : localStandardIsEffective &&
73
+ state?.contextSources !== undefined &&
74
+ context.adoptionSourcesChanged(state.contextSources, { cwd })
75
+ ? "stale"
76
+ : "ok";
72
77
 
73
78
  const prompt = context.renderPromptContext(cwd);
74
79
  const preloadClass = preload.classifyProjectPreload({
@@ -1,8 +1,6 @@
1
- import { readSettings } from "../core/config.js";
2
- import { openAuthStorage, resolveAuthTarget, targetRequiresAuth } from "../domains/providers/auth/index.js";
3
- import { isOrchestratorEligibleRuntime } from "../domains/providers/index.js";
4
- import { getRuntimeRegistry } from "../domains/providers/registry.js";
5
- import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
1
+ import { type ClioSettings, readSettings } from "../core/config.js";
2
+ import { bootAuthStatus } from "../domains/providers/auth/boot-status.js";
3
+ import { findBuiltinRuntimeBootMetadata } from "../domains/providers/runtimes/boot-manifest.js";
6
4
 
7
5
  /**
8
6
  * Why the configured chat target cannot be used, in the operator's terms
@@ -25,8 +23,7 @@ export type DefaultTargetVerdict =
25
23
  | { kind: "ineligible-runtime"; targetId: string; runtime: string }
26
24
  | { kind: "missing-credential"; targetId: string; store: string };
27
25
 
28
- export function classifyDefaultTarget(): DefaultTargetVerdict {
29
- const settings = readSettings();
26
+ export function classifyDefaultTarget(settings: Readonly<ClioSettings> = readSettings()): DefaultTargetVerdict {
30
27
  const targetId = settings.orchestrator.target;
31
28
  if (!targetId) return { kind: "no-target" };
32
29
  // A chat target naming an id that is not in `targets` cannot arrive here:
@@ -36,18 +33,13 @@ export function classifyDefaultTarget(): DefaultTargetVerdict {
36
33
  // it would be a case no settings file can produce.
37
34
  const target = settings.targets.find((entry) => entry.id === targetId);
38
35
  if (!target) return { kind: "no-target" };
39
- const registry = getRuntimeRegistry();
40
- if (registry.list().length === 0) registerBuiltinRuntimes(registry);
41
- const runtime = registry.get(target.runtime);
42
- if (!runtime || !isOrchestratorEligibleRuntime(runtime)) {
36
+ const runtime = findBuiltinRuntimeBootMetadata(target.runtime);
37
+ if (runtime?.kind !== "http") {
43
38
  return { kind: "ineligible-runtime", targetId, runtime: target.runtime };
44
39
  }
45
- if (!targetRequiresAuth(target, runtime)) return { kind: "usable" };
46
- const authTarget = resolveAuthTarget(target, runtime);
47
- if (openAuthStorage().statusForTarget(authTarget, { includeFallback: false }).available) {
48
- return { kind: "usable" };
49
- }
50
- return { kind: "missing-credential", targetId, store: authTarget.providerId };
40
+ const auth = bootAuthStatus(target, runtime);
41
+ if (auth.available) return { kind: "usable" };
42
+ return { kind: "missing-credential", targetId, store: auth.providerId };
51
43
  }
52
44
 
53
45
  /** One sentence naming what is wrong, for the causes target selection can fix. */
package/src/cli/docs.ts CHANGED
@@ -19,9 +19,11 @@ const HOST = "127.0.0.1";
19
19
 
20
20
  const HELP = `clio-coder docs [topic] [--no-open]
21
21
 
22
- Serve Clio Coder's bundled HTML documentation locally and open it in a browser.
23
- The server binds an ephemeral port on 127.0.0.1 only; it keeps no state, runs no
24
- daemon, and reaches no external network. Press Ctrl+C to stop it.
22
+ Serve Clio Coder's interactive HTML documentation locally and open it in a
23
+ browser. The blueprints live in docs/html of a source checkout; the npm package
24
+ ships the Markdown guides in docs/ only. The server binds an ephemeral port on
25
+ 127.0.0.1, keeps no state, runs no daemon, and reaches no external network.
26
+ Press Ctrl+C to stop it.
25
27
 
26
28
  Arguments:
27
29
  [topic] deep-link a specific blueprint (for example: safety, configuration,
@@ -62,7 +64,7 @@ export interface DocsMenuEntry {
62
64
  label: string;
63
65
  }
64
66
 
65
- /** Resolve the bundled docs/html directory from the installed package root. */
67
+ /** Resolve docs/html from the package root; present in a source checkout, absent from the npm package. */
66
68
  export function resolveDocsHtmlDir(): string {
67
69
  return resolve(resolvePackageRoot(), "docs", "html");
68
70
  }
@@ -307,7 +309,11 @@ export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<
307
309
  }
308
310
  const files = listHtmlFiles(htmlDir);
309
311
  if (files.length === 0) {
310
- printError(`no bundled HTML docs found at ${htmlDir}`);
312
+ printError(`no HTML docs at ${htmlDir}`);
313
+ process.stdout.write(
314
+ ` the npm package ships the Markdown guides only: ${resolve(resolvePackageRoot(), "docs")}\n` +
315
+ " the interactive blueprints are in a source checkout and at https://github.com/iowarp/clio-coder/tree/main/docs/html\n",
316
+ );
311
317
  return 1;
312
318
  }
313
319
 
@@ -110,7 +110,10 @@ export async function runEvidenceCommand(args: ReadonlyArray<string>): Promise<n
110
110
  parsed = parseEvidenceArgs(args);
111
111
  } catch (error) {
112
112
  printError(error instanceof Error ? error.message : String(error));
113
- process.stdout.write(HELP);
113
+ // Usage that accompanies an error goes to stderr with it. Splitting the
114
+ // two put the error on stderr and the usage on stdout, so a caller
115
+ // capturing stdout for evidence output collected a help screen instead.
116
+ process.stderr.write(HELP);
114
117
  return 2;
115
118
  }
116
119
  if (parsed.help) {
@@ -125,10 +125,19 @@ export function runExtensionsCommand(argv: ReadonlyArray<string>): number {
125
125
  process.stderr.write(HELP);
126
126
  return 2;
127
127
  }
128
- if (parsed.help || !parsed.command) {
128
+ if (parsed.help) {
129
129
  process.stdout.write(HELP);
130
130
  return 0;
131
131
  }
132
+ // A bare `clio-coder extensions` is a missing required argument, which the
133
+ // exit-code contract puts at 2 with the usage on stderr. It used to print the
134
+ // same help `--help` prints and exit 0, so a CI step gated on it went on to
135
+ // the next line; `eval`, `memory`, `evidence`, and `usage` all already
136
+ // answered 2 here.
137
+ if (!parsed.command) {
138
+ process.stderr.write(HELP);
139
+ return 2;
140
+ }
132
141
  const scopeOptions = { ...(parsed.scope ? { scope: parsed.scope } : {}) };
133
142
  switch (parsed.command) {
134
143
  case "list": {
package/src/cli/fleet.ts CHANGED
@@ -15,6 +15,7 @@
15
15
  import { randomBytes } from "node:crypto";
16
16
  import { readFileSync } from "node:fs";
17
17
  import { join } from "node:path";
18
+ import { attributeCommitMessage } from "../core/commit-attribution.js";
18
19
  import { loadDomains } from "../core/domain-loader.js";
19
20
  import { clioStateDir } from "../core/xdg.js";
20
21
  import type { AgentsContract } from "../domains/agents/contract.js";
@@ -33,8 +34,9 @@ import {
33
34
  renderFleetPrompt,
34
35
  resultContractAuthorship,
35
36
  } from "../domains/agents/index.js";
37
+ import type { ConfigContract } from "../domains/config/contract.js";
36
38
  import { ConfigDomainModule } from "../domains/config/index.js";
37
- import { ContextDomainModule } from "../domains/context/index.js";
39
+ import { ContextDomainModule } from "../domains/context/runtime.js";
38
40
  import { type CapacityDrain, capacityDrain, setCapacityDraining } from "../domains/dispatch/capacity-lease.js";
39
41
  import { runCodeStep } from "../domains/dispatch/code-step.js";
40
42
  import { codeStepDir, writeCodeStepRecord } from "../domains/dispatch/code-step-store.js";
@@ -51,6 +53,7 @@ import {
51
53
  withAttemptRole,
52
54
  } from "../domains/dispatch/execution-role.js";
53
55
  import { type ExecutionPlanResult, executePlan } from "../domains/dispatch/execution-scheduler.js";
56
+ import { deriveFleetCommitAttribution } from "../domains/dispatch/fleet-commit-attribution.js";
54
57
  import { compileFleetExecutionPlan } from "../domains/dispatch/fleet-plan.js";
55
58
  import {
56
59
  decideReviewGate,
@@ -162,7 +165,13 @@ function listingLine(entry: FleetContractListing, state: string, detail: string)
162
165
  return `${entry.name} ${entry.source} ${state.padEnd(7)} ${detail}\n`;
163
166
  }
164
167
 
165
- function runList(): number {
168
+ function runList(args: ReadonlyArray<string>): number {
169
+ // `list` took no arguments and silently ignored whatever followed it, so
170
+ // `fleet list --bogus` exited 0 with the normal table and `fleet list --json`
171
+ // printed the human one. Its siblings status, drain, and resume all reject an
172
+ // unrecognised flag, and so do `agents` and `models`.
173
+ const unknown = args[0];
174
+ if (unknown !== undefined) return fail(`list: unknown flag: ${unknown}`);
166
175
  const listings = listFleetContracts(process.cwd());
167
176
  if (listings.length === 0) {
168
177
  process.stdout.write("no fleet contracts found (.clio-coder/fleets/*.md)\n");
@@ -290,6 +299,7 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
290
299
  ]);
291
300
  const dispatch = loaded.getContract<DispatchContract>("dispatch");
292
301
  const agents = loaded.getContract<AgentsContract>("agents");
302
+ const config = loaded.getContract<ConfigContract>("config");
293
303
  const safety = loaded.getContract<SafetyContract>("safety");
294
304
  const scheduling = loaded.getContract<SchedulingContract>("scheduling");
295
305
  if (!dispatch || !agents || !safety) {
@@ -360,6 +370,13 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
360
370
  const receipts: RunReceipt[] = [];
361
371
  const receiptsByStep = new Map<string, RunReceipt>();
362
372
  const planStep = (stepId: string) => plan.steps.find((entry) => entry.id === stepId);
373
+ const attributionEnabled = config?.get().attribution.gitCommits ?? true;
374
+ // Freshness is coordinator-owned execution state. Worker prose cannot set
375
+ // either flag: a successful deterministic verification sets the first, and
376
+ // an integrity-valid independent gate decision sets the second. Any later
377
+ // workspace agent invalidates both before a commit may read them.
378
+ let validationFresh = false;
379
+ let independentReviewFresh = false;
363
380
 
364
381
  /**
365
382
  * The commit message is the words of the agent that produced the work, and
@@ -455,6 +472,10 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
455
472
  return {
456
473
  assignmentId: handle.runId,
457
474
  result: handle.finalPromise.then((receipt) => {
475
+ if (step.scope === "workspace") {
476
+ validationFresh = false;
477
+ independentReviewFresh = false;
478
+ }
458
479
  receipts.push(receipt);
459
480
  receiptsByStep.set(step.id, receipt);
460
481
  const envelope = dispatch.getRun(receipt.runId);
@@ -481,19 +502,37 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
481
502
  const command = commands?.commands.get(step.commandId);
482
503
  if (command === undefined) throw new Error(`fleet code step '${step.id}' has no registered command`);
483
504
  const isCommit = step.commitFrom !== undefined;
505
+ const evidence = isCommit
506
+ ? deriveFleetCommitAttribution({
507
+ plan,
508
+ step,
509
+ priorResults,
510
+ validationFresh,
511
+ independentReviewFresh,
512
+ })
513
+ : null;
514
+ if (!isCommit && step.scope === "workspace" && step.verification !== true) {
515
+ validationFresh = false;
516
+ independentReviewFresh = false;
517
+ }
518
+ const originalMessage = isCommit ? commitMessageFor(step, priorResults) : null;
484
519
  const outcome = await runCodeStep({
485
520
  stepId: step.id,
486
521
  command,
487
522
  workspaceRoot: process.cwd(),
488
523
  artifactDir: codeStepDir(fleetRootId),
489
524
  signal,
490
- ...(isCommit
525
+ ...(isCommit && evidence !== null && originalMessage !== null
491
526
  ? {
492
- substitutions: { commitMessage: commitMessageFor(step, priorResults) },
527
+ substitutions: {
528
+ commitMessage: attributeCommitMessage(originalMessage, evidence, attributionEnabled),
529
+ },
493
530
  requireWorkspaceChanges: true,
531
+ commitAttribution: { enabled: attributionEnabled, evidence },
494
532
  }
495
533
  : {}),
496
534
  });
535
+ if (step.verification === true) validationFresh = outcome.report.passed;
497
536
  const recordPath = await writeCodeStepRecord(fleetRootId, outcome.record);
498
537
  if (json) process.stdout.write(`${JSON.stringify({ codeStep: outcome.record })}\n`);
499
538
  else
@@ -534,15 +573,17 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
534
573
  needsDecision: `loop '${loop.id}' cycle ${attempt} has no sealed reviewer or subject receipt`,
535
574
  };
536
575
  }
576
+ const correlation = fleetGateCorrelation(subject, decider);
537
577
  const decided = decideReviewGate({
538
578
  group: `${fleetRootId}:${loop.id}`,
539
579
  cycle: attempt,
540
580
  terminalCycle: terminalAttempt,
541
581
  subjects: [{ runId: subject.runId, digest: subject.integrity.digest }],
542
582
  decider: { runId: decider.runId, digest: decider.integrity.digest },
543
- correlation: fleetGateCorrelation(subject, decider),
583
+ correlation,
544
584
  output: result.output,
545
585
  });
586
+ independentReviewFresh = decided.verdict === "pass" && correlation.independent;
546
587
  const staged = stagePendingGateDecision(decided.draft);
547
588
  const { path: decisionPath } = materializePendingGateDecision(staged);
548
589
  if (!json) {
@@ -810,7 +851,7 @@ export async function runFleetCommand(args: ReadonlyArray<string>): Promise<numb
810
851
  }
811
852
  switch (sub) {
812
853
  case "list":
813
- return runList();
854
+ return runList(args.slice(1));
814
855
  case "run":
815
856
  return runFleet(args.slice(1));
816
857
  case "status":