@iowarp/clio-coder 0.4.2 → 0.4.4

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 (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. 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-6OSVSQL5.js";
43
+ import {
44
+ sleep
45
+ } from "./chunk-EBY63B7G.js";
46
46
  import {
47
47
  listKnownModelsForRuntime
48
- } from "./chunk-CDNVLKUX.js";
48
+ } from "./chunk-26QSH3EJ.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
@@ -760,9 +760,6 @@ function runOverrides(env = process.env) {
760
760
  if (typeof maxContextTokens === "number" && Number.isInteger(maxContextTokens) && maxContextTokens > 0) {
761
761
  out.maxContextTokens = maxContextTokens;
762
762
  }
763
- if (typeof record.kvCacheMode === "string" && record.kvCacheMode.length > 0) {
764
- out.kvCacheMode = record.kvCacheMode;
765
- }
766
763
  const sampling = record.sampling;
767
764
  if (sampling !== null && typeof sampling === "object" && !Array.isArray(sampling)) {
768
765
  const numeric = {};
@@ -797,6 +794,12 @@ function applyModelCapabilityPatch(model, caps) {
797
794
  if (typeof caps.contextWindow === "number") model.contextWindow = caps.contextWindow;
798
795
  if (typeof caps.maxTokens === "number") model.maxTokens = caps.maxTokens;
799
796
  if (typeof caps.reasoning === "boolean") model.reasoning = caps.reasoning;
797
+ if (model.clioCoder || caps.thinkingControlRuntime !== void 0) {
798
+ const metadata2 = { ...model.clioCoder };
799
+ delete metadata2.thinkingControlRuntime;
800
+ if (caps.thinkingControlRuntime !== void 0) metadata2.thinkingControlRuntime = caps.thinkingControlRuntime;
801
+ model.clioCoder = metadata2;
802
+ }
800
803
  return model;
801
804
  }
802
805
  function applyReasoningResolution(caps, kbHit, detectedReasoning) {
@@ -1068,7 +1071,8 @@ function effectiveThinkingLevel(configured, available) {
1068
1071
  const fallback = available[0] ?? "off";
1069
1072
  if (!configured) return fallback;
1070
1073
  if (available.includes(configured)) return configured;
1071
- if (configured === "max" && available.includes("xhigh")) return "xhigh";
1074
+ if ((configured === "max" || configured === "high" && !available.includes("high")) && available.includes("xhigh"))
1075
+ return "xhigh";
1072
1076
  if ((configured === "high" || configured === "xhigh" || configured === "max") && available.includes("high")) {
1073
1077
  return "high";
1074
1078
  }
@@ -1263,7 +1267,12 @@ function resolveModelRuntimeCapabilities(input) {
1263
1267
  family,
1264
1268
  capabilities: input.capabilities,
1265
1269
  thinking,
1266
- request: resolveRequestCapability(thinking, parser, input.runtimeId, quirks),
1270
+ request: resolveRequestCapability(
1271
+ thinking,
1272
+ parser,
1273
+ input.runtimeId === "litellm" ? input.capabilities.thinkingControlRuntime ?? input.runtimeId : input.runtimeId,
1274
+ quirks
1275
+ ),
1267
1276
  response: {
1268
1277
  parser,
1269
1278
  stripTokenizerSentinels: true
@@ -1329,6 +1338,7 @@ function thinkingFormatFromModelApi(api) {
1329
1338
  }
1330
1339
  function capabilitiesFromModel(model) {
1331
1340
  const format = model.compat?.thinkingFormat ?? thinkingFormatFromModelApi(model.api);
1341
+ const controlRuntime = (model.clioCoder ?? model.clio)?.thinkingControlRuntime;
1332
1342
  const caps = {
1333
1343
  chat: true,
1334
1344
  tools: true,
@@ -1339,7 +1349,8 @@ function capabilitiesFromModel(model) {
1339
1349
  rerank: false,
1340
1350
  fim: false,
1341
1351
  contextWindow: model.contextWindow,
1342
- maxTokens: model.maxTokens
1352
+ maxTokens: model.maxTokens,
1353
+ ...controlRuntime ? { thinkingControlRuntime: controlRuntime } : {}
1343
1354
  };
1344
1355
  if (format === "qwen-chat-template" || format === "openrouter" || format === "zai" || format === "anthropic-extended" || format === "deepseek-r1" || format === "openai-codex" || format === "harmony") {
1345
1356
  caps.thinkingFormat = format;
@@ -1411,6 +1422,21 @@ function normalizedModels(models) {
1411
1422
  }
1412
1423
  return out;
1413
1424
  }
1425
+ function normalizedLabels(models, labels) {
1426
+ if (typeof labels !== "object" || labels === null || Array.isArray(labels)) return void 0;
1427
+ const source = labels;
1428
+ const out = {};
1429
+ for (const id of models) {
1430
+ const label = source[id];
1431
+ if (typeof label !== "string") continue;
1432
+ const trimmed = label.trim();
1433
+ if (trimmed.length === 0 || trimmed.length > TARGET_MODEL_CACHE_MAX_MODEL_ID_CHARS || /[\r\n\0]/u.test(trimmed)) {
1434
+ continue;
1435
+ }
1436
+ out[id] = trimmed;
1437
+ }
1438
+ return Object.keys(out).length > 0 ? out : void 0;
1439
+ }
1414
1440
  function parseSnapshot(value) {
1415
1441
  if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
1416
1442
  const row = value;
@@ -1422,7 +1448,7 @@ function parseSnapshot(value) {
1422
1448
  if (typeof row.observedAt !== "string" || !Number.isFinite(Date.parse(row.observedAt))) return null;
1423
1449
  const models = normalizedModels(row.models);
1424
1450
  if (models.length !== row.models.length) return null;
1425
- return {
1451
+ const snapshot = {
1426
1452
  version: TARGET_MODEL_CACHE_VERSION,
1427
1453
  targetId: row.targetId,
1428
1454
  runtimeId: row.runtimeId,
@@ -1430,6 +1456,9 @@ function parseSnapshot(value) {
1430
1456
  models,
1431
1457
  observedAt: row.observedAt
1432
1458
  };
1459
+ const modelLabels = normalizedLabels(models, row.modelLabels);
1460
+ if (modelLabels !== void 0) snapshot.modelLabels = modelLabels;
1461
+ return snapshot;
1433
1462
  }
1434
1463
  function readTargetModelSnapshot(target, options = {}) {
1435
1464
  const path = targetModelSnapshotPath(target.id, options.cacheDir);
@@ -1458,6 +1487,8 @@ function recordTargetModelSnapshot(target, models, options = {}) {
1458
1487
  models: normalizedModels(models),
1459
1488
  observedAt: new Date(options.nowMs ?? Date.now()).toISOString()
1460
1489
  };
1490
+ const modelLabels = normalizedLabels(snapshot.models, options.modelLabels);
1491
+ if (modelLabels !== void 0) snapshot.modelLabels = modelLabels;
1461
1492
  try {
1462
1493
  safeResourceWrite(targetModelSnapshotPath(target.id, options.cacheDir), `${JSON.stringify(snapshot, null, 2)}
1463
1494
  `, {
@@ -1515,8 +1546,7 @@ function modelResidencyForStatus(status, modelId) {
1515
1546
  }
1516
1547
  }
1517
1548
  function hasLiveModelCatalog(status) {
1518
- if (status.discoveredModelsSource === "probe" || status.discoveredModelsSource === "cache") return true;
1519
- return status.discoveredModelsSource === void 0 && status.discoveredModels.length > 0;
1549
+ return status.discoveredModelsSource === "probe" || status.discoveredModelsSource === "cache";
1520
1550
  }
1521
1551
  function modelCandidatesForStatus(status) {
1522
1552
  const configured = uniqueModels(status.target.wireModels ?? []);
@@ -1531,6 +1561,7 @@ function modelCandidatesForStatus(status) {
1531
1561
  const state = status.discoveredModelStates?.[trimmed];
1532
1562
  out.push({
1533
1563
  id: trimmed,
1564
+ ...status.discoveredModelLabels?.[trimmed] ? { label: status.discoveredModelLabels[trimmed] } : {},
1534
1565
  source,
1535
1566
  ...state ? { loadState: state.state } : {},
1536
1567
  ...state?.detail ? { loadStateDetail: state.detail } : {}
@@ -2408,6 +2439,7 @@ function mergeSamplingOverride(profile, override = runSamplingOverrides()) {
2408
2439
 
2409
2440
  // src/engine/apis/ollama-native.ts
2410
2441
  var REASONING_CHARS_PER_TOKEN = 4;
2442
+ var ownedModelsByTarget = /* @__PURE__ */ new Map();
2411
2443
  function clioQuirks(model) {
2412
2444
  return model.clioCoder?.quirks;
2413
2445
  }
@@ -2573,7 +2605,10 @@ async function listResidentOllamaModels(client) {
2573
2605
  });
2574
2606
  }
2575
2607
  async function unloadOllamaModel(baseUrl, modelId, headers) {
2608
+ const owned = ownedModelsByTarget.get(residencyTargetKey("ollama-native", baseUrl));
2609
+ if (!owned?.has(modelId)) return;
2576
2610
  await ollamaEvictClient(baseUrl, headers).generate({ model: modelId, prompt: "", keep_alive: 0, stream: false });
2611
+ owned.delete(modelId);
2577
2612
  }
2578
2613
  function mapStopReason(reason, hadToolCall) {
2579
2614
  if (hadToolCall) return "toolUse";
@@ -2729,8 +2764,19 @@ function runStream(model, context, options, thinkingLevel) {
2729
2764
  else emitText(segment.content);
2730
2765
  }
2731
2766
  };
2767
+ let recordedOwnership = false;
2732
2768
  for await (const chunk of iterator) {
2733
2769
  const response = chunk;
2770
+ if (!recordedOwnership && model.baseUrl) {
2771
+ const targetKey = residencyTargetKey("ollama-native", model.baseUrl);
2772
+ let owned = ownedModelsByTarget.get(targetKey);
2773
+ if (!owned) {
2774
+ owned = /* @__PURE__ */ new Set();
2775
+ ownedModelsByTarget.set(targetKey, owned);
2776
+ }
2777
+ owned.add(response.model || model.id);
2778
+ recordedOwnership = true;
2779
+ }
2734
2780
  const msg = response.message;
2735
2781
  if (msg?.thinking && msg.thinking.length > 0) {
2736
2782
  emitThinking(msg.thinking);
@@ -2796,6 +2842,115 @@ import {
2796
2842
  } from "@earendil-works/pi-ai";
2797
2843
  import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
2798
2844
 
2845
+ // src/core/gateway-routing.ts
2846
+ init_esm_shims();
2847
+ function liteLLMRouteFailureMessage(errorMessage, targetId, modelId) {
2848
+ const providerMessage = errorMessage?.trim() || "LiteLLM request failed.";
2849
+ 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.`;
2850
+ return providerMessage.includes(advice) ? providerMessage : `${providerMessage}
2851
+
2852
+ ${advice}`;
2853
+ }
2854
+ function nonEmptyString(value) {
2855
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
2856
+ }
2857
+ function nonnegativeNumber(value) {
2858
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) return value;
2859
+ if (typeof value !== "string" || value.trim().length === 0) return void 0;
2860
+ const parsed = Number(value);
2861
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : void 0;
2862
+ }
2863
+ function nonnegativeInteger(value) {
2864
+ const parsed = nonnegativeNumber(value);
2865
+ return parsed === void 0 ? void 0 : Math.floor(parsed);
2866
+ }
2867
+ function apiBaseHost(value) {
2868
+ const raw = nonEmptyString(value);
2869
+ if (raw === void 0) return void 0;
2870
+ try {
2871
+ return new URL(raw).host || void 0;
2872
+ } catch {
2873
+ return void 0;
2874
+ }
2875
+ }
2876
+ function storedApiBaseHost(value) {
2877
+ const raw = nonEmptyString(value);
2878
+ if (raw === void 0) return void 0;
2879
+ try {
2880
+ return new URL(raw.includes("://") ? raw : `http://${raw}`).host || void 0;
2881
+ } catch {
2882
+ return void 0;
2883
+ }
2884
+ }
2885
+ function liteLLMGatewayRoutingFromHeaders(headers) {
2886
+ const callId = nonEmptyString(headers.get("x-litellm-call-id"));
2887
+ const modelGroup = nonEmptyString(headers.get("x-litellm-model-group"));
2888
+ const modelName = nonEmptyString(headers.get("x-litellm-model-name"));
2889
+ const host = apiBaseHost(headers.get("x-litellm-model-api-base"));
2890
+ const deploymentId = nonEmptyString(headers.get("x-litellm-model-id"));
2891
+ const attemptedFallbacks = nonnegativeInteger(headers.get("x-litellm-attempted-fallbacks"));
2892
+ const attemptedRetries = nonnegativeInteger(headers.get("x-litellm-attempted-retries"));
2893
+ const overheadMs = nonnegativeNumber(headers.get("x-litellm-overhead-duration-ms"));
2894
+ const responseDurationMs = nonnegativeNumber(headers.get("x-litellm-response-duration-ms"));
2895
+ const version = nonEmptyString(headers.get("x-litellm-version"));
2896
+ const observation = {
2897
+ gateway: "litellm",
2898
+ ...callId !== void 0 ? { callId } : {},
2899
+ ...modelGroup !== void 0 ? { modelGroup } : {},
2900
+ ...modelName !== void 0 ? { modelName } : {},
2901
+ ...host !== void 0 ? { apiBaseHost: host } : {},
2902
+ ...deploymentId !== void 0 ? { deploymentId } : {},
2903
+ ...attemptedFallbacks !== void 0 ? { attemptedFallbacks } : {},
2904
+ ...attemptedRetries !== void 0 ? { attemptedRetries } : {},
2905
+ ...overheadMs !== void 0 ? { overheadMs } : {},
2906
+ ...responseDurationMs !== void 0 ? { responseDurationMs } : {},
2907
+ ...version !== void 0 ? { version } : {}
2908
+ };
2909
+ return Object.keys(observation).length > 1 ? observation : null;
2910
+ }
2911
+ function gatewayRoutingObservationFromRecord(record) {
2912
+ const value = record.gatewayRouting;
2913
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return null;
2914
+ const raw = value;
2915
+ if (raw.gateway !== "litellm") return null;
2916
+ const callId = nonEmptyString(raw.callId);
2917
+ const modelGroup = nonEmptyString(raw.modelGroup);
2918
+ const modelName = nonEmptyString(raw.modelName);
2919
+ const host = storedApiBaseHost(raw.apiBaseHost);
2920
+ const deploymentId = nonEmptyString(raw.deploymentId);
2921
+ const attemptedFallbacks = nonnegativeInteger(raw.attemptedFallbacks);
2922
+ const attemptedRetries = nonnegativeInteger(raw.attemptedRetries);
2923
+ const overheadMs = nonnegativeNumber(raw.overheadMs);
2924
+ const responseDurationMs = nonnegativeNumber(raw.responseDurationMs);
2925
+ const version = nonEmptyString(raw.version);
2926
+ const observation = {
2927
+ gateway: "litellm",
2928
+ ...callId !== void 0 ? { callId } : {},
2929
+ ...modelGroup !== void 0 ? { modelGroup } : {},
2930
+ ...modelName !== void 0 ? { modelName } : {},
2931
+ ...host !== void 0 ? { apiBaseHost: host } : {},
2932
+ ...deploymentId !== void 0 ? { deploymentId } : {},
2933
+ ...attemptedFallbacks !== void 0 ? { attemptedFallbacks } : {},
2934
+ ...attemptedRetries !== void 0 ? { attemptedRetries } : {},
2935
+ ...overheadMs !== void 0 ? { overheadMs } : {},
2936
+ ...responseDurationMs !== void 0 ? { responseDurationMs } : {},
2937
+ ...version !== void 0 ? { version } : {}
2938
+ };
2939
+ return Object.keys(observation).length > 1 ? observation : null;
2940
+ }
2941
+ function gatewayRoutingObservationLabel(observation) {
2942
+ const route = [observation.modelGroup, observation.modelName].filter(Boolean).join("->");
2943
+ const destination = [route, observation.apiBaseHost ? `@${observation.apiBaseHost}` : ""].filter(Boolean).join("");
2944
+ const parts = [
2945
+ "gateway=litellm",
2946
+ ...destination ? [`route=${destination}`] : [],
2947
+ ...observation.attemptedFallbacks !== void 0 ? [`fallbacks=${observation.attemptedFallbacks}`] : [],
2948
+ ...observation.attemptedRetries !== void 0 ? [`retries=${observation.attemptedRetries}`] : [],
2949
+ ...observation.overheadMs !== void 0 ? [`overhead_ms=${observation.overheadMs}`] : []
2950
+ ];
2951
+ return parts.join(" ");
2952
+ }
2953
+
2799
2954
  // src/engine/harmony-response.ts
2800
2955
  init_esm_shims();
2801
2956
  var START = "<|start|>";
@@ -3443,7 +3598,10 @@ function observeResponseModelIdBytes(chunk, capture, flush = false) {
3443
3598
  }
3444
3599
  if (captureCanStopEarly(capture) || flush) capture.decoder = null;
3445
3600
  }
3446
- function captureResponseModelId(response, capture) {
3601
+ function captureResponseModelId(response, capture, model) {
3602
+ if (runtimeMetadata(model)?.runtimeId === "litellm") {
3603
+ capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
3604
+ }
3447
3605
  if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
3448
3606
  return response;
3449
3607
  }
@@ -3473,13 +3631,14 @@ function withResponseModelIdCapture(model, options, sourceFactory) {
3473
3631
  modelIdDone: false,
3474
3632
  backendTimings: null,
3475
3633
  backendTimingsSource: backendTimingsSourceForModel(model),
3634
+ gatewayRouting: null,
3476
3635
  buffer: "",
3477
3636
  decoder: new TextDecoder()
3478
3637
  };
3479
3638
  const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
3480
3639
  const capturedOptions = {
3481
3640
  ...options,
3482
- fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture)
3641
+ fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture, model)
3483
3642
  };
3484
3643
  const source = sourceFactory(capturedOptions);
3485
3644
  const annotated = createAssistantMessageEventStream3();
@@ -3489,9 +3648,11 @@ function withResponseModelIdCapture(model, options, sourceFactory) {
3489
3648
  const observation = capture.observed ? capture.reportedModelId === null ? { state: "not-reported" } : { state: "reported", reportedModelId: capture.reportedModelId } : { state: "not-observed" };
3490
3649
  if (event.type === "done") {
3491
3650
  event.message.responseModelIdObservation = observation;
3651
+ if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
3492
3652
  if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
3493
3653
  } else if (event.type === "error") {
3494
3654
  event.error.responseModelIdObservation = observation;
3655
+ if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
3495
3656
  if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
3496
3657
  }
3497
3658
  annotated.push(event);
@@ -3504,6 +3665,26 @@ function withResponseModelIdCapture(model, options, sourceFactory) {
3504
3665
  })();
3505
3666
  return annotated;
3506
3667
  }
3668
+ function withLiteLLMRouteFailureAdvice(model, source) {
3669
+ const metadata2 = runtimeMetadata(model);
3670
+ if (metadata2?.runtimeId !== "litellm") return source;
3671
+ const advised = createAssistantMessageEventStream3();
3672
+ (async () => {
3673
+ try {
3674
+ for await (const event of source) {
3675
+ if (event.type === "error") {
3676
+ event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata2.targetId, model.id);
3677
+ }
3678
+ advised.push(event);
3679
+ }
3680
+ advised.end();
3681
+ } catch (err) {
3682
+ const message = err instanceof Error ? err.message : String(err);
3683
+ throw new Error(liteLLMRouteFailureMessage(message, metadata2.targetId, model.id));
3684
+ }
3685
+ })();
3686
+ return advised;
3687
+ }
3507
3688
  function samplingParamsFromProfile(profile) {
3508
3689
  return {
3509
3690
  ...profile.topP !== void 0 ? { top_p: profile.topP } : {},
@@ -3591,6 +3772,10 @@ function applyThinkingPayload(payload, applied, resolved, model) {
3591
3772
  if (resolved.request.reasoningEffort && (next.reasoning_effort === void 0 || resolved.response.parser === "harmony")) {
3592
3773
  next.reasoning_effort = resolved.request.reasoningEffort;
3593
3774
  }
3775
+ if (resolved.runtimeId === "litellm" && resolved.request.reasoningEffort && next.reasoning_effort === resolved.request.reasoningEffort) {
3776
+ const allowed = Array.isArray(next.allowed_openai_params) ? next.allowed_openai_params : [];
3777
+ next.allowed_openai_params = [.../* @__PURE__ */ new Set([...allowed, "reasoning_effort"])];
3778
+ }
3594
3779
  if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
3595
3780
  const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
3596
3781
  next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
@@ -3612,13 +3797,13 @@ function applyLmStudioPayload(payload, model, resolved) {
3612
3797
  if (request?.ttlSeconds !== void 0) next.ttl = request.ttlSeconds;
3613
3798
  if (request?.draftModel !== void 0) next.draft_model = request.draftModel;
3614
3799
  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);
3800
+ const resolvedEffort = runtimeMetadata(model)?.lmstudioReasoningOptions ? lmStudioReasoningEffort(resolved.thinking.effectiveLevel, runtimeMetadata(model)?.lmstudioReasoningOptions) : resolved.request.reasoningEffort ?? lmStudioReasoningEffort(resolved.thinking.effectiveLevel);
3616
3801
  switch (request?.reasoning) {
3617
3802
  case "off":
3618
- next.reasoning_effort = "none";
3803
+ next.reasoning_effort = lmStudioReasoningEffort("off", runtimeMetadata(model)?.lmstudioReasoningOptions);
3619
3804
  break;
3620
3805
  case "on":
3621
- next.reasoning_effort = "low";
3806
+ next.reasoning_effort = lmStudioReasoningEffort("low", runtimeMetadata(model)?.lmstudioReasoningOptions);
3622
3807
  break;
3623
3808
  case "low":
3624
3809
  case "medium":
@@ -3722,6 +3907,36 @@ function withRemainingContextBudget(model, context, options) {
3722
3907
  maxTokens: remainingContextMaxTokens(model, context, options)
3723
3908
  };
3724
3909
  }
3910
+ function hasHeader(headers, name) {
3911
+ if (!headers) return false;
3912
+ const wanted = name.toLowerCase();
3913
+ return Object.keys(headers).some((key) => key.toLowerCase() === wanted);
3914
+ }
3915
+ function withLiteLLMRequestOptions(model, options) {
3916
+ const metadata2 = runtimeMetadata(model);
3917
+ if (metadata2?.runtimeId !== "litellm") return options;
3918
+ const request = metadata2.litellm?.request;
3919
+ const modelHeaders = model.headers;
3920
+ const optionHeaders = options.headers;
3921
+ const headers = { ...options.headers ?? {} };
3922
+ const setDefault = (name, value) => {
3923
+ if (value === void 0 || hasHeader(modelHeaders, name) || hasHeader(optionHeaders, name)) return;
3924
+ headers[name] = value;
3925
+ };
3926
+ setDefault("x-litellm-tags", ["clio-coder", ...request?.tags ?? []].join(","));
3927
+ if (request?.sendSessionId !== false) setDefault("x-litellm-session-id", options.sessionId);
3928
+ setDefault("x-litellm-timeout", request?.timeoutSeconds?.toString());
3929
+ setDefault("x-litellm-stream-timeout", request?.streamTimeoutSeconds?.toString());
3930
+ setDefault("x-litellm-num-retries", request?.numRetries?.toString());
3931
+ return {
3932
+ ...options,
3933
+ headers,
3934
+ // Never hide duplicate attempts inside the OpenAI SDK beneath Clio's
3935
+ // operator-visible failure. The gateway may still be configured to retry,
3936
+ // but physical-routing deployments should keep that policy at zero too.
3937
+ maxRetries: options.maxRetries ?? 0
3938
+ };
3939
+ }
3725
3940
  function requiredToolArguments(tool) {
3726
3941
  const schema = tool.parameters;
3727
3942
  if (schema === null || typeof schema !== "object" || Array.isArray(schema)) return [];
@@ -3990,21 +4205,28 @@ var openAICompletionsApiProvider = {
3990
4205
  const resolved = resolvedCapabilitiesForModel(model, defaultLevel);
3991
4206
  const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
3992
4207
  const withSamplers = withSamplingOverrides(model, options, resolved);
4208
+ const withGatewayOptions = withLiteLLMRequestOptions(
4209
+ model,
4210
+ withRemainingContextBudget(model, effectiveContext, withSamplers)
4211
+ );
3993
4212
  return guardMalformedToolCalls(
3994
4213
  withReasoningTokenEstimate(
3995
4214
  stripSentinelsFromStream(
3996
4215
  stripNeverReasoningFromStream(
3997
4216
  filterGemmaChannelStream(
3998
- withResponseModelIdCapture(
4217
+ withLiteLLMRouteFailureAdvice(
3999
4218
  model,
4000
- withRemainingContextBudget(model, effectiveContext, withSamplers),
4001
- (capturedOptions) => withLocalResidency(
4219
+ withResponseModelIdCapture(
4002
4220
  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)
4221
+ withGatewayOptions,
4222
+ (capturedOptions) => withLocalResidency(
4223
+ model,
4224
+ {
4225
+ ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
4226
+ ...options?.signal !== void 0 ? { signal: options.signal } : {}
4227
+ },
4228
+ (requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions)
4229
+ )
4008
4230
  )
4009
4231
  ),
4010
4232
  usesGemmaChannelMarkers(resolved.modelId)
@@ -4022,21 +4244,28 @@ var openAICompletionsApiProvider = {
4022
4244
  const resolved = resolvedCapabilitiesForModel(model, thinkingLevelFromSimple2(options));
4023
4245
  const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
4024
4246
  const withSamplers = withSamplingOverrides(model, options, resolved);
4247
+ const withGatewayOptions = withLiteLLMRequestOptions(
4248
+ model,
4249
+ withRemainingContextBudget(model, effectiveContext, withSamplers)
4250
+ );
4025
4251
  return guardMalformedToolCalls(
4026
4252
  withReasoningTokenEstimate(
4027
4253
  stripSentinelsFromStream(
4028
4254
  stripNeverReasoningFromStream(
4029
4255
  filterGemmaChannelStream(
4030
- withResponseModelIdCapture(
4256
+ withLiteLLMRouteFailureAdvice(
4031
4257
  model,
4032
- withRemainingContextBudget(model, effectiveContext, withSamplers),
4033
- (capturedOptions) => withLocalResidency(
4258
+ withResponseModelIdCapture(
4034
4259
  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)
4260
+ withGatewayOptions,
4261
+ (capturedOptions) => withLocalResidency(
4262
+ model,
4263
+ {
4264
+ ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
4265
+ ...options?.signal !== void 0 ? { signal: options.signal } : {}
4266
+ },
4267
+ (requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions)
4268
+ )
4040
4269
  )
4041
4270
  ),
4042
4271
  usesGemmaChannelMarkers(resolved.modelId)
@@ -4376,7 +4605,7 @@ function discoveredModelsSource(probe, preservePreviousProbe, previous, cachedMo
4376
4605
  function sameProbeIdentity(previous, next) {
4377
4606
  return previous.id === next.id && previous.runtime === next.runtime && (previous.url ?? "") === (next.url ?? "") && (previous.defaultModel ?? "") === (next.defaultModel ?? "");
4378
4607
  }
4379
- function mergeProbeResult(desc, target, probe, previous, cachedModels = []) {
4608
+ function mergeProbeResult(desc, target, probe, previous, cachedModels = [], cachedModelLabels = {}) {
4380
4609
  const probeSucceeded = probe?.ok ?? false;
4381
4610
  const preservePrevious = !probeSucceeded && previous !== void 0 && sameProbeIdentity(previous.target, target);
4382
4611
  const probeCapabilities = probe?.discoveredCapabilities ?? (preservePrevious ? previous.probeCapabilities : null) ?? null;
@@ -4388,8 +4617,10 @@ function mergeProbeResult(desc, target, probe, previous, cachedModels = []) {
4388
4617
  probe?.models ?? (preservePrevious ? previous.discoveredModels : void 0) ?? (cachedModels.length > 0 ? cachedModels : void 0) ?? desc.knownModels ?? []
4389
4618
  );
4390
4619
  const discoveredModelStates = probe?.modelStates ?? (preservePrevious ? previous.discoveredModelStates : null) ?? null;
4620
+ const discoveredModelLabels = probe?.modelLabels ?? (preservePrevious ? previous.discoveredModelLabels : void 0) ?? (cachedModels.length > 0 ? cachedModelLabels : void 0) ?? {};
4391
4621
  const merge = {
4392
4622
  discoveredModels,
4623
+ discoveredModelLabels,
4393
4624
  discoveredModelsSource: discoveredModelsSource(probe, preservePrevious, previous, cachedModels, desc),
4394
4625
  discoveredModelStates,
4395
4626
  probeCapabilities,
@@ -4404,7 +4635,9 @@ function unservedDefaultModelReason(desc, target, merge) {
4404
4635
  const model = target.defaultModel;
4405
4636
  if (!model) return null;
4406
4637
  if (merge.discoveredModelsSource !== "probe" || merge.discoveredModels.length === 0) return null;
4407
- if (listKnownModelsForRuntime(desc.id).length > 0) return null;
4638
+ if (listKnownModelsForRuntime(desc.id).length > 0 && desc.externalAgentLoop?.modelCatalog !== "live-authoritative") {
4639
+ return null;
4640
+ }
4408
4641
  if (merge.discoveredModels.includes(model)) return null;
4409
4642
  if (merge.discoveredModelStates && model in merge.discoveredModelStates) return null;
4410
4643
  return `default model '${model}' is not advertised by the target`;
@@ -4424,14 +4657,18 @@ function createProvidersBundle(context) {
4424
4657
  if (config) return config.get();
4425
4658
  return readSettings();
4426
4659
  }
4427
- async function buildProbeContextForTarget(target, desc) {
4660
+ async function buildProbeContextForTarget(target, desc, signal) {
4428
4661
  const probeCtx = {
4429
4662
  credentialsPresent: credentialsPresent(),
4430
- httpTimeoutMs: DEFAULT_PROBE_TIMEOUT_MS
4663
+ httpTimeoutMs: DEFAULT_PROBE_TIMEOUT_MS,
4664
+ ...signal ? { signal } : {}
4431
4665
  };
4432
4666
  if (!targetRequiresAuth(target, desc)) return probeCtx;
4433
4667
  try {
4434
- const resolution = await authStore.resolveForTarget(resolveAuthTarget(target, desc), { includeFallback: false });
4668
+ const resolution = await authStore.resolveForTarget(resolveAuthTarget(target, desc), {
4669
+ includeFallback: false,
4670
+ ...signal ? { signal } : {}
4671
+ });
4435
4672
  if (resolution.apiKey) probeCtx.authToken = resolution.apiKey;
4436
4673
  } catch {
4437
4674
  }
@@ -4483,8 +4720,9 @@ function createProvidersBundle(context) {
4483
4720
  return out2;
4484
4721
  }
4485
4722
  const availability = availabilityFor(desc, target, authStatusFor);
4486
- const cachedModels = readTargetModelSnapshot(target)?.models ?? [];
4487
- const merge = mergeProbeResult(desc, target, probe, previous, cachedModels);
4723
+ const cachedSnapshot = readTargetModelSnapshot(target);
4724
+ const cachedModels = cachedSnapshot?.models ?? [];
4725
+ const merge = mergeProbeResult(desc, target, probe, previous, cachedModels, cachedSnapshot?.modelLabels ?? {});
4488
4726
  const { capabilities, contextWindowProvenance } = capabilitiesFor(desc, target, merge, kb);
4489
4727
  const healthy = probe !== null ? probe.ok : null;
4490
4728
  const unservedDefault = probe?.ok ? unservedDefaultModelReason(desc, target, merge) : null;
@@ -4508,6 +4746,7 @@ function createProvidersBundle(context) {
4508
4746
  probeModelCapabilities: merge.probeModelCapabilities,
4509
4747
  probeModelId: merge.probeModelId,
4510
4748
  discoveredModels: merge.discoveredModels,
4749
+ discoveredModelLabels: merge.discoveredModelLabels,
4511
4750
  discoveredModelsSource: merge.discoveredModelsSource,
4512
4751
  discoveredModelStates: merge.discoveredModelStates
4513
4752
  };
@@ -4516,6 +4755,7 @@ function createProvidersBundle(context) {
4516
4755
  return out;
4517
4756
  }
4518
4757
  async function probeTargetInternal(target, live, options) {
4758
+ options?.signal?.throwIfAborted();
4519
4759
  const previous = statuses.get(target.id);
4520
4760
  const desc = registry.get(target.runtime);
4521
4761
  if (!desc) {
@@ -4529,13 +4769,15 @@ function createProvidersBundle(context) {
4529
4769
  statuses.set(target.id, status2);
4530
4770
  return status2;
4531
4771
  }
4532
- const probeCtx = await buildProbeContextForTarget(target, desc);
4772
+ const probeCtx = await buildProbeContextForTarget(target, desc, options?.signal);
4773
+ options?.signal?.throwIfAborted();
4533
4774
  let probeResult;
4534
4775
  try {
4535
4776
  probeResult = await desc.probe(target, probeCtx);
4536
4777
  } catch (err) {
4537
4778
  probeResult = { ok: false, error: err instanceof Error ? err.message : String(err) };
4538
4779
  }
4780
+ options?.signal?.throwIfAborted();
4539
4781
  if (probeResult.ok && typeof desc.probeModels === "function" && !probeResult.models) {
4540
4782
  try {
4541
4783
  const ids = await desc.probeModels(target, probeCtx);
@@ -4543,6 +4785,7 @@ function createProvidersBundle(context) {
4543
4785
  } catch {
4544
4786
  }
4545
4787
  }
4788
+ options?.signal?.throwIfAborted();
4546
4789
  if (probeResult.ok && options?.reasoning !== false && typeof desc.probeReasoning === "function") {
4547
4790
  const settings = readConfig();
4548
4791
  const orchestratorTarget = settings.chat.target === target.id ? settings.chat.model : null;
@@ -4550,6 +4793,7 @@ function createProvidersBundle(context) {
4550
4793
  if (candidateModelId) {
4551
4794
  try {
4552
4795
  const result = await desc.probeReasoning(target, candidateModelId, probeCtx);
4796
+ options?.signal?.throwIfAborted();
4553
4797
  reasoningCache.set(reasoningCacheKey(target.id, candidateModelId), result.reasoning);
4554
4798
  const capabilityModelId = probeResult.capabilityModelId ?? null;
4555
4799
  if (capabilityModelId === null || capabilityModelId === candidateModelId) {
@@ -4570,10 +4814,15 @@ function createProvidersBundle(context) {
4570
4814
  }
4571
4815
  }
4572
4816
  }
4817
+ options?.signal?.throwIfAborted();
4573
4818
  const status = buildStatus(target, desc, probeResult, previous);
4574
4819
  statuses.set(target.id, status);
4575
4820
  if (probeResult.ok && probeResult.models !== void 0) {
4576
- recordTargetModelSnapshot(target, probeResult.models);
4821
+ recordTargetModelSnapshot(
4822
+ target,
4823
+ probeResult.models,
4824
+ probeResult.modelLabels ? { modelLabels: probeResult.modelLabels } : {}
4825
+ );
4577
4826
  }
4578
4827
  void recordEndpointSlotsFromStatus(status);
4579
4828
  context.bus.emit(BusChannels.ProviderHealth, { id: target.id, status });
@@ -4759,6 +5008,8 @@ export {
4759
5008
  setResidencyNoticeSink,
4760
5009
  setProtectedModelsProvider,
4761
5010
  withRunOverrides,
5011
+ gatewayRoutingObservationFromRecord,
5012
+ gatewayRoutingObservationLabel,
4762
5013
  applyModelCapabilityPatch,
4763
5014
  probeCapabilitiesForModel,
4764
5015
  resolveModelCapabilities,
@@ -4776,6 +5027,7 @@ export {
4776
5027
  isOrchestratorEligibleRuntime,
4777
5028
  isDispatchEligibleRuntime,
4778
5029
  modelResidencyForStatus,
5030
+ hasLiveModelCatalog,
4779
5031
  modelCandidatesForStatus,
4780
5032
  modelIdsForStatus,
4781
5033
  canonicalizeWireModelId,
@@ -4790,4 +5042,4 @@ export {
4790
5042
  resolveCostProvenance2 as resolveCostProvenance,
4791
5043
  ProvidersDomainModule
4792
5044
  };
4793
- //# sourceMappingURL=chunk-BYMNWQ7O.js.map
5045
+ //# sourceMappingURL=chunk-JSD46VO2.js.map