@iowarp/clio-coder 0.4.2 → 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 (369) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-H2NGRPWO.js} +11 -11
  5. package/dist/{agents-5N5NG3XG.js → agents-TL5LLUQP.js} +54 -53
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-E5SW4HMS.js} +19 -16
  8. package/dist/{builtins-K6TNDT24.js → builtins-IA7V7FUC.js} +9 -4
  9. package/dist/{chunk-ZW4HH5JJ.js → chunk-2APPQIER.js} +6 -6
  10. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  11. package/dist/{chunk-UBRFI4HS.js → chunk-2UG5F4C5.js} +127 -47
  12. package/dist/{chunk-UH632ZYL.js → chunk-2UH2KFUP.js} +2 -2
  13. package/dist/{chunk-3F7VUY77.js → chunk-2VIKGWFZ.js} +2 -2
  14. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  15. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  16. package/dist/{chunk-2X4RYJTJ.js → chunk-4UVU7BJ5.js} +2 -2
  17. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  18. package/dist/{chunk-5KW52TEP.js → chunk-54CBCGIR.js} +5 -5
  19. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  20. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  21. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  22. package/dist/{chunk-LJID3DYZ.js → chunk-64I3JVYM.js} +2 -2
  23. package/dist/{chunk-4JDLP6ZS.js → chunk-6PTFB5VS.js} +7 -7
  24. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  25. package/dist/{chunk-HLAFFSEK.js → chunk-7DRAWPTZ.js} +2 -2
  26. package/dist/chunk-7E7I3WLS.js +3762 -0
  27. package/dist/{chunk-YJISEZKC.js → chunk-7ZYNNDKC.js} +6 -6
  28. package/dist/{chunk-I66ZTYNP.js → chunk-AF4YM7Z4.js} +236 -101
  29. package/dist/{chunk-2HFQNRV3.js → chunk-AX2THNSA.js} +12 -12
  30. package/dist/{chunk-PGF63K6I.js → chunk-B4OAX3SI.js} +65 -3
  31. package/dist/{chunk-W6NIE6OW.js → chunk-B4VEBZKF.js} +3 -3
  32. package/dist/{chunk-JBCS7CRR.js → chunk-BEPZRGGU.js} +10 -10
  33. package/dist/{chunk-XGDPUNND.js → chunk-CE5AX47J.js} +2 -2
  34. package/dist/{chunk-I64IFBLB.js → chunk-DWUOQKRU.js} +17 -10
  35. package/dist/{chunk-DZAW46HP.js → chunk-E3TPLWFX.js} +3 -3
  36. package/dist/{chunk-HIICAHCJ.js → chunk-EKCHAPYA.js} +2 -2
  37. package/dist/{chunk-XE3PCIXH.js → chunk-F5JHEYZM.js} +7 -7
  38. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  39. package/dist/{chunk-ZNT2M6TG.js → chunk-G76U63X4.js} +17 -17
  40. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  41. package/dist/{chunk-2NHR3NAY.js → chunk-GI7YYQ3F.js} +40 -34
  42. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  43. package/dist/chunk-GYV6VZOC.js +26 -0
  44. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  45. package/dist/{chunk-W4YEMFBX.js → chunk-HEQY7ZFI.js} +2 -2
  46. package/dist/{chunk-IKOZFYBN.js → chunk-I7ZPNEJM.js} +145 -102
  47. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  48. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  49. package/dist/chunk-IJNZMHLA.js +101 -0
  50. package/dist/{chunk-JWJGP5DQ.js → chunk-INY6HTFL.js} +7 -7
  51. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  52. package/dist/{chunk-B74PXLU7.js → chunk-IWT4SF4R.js} +3 -3
  53. package/dist/{chunk-B7HM5Z7T.js → chunk-JDAY6FIL.js} +5 -5
  54. package/dist/{chunk-PJX3WQUQ.js → chunk-JEQ3XTHC.js} +2 -2
  55. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  56. package/dist/{chunk-X7IARSHT.js → chunk-JKKCYP3C.js} +9 -9
  57. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  58. package/dist/{chunk-SSEYRH53.js → chunk-KK4JZPBQ.js} +19 -140
  59. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  60. package/dist/{chunk-Q4XWMHX6.js → chunk-L47TF46W.js} +2 -2
  61. package/dist/{chunk-O3YUNJZ2.js → chunk-LDJG7DW3.js} +81 -24
  62. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  63. package/dist/{chunk-F2I26BDK.js → chunk-MUW2BDDH.js} +4 -4
  64. package/dist/{chunk-HKMD33FO.js → chunk-MWUZBSAQ.js} +79 -76
  65. package/dist/{chunk-QQLGQY2A.js → chunk-N2Z7HLVY.js} +20 -20
  66. package/dist/{chunk-DZEK6CJN.js → chunk-NIQJ66N4.js} +19 -19
  67. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  68. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  69. package/dist/{chunk-TPEQIQIE.js → chunk-OML5D5V5.js} +8 -8
  70. package/dist/{chunk-IKSLQ4XV.js → chunk-PAJQJ7BS.js} +558 -216
  71. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  72. package/dist/{chunk-UH347SHR.js → chunk-QWGDJJYJ.js} +11 -11
  73. package/dist/chunk-R6Q67RJH.js +134 -0
  74. package/dist/{chunk-CRFOIAX3.js → chunk-RRNP2ANY.js} +6 -6
  75. package/dist/{chunk-IDNA72AH.js → chunk-RSJ25QSL.js} +2 -2
  76. package/dist/chunk-SKHCAU7K.js +385 -0
  77. package/dist/{chunk-RLYRBIYQ.js → chunk-TM6LQDI3.js} +20 -12
  78. package/dist/chunk-UOIZ7DA4.js +41 -0
  79. package/dist/{chunk-P75RZCJW.js → chunk-UPZU6GE4.js} +3 -3
  80. package/dist/{chunk-MCMZMDAC.js → chunk-V2ANDPVT.js} +4 -4
  81. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  82. package/dist/{chunk-IMXMHHMQ.js → chunk-VW6DOEDG.js} +332 -57
  83. package/dist/{chunk-XOXV5GKE.js → chunk-W6RRQCPQ.js} +16 -7
  84. package/dist/{chunk-CYZW7JHJ.js → chunk-WBKFA554.js} +8 -8
  85. package/dist/{chunk-BO7Y52RY.js → chunk-WCXUNS7U.js} +7 -7
  86. package/dist/{chunk-ZGNYYXQ6.js → chunk-WRBAGUNF.js} +3 -3
  87. package/dist/{chunk-FVDGR2ZL.js → chunk-XIVNBFZS.js} +85 -30
  88. package/dist/{chunk-BYMNWQ7O.js → chunk-XPWWI35G.js} +299 -58
  89. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  90. package/dist/{chunk-AZ4WMN4W.js → chunk-Y3CBHOR6.js} +2 -2
  91. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  92. package/dist/{chunk-54ODD65L.js → chunk-YQWYVTMC.js} +4 -4
  93. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  94. package/dist/{chunk-7BHIY2MW.js → chunk-ZDN3Y73Y.js} +6 -6
  95. package/dist/{chunk-E7GT7O5N.js → chunk-ZWPRK62N.js} +7 -4
  96. package/dist/cli/index.js +38 -37
  97. package/dist/{clio-7VB377CC.js → clio-CMMK4KRR.js} +7 -7
  98. package/dist/{code-nav-YVLCYA7V.js → code-nav-MDZNQS33.js} +7 -7
  99. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  100. package/dist/{config-4HVOS65E.js → config-SVM5P5YI.js} +76 -74
  101. package/dist/{configure-PIWO7B24.js → configure-LE3IK2TJ.js} +26 -24
  102. package/dist/{context-IYEHL3WQ.js → context-2OHRKS42.js} +66 -63
  103. package/dist/{context-N6ZE3LGJ.js → context-E3VC7RX5.js} +15 -11
  104. package/dist/{context-KQYIWPWT.js → context-VNCR7KAG.js} +60 -45
  105. package/dist/{context-clear-G4OGZJDS.js → context-clear-BW4O37TG.js} +61 -59
  106. package/dist/context-map-COB37XXN.js +505 -0
  107. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-VDS25HXZ.js} +17 -16
  108. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-5AHT53RF.js} +85 -74
  109. package/dist/{doctor-LHBD36VU.js → doctor-WNNVO6FY.js} +37 -37
  110. package/dist/{eval-C45FYRJ6.js → eval-7G7SGAYO.js} +285 -114
  111. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  112. package/dist/{evidence-6SHONYAF.js → evidence-VD6736FQ.js} +63 -62
  113. package/dist/{evolve-KRKMV72X.js → evolve-AL3NGVRL.js} +62 -61
  114. package/dist/{extensions-KPZ2UHBB.js → extensions-MOVJ32NM.js} +7 -7
  115. package/dist/{fleet-IVTCKDHT.js → fleet-QZHUMAGI.js} +110 -108
  116. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-BAYT5FJZ.js} +10 -10
  117. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-IREVMRU4.js} +7 -6
  118. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-YCTT3HTI.js} +19 -18
  119. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-QVJTDAVB.js} +55 -54
  120. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-25QAFPK4.js} +4 -4
  121. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-5O57AAJ7.js} +23 -22
  122. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-CPH2W2T6.js} +56 -55
  123. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-SWBR3VGQ.js} +55 -54
  124. package/dist/{init-T2QORQ3Y.js → init-J477LKZH.js} +78 -76
  125. package/dist/{interop-IN5I2A66.js → interop-3FCM6XLG.js} +11 -11
  126. package/dist/{library-LSCATDLZ.js → library-QUQEIUG6.js} +28 -27
  127. package/dist/{memory-HYOKAGGJ.js → memory-SGGSEP65.js} +64 -63
  128. package/dist/{models-2GPMFYCM.js → models-HEKUAXXK.js} +49 -43
  129. package/dist/{monitor-E4ASVUJH.js → monitor-HKU57TYQ.js} +61 -60
  130. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-VDFAEFAI.js} +919 -546
  131. package/dist/{panes-E3RUXOW5.js → panes-DN2SSFOH.js} +3 -3
  132. package/dist/{panes-IXKLOKA2.js → panes-TALGNPZT.js} +8 -8
  133. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  134. package/dist/reset-EAJFFJVB.js +344 -0
  135. package/dist/{resources-OTRSN34L.js → resources-OVKSEFVE.js} +27 -20
  136. package/dist/{run-5DEYH5QK.js → run-7DP7ZF2J.js} +113 -109
  137. package/dist/{share-IHWTLO3M.js → share-WML67FT3.js} +26 -25
  138. package/dist/{skills-IYMXMKW4.js → skills-SG662R2K.js} +39 -31
  139. package/dist/{skills-eval-DROHSJAR.js → skills-eval-VVZEUU46.js} +74 -73
  140. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-I2E23GET.js} +21 -20
  141. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-S7MBJDQK.js} +35 -34
  142. package/dist/{steer-Z5DO23FJ.js → steer-2LQOMCPB.js} +3 -3
  143. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  144. package/dist/{targets-P2FUC4IL.js → targets-4QC3HIEW.js} +48 -45
  145. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-TUHIJ6Y2.js} +2 -2
  146. package/dist/{tools-5B7RO6MV.js → tools-TFGJICCU.js} +8 -8
  147. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  148. package/dist/uninstall-5PEVOE5B.js +408 -0
  149. package/dist/upgrade-M4WXY6KN.js +303 -0
  150. package/dist/{usage-ME5MPXGX.js → usage-N7ZNVLEM.js} +147 -102
  151. package/dist/{verifiers-BVZ7IWOO.js → verifiers-DJTP4XX6.js} +15 -15
  152. package/dist/{verify-5K7ZKQFC.js → verify-RWE4PPEK.js} +9 -9
  153. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-C7IQOXSP.js} +84 -82
  154. package/dist/{with-panes-BYOJCLAM.js → with-panes-4GCGSL7J.js} +9 -9
  155. package/dist/worker/entry.js +61 -60
  156. package/docs/architecture/artifact-placement.md +1 -0
  157. package/docs/architecture/artifact-versions.md +1 -1
  158. package/docs/architecture/context-engine.md +4 -0
  159. package/docs/architecture/middleware-and-components.md +1 -1
  160. package/docs/architecture/model-catalog.md +21 -10
  161. package/docs/architecture/observability.md +12 -1
  162. package/docs/architecture/prompt-envelope-and-tools.md +2 -0
  163. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  164. package/docs/architecture/safety-model.md +15 -5
  165. package/docs/guide/built-in-agents.md +17 -3
  166. package/docs/guide/commands-and-modes.md +1 -1
  167. package/docs/guide/configuration-and-targets.md +97 -9
  168. package/docs/guide/configuration-reference.md +7 -2
  169. package/docs/guide/environment-variables.md +2 -0
  170. package/docs/guide/installation-and-lifecycle.md +37 -4
  171. package/docs/guide/proactive-memory.md +66 -55
  172. package/docs/guide/skills-marketplace.md +18 -0
  173. package/docs/process/development-pipeline.md +34 -1
  174. package/docs/process/eval-runner.md +67 -3
  175. package/evals/behavioral-model.yaml +3 -2
  176. package/package.json +2 -2
  177. package/skills/README.md +7 -5
  178. package/skills/coding/ast-grep/SKILL.md +101 -30
  179. package/skills/coding/ast-grep/evals.md +26 -0
  180. package/skills/coding/coding-standards/SKILL.md +40 -5
  181. package/skills/coding/coding-standards/evals.md +23 -0
  182. package/skills/coding/prototype/SKILL.md +87 -28
  183. package/skills/coding/prototype/evals.md +19 -0
  184. package/skills/coding/tdd/SKILL.md +80 -53
  185. package/skills/coding/tdd/evals.md +20 -0
  186. package/skills/context/context-handoff/SKILL.md +43 -2
  187. package/skills/context/context-handoff/evals.md +44 -0
  188. package/skills/context/context-prime/SKILL.md +45 -15
  189. package/skills/context/context-prime/evals.md +45 -0
  190. package/skills/git/branch-closeout/SKILL.md +132 -0
  191. package/skills/git/branch-closeout/evals.md +133 -0
  192. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  193. package/skills/git/file-ticket/SKILL.md +77 -63
  194. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  195. package/skills/git/file-ticket/evals.md +31 -26
  196. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  197. package/skills/git/fix-issue/SKILL.md +87 -64
  198. package/skills/git/fix-issue/evals.md +35 -31
  199. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  200. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  201. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  202. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  203. package/skills/git/ship/SKILL.md +103 -67
  204. package/skills/git/ship/assets/pr-template.md +21 -0
  205. package/skills/git/ship/evals.md +44 -28
  206. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  207. package/skills/git/worktree-create/SKILL.md +80 -50
  208. package/skills/git/worktree-create/evals.md +40 -33
  209. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  210. package/skills/git/worktree-merge/SKILL.md +112 -65
  211. package/skills/git/worktree-merge/evals.md +42 -34
  212. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  213. package/skills/planning/archify/SKILL.md +196 -0
  214. package/skills/planning/archify/evals.md +65 -0
  215. package/skills/planning/architecture/SKILL.md +61 -12
  216. package/skills/planning/architecture/evals.md +65 -0
  217. package/skills/planning/backlog/SKILL.md +130 -14
  218. package/skills/planning/backlog/evals.md +142 -0
  219. package/skills/planning/prd/SKILL.md +46 -6
  220. package/skills/planning/prd/evals.md +54 -0
  221. package/skills/planning/product-intent/SKILL.md +57 -2
  222. package/skills/planning/product-intent/evals.md +70 -0
  223. package/skills/planning/tech-spec/SKILL.md +53 -2
  224. package/skills/planning/tech-spec/evals.md +73 -0
  225. package/skills/registry.yaml +58 -50
  226. package/skills/remote.yaml +13 -0
  227. package/skills/research/arxiv-literature/SKILL.md +76 -18
  228. package/skills/research/arxiv-literature/evals.md +50 -0
  229. package/skills/research/experiment-protocol/SKILL.md +20 -1
  230. package/skills/research/experiment-protocol/evals.md +23 -0
  231. package/skills/research/scientific-debugging/SKILL.md +23 -1
  232. package/skills/research/scientific-debugging/evals.md +18 -0
  233. package/skills/research/scientific-modernization/SKILL.md +26 -1
  234. package/skills/research/scientific-modernization/evals.md +27 -0
  235. package/skills/skill-marketplace.json +63 -28
  236. package/skills/workflow/cut-it/SKILL.md +65 -5
  237. package/skills/workflow/cut-it/evals.md +101 -0
  238. package/skills/workflow/design-council/SKILL.md +117 -27
  239. package/skills/workflow/design-council/evals.md +161 -0
  240. package/skills/workflow/grill-me/SKILL.md +86 -10
  241. package/skills/workflow/grill-me/evals.md +153 -0
  242. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  243. package/skills/workflow/workflow-distiller/evals.md +118 -0
  244. package/src/cli/configure-interop.ts +105 -13
  245. package/src/cli/configure-oauth.ts +57 -0
  246. package/src/cli/configure-onboarding.ts +980 -0
  247. package/src/cli/configure-target.ts +594 -0
  248. package/src/cli/configure.ts +1082 -528
  249. package/src/cli/context-map.ts +114 -0
  250. package/src/cli/context.ts +4 -0
  251. package/src/cli/index.ts +1 -0
  252. package/src/cli/lifecycle-presenter.ts +436 -0
  253. package/src/cli/models.ts +10 -2
  254. package/src/cli/modes/print.ts +5 -1
  255. package/src/cli/reset.ts +228 -106
  256. package/src/cli/run.ts +7 -2
  257. package/src/cli/select.ts +664 -0
  258. package/src/cli/skills.ts +9 -2
  259. package/src/cli/targets.ts +3 -0
  260. package/src/cli/uninstall.ts +233 -165
  261. package/src/cli/upgrade.ts +204 -149
  262. package/src/cli/usage.ts +86 -27
  263. package/src/cli/validate-model.ts +3 -3
  264. package/src/core/config.ts +56 -0
  265. package/src/core/external-diagnostic.ts +44 -0
  266. package/src/core/gateway-routing.ts +157 -0
  267. package/src/core/safe-exec.ts +17 -2
  268. package/src/core/skill-activation.ts +89 -2
  269. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  270. package/src/domains/agents/catalog.ts +1 -1
  271. package/src/domains/agents/result-contract.ts +70 -0
  272. package/src/domains/context/wiki/map-seed.ts +589 -0
  273. package/src/domains/context/wiki/plan.ts +2 -2
  274. package/src/domains/dispatch/admission.ts +29 -0
  275. package/src/domains/dispatch/agent-candidates.ts +10 -0
  276. package/src/domains/dispatch/budget-envelope.ts +86 -1
  277. package/src/domains/dispatch/capability-match.ts +1 -0
  278. package/src/domains/dispatch/capacity-lease.ts +17 -0
  279. package/src/domains/dispatch/contract.ts +11 -1
  280. package/src/domains/dispatch/extension.ts +134 -29
  281. package/src/domains/dispatch/types.ts +3 -0
  282. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  283. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  284. package/src/domains/eval/metrics/token-stream.ts +201 -31
  285. package/src/domains/eval/metrics/tracked.ts +40 -4
  286. package/src/domains/eval/runners/clio-run.ts +5 -2
  287. package/src/domains/eval/schema/suite.ts +28 -0
  288. package/src/domains/eval/schema/verdict.ts +2 -2
  289. package/src/domains/eval/suites/resolve.ts +13 -1
  290. package/src/domains/eval/suites/run.ts +24 -3
  291. package/src/domains/interop/registry.ts +6 -2
  292. package/src/domains/interop/types.ts +4 -0
  293. package/src/domains/lifecycle/migrations/index.ts +4 -0
  294. package/src/domains/memory/task-memory-policy.ts +70 -26
  295. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  296. package/src/domains/middleware/index.ts +0 -1
  297. package/src/domains/middleware/marketplace-offer.ts +3 -35
  298. package/src/domains/middleware/memory-intervention.ts +127 -32
  299. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  300. package/src/domains/middleware/skills-reminder.ts +31 -2
  301. package/src/domains/observability/compaction-usage.ts +118 -0
  302. package/src/domains/observability/cost.ts +1 -1
  303. package/src/domains/observability/extension.ts +6 -1
  304. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  305. package/src/domains/providers/contract.ts +4 -1
  306. package/src/domains/providers/extension.ts +40 -9
  307. package/src/domains/providers/model-capabilities.ts +9 -0
  308. package/src/domains/providers/model-discovery.ts +2 -0
  309. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  310. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +32 -12
  311. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  312. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  313. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  314. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  315. package/src/domains/providers/support.ts +11 -5
  316. package/src/domains/providers/target-model-cache.ts +25 -2
  317. package/src/domains/providers/types/capability-flags.ts +2 -0
  318. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  319. package/src/domains/providers/types/target-descriptor.ts +19 -0
  320. package/src/domains/resources/index.ts +3 -0
  321. package/src/domains/resources/skills/install.ts +72 -7
  322. package/src/domains/resources/skills/loader.ts +7 -0
  323. package/src/domains/resources/skills/marketplace.ts +63 -11
  324. package/src/domains/safety/autonomy.ts +15 -0
  325. package/src/domains/safety/index.ts +1 -0
  326. package/src/domains/safety/path-policy.ts +1 -1
  327. package/src/domains/safety/policy-engine.ts +34 -11
  328. package/src/domains/safety/protected-artifacts.ts +191 -88
  329. package/src/domains/safety/run-effects.ts +2 -22
  330. package/src/domains/safety/skill-authority.ts +55 -0
  331. package/src/domains/session/compaction/compact.ts +72 -22
  332. package/src/domains/session/entries.ts +6 -0
  333. package/src/domains/session/usage.ts +3 -3
  334. package/src/engine/agent.ts +13 -3
  335. package/src/engine/ai.ts +26 -8
  336. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  337. package/src/engine/api-registry.ts +3 -0
  338. package/src/engine/apis/openai-completions.ts +117 -14
  339. package/src/engine/external-subprocess.ts +114 -6
  340. package/src/entry/background-model-metadata.ts +18 -0
  341. package/src/entry/compaction-prompt.ts +57 -0
  342. package/src/entry/orchestrator.ts +405 -216
  343. package/src/entry/task-memory-lifecycle.ts +35 -0
  344. package/src/interactive/chat-loop-messages.ts +13 -4
  345. package/src/interactive/chat-loop.ts +65 -2
  346. package/src/interactive/chat-renderer.ts +1 -0
  347. package/src/interactive/cost-overlay.ts +26 -2
  348. package/src/interactive/interactive-slash-runtime.ts +2 -1
  349. package/src/interactive/renderers/worker-entry.ts +32 -0
  350. package/src/interactive/slash-commands.ts +24 -6
  351. package/src/interactive/theme/labels.ts +19 -13
  352. package/src/interactive/turn-context.ts +9 -5
  353. package/src/interactive/turn-recovery.ts +8 -0
  354. package/src/interactive/turn-runtime.ts +27 -11
  355. package/src/interactive/turn-state.ts +7 -0
  356. package/src/interactive/worker-receipts.ts +1 -0
  357. package/src/interactive/worker-stream.ts +6 -1
  358. package/src/tools/context/index.ts +30 -9
  359. package/src/tools/dispatch-arguments.ts +1 -0
  360. package/src/tools/dispatch-event-text.ts +10 -0
  361. package/src/tools/dispatch-plan.ts +1 -0
  362. package/src/tools/dispatch-runner.ts +12 -0
  363. package/src/tools/registry.ts +11 -5
  364. package/src/tools/worker-evidence.ts +3 -1
  365. package/src/worker/spec-contract.ts +4 -0
  366. package/dist/chunk-2Z2IKEXI.js +0 -1554
  367. package/dist/reset-OAQP3W4O.js +0 -230
  368. package/dist/uninstall-N34PCTGJ.js +0 -331
  369. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -3,29 +3,26 @@ import {
3
3
  createSentinelStripper,
4
4
  stripTokenizerSentinels
5
5
  } from "./chunk-CFGTUFWB.js";
6
- import {
7
- credentialsPresent
8
- } from "./chunk-72GZI5EV.js";
9
6
  import {
10
7
  ceilChars,
11
8
  estimateAgentMessageTokens,
12
9
  toolSchemaChars
13
- } from "./chunk-CWVRRIEI.js";
10
+ } from "./chunk-NZMNUPZZ.js";
14
11
  import {
15
- getSharedBus
16
- } from "./chunk-PMZVFWSR.js";
12
+ credentialsPresent
13
+ } from "./chunk-2JH2WHGE.js";
17
14
  import {
18
15
  readSettings
19
- } from "./chunk-34BHNEE3.js";
16
+ } from "./chunk-GHS5EBTQ.js";
20
17
  import {
21
18
  warnLegacyNaming
22
19
  } from "./chunk-D7E7WCDF.js";
20
+ import {
21
+ getSharedBus
22
+ } from "./chunk-PMZVFWSR.js";
23
23
  import {
24
24
  BusChannels
25
25
  } from "./chunk-F4EKGO4N.js";
26
- import {
27
- sleep
28
- } from "./chunk-EBY63B7G.js";
29
26
  import {
30
27
  CLIO_CONTEXT_WINDOW_WARN_BELOW,
31
28
  CLIO_MIN_CONTEXT_WINDOW,
@@ -42,31 +39,26 @@ import {
42
39
  registerBuiltinRuntimes,
43
40
  requestLmStudioJson,
44
41
  resolveLmStudioInstance
45
- } from "./chunk-IMXMHHMQ.js";
42
+ } from "./chunk-VW6DOEDG.js";
43
+ import {
44
+ sleep
45
+ } from "./chunk-EBY63B7G.js";
46
46
  import {
47
47
  listKnownModelsForRuntime
48
- } from "./chunk-CDNVLKUX.js";
48
+ } from "./chunk-LLDJM5XK.js";
49
49
  import {
50
50
  authNotRequiredStatus,
51
51
  openAuthStorage,
52
52
  registerClioOAuthProviders,
53
53
  resolveAuthTarget,
54
54
  targetRequiresAuth
55
- } from "./chunk-WNP7O5WZ.js";
55
+ } from "./chunk-ID64D7PE.js";
56
56
  import {
57
57
  withStateFileLock
58
58
  } from "./chunk-IKCO5N3L.js";
59
59
  import {
60
60
  require_dist
61
61
  } from "./chunk-APJ265NV.js";
62
- import {
63
- clioCacheDir,
64
- clioConfigDir,
65
- clioStateDir,
66
- clioStatePath,
67
- resolveClioDirs,
68
- stateRootRemoved
69
- } from "./chunk-BYP5D4HI.js";
70
62
  import {
71
63
  safeResourceWrite
72
64
  } from "./chunk-WEPFGWHJ.js";
@@ -78,13 +70,21 @@ import {
78
70
  getCatalogModelForRuntime,
79
71
  mergeCapabilities,
80
72
  resolveCostProvenance
81
- } from "./chunk-O42A54GG.js";
73
+ } from "./chunk-5OIVVPHF.js";
82
74
  import {
83
75
  activateExternalPluginApiBridge,
84
76
  calculateEngineCost,
85
77
  ensurePiAiRegistered,
86
78
  registerEngineApiProvider
87
- } from "./chunk-VXMFAE2W.js";
79
+ } from "./chunk-YPC6ZR5L.js";
80
+ import {
81
+ clioCacheDir,
82
+ clioConfigDir,
83
+ clioStateDir,
84
+ clioStatePath,
85
+ resolveClioDirs,
86
+ stateRootRemoved
87
+ } from "./chunk-BYP5D4HI.js";
88
88
  import {
89
89
  __toESM,
90
90
  init_esm_shims
@@ -797,6 +797,12 @@ function applyModelCapabilityPatch(model, caps) {
797
797
  if (typeof caps.contextWindow === "number") model.contextWindow = caps.contextWindow;
798
798
  if (typeof caps.maxTokens === "number") model.maxTokens = caps.maxTokens;
799
799
  if (typeof caps.reasoning === "boolean") model.reasoning = caps.reasoning;
800
+ if (model.clioCoder || caps.thinkingControlRuntime !== void 0) {
801
+ const metadata2 = { ...model.clioCoder };
802
+ delete metadata2.thinkingControlRuntime;
803
+ if (caps.thinkingControlRuntime !== void 0) metadata2.thinkingControlRuntime = caps.thinkingControlRuntime;
804
+ model.clioCoder = metadata2;
805
+ }
800
806
  return model;
801
807
  }
802
808
  function applyReasoningResolution(caps, kbHit, detectedReasoning) {
@@ -1068,7 +1074,8 @@ function effectiveThinkingLevel(configured, available) {
1068
1074
  const fallback = available[0] ?? "off";
1069
1075
  if (!configured) return fallback;
1070
1076
  if (available.includes(configured)) return configured;
1071
- if (configured === "max" && available.includes("xhigh")) return "xhigh";
1077
+ if ((configured === "max" || configured === "high" && !available.includes("high")) && available.includes("xhigh"))
1078
+ return "xhigh";
1072
1079
  if ((configured === "high" || configured === "xhigh" || configured === "max") && available.includes("high")) {
1073
1080
  return "high";
1074
1081
  }
@@ -1263,7 +1270,12 @@ function resolveModelRuntimeCapabilities(input) {
1263
1270
  family,
1264
1271
  capabilities: input.capabilities,
1265
1272
  thinking,
1266
- request: resolveRequestCapability(thinking, parser, input.runtimeId, quirks),
1273
+ request: resolveRequestCapability(
1274
+ thinking,
1275
+ parser,
1276
+ input.runtimeId === "litellm" ? input.capabilities.thinkingControlRuntime ?? input.runtimeId : input.runtimeId,
1277
+ quirks
1278
+ ),
1267
1279
  response: {
1268
1280
  parser,
1269
1281
  stripTokenizerSentinels: true
@@ -1329,6 +1341,7 @@ function thinkingFormatFromModelApi(api) {
1329
1341
  }
1330
1342
  function capabilitiesFromModel(model) {
1331
1343
  const format = model.compat?.thinkingFormat ?? thinkingFormatFromModelApi(model.api);
1344
+ const controlRuntime = (model.clioCoder ?? model.clio)?.thinkingControlRuntime;
1332
1345
  const caps = {
1333
1346
  chat: true,
1334
1347
  tools: true,
@@ -1339,7 +1352,8 @@ function capabilitiesFromModel(model) {
1339
1352
  rerank: false,
1340
1353
  fim: false,
1341
1354
  contextWindow: model.contextWindow,
1342
- maxTokens: model.maxTokens
1355
+ maxTokens: model.maxTokens,
1356
+ ...controlRuntime ? { thinkingControlRuntime: controlRuntime } : {}
1343
1357
  };
1344
1358
  if (format === "qwen-chat-template" || format === "openrouter" || format === "zai" || format === "anthropic-extended" || format === "deepseek-r1" || format === "openai-codex" || format === "harmony") {
1345
1359
  caps.thinkingFormat = format;
@@ -1411,6 +1425,21 @@ function normalizedModels(models) {
1411
1425
  }
1412
1426
  return out;
1413
1427
  }
1428
+ function normalizedLabels(models, labels) {
1429
+ if (typeof labels !== "object" || labels === null || Array.isArray(labels)) return void 0;
1430
+ const source = labels;
1431
+ const out = {};
1432
+ for (const id of models) {
1433
+ const label = source[id];
1434
+ if (typeof label !== "string") continue;
1435
+ const trimmed = label.trim();
1436
+ if (trimmed.length === 0 || trimmed.length > TARGET_MODEL_CACHE_MAX_MODEL_ID_CHARS || /[\r\n\0]/u.test(trimmed)) {
1437
+ continue;
1438
+ }
1439
+ out[id] = trimmed;
1440
+ }
1441
+ return Object.keys(out).length > 0 ? out : void 0;
1442
+ }
1414
1443
  function parseSnapshot(value) {
1415
1444
  if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
1416
1445
  const row = value;
@@ -1422,7 +1451,7 @@ function parseSnapshot(value) {
1422
1451
  if (typeof row.observedAt !== "string" || !Number.isFinite(Date.parse(row.observedAt))) return null;
1423
1452
  const models = normalizedModels(row.models);
1424
1453
  if (models.length !== row.models.length) return null;
1425
- return {
1454
+ const snapshot = {
1426
1455
  version: TARGET_MODEL_CACHE_VERSION,
1427
1456
  targetId: row.targetId,
1428
1457
  runtimeId: row.runtimeId,
@@ -1430,6 +1459,9 @@ function parseSnapshot(value) {
1430
1459
  models,
1431
1460
  observedAt: row.observedAt
1432
1461
  };
1462
+ const modelLabels = normalizedLabels(models, row.modelLabels);
1463
+ if (modelLabels !== void 0) snapshot.modelLabels = modelLabels;
1464
+ return snapshot;
1433
1465
  }
1434
1466
  function readTargetModelSnapshot(target, options = {}) {
1435
1467
  const path = targetModelSnapshotPath(target.id, options.cacheDir);
@@ -1458,6 +1490,8 @@ function recordTargetModelSnapshot(target, models, options = {}) {
1458
1490
  models: normalizedModels(models),
1459
1491
  observedAt: new Date(options.nowMs ?? Date.now()).toISOString()
1460
1492
  };
1493
+ const modelLabels = normalizedLabels(snapshot.models, options.modelLabels);
1494
+ if (modelLabels !== void 0) snapshot.modelLabels = modelLabels;
1461
1495
  try {
1462
1496
  safeResourceWrite(targetModelSnapshotPath(target.id, options.cacheDir), `${JSON.stringify(snapshot, null, 2)}
1463
1497
  `, {
@@ -1531,6 +1565,7 @@ function modelCandidatesForStatus(status) {
1531
1565
  const state = status.discoveredModelStates?.[trimmed];
1532
1566
  out.push({
1533
1567
  id: trimmed,
1568
+ ...status.discoveredModelLabels?.[trimmed] ? { label: status.discoveredModelLabels[trimmed] } : {},
1534
1569
  source,
1535
1570
  ...state ? { loadState: state.state } : {},
1536
1571
  ...state?.detail ? { loadStateDetail: state.detail } : {}
@@ -2796,6 +2831,115 @@ import {
2796
2831
  } from "@earendil-works/pi-ai";
2797
2832
  import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
2798
2833
 
2834
+ // src/core/gateway-routing.ts
2835
+ init_esm_shims();
2836
+ function liteLLMRouteFailureMessage(errorMessage, targetId, modelId) {
2837
+ const providerMessage = errorMessage?.trim() || "LiteLLM request failed.";
2838
+ const advice = `LiteLLM route '${modelId}' on target '${targetId}' failed. Clio did not retry or substitute another model; select a different route with /model, then resend.`;
2839
+ return providerMessage.includes(advice) ? providerMessage : `${providerMessage}
2840
+
2841
+ ${advice}`;
2842
+ }
2843
+ function nonEmptyString(value) {
2844
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
2845
+ }
2846
+ function nonnegativeNumber(value) {
2847
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) return value;
2848
+ if (typeof value !== "string" || value.trim().length === 0) return void 0;
2849
+ const parsed = Number(value);
2850
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : void 0;
2851
+ }
2852
+ function nonnegativeInteger(value) {
2853
+ const parsed = nonnegativeNumber(value);
2854
+ return parsed === void 0 ? void 0 : Math.floor(parsed);
2855
+ }
2856
+ function apiBaseHost(value) {
2857
+ const raw = nonEmptyString(value);
2858
+ if (raw === void 0) return void 0;
2859
+ try {
2860
+ return new URL(raw).host || void 0;
2861
+ } catch {
2862
+ return void 0;
2863
+ }
2864
+ }
2865
+ function storedApiBaseHost(value) {
2866
+ const raw = nonEmptyString(value);
2867
+ if (raw === void 0) return void 0;
2868
+ try {
2869
+ return new URL(raw.includes("://") ? raw : `http://${raw}`).host || void 0;
2870
+ } catch {
2871
+ return void 0;
2872
+ }
2873
+ }
2874
+ function liteLLMGatewayRoutingFromHeaders(headers) {
2875
+ const callId = nonEmptyString(headers.get("x-litellm-call-id"));
2876
+ const modelGroup = nonEmptyString(headers.get("x-litellm-model-group"));
2877
+ const modelName = nonEmptyString(headers.get("x-litellm-model-name"));
2878
+ const host = apiBaseHost(headers.get("x-litellm-model-api-base"));
2879
+ const deploymentId = nonEmptyString(headers.get("x-litellm-model-id"));
2880
+ const attemptedFallbacks = nonnegativeInteger(headers.get("x-litellm-attempted-fallbacks"));
2881
+ const attemptedRetries = nonnegativeInteger(headers.get("x-litellm-attempted-retries"));
2882
+ const overheadMs = nonnegativeNumber(headers.get("x-litellm-overhead-duration-ms"));
2883
+ const responseDurationMs = nonnegativeNumber(headers.get("x-litellm-response-duration-ms"));
2884
+ const version = nonEmptyString(headers.get("x-litellm-version"));
2885
+ const observation = {
2886
+ gateway: "litellm",
2887
+ ...callId !== void 0 ? { callId } : {},
2888
+ ...modelGroup !== void 0 ? { modelGroup } : {},
2889
+ ...modelName !== void 0 ? { modelName } : {},
2890
+ ...host !== void 0 ? { apiBaseHost: host } : {},
2891
+ ...deploymentId !== void 0 ? { deploymentId } : {},
2892
+ ...attemptedFallbacks !== void 0 ? { attemptedFallbacks } : {},
2893
+ ...attemptedRetries !== void 0 ? { attemptedRetries } : {},
2894
+ ...overheadMs !== void 0 ? { overheadMs } : {},
2895
+ ...responseDurationMs !== void 0 ? { responseDurationMs } : {},
2896
+ ...version !== void 0 ? { version } : {}
2897
+ };
2898
+ return Object.keys(observation).length > 1 ? observation : null;
2899
+ }
2900
+ function gatewayRoutingObservationFromRecord(record) {
2901
+ const value = record.gatewayRouting;
2902
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
2903
+ const raw = value;
2904
+ if (raw.gateway !== "litellm") return null;
2905
+ const callId = nonEmptyString(raw.callId);
2906
+ const modelGroup = nonEmptyString(raw.modelGroup);
2907
+ const modelName = nonEmptyString(raw.modelName);
2908
+ const host = storedApiBaseHost(raw.apiBaseHost);
2909
+ const deploymentId = nonEmptyString(raw.deploymentId);
2910
+ const attemptedFallbacks = nonnegativeInteger(raw.attemptedFallbacks);
2911
+ const attemptedRetries = nonnegativeInteger(raw.attemptedRetries);
2912
+ const overheadMs = nonnegativeNumber(raw.overheadMs);
2913
+ const responseDurationMs = nonnegativeNumber(raw.responseDurationMs);
2914
+ const version = nonEmptyString(raw.version);
2915
+ const observation = {
2916
+ gateway: "litellm",
2917
+ ...callId !== void 0 ? { callId } : {},
2918
+ ...modelGroup !== void 0 ? { modelGroup } : {},
2919
+ ...modelName !== void 0 ? { modelName } : {},
2920
+ ...host !== void 0 ? { apiBaseHost: host } : {},
2921
+ ...deploymentId !== void 0 ? { deploymentId } : {},
2922
+ ...attemptedFallbacks !== void 0 ? { attemptedFallbacks } : {},
2923
+ ...attemptedRetries !== void 0 ? { attemptedRetries } : {},
2924
+ ...overheadMs !== void 0 ? { overheadMs } : {},
2925
+ ...responseDurationMs !== void 0 ? { responseDurationMs } : {},
2926
+ ...version !== void 0 ? { version } : {}
2927
+ };
2928
+ return Object.keys(observation).length > 1 ? observation : null;
2929
+ }
2930
+ function gatewayRoutingObservationLabel(observation) {
2931
+ const route = [observation.modelGroup, observation.modelName].filter(Boolean).join("->");
2932
+ const destination = [route, observation.apiBaseHost ? `@${observation.apiBaseHost}` : ""].filter(Boolean).join("");
2933
+ const parts = [
2934
+ "gateway=litellm",
2935
+ ...destination ? [`route=${destination}`] : [],
2936
+ ...observation.attemptedFallbacks !== void 0 ? [`fallbacks=${observation.attemptedFallbacks}`] : [],
2937
+ ...observation.attemptedRetries !== void 0 ? [`retries=${observation.attemptedRetries}`] : [],
2938
+ ...observation.overheadMs !== void 0 ? [`overhead_ms=${observation.overheadMs}`] : []
2939
+ ];
2940
+ return parts.join(" ");
2941
+ }
2942
+
2799
2943
  // src/engine/harmony-response.ts
2800
2944
  init_esm_shims();
2801
2945
  var START = "<|start|>";
@@ -3443,7 +3587,10 @@ function observeResponseModelIdBytes(chunk, capture, flush = false) {
3443
3587
  }
3444
3588
  if (captureCanStopEarly(capture) || flush) capture.decoder = null;
3445
3589
  }
3446
- function captureResponseModelId(response, capture) {
3590
+ function captureResponseModelId(response, capture, model) {
3591
+ if (runtimeMetadata(model)?.runtimeId === "litellm") {
3592
+ capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
3593
+ }
3447
3594
  if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
3448
3595
  return response;
3449
3596
  }
@@ -3473,13 +3620,14 @@ function withResponseModelIdCapture(model, options, sourceFactory) {
3473
3620
  modelIdDone: false,
3474
3621
  backendTimings: null,
3475
3622
  backendTimingsSource: backendTimingsSourceForModel(model),
3623
+ gatewayRouting: null,
3476
3624
  buffer: "",
3477
3625
  decoder: new TextDecoder()
3478
3626
  };
3479
3627
  const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
3480
3628
  const capturedOptions = {
3481
3629
  ...options,
3482
- fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture)
3630
+ fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture, model)
3483
3631
  };
3484
3632
  const source = sourceFactory(capturedOptions);
3485
3633
  const annotated = createAssistantMessageEventStream3();
@@ -3489,9 +3637,11 @@ function withResponseModelIdCapture(model, options, sourceFactory) {
3489
3637
  const observation = capture.observed ? capture.reportedModelId === null ? { state: "not-reported" } : { state: "reported", reportedModelId: capture.reportedModelId } : { state: "not-observed" };
3490
3638
  if (event.type === "done") {
3491
3639
  event.message.responseModelIdObservation = observation;
3640
+ if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
3492
3641
  if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
3493
3642
  } else if (event.type === "error") {
3494
3643
  event.error.responseModelIdObservation = observation;
3644
+ if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
3495
3645
  if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
3496
3646
  }
3497
3647
  annotated.push(event);
@@ -3504,6 +3654,26 @@ function withResponseModelIdCapture(model, options, sourceFactory) {
3504
3654
  })();
3505
3655
  return annotated;
3506
3656
  }
3657
+ function withLiteLLMRouteFailureAdvice(model, source) {
3658
+ const metadata2 = runtimeMetadata(model);
3659
+ if (metadata2?.runtimeId !== "litellm") return source;
3660
+ const advised = createAssistantMessageEventStream3();
3661
+ (async () => {
3662
+ try {
3663
+ for await (const event of source) {
3664
+ if (event.type === "error") {
3665
+ event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata2.targetId, model.id);
3666
+ }
3667
+ advised.push(event);
3668
+ }
3669
+ advised.end();
3670
+ } catch (err) {
3671
+ const message = err instanceof Error ? err.message : String(err);
3672
+ throw new Error(liteLLMRouteFailureMessage(message, metadata2.targetId, model.id));
3673
+ }
3674
+ })();
3675
+ return advised;
3676
+ }
3507
3677
  function samplingParamsFromProfile(profile) {
3508
3678
  return {
3509
3679
  ...profile.topP !== void 0 ? { top_p: profile.topP } : {},
@@ -3591,6 +3761,10 @@ function applyThinkingPayload(payload, applied, resolved, model) {
3591
3761
  if (resolved.request.reasoningEffort && (next.reasoning_effort === void 0 || resolved.response.parser === "harmony")) {
3592
3762
  next.reasoning_effort = resolved.request.reasoningEffort;
3593
3763
  }
3764
+ if (resolved.runtimeId === "litellm" && resolved.request.reasoningEffort && next.reasoning_effort === resolved.request.reasoningEffort) {
3765
+ const allowed = Array.isArray(next.allowed_openai_params) ? next.allowed_openai_params : [];
3766
+ next.allowed_openai_params = [.../* @__PURE__ */ new Set([...allowed, "reasoning_effort"])];
3767
+ }
3594
3768
  if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
3595
3769
  const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
3596
3770
  next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
@@ -3612,13 +3786,13 @@ function applyLmStudioPayload(payload, model, resolved) {
3612
3786
  if (request?.ttlSeconds !== void 0) next.ttl = request.ttlSeconds;
3613
3787
  if (request?.draftModel !== void 0) next.draft_model = request.draftModel;
3614
3788
  if (resolved.thinking.mechanism === "none" || resolved.thinking.mechanism === "always-on") return next;
3615
- const resolvedEffort = resolved.request.reasoningEffort ?? lmStudioReasoningEffort(resolved.thinking.effectiveLevel, runtimeMetadata(model)?.lmstudioReasoningOptions);
3789
+ const resolvedEffort = runtimeMetadata(model)?.lmstudioReasoningOptions ? lmStudioReasoningEffort(resolved.thinking.effectiveLevel, runtimeMetadata(model)?.lmstudioReasoningOptions) : resolved.request.reasoningEffort ?? lmStudioReasoningEffort(resolved.thinking.effectiveLevel);
3616
3790
  switch (request?.reasoning) {
3617
3791
  case "off":
3618
- next.reasoning_effort = "none";
3792
+ next.reasoning_effort = lmStudioReasoningEffort("off", runtimeMetadata(model)?.lmstudioReasoningOptions);
3619
3793
  break;
3620
3794
  case "on":
3621
- next.reasoning_effort = "low";
3795
+ next.reasoning_effort = lmStudioReasoningEffort("low", runtimeMetadata(model)?.lmstudioReasoningOptions);
3622
3796
  break;
3623
3797
  case "low":
3624
3798
  case "medium":
@@ -3722,6 +3896,36 @@ function withRemainingContextBudget(model, context, options) {
3722
3896
  maxTokens: remainingContextMaxTokens(model, context, options)
3723
3897
  };
3724
3898
  }
3899
+ function hasHeader(headers, name) {
3900
+ if (!headers) return false;
3901
+ const wanted = name.toLowerCase();
3902
+ return Object.keys(headers).some((key) => key.toLowerCase() === wanted);
3903
+ }
3904
+ function withLiteLLMRequestOptions(model, options) {
3905
+ const metadata2 = runtimeMetadata(model);
3906
+ if (metadata2?.runtimeId !== "litellm") return options;
3907
+ const request = metadata2.litellm?.request;
3908
+ const modelHeaders = model.headers;
3909
+ const optionHeaders = options.headers;
3910
+ const headers = { ...options.headers ?? {} };
3911
+ const setDefault = (name, value) => {
3912
+ if (value === void 0 || hasHeader(modelHeaders, name) || hasHeader(optionHeaders, name)) return;
3913
+ headers[name] = value;
3914
+ };
3915
+ setDefault("x-litellm-tags", ["clio-coder", ...request?.tags ?? []].join(","));
3916
+ if (request?.sendSessionId !== false) setDefault("x-litellm-session-id", options.sessionId);
3917
+ setDefault("x-litellm-timeout", request?.timeoutSeconds?.toString());
3918
+ setDefault("x-litellm-stream-timeout", request?.streamTimeoutSeconds?.toString());
3919
+ setDefault("x-litellm-num-retries", request?.numRetries?.toString());
3920
+ return {
3921
+ ...options,
3922
+ headers,
3923
+ // Never hide duplicate attempts inside the OpenAI SDK beneath Clio's
3924
+ // operator-visible failure. The gateway may still be configured to retry,
3925
+ // but physical-routing deployments should keep that policy at zero too.
3926
+ maxRetries: options.maxRetries ?? 0
3927
+ };
3928
+ }
3725
3929
  function requiredToolArguments(tool) {
3726
3930
  const schema = tool.parameters;
3727
3931
  if (schema === null || typeof schema !== "object" || Array.isArray(schema)) return [];
@@ -3990,21 +4194,28 @@ var openAICompletionsApiProvider = {
3990
4194
  const resolved = resolvedCapabilitiesForModel(model, defaultLevel);
3991
4195
  const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
3992
4196
  const withSamplers = withSamplingOverrides(model, options, resolved);
4197
+ const withGatewayOptions = withLiteLLMRequestOptions(
4198
+ model,
4199
+ withRemainingContextBudget(model, effectiveContext, withSamplers)
4200
+ );
3993
4201
  return guardMalformedToolCalls(
3994
4202
  withReasoningTokenEstimate(
3995
4203
  stripSentinelsFromStream(
3996
4204
  stripNeverReasoningFromStream(
3997
4205
  filterGemmaChannelStream(
3998
- withResponseModelIdCapture(
4206
+ withLiteLLMRouteFailureAdvice(
3999
4207
  model,
4000
- withRemainingContextBudget(model, effectiveContext, withSamplers),
4001
- (capturedOptions) => withLocalResidency(
4208
+ withResponseModelIdCapture(
4002
4209
  model,
4003
- {
4004
- ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
4005
- ...options?.signal !== void 0 ? { signal: options.signal } : {}
4006
- },
4007
- (requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions)
4210
+ withGatewayOptions,
4211
+ (capturedOptions) => withLocalResidency(
4212
+ model,
4213
+ {
4214
+ ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
4215
+ ...options?.signal !== void 0 ? { signal: options.signal } : {}
4216
+ },
4217
+ (requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions)
4218
+ )
4008
4219
  )
4009
4220
  ),
4010
4221
  usesGemmaChannelMarkers(resolved.modelId)
@@ -4022,21 +4233,28 @@ var openAICompletionsApiProvider = {
4022
4233
  const resolved = resolvedCapabilitiesForModel(model, thinkingLevelFromSimple2(options));
4023
4234
  const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
4024
4235
  const withSamplers = withSamplingOverrides(model, options, resolved);
4236
+ const withGatewayOptions = withLiteLLMRequestOptions(
4237
+ model,
4238
+ withRemainingContextBudget(model, effectiveContext, withSamplers)
4239
+ );
4025
4240
  return guardMalformedToolCalls(
4026
4241
  withReasoningTokenEstimate(
4027
4242
  stripSentinelsFromStream(
4028
4243
  stripNeverReasoningFromStream(
4029
4244
  filterGemmaChannelStream(
4030
- withResponseModelIdCapture(
4245
+ withLiteLLMRouteFailureAdvice(
4031
4246
  model,
4032
- withRemainingContextBudget(model, effectiveContext, withSamplers),
4033
- (capturedOptions) => withLocalResidency(
4247
+ withResponseModelIdCapture(
4034
4248
  model,
4035
- {
4036
- ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
4037
- ...options?.signal !== void 0 ? { signal: options.signal } : {}
4038
- },
4039
- (requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions)
4249
+ withGatewayOptions,
4250
+ (capturedOptions) => withLocalResidency(
4251
+ model,
4252
+ {
4253
+ ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
4254
+ ...options?.signal !== void 0 ? { signal: options.signal } : {}
4255
+ },
4256
+ (requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions)
4257
+ )
4040
4258
  )
4041
4259
  ),
4042
4260
  usesGemmaChannelMarkers(resolved.modelId)
@@ -4376,7 +4594,7 @@ function discoveredModelsSource(probe, preservePreviousProbe, previous, cachedMo
4376
4594
  function sameProbeIdentity(previous, next) {
4377
4595
  return previous.id === next.id && previous.runtime === next.runtime && (previous.url ?? "") === (next.url ?? "") && (previous.defaultModel ?? "") === (next.defaultModel ?? "");
4378
4596
  }
4379
- function mergeProbeResult(desc, target, probe, previous, cachedModels = []) {
4597
+ function mergeProbeResult(desc, target, probe, previous, cachedModels = [], cachedModelLabels = {}) {
4380
4598
  const probeSucceeded = probe?.ok ?? false;
4381
4599
  const preservePrevious = !probeSucceeded && previous !== void 0 && sameProbeIdentity(previous.target, target);
4382
4600
  const probeCapabilities = probe?.discoveredCapabilities ?? (preservePrevious ? previous.probeCapabilities : null) ?? null;
@@ -4388,8 +4606,10 @@ function mergeProbeResult(desc, target, probe, previous, cachedModels = []) {
4388
4606
  probe?.models ?? (preservePrevious ? previous.discoveredModels : void 0) ?? (cachedModels.length > 0 ? cachedModels : void 0) ?? desc.knownModels ?? []
4389
4607
  );
4390
4608
  const discoveredModelStates = probe?.modelStates ?? (preservePrevious ? previous.discoveredModelStates : null) ?? null;
4609
+ const discoveredModelLabels = probe?.modelLabels ?? (preservePrevious ? previous.discoveredModelLabels : void 0) ?? (cachedModels.length > 0 ? cachedModelLabels : void 0) ?? {};
4391
4610
  const merge = {
4392
4611
  discoveredModels,
4612
+ discoveredModelLabels,
4393
4613
  discoveredModelsSource: discoveredModelsSource(probe, preservePrevious, previous, cachedModels, desc),
4394
4614
  discoveredModelStates,
4395
4615
  probeCapabilities,
@@ -4404,7 +4624,9 @@ function unservedDefaultModelReason(desc, target, merge) {
4404
4624
  const model = target.defaultModel;
4405
4625
  if (!model) return null;
4406
4626
  if (merge.discoveredModelsSource !== "probe" || merge.discoveredModels.length === 0) return null;
4407
- if (listKnownModelsForRuntime(desc.id).length > 0) return null;
4627
+ if (listKnownModelsForRuntime(desc.id).length > 0 && desc.externalAgentLoop?.modelCatalog !== "live-authoritative") {
4628
+ return null;
4629
+ }
4408
4630
  if (merge.discoveredModels.includes(model)) return null;
4409
4631
  if (merge.discoveredModelStates && model in merge.discoveredModelStates) return null;
4410
4632
  return `default model '${model}' is not advertised by the target`;
@@ -4424,14 +4646,18 @@ function createProvidersBundle(context) {
4424
4646
  if (config) return config.get();
4425
4647
  return readSettings();
4426
4648
  }
4427
- async function buildProbeContextForTarget(target, desc) {
4649
+ async function buildProbeContextForTarget(target, desc, signal) {
4428
4650
  const probeCtx = {
4429
4651
  credentialsPresent: credentialsPresent(),
4430
- httpTimeoutMs: DEFAULT_PROBE_TIMEOUT_MS
4652
+ httpTimeoutMs: DEFAULT_PROBE_TIMEOUT_MS,
4653
+ ...signal ? { signal } : {}
4431
4654
  };
4432
4655
  if (!targetRequiresAuth(target, desc)) return probeCtx;
4433
4656
  try {
4434
- const resolution = await authStore.resolveForTarget(resolveAuthTarget(target, desc), { includeFallback: false });
4657
+ const resolution = await authStore.resolveForTarget(resolveAuthTarget(target, desc), {
4658
+ includeFallback: false,
4659
+ ...signal ? { signal } : {}
4660
+ });
4435
4661
  if (resolution.apiKey) probeCtx.authToken = resolution.apiKey;
4436
4662
  } catch {
4437
4663
  }
@@ -4483,8 +4709,9 @@ function createProvidersBundle(context) {
4483
4709
  return out2;
4484
4710
  }
4485
4711
  const availability = availabilityFor(desc, target, authStatusFor);
4486
- const cachedModels = readTargetModelSnapshot(target)?.models ?? [];
4487
- const merge = mergeProbeResult(desc, target, probe, previous, cachedModels);
4712
+ const cachedSnapshot = readTargetModelSnapshot(target);
4713
+ const cachedModels = cachedSnapshot?.models ?? [];
4714
+ const merge = mergeProbeResult(desc, target, probe, previous, cachedModels, cachedSnapshot?.modelLabels ?? {});
4488
4715
  const { capabilities, contextWindowProvenance } = capabilitiesFor(desc, target, merge, kb);
4489
4716
  const healthy = probe !== null ? probe.ok : null;
4490
4717
  const unservedDefault = probe?.ok ? unservedDefaultModelReason(desc, target, merge) : null;
@@ -4508,6 +4735,7 @@ function createProvidersBundle(context) {
4508
4735
  probeModelCapabilities: merge.probeModelCapabilities,
4509
4736
  probeModelId: merge.probeModelId,
4510
4737
  discoveredModels: merge.discoveredModels,
4738
+ discoveredModelLabels: merge.discoveredModelLabels,
4511
4739
  discoveredModelsSource: merge.discoveredModelsSource,
4512
4740
  discoveredModelStates: merge.discoveredModelStates
4513
4741
  };
@@ -4516,6 +4744,7 @@ function createProvidersBundle(context) {
4516
4744
  return out;
4517
4745
  }
4518
4746
  async function probeTargetInternal(target, live, options) {
4747
+ options?.signal?.throwIfAborted();
4519
4748
  const previous = statuses.get(target.id);
4520
4749
  const desc = registry.get(target.runtime);
4521
4750
  if (!desc) {
@@ -4529,13 +4758,15 @@ function createProvidersBundle(context) {
4529
4758
  statuses.set(target.id, status2);
4530
4759
  return status2;
4531
4760
  }
4532
- const probeCtx = await buildProbeContextForTarget(target, desc);
4761
+ const probeCtx = await buildProbeContextForTarget(target, desc, options?.signal);
4762
+ options?.signal?.throwIfAborted();
4533
4763
  let probeResult;
4534
4764
  try {
4535
4765
  probeResult = await desc.probe(target, probeCtx);
4536
4766
  } catch (err) {
4537
4767
  probeResult = { ok: false, error: err instanceof Error ? err.message : String(err) };
4538
4768
  }
4769
+ options?.signal?.throwIfAborted();
4539
4770
  if (probeResult.ok && typeof desc.probeModels === "function" && !probeResult.models) {
4540
4771
  try {
4541
4772
  const ids = await desc.probeModels(target, probeCtx);
@@ -4543,6 +4774,7 @@ function createProvidersBundle(context) {
4543
4774
  } catch {
4544
4775
  }
4545
4776
  }
4777
+ options?.signal?.throwIfAborted();
4546
4778
  if (probeResult.ok && options?.reasoning !== false && typeof desc.probeReasoning === "function") {
4547
4779
  const settings = readConfig();
4548
4780
  const orchestratorTarget = settings.chat.target === target.id ? settings.chat.model : null;
@@ -4550,6 +4782,7 @@ function createProvidersBundle(context) {
4550
4782
  if (candidateModelId) {
4551
4783
  try {
4552
4784
  const result = await desc.probeReasoning(target, candidateModelId, probeCtx);
4785
+ options?.signal?.throwIfAborted();
4553
4786
  reasoningCache.set(reasoningCacheKey(target.id, candidateModelId), result.reasoning);
4554
4787
  const capabilityModelId = probeResult.capabilityModelId ?? null;
4555
4788
  if (capabilityModelId === null || capabilityModelId === candidateModelId) {
@@ -4570,10 +4803,15 @@ function createProvidersBundle(context) {
4570
4803
  }
4571
4804
  }
4572
4805
  }
4806
+ options?.signal?.throwIfAborted();
4573
4807
  const status = buildStatus(target, desc, probeResult, previous);
4574
4808
  statuses.set(target.id, status);
4575
4809
  if (probeResult.ok && probeResult.models !== void 0) {
4576
- recordTargetModelSnapshot(target, probeResult.models);
4810
+ recordTargetModelSnapshot(
4811
+ target,
4812
+ probeResult.models,
4813
+ probeResult.modelLabels ? { modelLabels: probeResult.modelLabels } : {}
4814
+ );
4577
4815
  }
4578
4816
  void recordEndpointSlotsFromStatus(status);
4579
4817
  context.bus.emit(BusChannels.ProviderHealth, { id: target.id, status });
@@ -4759,6 +4997,8 @@ export {
4759
4997
  setResidencyNoticeSink,
4760
4998
  setProtectedModelsProvider,
4761
4999
  withRunOverrides,
5000
+ gatewayRoutingObservationFromRecord,
5001
+ gatewayRoutingObservationLabel,
4762
5002
  applyModelCapabilityPatch,
4763
5003
  probeCapabilitiesForModel,
4764
5004
  resolveModelCapabilities,
@@ -4776,6 +5016,7 @@ export {
4776
5016
  isOrchestratorEligibleRuntime,
4777
5017
  isDispatchEligibleRuntime,
4778
5018
  modelResidencyForStatus,
5019
+ hasLiveModelCatalog,
4779
5020
  modelCandidatesForStatus,
4780
5021
  modelIdsForStatus,
4781
5022
  canonicalizeWireModelId,
@@ -4790,4 +5031,4 @@ export {
4790
5031
  resolveCostProvenance2 as resolveCostProvenance,
4791
5032
  ProvidersDomainModule
4792
5033
  };
4793
- //# sourceMappingURL=chunk-BYMNWQ7O.js.map
5034
+ //# sourceMappingURL=chunk-XPWWI35G.js.map