@iowarp/clio-coder 0.3.1 → 0.3.3

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 (601) hide show
  1. package/CHANGELOG.md +233 -373
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.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-2DJ2KNFG.js +2095 -0
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
  12. package/dist/chunk-2VTFPG5O.js +48 -0
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4VP4KH3K.js +962 -0
  16. package/dist/chunk-4XUGQOHA.js +797 -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-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
  21. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  22. package/dist/chunk-65DEGPJ6.js +52 -0
  23. package/dist/chunk-6EJMN2Y3.js +17 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6SGHMWE3.js +277 -0
  26. package/dist/chunk-6XLNIQDB.js +27 -0
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/chunk-7MNJORFF.js +22 -0
  29. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  30. package/dist/chunk-AGYYIBLL.js +1069 -0
  31. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  32. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  33. package/dist/chunk-CBCAPZAA.js +229 -0
  34. package/dist/chunk-CMZWFGD2.js +352 -0
  35. package/dist/chunk-COU2UHX6.js +400 -0
  36. package/dist/chunk-DSELYM6W.js +1077 -0
  37. package/dist/chunk-DUYJ5IO6.js +644 -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-FCSXB6T2.js +338 -0
  42. package/dist/chunk-FJ3H4MN5.js +48 -0
  43. package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G4BMMOKF.js +182 -0
  46. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  47. package/dist/chunk-HC4CLZ2Y.js +68 -0
  48. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  49. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  50. package/dist/chunk-I4HZDVNP.js +73 -0
  51. package/dist/chunk-IKCO5N3L.js +162 -0
  52. package/dist/chunk-IR4CFBFN.js +56 -0
  53. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  54. package/dist/chunk-J7CWMCQD.js +255 -0
  55. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  56. package/dist/chunk-KZWTDYJF.js +217 -0
  57. package/dist/chunk-LBMZMYH2.js +285 -0
  58. package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
  59. package/dist/chunk-LW6DSM3M.js +5135 -0
  60. package/dist/chunk-LWLEKMDQ.js +3482 -0
  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-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  64. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  65. package/dist/chunk-OAO4GE4M.js +619 -0
  66. package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
  67. package/dist/chunk-OKGUZO2U.js +34 -0
  68. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  69. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  70. package/dist/chunk-OQE5J4C6.js +73 -0
  71. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  72. package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
  73. package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
  74. package/dist/chunk-POHLU5DW.js +1186 -0
  75. package/dist/chunk-QKMUKYO7.js +4961 -0
  76. package/dist/chunk-SRDMMSEP.js +16405 -0
  77. package/dist/chunk-SST6Z5JA.js +80 -0
  78. package/dist/chunk-STBPMHSX.js +2456 -0
  79. package/dist/chunk-T6YILFSB.js +80 -0
  80. package/dist/chunk-TZK7PACC.js +174 -0
  81. package/dist/chunk-TZTZS7QK.js +227 -0
  82. package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
  83. package/dist/chunk-UOV2BYIW.js +107 -0
  84. package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
  85. package/dist/chunk-VAKQQHWR.js +434 -0
  86. package/dist/chunk-VG7TBQIY.js +128 -0
  87. package/dist/chunk-VJWL6YS5.js +244 -0
  88. package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-X4RCMKVQ.js +641 -0
  91. package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
  92. package/dist/chunk-XBXAASKX.js +18 -0
  93. package/dist/chunk-XN3L4EYL.js +46 -0
  94. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  95. package/dist/chunk-YHZX5GEU.js +193 -0
  96. package/dist/chunk-YXLYO42X.js +91 -0
  97. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  98. package/dist/chunk-ZI647VB5.js +37 -0
  99. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  100. package/dist/chunk-ZWMF7253.js +1882 -0
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-JOU4FXVA.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-XCDVKR23.js} +92 -55
  108. package/dist/configure-4GAP54ZW.js +42 -0
  109. package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
  110. package/dist/context-5VKGUVJJ.js +866 -0
  111. package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
  126. package/dist/monitor-GE4ID3IA.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
  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-ZU3QMZPZ.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
  137. package/dist/terminal-lease-BNAHVHBS.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-JQHHPQ4K.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
  143. package/dist/verify-375KUB3Y.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.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 +387 -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 +45 -9
  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 +715 -278
  444. package/src/interactive/chat-renderer.ts +306 -85
  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 +253 -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 +42 -22
  456. package/src/interactive/footer-panel.ts +8 -3
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +203 -17
  459. package/src/interactive/interactive-event-projection.ts +18 -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 +184 -117
  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/ask-user.ts +146 -24
  474. package/src/interactive/overlays/decisions.ts +300 -0
  475. package/src/interactive/overlays/help-reference.ts +15 -10
  476. package/src/interactive/overlays/model-selector.ts +34 -16
  477. package/src/interactive/overlays/session-selector.ts +18 -0
  478. package/src/interactive/overlays/settings.ts +105 -17
  479. package/src/interactive/overlays/skills-hub.ts +4 -4
  480. package/src/interactive/overlays/tree-selector.ts +41 -6
  481. package/src/interactive/render-trace.ts +499 -90
  482. package/src/interactive/renderers/compaction-summary.ts +2 -2
  483. package/src/interactive/renderers/diff.ts +115 -104
  484. package/src/interactive/renderers/mermaid.ts +53 -0
  485. package/src/interactive/renderers/tool-execution.ts +516 -168
  486. package/src/interactive/renderers/worker-entry.ts +20 -4
  487. package/src/interactive/session-switch-settlement.ts +10 -0
  488. package/src/interactive/slash-autocomplete.ts +6 -114
  489. package/src/interactive/slash-commands.ts +135 -47
  490. package/src/interactive/slash-spec.ts +9 -38
  491. package/src/interactive/status/controller.ts +5 -1
  492. package/src/interactive/status/index.ts +12 -1
  493. package/src/interactive/status/reasoning.ts +87 -0
  494. package/src/interactive/status/summary.ts +13 -2
  495. package/src/interactive/stdout-backpressure.ts +99 -0
  496. package/src/interactive/stream-pacer.ts +530 -0
  497. package/src/interactive/stream-pacing-policy.ts +66 -0
  498. package/src/interactive/tasks-overlay.ts +368 -14
  499. package/src/interactive/terminal-lease.ts +485 -0
  500. package/src/interactive/theme/tokens.ts +1 -1
  501. package/src/interactive/transcript-detail.ts +120 -0
  502. package/src/interactive/turn-context.ts +4 -3
  503. package/src/interactive/turn-persistence.ts +30 -13
  504. package/src/interactive/turn-queues.ts +12 -0
  505. package/src/interactive/turn-recovery.ts +25 -8
  506. package/src/interactive/turn-runtime.ts +79 -12
  507. package/src/interactive/turn-state.ts +10 -0
  508. package/src/interactive/view/artifacts.ts +114 -4
  509. package/src/interactive/view/view-overlay.ts +3 -0
  510. package/src/interactive/welcome-dashboard.ts +17 -16
  511. package/src/interactive/worker-receipts.ts +52 -3
  512. package/src/interactive/worker-stream.ts +5 -1
  513. package/src/tools/agent-tools.ts +23 -3
  514. package/src/tools/artifact.ts +2 -2
  515. package/src/tools/ask-user.ts +23 -13
  516. package/src/tools/bash.ts +30 -2
  517. package/src/tools/bootstrap.ts +34 -431
  518. package/src/tools/builtin-tool-catalog.ts +271 -0
  519. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  520. package/src/tools/codewiki/code-nav.ts +8 -22
  521. package/src/tools/codewiki/shared.ts +41 -38
  522. package/src/tools/context/docs-engine.ts +14 -3
  523. package/src/tools/context/index.ts +107 -28
  524. package/src/tools/context/surface.ts +19 -0
  525. package/src/tools/core-bootstrap.ts +168 -0
  526. package/src/tools/credential-present.ts +5 -5
  527. package/src/tools/dispatch-admission.ts +533 -0
  528. package/src/tools/dispatch-background.ts +54 -0
  529. package/src/tools/dispatch-event-text.ts +6 -0
  530. package/src/tools/dispatch-plan.ts +9 -4
  531. package/src/tools/dispatch-run-events.ts +238 -0
  532. package/src/tools/dispatch-runner.ts +2370 -0
  533. package/src/tools/dispatch-scout-admission.ts +295 -0
  534. package/src/tools/dispatch-types.ts +77 -0
  535. package/src/tools/dispatch.ts +67 -3161
  536. package/src/tools/find.ts +4 -2
  537. package/src/tools/grep.ts +2 -2
  538. package/src/tools/lazy-tool.ts +60 -0
  539. package/src/tools/ledger.ts +3 -3
  540. package/src/tools/monitor-surface.ts +36 -0
  541. package/src/tools/monitor.ts +2 -32
  542. package/src/tools/observers.ts +2 -2
  543. package/src/tools/presentation.ts +107 -0
  544. package/src/tools/registry.ts +45 -27
  545. package/src/tools/safe-exec.ts +2 -2
  546. package/src/tools/steer-surface.ts +17 -0
  547. package/src/tools/steer.ts +2 -13
  548. package/src/tools/tasks.ts +108 -11
  549. package/src/tools/truncate.ts +25 -184
  550. package/src/tools/verify/frontend.ts +3 -1
  551. package/src/tools/verify/index.ts +3 -38
  552. package/src/tools/verify/surface.ts +46 -0
  553. package/src/tools/web-fetch-surface.ts +23 -0
  554. package/src/tools/web-fetch.ts +2 -20
  555. package/src/tools/write.ts +7 -2
  556. package/src/worker/entry.ts +39 -2
  557. package/src/worker/spec-contract.ts +26 -5
  558. package/dist/chunk-7SS2CTV2.js +0 -61361
  559. package/dist/chunk-DKGKUHFA.js +0 -924
  560. package/dist/chunk-GEP36Y4X.js +0 -12796
  561. package/dist/chunk-XYWBQRDM.js +0 -137
  562. package/dist/clio-BZVGEUFJ.js +0 -58
  563. package/dist/configure-S7S6F6CL.js +0 -32
  564. package/docs/html/agents_blueprint.html +0 -936
  565. package/docs/html/alcf_blueprint.html +0 -324
  566. package/docs/html/architecture_blueprint.html +0 -850
  567. package/docs/html/commands_blueprint.html +0 -939
  568. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  569. package/docs/html/configuration_blueprint.html +0 -1080
  570. package/docs/html/context_blueprint.html +0 -603
  571. package/docs/html/documentation_blueprint.html +0 -832
  572. package/docs/html/environment_blueprint.html +0 -404
  573. package/docs/html/eval_blueprint.html +0 -743
  574. package/docs/html/evals_internal_blueprint.html +0 -190
  575. package/docs/html/evolution_blueprint.html +0 -674
  576. package/docs/html/extensions_blueprint.html +0 -2065
  577. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  578. package/docs/html/index.html +0 -919
  579. package/docs/html/lifecycle_blueprint.html +0 -723
  580. package/docs/html/memory_blueprint.html +0 -699
  581. package/docs/html/middleware_blueprint.html +0 -664
  582. package/docs/html/models_blueprint.html +0 -2366
  583. package/docs/html/observability_blueprint.html +0 -683
  584. package/docs/html/provider_adapter_blueprint.html +0 -245
  585. package/docs/html/safety_blueprint.html +0 -1386
  586. package/docs/html/shared.css +0 -571
  587. package/docs/html/shared.js +0 -143
  588. package/docs/html/skills_blueprint.html +0 -671
  589. package/docs/html/soak_blueprint.html +0 -182
  590. package/docs/html/tool_usage_blueprint.html +0 -350
  591. package/docs/html/tools_blueprint.html +0 -2249
  592. package/docs/html/trace_blueprint.html +0 -235
  593. package/docs/html/tui_design_blueprint.html +0 -374
  594. package/docs/html/validation_blueprint.html +0 -961
  595. package/docs/html/worker_dispatch_blueprint.html +0 -231
  596. package/src/core/release.ts +0 -2
  597. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  598. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  599. package/src/engine/apis/lmstudio-native.ts +0 -1438
  600. package/src/engine/apis/thinking-replay.ts +0 -11
  601. 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":