@iowarp/clio-coder 0.4.1 → 0.4.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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -1,1558 +0,0 @@
1
- import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- fingerprintNativeRuntime
4
- } from "./chunk-NEKRRTYW.js";
5
- import {
6
- INHERITED_PROJECT_CONTEXT,
7
- acceptInteropAgents,
8
- declineInteropAgents,
9
- detectInteropAgents,
10
- interopProposals,
11
- renderProposalEntry
12
- } from "./chunk-BDPT6GTK.js";
13
- import {
14
- initializeClioHome
15
- } from "./chunk-7PWAODYW.js";
16
- import {
17
- createDelayedManualCodeInput,
18
- promptOAuthSelection
19
- } from "./chunk-2STGEDFV.js";
20
- import {
21
- column,
22
- terminalColumns,
23
- truncate,
24
- twoColumnRow,
25
- wrapPlain
26
- } from "./chunk-2IR2NMPA.js";
27
- import {
28
- credentialWriteFailed,
29
- printPlaintextCredentialWarning
30
- } from "./chunk-ZW55JB7N.js";
31
- import {
32
- printError,
33
- printOk
34
- } from "./chunk-VPKWYKEY.js";
35
- import {
36
- isOrchestratorEligibleRuntime,
37
- probeCapabilitiesForModel,
38
- readTargetModelSnapshot,
39
- recordTargetModelSnapshot
40
- } from "./chunk-UEDMSP56.js";
41
- import {
42
- credentialsPresent
43
- } from "./chunk-72GZI5EV.js";
44
- import {
45
- readSettings,
46
- removeTargetFromSettings,
47
- settingsPath,
48
- updateSettings
49
- } from "./chunk-EIMVLWB3.js";
50
- import {
51
- greetLmStudio,
52
- registerBuiltinRuntimes
53
- } from "./chunk-QKIFBZKT.js";
54
- import {
55
- buildProviderSupportEntry,
56
- configuredTargetsForRuntime,
57
- describeRuntimeModels,
58
- listKnownModelsForRuntime,
59
- listProviderSupportEntries,
60
- supportGroupLabel
61
- } from "./chunk-CDNVLKUX.js";
62
- import {
63
- openAuthStorage,
64
- registerClioOAuthProviders,
65
- resolveAuthTarget,
66
- resolveRuntimeAuthTarget,
67
- targetRequiresAuth
68
- } from "./chunk-WNP7O5WZ.js";
69
- import {
70
- getRuntimeRegistry
71
- } from "./chunk-NUGM5KR6.js";
72
- import {
73
- getCatalogModelForRuntime
74
- } from "./chunk-O42A54GG.js";
75
- import {
76
- init_esm_shims
77
- } from "./chunk-3R73A4XB.js";
78
-
79
- // src/cli/configure.ts
80
- init_esm_shims();
81
- import { stdin as input, stdout as output2 } from "node:process";
82
- import { createInterface } from "node:readline/promises";
83
-
84
- // src/cli/ask.ts
85
- init_esm_shims();
86
- async function ask(rl, label, defaultValue) {
87
- const suffix = defaultValue && defaultValue.length > 0 ? ` [${defaultValue}]` : "";
88
- try {
89
- const answer = (await rl.question(`${label}${suffix}: `)).trim();
90
- if (answer.length === 0) return defaultValue ?? "";
91
- if (answer.toLowerCase() === "q" || answer.toLowerCase() === "quit") return null;
92
- return answer;
93
- } catch {
94
- return null;
95
- }
96
- }
97
- async function askYesNo(rl, label, defaultValue) {
98
- const marker = defaultValue ? "Y/n" : "y/N";
99
- for (; ; ) {
100
- const answer = await ask(rl, `${label} [${marker}]`);
101
- if (answer === null) return defaultValue;
102
- if (answer.length === 0) return defaultValue;
103
- const lc = answer.toLowerCase();
104
- if (lc === "y" || lc === "yes") return true;
105
- if (lc === "n" || lc === "no") return false;
106
- process.stderr.write(`invalid response: ${answer}
107
- `);
108
- }
109
- }
110
-
111
- // src/cli/configure-interop.ts
112
- init_esm_shims();
113
- import { stdout as output } from "node:process";
114
- function describe(proposal) {
115
- const lines = [
116
- "",
117
- `${proposal.label} is installed and not configured as a delegation agent.`,
118
- "",
119
- renderProposalEntry(proposal),
120
- "",
121
- `projectContext stays ${INHERITED_PROJECT_CONTEXT}: this agent receives your task text, never the project projection.`,
122
- `toolGovernance is clio-coder-policy: its tool calls are gated by Clio safety.`
123
- ];
124
- if (proposal.needsNetworkInstall) {
125
- lines.push(`The ACP adapter is not installed locally; npx fetches it the first time you delegate.`);
126
- }
127
- return `${lines.join("\n")}
128
- `;
129
- }
130
- async function runInteropReview(rl) {
131
- const report = await detectInteropAgents({ cwd: process.cwd(), probeVersion: true });
132
- const proposals = interopProposals(report, readSettings());
133
- if (proposals.length === 0) {
134
- output.write("No new coding agents to connect.\n");
135
- return 0;
136
- }
137
- if (rl === null) {
138
- for (const proposal of proposals) output.write(describe(proposal));
139
- output.write("\nRun `clio-coder configure --interop` on a terminal to connect any of these.\n");
140
- return 0;
141
- }
142
- const accepted = [];
143
- const declined = [];
144
- for (const proposal of proposals) {
145
- output.write(describe(proposal));
146
- const yes = await askYesNo(rl, `Add ${proposal.label} as delegation agent \`${proposal.entry.id}\`?`, false);
147
- (yes ? accepted : declined).push(proposal.kind);
148
- }
149
- if (accepted.length > 0) {
150
- const result = acceptInteropAgents(accepted, report);
151
- for (const diagnostic of result.diagnostics) output.write(`note: ${diagnostic}
152
- `);
153
- for (const id of result.wired) printOk(`delegation agent ${id} added; use \`/delegate ${id} <task>\``);
154
- }
155
- if (declined.length > 0) {
156
- declineInteropAgents(declined, report);
157
- output.write(`Declined ${declined.join(", ")}; Clio stays quiet about them until their version or path changes.
158
- `);
159
- }
160
- return 0;
161
- }
162
-
163
- // src/cli/configure-layout.ts
164
- init_esm_shims();
165
- function maxLength(values) {
166
- return values.reduce((widest, value) => Math.max(widest, value.length), 0);
167
- }
168
- var CONFIGURE_CATEGORY_CHOICES = [
169
- {
170
- category: "local-app",
171
- label: "Local app",
172
- summary: "Ollama or LM Studio (recommended for new users)",
173
- aliases: ["local"]
174
- },
175
- {
176
- category: "local-http",
177
- label: "Local HTTP server",
178
- summary: "llama.cpp / vLLM / SGLang / OpenAI/Anthropic-compatible",
179
- aliases: ["http"]
180
- },
181
- {
182
- category: "chatgpt",
183
- label: "ChatGPT plan",
184
- summary: "Plus or Pro via Codex OAuth",
185
- aliases: ["codex"]
186
- },
187
- {
188
- category: "cloud-api",
189
- label: "Cloud API key",
190
- summary: "Anthropic, OpenAI, OpenRouter, Groq, Google, DeepSeek, Mistral, Bedrock, or any OpenAI/Anthropic-compatible endpoint (e.g. Inception)",
191
- aliases: ["cloud"]
192
- },
193
- {
194
- category: "all",
195
- label: "All runtimes",
196
- summary: "advanced (full list)",
197
- aliases: ["a"]
198
- }
199
- ];
200
- function formatCategoryMenu(width) {
201
- const leftWidth = maxLength(CONFIGURE_CATEGORY_CHOICES.map((choice, index) => `${index + 1}. ${choice.label}`)) + 2;
202
- const lines = [];
203
- for (const [index, choice] of CONFIGURE_CATEGORY_CHOICES.entries()) {
204
- lines.push(...twoColumnRow(`${index + 1}. ${choice.label}`, choice.summary, { indent: 2, leftWidth, width }));
205
- }
206
- return lines;
207
- }
208
- function matchCategoryChoice(answer) {
209
- const lc = answer.trim().toLowerCase();
210
- if (lc.length === 0) return null;
211
- for (const [index, choice] of CONFIGURE_CATEGORY_CHOICES.entries()) {
212
- if (lc === String(index + 1) || lc === choice.category || choice.aliases.includes(lc)) {
213
- return choice.category;
214
- }
215
- }
216
- return null;
217
- }
218
- function formatRuntimeMenu(items, width) {
219
- if (items.length === 0) return [];
220
- const leftWidth = maxLength(items.map((item, index) => `${String(index + 1).padStart(2)}. ${item.runtimeId}`)) + 1;
221
- const lines = [];
222
- let lastGroup = null;
223
- const grouped = new Set(items.map((item) => item.group)).size > 1;
224
- for (const [index, item] of items.entries()) {
225
- if (grouped && item.group !== lastGroup) {
226
- lastGroup = item.group;
227
- lines.push(` ${item.group}:`);
228
- }
229
- lines.push(
230
- ...twoColumnRow(`${String(index + 1).padStart(2)}. ${item.runtimeId}`, item.summary, {
231
- indent: 4,
232
- leftWidth,
233
- width
234
- })
235
- );
236
- }
237
- return lines;
238
- }
239
- var LIST_INDENT = 2;
240
- var LIST_GAP = 1;
241
- var LIST_MIN_MODELS = 16;
242
- function formatRuntimeList(rows, width) {
243
- if (rows.length === 0) return [];
244
- const targetCells = rows.map((row) => `targets=${row.targets}`);
245
- const idWidth = maxLength(rows.map((row) => row.runtimeId));
246
- const labelWidth = maxLength(rows.map((row) => row.label));
247
- const authWidth = maxLength(rows.map((row) => row.auth));
248
- const targetsWidth = maxLength(targetCells);
249
- const alignedWidth = LIST_INDENT + idWidth + LIST_GAP + labelWidth + LIST_GAP + authWidth + LIST_GAP + targetsWidth;
250
- const inline = width >= alignedWidth + LIST_GAP + LIST_MIN_MODELS;
251
- const pad = " ".repeat(LIST_INDENT);
252
- const detailPad = " ".repeat(LIST_INDENT + 2);
253
- const lines = [];
254
- let lastGroup = null;
255
- for (const [index, row] of rows.entries()) {
256
- if (row.group !== lastGroup) {
257
- if (lastGroup !== null) lines.push("");
258
- lastGroup = row.group;
259
- lines.push(`${row.group}:`);
260
- }
261
- const targetCell = targetCells[index] ?? "";
262
- const models = `models=${row.models}`;
263
- if (inline) {
264
- const id = column(row.runtimeId, idWidth);
265
- const label = column(row.label, labelWidth);
266
- const auth = column(row.auth, authWidth);
267
- lines.push(truncate(`${pad}${id} ${label} ${auth} ${column(targetCell, targetsWidth)} ${models}`, width));
268
- continue;
269
- }
270
- lines.push(truncate(`${pad}${column(row.runtimeId, idWidth)} ${column(row.auth, authWidth)} ${targetCell}`, width));
271
- lines.push(truncate(`${detailPad}${row.label} \xB7 ${models}`, width));
272
- }
273
- return lines;
274
- }
275
-
276
- // src/cli/validate-model.ts
277
- init_esm_shims();
278
- var SAMPLE_SIZE = 10;
279
- function sample(models) {
280
- const shown = models.slice(0, SAMPLE_SIZE).join(", ");
281
- return models.length > SAMPLE_SIZE ? `${shown}, \u2026` : shown;
282
- }
283
- function describeLiveTarget(live) {
284
- return live.url ? `target '${live.targetId}' at ${live.url}` : `target '${live.targetId}'`;
285
- }
286
- function formatUnadvertisedModelReason(modelId, live) {
287
- const resident = live.resident.length > 0 ? live.resident.join(", ") : "none";
288
- return `${describeLiveTarget(live)} does not advertise model '${modelId}'. Advertised (${live.models.length}): ${sample(live.models)}. Resident instances: ${resident}. Pass one of the advertised ids with --model, or --force to save a model the target cannot serve.`;
289
- }
290
- function validateModelChoice(input2) {
291
- const { runtimeId, modelId, knownModels, live, force } = input2;
292
- if (knownModels.length === 0) return validateAgainstLive(modelId, live, force);
293
- if (knownModels.includes(modelId)) return { ok: true };
294
- if (force) {
295
- return {
296
- ok: true,
297
- warning: `model '${modelId}' not in ${runtimeId} catalog (use without --force to reject)`
298
- };
299
- }
300
- return {
301
- ok: false,
302
- reason: `model '${modelId}' not in ${runtimeId} catalog. Known: ${sample(knownModels)}. Use --force to skip validation.`,
303
- knownModels: knownModels.slice(0, SAMPLE_SIZE)
304
- };
305
- }
306
- function validateAgainstLive(modelId, live, force) {
307
- if (!live || live.models.length === 0) return { ok: true };
308
- if (live.models.includes(modelId)) return { ok: true };
309
- const reason = formatUnadvertisedModelReason(modelId, live);
310
- if (force) return { ok: true, warning: `${reason.replace(/ Pass one of.*$/u, "")} Saved anyway because of --force.` };
311
- return { ok: false, reason, knownModels: live.models.slice(0, SAMPLE_SIZE) };
312
- }
313
-
314
- // src/cli/configure.ts
315
- var HELP = `clio-coder configure
316
-
317
- Configure model targets for chat and fleet-agent dispatch.
318
-
319
- Usage:
320
- clio-coder configure interactive wizard
321
- clio-coder configure --interop review detected coding agents as delegation peers
322
- clio-coder configure --list list target runtimes (user-facing only)
323
- clio-coder configure --list --all list every registered runtime including aliases
324
- clio-coder configure --id <targetId> [flags] --runtime <runtimeId>
325
-
326
- Non-interactive flags:
327
- --id <targetId> target id to register (required when non-interactive)
328
- --runtime <runtimeId> runtime to use when registering non-interactively
329
- --url <host> target base URL (http(s):// or ws://)
330
- --model <wireModelId> default model id for this target
331
- --orchestrator-model <id> model to use when setting chat default
332
- --background-model <id> model to use for proactive task memory
333
- --fleet-model <id> model to use when setting fleet default
334
- (mutually exclusive with --agent-profile)
335
- --agent-profile <name> save this target as a named fleet profile
336
- --agent-profile-model <id> model to use for --agent-profile
337
- --api-key-env <VAR> read API key from this env var at call time
338
- --api-key <literal> store API key in credentials.yaml
339
- --force save a model outside the runtime catalog, or one the
340
- target does not advertise, without refusing
341
- --gateway mark the target as a gateway
342
- --lifecycle <user-managed|clio-coder-managed>
343
- resident model lifecycle policy
344
- --set-orchestrator use this target for chat
345
- --set-background use this target for proactive task memory
346
- --set-fleet-default use this target for the fleet default
347
- --context-window <N> capability override
348
- --max-tokens <N> output token capability override
349
- --reasoning <true|false> capability override
350
- `;
351
- var DEFAULT_PORTS = {
352
- llamacpp: 8080,
353
- "llamacpp-anthropic": 8080,
354
- "llamacpp-completion": 8080,
355
- "llamacpp-embed": 8080,
356
- "llamacpp-rerank": 8080,
357
- "lmstudio-native": 1234,
358
- lmstudio: 1234,
359
- "ollama-native": 11434,
360
- vllm: 8e3,
361
- sglang: 3e4,
362
- "lemonade-anthropic": 8e3,
363
- lemonade: 8e3,
364
- "anthropic-compat": 8e3,
365
- "openai-compat": 8e3,
366
- litellm: 4e3
367
- };
368
- function parseSetupArgs(argv) {
369
- const out = {
370
- positional: [],
371
- help: false,
372
- list: false,
373
- all: false,
374
- interop: false,
375
- force: false,
376
- gateway: false,
377
- setOrchestrator: false,
378
- setBackground: false,
379
- setWorkerDefault: false
380
- };
381
- for (let i = 0; i < argv.length; i++) {
382
- const a = argv[i];
383
- const need = () => {
384
- const v = argv[i + 1];
385
- if (v === void 0) throw new Error(`${a} requires a value`);
386
- i += 1;
387
- return v;
388
- };
389
- switch (a) {
390
- case "--help":
391
- case "-h":
392
- out.help = true;
393
- break;
394
- case "--list":
395
- out.list = true;
396
- break;
397
- case "--all":
398
- out.all = true;
399
- break;
400
- case "--interop":
401
- out.interop = true;
402
- break;
403
- case "--remove":
404
- out.remove = need();
405
- break;
406
- case "--rename":
407
- out.renameOld = need();
408
- out.renameNew = need();
409
- break;
410
- case "--id":
411
- out.id = need();
412
- break;
413
- case "--runtime":
414
- out.runtime = need();
415
- break;
416
- case "--url":
417
- out.url = need();
418
- break;
419
- case "--model":
420
- out.model = need();
421
- break;
422
- case "--orchestrator-model":
423
- out.orchestratorModel = need();
424
- break;
425
- case "--background-model":
426
- out.backgroundModel = need();
427
- break;
428
- case "--fleet-model":
429
- case "--worker-model":
430
- out.workerModel = need();
431
- break;
432
- case "--agent-profile":
433
- case "--worker-profile":
434
- out.workerProfile = need();
435
- break;
436
- case "--agent-profile-model":
437
- case "--worker-profile-model":
438
- out.workerProfileModel = need();
439
- break;
440
- case "--api-key-env":
441
- out.apiKeyEnv = need();
442
- break;
443
- case "--api-key":
444
- out.apiKey = need();
445
- break;
446
- case "--force":
447
- out.force = true;
448
- break;
449
- case "--gateway":
450
- out.gateway = true;
451
- break;
452
- case "--lifecycle": {
453
- const v = need();
454
- if (v !== "user-managed" && v !== "clio-coder-managed") {
455
- throw new Error("--lifecycle must be user-managed or clio-coder-managed");
456
- }
457
- out.lifecycle = v;
458
- break;
459
- }
460
- case "--set-orchestrator":
461
- out.setOrchestrator = true;
462
- break;
463
- case "--set-background":
464
- out.setBackground = true;
465
- break;
466
- case "--set-fleet-default":
467
- case "--set-worker-default":
468
- out.setWorkerDefault = true;
469
- break;
470
- case "--context-window": {
471
- const n = Number(need());
472
- if (!Number.isFinite(n) || n <= 0) throw new Error("--context-window must be a positive number");
473
- out.contextWindow = Math.floor(n);
474
- break;
475
- }
476
- case "--max-tokens": {
477
- const n = Number(need());
478
- if (!Number.isFinite(n) || n <= 0) throw new Error("--max-tokens must be a positive number");
479
- out.maxTokens = Math.floor(n);
480
- break;
481
- }
482
- case "--reasoning": {
483
- const v = need().toLowerCase();
484
- if (v !== "true" && v !== "false") throw new Error("--reasoning must be true or false");
485
- out.reasoning = v === "true";
486
- break;
487
- }
488
- default:
489
- if (a.startsWith("-")) throw new Error(`unknown flag: ${a}`);
490
- out.positional.push(a);
491
- }
492
- }
493
- return out;
494
- }
495
- function ensureRegistryPopulated() {
496
- registerClioOAuthProviders();
497
- const registry = getRuntimeRegistry();
498
- if (registry.list().length === 0) registerBuiltinRuntimes(registry);
499
- }
500
- function trimTrailing(url) {
501
- return url.endsWith("/") && url.length > 1 ? url.slice(0, -1) : url;
502
- }
503
- function normalizeUrl(input2, runtimeId) {
504
- const trimmed = input2.trim();
505
- if (trimmed.length === 0) return defaultUrlFor(runtimeId);
506
- const hasScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed);
507
- let withScheme = hasScheme ? trimmed : `http://${trimmed}`;
508
- if (runtimeId === "lmstudio") withScheme = withScheme.replace(/^ws:/u, "http:").replace(/^wss:/u, "https:");
509
- try {
510
- const parsed = new URL(withScheme);
511
- if (!hasScheme && !parsed.port && DEFAULT_PORTS[runtimeId]) {
512
- parsed.port = String(DEFAULT_PORTS[runtimeId]);
513
- }
514
- return trimTrailing(parsed.toString());
515
- } catch {
516
- return trimTrailing(withScheme);
517
- }
518
- }
519
- function defaultUrlFor(runtimeId) {
520
- const port = DEFAULT_PORTS[runtimeId];
521
- return port ? `http://127.0.0.1:${port}` : "http://127.0.0.1:8080";
522
- }
523
- var RUNTIME_LIST_CAPTION = "every registered runtime. run `clio-coder auth list` for the ones clio authenticates itself; the rest authenticate through their own tool (claude-cli, aws-sdk) or need no credential.";
524
- function printRuntimeList(includeHidden) {
525
- const settings = readSettings();
526
- const auth = openAuthStorage();
527
- const rows = [];
528
- for (const entry of listProviderSupportEntries(getRuntimeRegistry().list(), { includeHidden })) {
529
- const runtime = getRuntimeRegistry().get(entry.runtimeId);
530
- const status = runtime && entry.connectable ? auth.statusForTarget(resolveRuntimeAuthTarget(runtime), { includeFallback: false }) : null;
531
- const authLabel = runtime?.auth === "oauth" ? status?.available ? "connected" : "login" : runtime?.auth === "api-key" ? status?.available ? "credential" : targetRequiresAuth({ id: entry.runtimeId, runtime: entry.runtimeId }, runtime) ? "needs-key" : "key-optional" : runtime?.auth ?? "none";
532
- rows.push({
533
- group: supportGroupLabel(entry.group),
534
- runtimeId: entry.runtimeId,
535
- label: entry.label,
536
- auth: authLabel,
537
- targets: configuredTargetsForRuntime(settings, entry.runtimeId).length,
538
- models: describeRuntimeModels(entry, 2)
539
- });
540
- }
541
- const width = terminalColumns();
542
- for (const line of formatRuntimeList(rows, width)) {
543
- process.stdout.write(`${line}
544
- `);
545
- }
546
- for (const line of wrapPlain(RUNTIME_LIST_CAPTION, width)) {
547
- process.stdout.write(`${line}
548
- `);
549
- }
550
- }
551
- function deriveTargetId(runtimeId, existing) {
552
- const base = runtimeId;
553
- const taken = new Set(existing.map((e) => e.id));
554
- if (!taken.has(base)) return base;
555
- for (let i = 2; i < 1e3; i++) {
556
- const candidate = `${base}-${i}`;
557
- if (!taken.has(candidate)) return candidate;
558
- }
559
- return `${base}-${Date.now()}`;
560
- }
561
- async function buildProbeContext(runtime, target) {
562
- const probeCtx = {
563
- credentialsPresent: credentialsPresent(),
564
- httpTimeoutMs: 5e3
565
- };
566
- if (!runtime || !target || !targetRequiresAuth(target, runtime)) return probeCtx;
567
- try {
568
- const resolution = await openAuthStorage().resolveForTarget(resolveAuthTarget(target, runtime), {
569
- includeFallback: false
570
- });
571
- if (resolution.apiKey) probeCtx.authToken = resolution.apiKey;
572
- } catch {
573
- }
574
- return probeCtx;
575
- }
576
- function runtimeKnownModelsFor(runtimeId) {
577
- return listKnownModelsForRuntime(runtimeId);
578
- }
579
- function catalogContextWindowFor(runtime, modelId) {
580
- const catalogModel = getCatalogModelForRuntime(runtime.id, modelId);
581
- if (typeof catalogModel?.contextWindow === "number" && catalogModel.contextWindow > 0) {
582
- return catalogModel.contextWindow;
583
- }
584
- if (runtimeKnownModelsFor(runtime.id).includes(modelId) && runtime.defaultCapabilities.contextWindow > 0) {
585
- return runtime.defaultCapabilities.contextWindow;
586
- }
587
- return null;
588
- }
589
- function validateResolvedModel(runtime, target, modelId, force, inventory) {
590
- if (!modelId) return true;
591
- const knownModels = runtimeKnownModelsFor(runtime.id);
592
- const live = inventory.source === "probe" ? liveInventoryFor(target, inventory) : void 0;
593
- const validation = validateModelChoice({ runtimeId: runtime.id, modelId, knownModels, live, force });
594
- if (!validation.ok) {
595
- process.stderr.write(`error: ${validation.reason}
596
- `);
597
- return false;
598
- }
599
- if (validation.warning) process.stderr.write(`warning: ${validation.warning}
600
- `);
601
- if (knownModels.length === 0 && live === void 0 && runtime.kind === "http") {
602
- process.stderr.write(
603
- `warning: could not verify model '${modelId}': ${target.url ?? `target '${target.id}'`} returned no model list; it is saved as written
604
- `
605
- );
606
- }
607
- return true;
608
- }
609
- function validateContextWindowOverride(runtime, modelId, contextWindow, force) {
610
- if (contextWindow === void 0 || !modelId) return true;
611
- const catalogMax = catalogContextWindowFor(runtime, modelId);
612
- if (catalogMax === null || contextWindow <= catalogMax) return true;
613
- const message = `--context-window ${contextWindow} exceeds catalog max ${catalogMax} for model '${modelId}'`;
614
- if (!force) {
615
- process.stderr.write(`error: ${message}. Use --force to override.
616
- `);
617
- return false;
618
- }
619
- process.stderr.write(`warning: ${message}
620
- `);
621
- return true;
622
- }
623
- async function runtimeProbe(runtime, target, authToken) {
624
- if (typeof runtime.probe !== "function") return null;
625
- try {
626
- const context = await buildProbeContext(runtime, target);
627
- return await runtime.probe(target, authToken === void 0 ? context : { ...context, authToken });
628
- } catch (err) {
629
- return { ok: false, error: err instanceof Error ? err.message : String(err) };
630
- }
631
- }
632
- async function runtimeProbeModels(runtime, target, authToken) {
633
- if (typeof runtime.probeModels !== "function") return [];
634
- try {
635
- const context = await buildProbeContext(runtime, target);
636
- return await runtime.probeModels(target, authToken === void 0 ? context : { ...context, authToken });
637
- } catch {
638
- return [];
639
- }
640
- }
641
- function applyTarget(settings, descriptor) {
642
- const idx = settings.targets.findIndex((e) => e.id === descriptor.id);
643
- if (idx >= 0) settings.targets[idx] = descriptor;
644
- else settings.targets.push(descriptor);
645
- }
646
- function setOrchestratorPointer(settings, descriptor, model) {
647
- const runtime = getRuntimeRegistry().get(descriptor.runtime);
648
- if (!runtime) {
649
- throw new Error(
650
- `cannot use target '${descriptor.id}' as orchestrator target because runtime '${descriptor.runtime}' is not registered`
651
- );
652
- }
653
- if (!isOrchestratorEligibleRuntime(runtime)) {
654
- throw new Error(
655
- `cannot use target '${descriptor.id}' as orchestrator target because runtime '${runtime.id}' is not an HTTP/native runtime`
656
- );
657
- }
658
- settings.chat.target = descriptor.id;
659
- settings.chat.model = model ?? descriptor.defaultModel ?? null;
660
- }
661
- function setWorkerDefaultPointer(settings, descriptor, model) {
662
- settings.fleet.default.target = descriptor.id;
663
- settings.fleet.default.model = model ?? descriptor.defaultModel ?? null;
664
- }
665
- function setBackgroundPointer(settings, descriptor, model) {
666
- const runtime = getRuntimeRegistry().get(descriptor.runtime);
667
- if (!runtime || !isOrchestratorEligibleRuntime(runtime)) {
668
- throw new Error(
669
- `cannot use target '${descriptor.id}' as background target because runtime '${descriptor.runtime}' is not an HTTP/native runtime`
670
- );
671
- }
672
- settings.context.memory.target = descriptor.id;
673
- settings.context.memory.model = model ?? descriptor.defaultModel ?? null;
674
- }
675
- function assertOrchestratorReplacementEligible(settings, descriptor) {
676
- if (settings.chat.target !== descriptor.id && settings.context.memory.target !== descriptor.id) return;
677
- const role = settings.chat.target === descriptor.id ? "orchestrator" : "background";
678
- const runtime = getRuntimeRegistry().get(descriptor.runtime);
679
- if (!runtime) {
680
- throw new Error(
681
- `cannot update ${role} target '${descriptor.id}' because runtime '${descriptor.runtime}' is not registered`
682
- );
683
- }
684
- if (!isOrchestratorEligibleRuntime(runtime)) {
685
- throw new Error(`cannot update ${role} target '${descriptor.id}' to non-HTTP/native runtime '${runtime.id}'`);
686
- }
687
- }
688
- function setWorkerProfilePointer(settings, name, descriptor, model) {
689
- const trimmed = name.trim();
690
- if (trimmed.length === 0) throw new Error("fleet profile name must be non-empty");
691
- settings.fleet.profiles[trimmed] = {
692
- target: descriptor.id,
693
- model: model ?? descriptor.defaultModel ?? null,
694
- thinkingLevel: "off"
695
- };
696
- }
697
- function warnUndiscoveredContextWindow(descriptor, probe) {
698
- if (!probe?.ok) return;
699
- if (typeof descriptor.capabilities?.contextWindow === "number" && descriptor.capabilities.contextWindow > 0) return;
700
- const discovered = probeCapabilitiesForModel(
701
- {
702
- target: descriptor,
703
- probeCapabilities: probe.discoveredCapabilities ?? null,
704
- probeModelCapabilities: probe.modelCapabilities ?? null,
705
- probeModelId: probe.capabilityModelId ?? null
706
- },
707
- descriptor.defaultModel
708
- );
709
- if (typeof discovered?.contextWindow === "number" && discovered.contextWindow > 0) return;
710
- process.stdout.write(
711
- " warning: the target reported no context window; Clio will use the runtime default as a guess. Set one with --context-window.\n"
712
- );
713
- }
714
- function probeReadings(probe) {
715
- const readings = [];
716
- if (probe.models && probe.models.length > 0) readings.push(`${probe.models.length} models`);
717
- if (probe.serverVersion) readings.push(probe.serverVersion);
718
- if (probe.discoveredCapabilities && Object.keys(probe.discoveredCapabilities).length > 0) {
719
- readings.push("capabilities");
720
- }
721
- return readings;
722
- }
723
- function probeLines(descriptor, probe) {
724
- const latency = probe.latencyMs !== void 0 ? ` (${probe.latencyMs}ms)` : "";
725
- if (!probe.ok) {
726
- const where = descriptor.url ? ` ${descriptor.url}` : "";
727
- return [
728
- `probe failed${latency}:${where} ${probe.error ?? "unknown"}`,
729
- ` check the server is running and reachable, then re-run: clio-coder configure --id ${descriptor.id} --url <url>`
730
- ];
731
- }
732
- const readings = probeReadings(probe);
733
- if (readings.length > 0) return [`probe ok${latency} ${readings.join(", ")}`];
734
- return [
735
- `probe reachable${latency}, but the target answered no model list and no version`,
736
- " Clio cannot verify the model id or the context window from here and will send both as written.",
737
- " re-read them once the server serves them with: clio-coder targets --probe"
738
- ];
739
- }
740
- function printSummary(settings, descriptor, probe) {
741
- process.stdout.write(`
742
- saved target ${descriptor.id} (runtime=${descriptor.runtime})
743
- `);
744
- if (descriptor.url) process.stdout.write(` url ${descriptor.url}
745
- `);
746
- if (descriptor.defaultModel) process.stdout.write(` model ${descriptor.defaultModel}
747
- `);
748
- if (descriptor.auth?.apiKeyEnvVar) process.stdout.write(` apiKeyEnv ${descriptor.auth.apiKeyEnvVar}
749
- `);
750
- if (descriptor.gateway) process.stdout.write(" gateway true\n");
751
- if (descriptor.lifecycle) process.stdout.write(` lifecycle ${descriptor.lifecycle}
752
- `);
753
- if (probe) {
754
- for (const line of probeLines(descriptor, probe)) process.stdout.write(` ${line}
755
- `);
756
- }
757
- warnUndiscoveredContextWindow(descriptor, probe);
758
- if (settings.chat.target === descriptor.id) process.stdout.write(" orchestrator target\n");
759
- if (settings.context.memory.target === descriptor.id) process.stdout.write(" background memory target\n");
760
- if (settings.fleet.default.target === descriptor.id) process.stdout.write(" fleet default\n");
761
- for (const [name, profile] of Object.entries(settings.fleet.profiles)) {
762
- if (profile.target === descriptor.id) process.stdout.write(` fleet profile ${name}
763
- `);
764
- }
765
- process.stdout.write(`
766
- settings written to ${settingsPath()}
767
- `);
768
- }
769
- function buildDescriptor(runtime, id, parts) {
770
- const descriptor = { id, runtime: runtime.id };
771
- if (parts.url) descriptor.url = parts.url;
772
- if (parts.model) descriptor.defaultModel = parts.model;
773
- const auth = {};
774
- if (parts.apiKeyEnv) auth.apiKeyEnvVar = parts.apiKeyEnv;
775
- if (parts.apiKeyRef) auth.apiKeyRef = parts.apiKeyRef;
776
- if (parts.oauthProfile) auth.oauthProfile = parts.oauthProfile;
777
- if (Object.keys(auth).length > 0) descriptor.auth = auth;
778
- if (parts.gateway) descriptor.gateway = true;
779
- if (parts.lifecycle) descriptor.lifecycle = parts.lifecycle;
780
- const caps = {};
781
- if (parts.contextWindow !== void 0) caps.contextWindow = parts.contextWindow;
782
- if (parts.maxTokens !== void 0) caps.maxTokens = parts.maxTokens;
783
- if (parts.reasoning !== void 0) caps.reasoning = parts.reasoning;
784
- if (Object.keys(caps).length > 0) descriptor.capabilities = caps;
785
- if (parts.lmstudio) descriptor.lmstudio = parts.lmstudio;
786
- return descriptor;
787
- }
788
- function describeAuthStatus(runtime) {
789
- const status = openAuthStorage().statusForTarget(resolveRuntimeAuthTarget(runtime), { includeFallback: false });
790
- if (!status.available) return "none stored";
791
- if (status.source === "environment") return `environment${status.detail ? ` (${status.detail})` : ""}`;
792
- if (status.source === "stored-api-key") return "stored api key";
793
- if (status.source === "stored-oauth") return "stored oauth";
794
- return status.source;
795
- }
796
- async function loginOAuthRuntime(rl, runtime) {
797
- const auth = openAuthStorage();
798
- if (runtime.authNotice) process.stdout.write(`note: ${runtime.authNotice}
799
- `);
800
- const manualCodeInput = createDelayedManualCodeInput(
801
- rl,
802
- "Paste verification code if browser callback does not complete automatically: "
803
- );
804
- try {
805
- await auth.login(runtime.oauthProviderId ?? runtime.id, {
806
- onAuth: ({ url, instructions }) => {
807
- process.stdout.write(`
808
- Open: ${url}
809
- `);
810
- if (instructions) process.stdout.write(`${instructions}
811
- `);
812
- process.stdout.write("Waiting for the browser callback. A manual code prompt will appear if needed.\n");
813
- },
814
- onDeviceCode: ({ verificationUri, userCode }) => {
815
- process.stdout.write(`
816
- Open: ${verificationUri}
817
- `);
818
- process.stdout.write(`Enter code: ${userCode}
819
- `);
820
- },
821
- onPrompt: async (prompt) => {
822
- const answer = await rl.question(`${prompt.message}${prompt.allowEmpty ? " " : ": "}`);
823
- return prompt.allowEmpty ? answer : answer.trim();
824
- },
825
- onSelect: (prompt) => promptOAuthSelection(rl, prompt),
826
- onManualCodeInput: manualCodeInput.onManualCodeInput,
827
- onProgress: (message) => {
828
- process.stderr.write(`${message}
829
- `);
830
- }
831
- });
832
- if (credentialWriteFailed(auth, `credential for ${runtime.id} was not stored`)) return false;
833
- printOk(`authenticated ${runtime.id}`);
834
- return true;
835
- } catch (error) {
836
- printError(error instanceof Error ? error.message : String(error));
837
- return false;
838
- } finally {
839
- manualCodeInput.cancel();
840
- }
841
- }
842
- function advertisedModelIds(inventory) {
843
- const ids = [...inventory.models];
844
- for (const id of Object.keys(inventory.modelStates ?? {})) if (!ids.includes(id)) ids.push(id);
845
- return ids;
846
- }
847
- function residentModelIds(modelStates) {
848
- return Object.entries(modelStates ?? {}).filter(([, status]) => status.state === "loaded" || status.state === "loading").map(([id]) => id);
849
- }
850
- function liveInventoryFor(target, inventory) {
851
- return {
852
- targetId: target.id,
853
- url: target.url,
854
- models: advertisedModelIds(inventory),
855
- resident: residentModelIds(inventory.modelStates)
856
- };
857
- }
858
- async function resolveSupportedWireModels(runtime, target, existing, authToken) {
859
- const known = listKnownModelsForRuntime(runtime.id);
860
- if (known.length > 0) return { models: known, source: "catalog" };
861
- if (runtime.kind === "http") {
862
- const probe = await runtimeProbe(runtime, target, authToken);
863
- if (probe?.ok && probe.models && probe.models.length > 0) {
864
- recordTargetModelSnapshot(target, probe.models);
865
- return { models: [...probe.models], source: "probe", modelStates: probe.modelStates };
866
- }
867
- const discovered = await runtimeProbeModels(runtime, target, authToken);
868
- if (discovered.length > 0) {
869
- recordTargetModelSnapshot(target, discovered);
870
- return { models: discovered, source: "probe" };
871
- }
872
- }
873
- const cached = readTargetModelSnapshot(target);
874
- if (cached && cached.models.length > 0) return { models: [...cached.models], source: "cache" };
875
- if (existing?.wireModels && existing.wireModels.length > 0) {
876
- recordTargetModelSnapshot(target, existing.wireModels);
877
- return { models: [...existing.wireModels], source: "legacy" };
878
- }
879
- return { models: [], source: "none" };
880
- }
881
- function resolveModelChoice(answer, wireModels, defaultValue) {
882
- if (answer.length === 0) return defaultValue;
883
- const numeric = Number(answer);
884
- if (Number.isInteger(numeric) && numeric >= 1 && numeric <= wireModels.length) {
885
- return wireModels[numeric - 1];
886
- }
887
- return answer;
888
- }
889
- async function askModelChoice(rl, label, wireModels, defaultValue) {
890
- const answer = await ask(rl, `${label} (number or id)`, defaultValue ?? "");
891
- if (answer === null) return null;
892
- return resolveModelChoice(answer, wireModels, defaultValue) ?? "";
893
- }
894
- function refuseCatalogSeededModel(runtime, support) {
895
- printError(
896
- `--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`
897
- );
898
- process.stderr.write(
899
- ` run \`clio-coder configure --runtime ${runtime.id}\` with no other flags to choose from the full list
900
- `
901
- );
902
- }
903
- async function runNonInteractive(runtime, args) {
904
- if (!args.id) {
905
- printError("--id is required when passing flags non-interactively");
906
- return 2;
907
- }
908
- if (args.workerProfileModel !== void 0 && args.workerProfile === void 0) {
909
- printError("--agent-profile-model requires --agent-profile");
910
- return 2;
911
- }
912
- if (args.workerProfile !== void 0 && args.workerProfile.trim().length === 0) {
913
- printError("--agent-profile must be non-empty");
914
- return 2;
915
- }
916
- if (args.workerProfile !== void 0 && args.workerModel !== void 0) {
917
- printError(
918
- "--fleet-model and --agent-profile conflict; use --agent-profile-model for the profile, or drop --agent-profile to set the fleet default"
919
- );
920
- return 2;
921
- }
922
- const settings = readSettings();
923
- const auth = openAuthStorage();
924
- const support = buildProviderSupportEntry(runtime);
925
- const existing = settings.targets.find((e) => e.id === args.id);
926
- if (existing && (getRuntimeRegistry().get(existing.runtime)?.id ?? existing.runtime) !== runtime.id) {
927
- printError(`target ${args.id} already exists with runtime ${existing.runtime}`);
928
- return 2;
929
- }
930
- let url = args.url ? normalizeUrl(args.url, runtime.id) : existing?.url;
931
- if (!url && support.supportsCustomUrl) {
932
- url = defaultUrlFor(runtime.id);
933
- }
934
- if (url && runtime.id === "lmstudio") {
935
- const greeting = await greetLmStudio(
936
- { id: args.id, runtime: runtime.id, url },
937
- { credentialsPresent: /* @__PURE__ */ new Set(), httpTimeoutMs: 750 }
938
- );
939
- if (!greeting.ok) {
940
- printError(`refusing to save LM Studio target '${args.id}': ${url} did not return the LM Studio greeting`);
941
- return 2;
942
- }
943
- }
944
- if (url && (runtime.id === "openai-compat" || runtime.id === "anthropic-compat")) {
945
- const fingerprint = await fingerprintNativeRuntime(url);
946
- if (fingerprint) {
947
- process.stdout.write(
948
- `note: detected ${fingerprint.displayName} at ${url}; consider \`clio-coder targets convert ${args.id} --runtime ${fingerprint.runtimeId}\` for proper resident-model lifecycle
949
- `
950
- );
951
- }
952
- }
953
- const authStatus = auth.statusForTarget(resolveRuntimeAuthTarget(runtime), { includeFallback: false });
954
- const apiKeyEnv = args.apiKeyEnv ?? existing?.auth?.apiKeyEnvVar;
955
- const apiKeyRef = runtime.auth === "api-key" && (args.apiKey || existing?.auth?.apiKeyRef || authStatus.source === "stored-api-key") ? runtime.id : void 0;
956
- const oauthProfile = runtime.auth === "oauth" ? existing?.auth?.oauthProfile ?? runtime.oauthProviderId ?? runtime.id : void 0;
957
- const seed = buildDescriptor(runtime, args.id, {
958
- ...url !== void 0 ? { url } : {},
959
- ...args.model !== void 0 ? { model: args.model } : existing?.defaultModel ? { model: existing.defaultModel } : support.defaultModel ? { model: support.defaultModel } : {},
960
- ...apiKeyEnv !== void 0 ? { apiKeyEnv } : {},
961
- ...apiKeyRef !== void 0 ? { apiKeyRef } : {},
962
- ...oauthProfile !== void 0 ? { oauthProfile } : {},
963
- gateway: args.gateway || existing?.gateway === true,
964
- ...args.lifecycle !== void 0 ? { lifecycle: args.lifecycle } : existing?.lifecycle !== void 0 ? { lifecycle: existing.lifecycle } : {},
965
- ...args.contextWindow !== void 0 ? { contextWindow: args.contextWindow } : {},
966
- ...args.maxTokens !== void 0 ? { maxTokens: args.maxTokens } : {},
967
- ...args.reasoning !== void 0 ? { reasoning: args.reasoning } : {},
968
- ...existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}
969
- });
970
- const inventory = await resolveSupportedWireModels(runtime, seed, existing, args.apiKey);
971
- const wireModels = inventory.models;
972
- const model = args.model ?? existing?.defaultModel ?? support.defaultModel ?? (support.modelSource === "catalog" ? void 0 : wireModels[0]);
973
- if (model === void 0 && support.modelSource === "catalog") {
974
- refuseCatalogSeededModel(runtime, support);
975
- return 2;
976
- }
977
- if (!validateResolvedModel(runtime, seed, model, args.force, inventory)) return 2;
978
- if (!validateContextWindowOverride(runtime, model, args.contextWindow, args.force)) return 2;
979
- const descriptor = buildDescriptor(runtime, args.id, {
980
- ...url !== void 0 ? { url } : {},
981
- ...model ? { model } : {},
982
- ...apiKeyEnv !== void 0 ? { apiKeyEnv } : {},
983
- ...apiKeyRef !== void 0 ? { apiKeyRef } : {},
984
- ...oauthProfile !== void 0 ? { oauthProfile } : {},
985
- gateway: args.gateway || existing?.gateway === true,
986
- ...args.lifecycle !== void 0 ? { lifecycle: args.lifecycle } : existing?.lifecycle !== void 0 ? { lifecycle: existing.lifecycle } : {},
987
- ...args.contextWindow !== void 0 ? { contextWindow: args.contextWindow } : {},
988
- ...args.maxTokens !== void 0 ? { maxTokens: args.maxTokens } : {},
989
- ...args.reasoning !== void 0 ? { reasoning: args.reasoning } : {},
990
- ...existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}
991
- });
992
- const setOrchestrator = args.setOrchestrator || args.orchestratorModel !== void 0;
993
- const setBackground = args.setBackground || args.backgroundModel !== void 0;
994
- if ((setOrchestrator || setBackground) && !isOrchestratorEligibleRuntime(runtime)) {
995
- printError(
996
- `cannot use target '${descriptor.id}' as a chat or background target because runtime '${runtime.id}' is not an HTTP/native runtime`
997
- );
998
- return 1;
999
- }
1000
- try {
1001
- assertOrchestratorReplacementEligible(settings, descriptor);
1002
- } catch (error) {
1003
- printError(error instanceof Error ? error.message : String(error));
1004
- return 1;
1005
- }
1006
- if (args.apiKey) {
1007
- auth.setApiKey(runtime.id, args.apiKey);
1008
- if (credentialWriteFailed(auth, `credential for ${runtime.id} was not stored; target '${descriptor.id}' not saved`))
1009
- return 1;
1010
- printPlaintextCredentialWarning();
1011
- }
1012
- const setWorkerDefault = args.setWorkerDefault || args.workerProfile === void 0 && args.workerModel !== void 0;
1013
- const applyConfiguration = (target) => {
1014
- applyTarget(target, descriptor);
1015
- if (setOrchestrator)
1016
- setOrchestratorPointer(target, descriptor, args.orchestratorModel ?? descriptor.defaultModel ?? null);
1017
- if (setBackground) setBackgroundPointer(target, descriptor, args.backgroundModel ?? descriptor.defaultModel ?? null);
1018
- if (setWorkerDefault)
1019
- setWorkerDefaultPointer(target, descriptor, args.workerModel ?? descriptor.defaultModel ?? null);
1020
- if (args.workerProfile !== void 0) {
1021
- setWorkerProfilePointer(
1022
- target,
1023
- args.workerProfile,
1024
- descriptor,
1025
- args.workerProfileModel ?? descriptor.defaultModel ?? null
1026
- );
1027
- }
1028
- };
1029
- applyConfiguration(settings);
1030
- updateSettings(applyConfiguration);
1031
- const probe = await runtimeProbe(runtime, descriptor);
1032
- if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
1033
- printSummary(settings, descriptor, probe);
1034
- if (runtime.auth === "oauth" && !auth.statusForTarget(resolveRuntimeAuthTarget(runtime), { includeFallback: false }).available) {
1035
- process.stdout.write(
1036
- `note: authenticate ${runtime.id} with \`clio-coder auth login ${runtime.id}\` before using this target
1037
- `
1038
- );
1039
- }
1040
- printOk(`target ${args.id} saved`);
1041
- return 0;
1042
- }
1043
- async function pickRuntime(rl) {
1044
- const registry = getRuntimeRegistry();
1045
- const entries = listProviderSupportEntries(registry.list());
1046
- return pickRuntimeFromEntries(rl, entries, "\nSupported runtimes:");
1047
- }
1048
- async function pickRuntimeFromEntries(rl, entries, heading) {
1049
- const registry = getRuntimeRegistry();
1050
- if (entries.length === 0) {
1051
- process.stderr.write("no runtimes available in this category\n");
1052
- return null;
1053
- }
1054
- process.stdout.write(`${heading}
1055
- `);
1056
- const menu = formatRuntimeMenu(
1057
- entries.map((entry) => ({
1058
- group: supportGroupLabel(entry.group),
1059
- runtimeId: entry.runtimeId,
1060
- summary: entry.summary
1061
- })),
1062
- terminalColumns()
1063
- );
1064
- for (const line of menu) process.stdout.write(`${line}
1065
- `);
1066
- const allowedIds = new Set(entries.map((entry) => entry.runtimeId));
1067
- const defaultRuntimeId = entries.find((entry) => entry.featured)?.runtimeId ?? "";
1068
- for (; ; ) {
1069
- const answer = await ask(rl, "\nSelection (number or runtime id)", defaultRuntimeId);
1070
- if (answer === null) return null;
1071
- if (answer.length === 0) {
1072
- process.stderr.write(`pick a number from 1 to ${entries.length}, or type a runtime id
1073
- `);
1074
- continue;
1075
- }
1076
- const numeric = Number(answer);
1077
- if (Number.isInteger(numeric) && numeric >= 1 && numeric <= entries.length) {
1078
- const picked = entries[numeric - 1];
1079
- if (picked) {
1080
- const runtime = registry.get(picked.runtimeId);
1081
- if (runtime) return runtime;
1082
- }
1083
- }
1084
- if (allowedIds.has(answer)) {
1085
- const match = registry.get(answer);
1086
- if (match) return match;
1087
- }
1088
- process.stderr.write(`unknown runtime id for this category: ${answer}
1089
- `);
1090
- }
1091
- }
1092
- var LOCAL_APP_RUNTIME_IDS = /* @__PURE__ */ new Set(["ollama-native", "lmstudio"]);
1093
- var PROTOCOL_COMPAT_RUNTIME_IDS = /* @__PURE__ */ new Set(["openai-compat", "anthropic-compat"]);
1094
- function runtimesForCategory(entries, category) {
1095
- switch (category) {
1096
- case "local-app":
1097
- return entries.filter((entry) => LOCAL_APP_RUNTIME_IDS.has(entry.runtimeId));
1098
- case "local-http":
1099
- return entries.filter((entry) => entry.group === "local-http" && !LOCAL_APP_RUNTIME_IDS.has(entry.runtimeId));
1100
- case "chatgpt":
1101
- return entries.filter((entry) => entry.runtimeId === "openai-codex");
1102
- case "cloud-api": {
1103
- const byLabel = (a, b) => a.label.localeCompare(b.label) || a.runtimeId.localeCompare(b.runtimeId);
1104
- const named = entries.filter((entry) => entry.group === "cloud-api").slice().sort(byLabel);
1105
- const compat = entries.filter((entry) => PROTOCOL_COMPAT_RUNTIME_IDS.has(entry.runtimeId)).map((entry) => ({ ...entry, group: "cloud-api" })).sort(byLabel);
1106
- return [...named, ...compat];
1107
- }
1108
- case "all":
1109
- return entries.slice();
1110
- }
1111
- }
1112
- async function pickCategory(rl) {
1113
- process.stdout.write("\nHow will you connect Clio to a model?\n\n");
1114
- for (const line of formatCategoryMenu(terminalColumns())) process.stdout.write(`${line}
1115
- `);
1116
- for (; ; ) {
1117
- const answer = await ask(rl, "\nSelection", "1");
1118
- if (answer === null) return null;
1119
- if (answer.length === 0) continue;
1120
- const category = matchCategoryChoice(answer);
1121
- if (category) return category;
1122
- process.stderr.write(`invalid choice: ${answer}
1123
- `);
1124
- }
1125
- }
1126
- async function pickRuntimeViaCategory(rl) {
1127
- const registry = getRuntimeRegistry();
1128
- const allEntries = listProviderSupportEntries(registry.list());
1129
- const category = await pickCategory(rl);
1130
- if (category === null) return null;
1131
- if (category === "all") return pickRuntime(rl);
1132
- const filtered = runtimesForCategory(allEntries, category);
1133
- if (filtered.length === 0) {
1134
- process.stderr.write("no runtimes available for that category; falling back to full list\n");
1135
- return pickRuntime(rl);
1136
- }
1137
- if (category === "chatgpt") {
1138
- const only = filtered[0];
1139
- if (only) {
1140
- const runtime = registry.get(only.runtimeId);
1141
- if (runtime) {
1142
- process.stdout.write(`
1143
- Using ${runtime.id} (${only.summary}).
1144
- `);
1145
- return runtime;
1146
- }
1147
- }
1148
- return pickRuntime(rl);
1149
- }
1150
- if (filtered.length === 1) {
1151
- const only = filtered[0];
1152
- if (only) {
1153
- const runtime = registry.get(only.runtimeId);
1154
- if (runtime) {
1155
- process.stdout.write(`
1156
- Using ${runtime.id} (${only.summary}).
1157
- `);
1158
- return runtime;
1159
- }
1160
- }
1161
- }
1162
- const heading = category === "local-app" ? "\nLocal apps:" : category === "local-http" ? "\nLocal HTTP servers:" : "\nCloud APIs:";
1163
- return pickRuntimeFromEntries(rl, filtered, heading);
1164
- }
1165
- async function maybeSteerToNativeRuntime(rl, currentRuntime, url) {
1166
- if (currentRuntime.id !== "openai-compat" && currentRuntime.id !== "anthropic-compat") return currentRuntime;
1167
- const fingerprint = await fingerprintNativeRuntime(url);
1168
- if (!fingerprint) return currentRuntime;
1169
- const native = getRuntimeRegistry().get(fingerprint.runtimeId);
1170
- if (!native) return currentRuntime;
1171
- process.stdout.write(`
1172
- Detected ${fingerprint.displayName} at ${url}.
1173
- `);
1174
- const switchIt = await askYesNo(rl, `Use ${fingerprint.runtimeId} runtime instead of ${currentRuntime.id}?`, true);
1175
- if (!switchIt) return currentRuntime;
1176
- process.stdout.write(`Using ${fingerprint.runtimeId} runtime.
1177
- `);
1178
- return native;
1179
- }
1180
- async function runInteractive(rl, preselectedRuntime, defaults) {
1181
- let runtime = preselectedRuntime ?? await pickRuntimeViaCategory(rl);
1182
- if (!runtime) {
1183
- printError("configuration cancelled");
1184
- return 130;
1185
- }
1186
- const auth = openAuthStorage();
1187
- const settings = readSettings();
1188
- let support = buildProviderSupportEntry(runtime);
1189
- const initialRuntimeId = runtime.id;
1190
- const existingForRuntime = configuredTargetsForRuntime(settings, initialRuntimeId);
1191
- const existing = (defaults.id ? settings.targets.find((entry) => entry.id === defaults.id && entry.runtime === initialRuntimeId) : null) ?? existingForRuntime[0] ?? null;
1192
- if (existingForRuntime.length > 0) {
1193
- process.stdout.write(`
1194
- Existing targets for ${runtime.id}:
1195
- `);
1196
- for (const target of existingForRuntime) {
1197
- process.stdout.write(` - ${target.id}${target.defaultModel ? ` (${target.defaultModel})` : ""}
1198
- `);
1199
- }
1200
- }
1201
- process.stdout.write(`
1202
- Selected runtime: ${runtime.id} (${support.summary})
1203
- `);
1204
- process.stdout.write(`Credentials: ${describeAuthStatus(runtime)}
1205
- `);
1206
- if (support.modelHints.length > 0) {
1207
- process.stdout.write(`Known models: ${describeRuntimeModels(support, 4)}
1208
- `);
1209
- }
1210
- const suggestedId = defaults.id ?? existing?.id ?? deriveTargetId(runtime.id, settings.targets);
1211
- const idInput = await ask(rl, "Target id", suggestedId);
1212
- if (idInput === null || idInput.length === 0) {
1213
- printError("target id is required");
1214
- return 2;
1215
- }
1216
- const targetId = idInput;
1217
- let url = existing?.url;
1218
- if (support.supportsCustomUrl) {
1219
- const urlDefault = defaults.url ?? existing?.url ?? defaultUrlFor(runtime.id);
1220
- const urlInput = await ask(
1221
- rl,
1222
- support.group === "local-http" ? "Target URL" : "Base URL override (blank for runtime default)",
1223
- urlDefault
1224
- );
1225
- if (urlInput === null) return 0;
1226
- if (urlInput.length > 0) url = normalizeUrl(urlInput, runtime.id);
1227
- } else if (defaults.url) {
1228
- url = normalizeUrl(defaults.url, runtime.id);
1229
- }
1230
- if (url) {
1231
- const steered = await maybeSteerToNativeRuntime(rl, runtime, url);
1232
- if (steered.id !== runtime.id) {
1233
- runtime = steered;
1234
- support = buildProviderSupportEntry(runtime);
1235
- }
1236
- if (runtime.id === "lmstudio") {
1237
- const greeting = await greetLmStudio(
1238
- { id: targetId, runtime: runtime.id, url },
1239
- { credentialsPresent: /* @__PURE__ */ new Set(), httpTimeoutMs: 750 }
1240
- );
1241
- if (!greeting.ok) {
1242
- printError(`refusing to save LM Studio target '${targetId}': ${url} did not return the LM Studio greeting`);
1243
- return 2;
1244
- }
1245
- }
1246
- }
1247
- let apiKeyEnv;
1248
- let apiKeyLiteral;
1249
- let apiKeyRef = existing?.auth?.apiKeyRef;
1250
- let oauthProfile = runtime.auth === "oauth" ? existing?.auth?.oauthProfile ?? runtime.oauthProviderId ?? runtime.id : void 0;
1251
- const authStatus = auth.statusForTarget(resolveRuntimeAuthTarget(runtime), { includeFallback: false });
1252
- if (runtime.auth === "api-key") {
1253
- const needsCredential = targetRequiresAuth({ id: targetId, runtime: runtime.id }, runtime);
1254
- const defaultSource = authStatus.source === "stored-api-key" ? "keep" : authStatus.source === "environment" || existing?.auth?.apiKeyEnvVar || needsCredential ? "env" : "skip";
1255
- process.stdout.write(
1256
- "\nCredential source: env reads a key from an environment variable, stored writes one to\ncredentials.yaml, keep leaves the current one alone, skip uses no key at all.\n"
1257
- );
1258
- const choice = await ask(rl, "Credential source [env|stored|keep|skip]", defaultSource);
1259
- if (choice === null) return 0;
1260
- const normalized = choice.trim().toLowerCase();
1261
- if (normalized === "stored") {
1262
- const literal = await ask(rl, "API key literal (stored in credentials.yaml, mode 0600)");
1263
- if (literal !== null && literal.length > 0) {
1264
- apiKeyLiteral = literal;
1265
- apiKeyRef = runtime.id;
1266
- }
1267
- } else if (normalized === "env") {
1268
- const envDefault = defaults.apiKeyEnv ?? existing?.auth?.apiKeyEnvVar ?? runtime.credentialsEnvVar ?? "";
1269
- const envAnswer = await ask(rl, "Env var name (blank for no key)", envDefault);
1270
- if (envAnswer === null) return 0;
1271
- if (envAnswer.length > 0) apiKeyEnv = envAnswer;
1272
- apiKeyRef = void 0;
1273
- } else if (normalized === "keep") {
1274
- apiKeyEnv = existing?.auth?.apiKeyEnvVar ?? (authStatus.source === "environment" ? runtime.credentialsEnvVar : void 0);
1275
- apiKeyRef = existing?.auth?.apiKeyRef ?? (authStatus.source === "stored-api-key" ? runtime.id : void 0);
1276
- } else {
1277
- apiKeyEnv = void 0;
1278
- apiKeyRef = void 0;
1279
- }
1280
- }
1281
- if (runtime.auth === "oauth") {
1282
- const connectNow = authStatus.available ? await askYesNo(rl, `Reconnect ${runtime.displayName}?`, false) : await askYesNo(rl, `Connect ${runtime.displayName} now?`, true);
1283
- if (connectNow) {
1284
- const connected = await loginOAuthRuntime(rl, runtime);
1285
- if (!connected) return 1;
1286
- }
1287
- oauthProfile = runtime.oauthProviderId ?? runtime.id;
1288
- }
1289
- let model = defaults.model;
1290
- let inventory = { models: [], source: "none" };
1291
- const tentative = buildDescriptor(runtime, targetId, {
1292
- ...url !== void 0 ? { url } : {},
1293
- ...apiKeyEnv !== void 0 ? { apiKeyEnv } : {},
1294
- ...apiKeyRef !== void 0 ? { apiKeyRef } : {},
1295
- ...oauthProfile !== void 0 ? { oauthProfile } : {},
1296
- gateway: defaults.gateway,
1297
- ...defaults.lifecycle !== void 0 ? { lifecycle: defaults.lifecycle } : existing?.lifecycle !== void 0 ? { lifecycle: existing.lifecycle } : {},
1298
- ...defaults.contextWindow !== void 0 ? { contextWindow: defaults.contextWindow } : {},
1299
- ...defaults.maxTokens !== void 0 ? { maxTokens: defaults.maxTokens } : {},
1300
- ...defaults.reasoning !== void 0 ? { reasoning: defaults.reasoning } : {},
1301
- ...existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}
1302
- });
1303
- if (runtime.kind === "http") {
1304
- inventory = await resolveSupportedWireModels(runtime, tentative, existing ?? void 0);
1305
- }
1306
- const wireModels = inventory.models;
1307
- const catalogOrdered = support.modelSource === "catalog";
1308
- model = model ?? existing?.defaultModel ?? support.defaultModel ?? (catalogOrdered ? void 0 : wireModels[0]);
1309
- if (wireModels.length > 0) {
1310
- process.stdout.write("\nSelectable models:\n");
1311
- for (const [index, wireModel] of wireModels.entries()) {
1312
- process.stdout.write(` ${index + 1}. ${wireModel}${wireModel === model ? " [default]" : ""}
1313
- `);
1314
- }
1315
- if (!model && catalogOrdered) {
1316
- process.stdout.write(` listed in provider catalog order, which recommends none of them; pick one.
1317
- `);
1318
- }
1319
- for (; ; ) {
1320
- const pickedModel = await askModelChoice(rl, "Default target model", wireModels, model);
1321
- if (pickedModel === null) return 0;
1322
- if (pickedModel.length > 0) model = pickedModel;
1323
- if (!model) {
1324
- process.stdout.write(" a model is required: enter a number from the list or a model id.\n");
1325
- continue;
1326
- }
1327
- if (validateResolvedModel(runtime, tentative, model, defaults.force, inventory)) break;
1328
- }
1329
- } else {
1330
- for (; ; ) {
1331
- if (model && validateResolvedModel(runtime, tentative, model, defaults.force, inventory)) break;
1332
- const manual = await ask(rl, "Default model id (blank to leave empty)", model ?? "");
1333
- if (manual === null) return 0;
1334
- model = manual.length > 0 ? manual : void 0;
1335
- if (!model) break;
1336
- }
1337
- }
1338
- let contextWindowChoice = defaults.contextWindow;
1339
- let reasoningChoice = defaults.reasoning;
1340
- if (PROTOCOL_COMPAT_RUNTIME_IDS.has(runtime.id)) {
1341
- if (contextWindowChoice === void 0) {
1342
- const cwDefault = existing?.capabilities?.contextWindow ?? runtime.defaultCapabilities.contextWindow;
1343
- const cwAnswer = await ask(
1344
- rl,
1345
- "Context window in tokens (blank for runtime default)",
1346
- cwDefault > 0 ? String(cwDefault) : ""
1347
- );
1348
- if (cwAnswer === null) return 0;
1349
- if (cwAnswer.length > 0) {
1350
- const parsed = Number(cwAnswer);
1351
- if (Number.isInteger(parsed) && parsed > 0) contextWindowChoice = parsed;
1352
- else process.stderr.write(`ignoring invalid context window: ${cwAnswer}
1353
- `);
1354
- }
1355
- }
1356
- if (reasoningChoice === void 0) {
1357
- const reasoningDefault = existing?.capabilities?.reasoning ?? runtime.defaultCapabilities.reasoning === true;
1358
- reasoningChoice = await askYesNo(rl, "Does this model support reasoning / thinking?", reasoningDefault);
1359
- }
1360
- }
1361
- if (!validateContextWindowOverride(runtime, model, contextWindowChoice, defaults.force)) return 2;
1362
- const gatewayDefault = defaults.gateway || existing?.gateway === true;
1363
- const gatewayAnswer = gatewayDefault ? true : await askYesNo(rl, "Mark as gateway?", false);
1364
- const descriptor = buildDescriptor(runtime, targetId, {
1365
- ...url !== void 0 ? { url } : {},
1366
- ...model !== void 0 ? { model } : {},
1367
- ...apiKeyEnv !== void 0 ? { apiKeyEnv } : {},
1368
- ...apiKeyRef !== void 0 ? { apiKeyRef } : {},
1369
- ...oauthProfile !== void 0 ? { oauthProfile } : {},
1370
- gateway: gatewayAnswer,
1371
- ...defaults.lifecycle !== void 0 ? { lifecycle: defaults.lifecycle } : existing?.lifecycle !== void 0 ? { lifecycle: existing.lifecycle } : {},
1372
- ...contextWindowChoice !== void 0 ? { contextWindow: contextWindowChoice } : {},
1373
- ...defaults.maxTokens !== void 0 ? { maxTokens: defaults.maxTokens } : {},
1374
- ...reasoningChoice !== void 0 ? { reasoning: reasoningChoice } : {},
1375
- ...existing?.lmstudio ? { lmstudio: existing.lmstudio } : {}
1376
- });
1377
- try {
1378
- assertOrchestratorReplacementEligible(settings, descriptor);
1379
- } catch (error) {
1380
- printError(error instanceof Error ? error.message : String(error));
1381
- return 1;
1382
- }
1383
- if (apiKeyLiteral) {
1384
- auth.setApiKey(runtime.id, apiKeyLiteral);
1385
- if (credentialWriteFailed(auth, `credential for ${runtime.id} was not stored; target '${descriptor.id}' not saved`))
1386
- return 1;
1387
- printPlaintextCredentialWarning();
1388
- }
1389
- const probe = await runtimeProbe(runtime, descriptor);
1390
- if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
1391
- if (probe) {
1392
- process.stdout.write("\n");
1393
- for (const line of probeLines(descriptor, probe)) process.stdout.write(`${line}
1394
- `);
1395
- if (!probe.ok) {
1396
- const keepAnyway = await askYesNo(rl, "save this target anyway, without a reply from it?", true);
1397
- if (!keepAnyway) {
1398
- printError("aborted; settings not changed");
1399
- return 0;
1400
- }
1401
- }
1402
- }
1403
- const setOrchestrator = !isOrchestratorEligibleRuntime(runtime) ? false : defaults.setOrchestrator ? true : await askYesNo(rl, "use as orchestrator (chat) target?", !settings.chat.target);
1404
- const setWorkerDefault = defaults.setWorkerDefault ? true : await askYesNo(rl, "use as fleet default?", !settings.fleet.default.target);
1405
- const setBackground = !isOrchestratorEligibleRuntime(runtime) ? false : defaults.setBackground ? true : await askYesNo(rl, "use as background memory target?", false);
1406
- const orchestratorModel = setOrchestrator ? defaults.orchestratorModel ?? await askModelChoice(
1407
- rl,
1408
- "Orchestrator model",
1409
- wireModels,
1410
- settings.chat.target === targetId ? settings.chat.model ?? model : model
1411
- ) : void 0;
1412
- if (orchestratorModel === null) return 0;
1413
- const workerModel = setWorkerDefault ? defaults.workerModel ?? await askModelChoice(
1414
- rl,
1415
- "Fleet model",
1416
- wireModels,
1417
- settings.fleet.default.target === targetId ? settings.fleet.default.model ?? model : model
1418
- ) : void 0;
1419
- if (workerModel === null) return 0;
1420
- const backgroundModel = setBackground ? defaults.backgroundModel ?? await askModelChoice(
1421
- rl,
1422
- "Background memory model",
1423
- wireModels,
1424
- settings.context.memory.target === targetId ? settings.context.memory.model ?? model : model
1425
- ) : void 0;
1426
- if (backgroundModel === null) return 0;
1427
- const applyWizardChoice = (target) => {
1428
- applyTarget(target, descriptor);
1429
- if (setOrchestrator) setOrchestratorPointer(target, descriptor, orchestratorModel);
1430
- if (setBackground) setBackgroundPointer(target, descriptor, backgroundModel);
1431
- if (setWorkerDefault) setWorkerDefaultPointer(target, descriptor, workerModel);
1432
- };
1433
- applyWizardChoice(settings);
1434
- updateSettings(applyWizardChoice);
1435
- printSummary(settings, descriptor, probe);
1436
- printOk(`target ${targetId} saved`);
1437
- await runInteropReview(rl);
1438
- return 0;
1439
- }
1440
- function runTargetRemove(id) {
1441
- if (!readSettings().targets.some((e) => e.id === id)) {
1442
- printError(`no target with id ${id}`);
1443
- return 1;
1444
- }
1445
- updateSettings((settings) => {
1446
- removeTargetFromSettings(settings, id);
1447
- });
1448
- printOk(`removed target ${id}`);
1449
- return 0;
1450
- }
1451
- function runTargetRename(oldId, newId) {
1452
- if (oldId === newId) {
1453
- printError("old and new id are identical");
1454
- return 2;
1455
- }
1456
- const current = readSettings();
1457
- if (current.targets.some((e) => e.id === newId)) {
1458
- printError(`target id already exists: ${newId}`);
1459
- return 2;
1460
- }
1461
- if (!current.targets.some((e) => e.id === oldId)) {
1462
- printError(`no target with id ${oldId}`);
1463
- return 1;
1464
- }
1465
- updateSettings((settings) => {
1466
- const target = settings.targets.find((e) => e.id === oldId);
1467
- if (!target) return;
1468
- target.id = newId;
1469
- if (settings.chat.target === oldId) settings.chat.target = newId;
1470
- if (settings.context.memory.target === oldId) settings.context.memory.target = newId;
1471
- if (settings.fleet.default.target === oldId) settings.fleet.default.target = newId;
1472
- for (const profile of Object.values(settings.fleet.profiles)) {
1473
- if (profile.target === oldId) profile.target = newId;
1474
- }
1475
- settings.chat.modelPicker.cycleSet = settings.chat.modelPicker.cycleSet.map((entry) => {
1476
- const [head, ...rest] = entry.split("/");
1477
- if (head !== oldId) return entry;
1478
- return rest.length === 0 ? newId : `${newId}/${rest.join("/")}`;
1479
- });
1480
- });
1481
- printOk(`renamed ${oldId} to ${newId}`);
1482
- return 0;
1483
- }
1484
- async function runConfigureCommand(argv) {
1485
- let args;
1486
- try {
1487
- args = parseSetupArgs(argv);
1488
- } catch (err) {
1489
- printError(err instanceof Error ? err.message : String(err));
1490
- process.stdout.write(HELP);
1491
- return 2;
1492
- }
1493
- if (args.help) {
1494
- process.stdout.write(HELP);
1495
- return 0;
1496
- }
1497
- initializeClioHome();
1498
- ensureRegistryPopulated();
1499
- if (args.list) {
1500
- printRuntimeList(args.all);
1501
- return 0;
1502
- }
1503
- if (args.interop) {
1504
- if (!input.isTTY) return runInteropReview(null);
1505
- const rl2 = createInterface({ input, output: output2 });
1506
- try {
1507
- return await runInteropReview(rl2);
1508
- } finally {
1509
- rl2.close();
1510
- }
1511
- }
1512
- if (args.remove) return runTargetRemove(args.remove);
1513
- if (args.renameOld && args.renameNew) return runTargetRename(args.renameOld, args.renameNew);
1514
- if (args.positional.length > 0) {
1515
- printError(
1516
- "`clio-coder configure` accepts flags, not positional runtimes. Use `clio-coder auth login <runtime>` first when authentication is needed, then `clio-coder configure --runtime <runtimeId> ...`."
1517
- );
1518
- return 2;
1519
- }
1520
- const runtimeId = args.runtime;
1521
- let runtime = null;
1522
- if (runtimeId) {
1523
- runtime = getRuntimeRegistry().get(runtimeId);
1524
- if (!runtime) {
1525
- printError(`unknown runtime id: ${runtimeId}`);
1526
- process.stdout.write("run `clio-coder configure --list` to see registered runtimes\n");
1527
- return 2;
1528
- }
1529
- if (runtimeId === "lmstudio-native" && runtime.id === "lmstudio") {
1530
- process.stderr.write("warning: runtime 'lmstudio-native' is deprecated; using 'lmstudio'\n");
1531
- }
1532
- }
1533
- const hasTargetSetupFlag = args.id !== void 0 || args.url !== void 0 || args.model !== void 0 || args.workerProfile !== void 0 || args.workerProfileModel !== void 0 || args.apiKey !== void 0 || args.apiKeyEnv !== void 0 || args.gateway || args.lifecycle !== void 0 || args.setOrchestrator || args.setWorkerDefault || args.contextWindow !== void 0 || args.maxTokens !== void 0 || args.reasoning !== void 0;
1534
- const nonInteractive = runtime !== null && hasTargetSetupFlag;
1535
- if (nonInteractive && runtime) return runNonInteractive(runtime, args);
1536
- if ((runtimeId !== void 0 || hasTargetSetupFlag) && !input.isTTY) {
1537
- printError(
1538
- runtime === null ? "--runtime is required when configuring a target non-interactively" : "--id is required when passing flags non-interactively"
1539
- );
1540
- return 2;
1541
- }
1542
- const rl = createInterface({ input, output: output2 });
1543
- try {
1544
- return await runInteractive(rl, runtime, args);
1545
- } catch (err) {
1546
- printError(err instanceof Error ? err.message : String(err));
1547
- return 1;
1548
- } finally {
1549
- rl.close();
1550
- }
1551
- }
1552
-
1553
- export {
1554
- runTargetRemove,
1555
- runTargetRename,
1556
- runConfigureCommand
1557
- };
1558
- //# sourceMappingURL=chunk-Y45G3AXC.js.map