@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
@@ -2,12 +2,15 @@ import { createRequire as __clioCreateRequire } from "node:module"; const requir
2
2
  import {
3
3
  THINKING_LEVELS
4
4
  } from "./chunk-UXCU4E3T.js";
5
+ import {
6
+ runCommandVector
7
+ } from "./chunk-JSC3U7TI.js";
5
8
  import {
6
9
  catalogThinkingLevelsForRuntime,
7
10
  listCatalogModelsForRuntime,
8
11
  mergeCapabilities,
9
12
  synthesizeCatalogBackedModel
10
- } from "./chunk-O42A54GG.js";
13
+ } from "./chunk-5OIVVPHF.js";
11
14
  import {
12
15
  init_esm_shims
13
16
  } from "./chunk-3R73A4XB.js";
@@ -17,47 +20,243 @@ init_esm_shims();
17
20
 
18
21
  // src/domains/providers/runtimes/antigravity/antigravity-code.ts
19
22
  init_esm_shims();
20
- var ANTIGRAVITY_AUTH_NOTICE = "Uses your existing Antigravity (`agy`) login. Clio stores no Antigravity credentials. agy runs its own agent harness as a subprocess; Clio maps autonomy levels onto its CLI flags but cannot mediate individual agy tool calls.";
23
+
24
+ // src/core/external-diagnostic.ts
25
+ init_esm_shims();
26
+ var REDACTED = "[redacted]";
27
+ function redactExternalDiagnostic(input) {
28
+ return input.replace(/\b(?:authorization|proxy-authorization)\s*:\s*[^\r\n]+/giu, `Authorization: ${REDACTED}`).replace(/\b(?:set-cookie|cookie)\s*:\s*[^\r\n]+/giu, `Cookie: ${REDACTED}`).replace(/\bbearer\s+[A-Za-z0-9._~+/-]+=*/giu, `Bearer ${REDACTED}`).replace(
29
+ /\b(?:api[_-]?key|access[_-]?token|refresh[_-]?token|token|secret|password)\s*[:=]\s*[^\s,;]+/giu,
30
+ (match) => {
31
+ const separator = match.includes(":") ? ":" : "=";
32
+ return `${match.slice(0, match.indexOf(separator)).trim()}${separator}${REDACTED}`;
33
+ }
34
+ ).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu, REDACTED).replace(
35
+ /(?:~|\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*)\/\.(?:gemini\/antigravity-cli|antigravitycli)(?:\/[^\s]*)?/gu,
36
+ "[redacted credential path]"
37
+ ).replace(/https?:\/\/[^\s"'<>]+/giu, (url2) => {
38
+ try {
39
+ const parsed = new URL(url2);
40
+ if (/(?:auth|oauth|login|signin|callback)/iu.test(parsed.pathname)) return "[redacted authorization URL]";
41
+ parsed.username = "";
42
+ parsed.password = "";
43
+ parsed.search = "";
44
+ parsed.hash = "";
45
+ return parsed.toString();
46
+ } catch {
47
+ return REDACTED;
48
+ }
49
+ });
50
+ }
51
+ function boundedExternalDiagnostic(input, maxBytes = 8192) {
52
+ const redacted = redactExternalDiagnostic(input).trim();
53
+ const bytes = Buffer.from(redacted, "utf8");
54
+ if (bytes.byteLength <= maxBytes) return redacted;
55
+ return `${bytes.subarray(0, Math.max(0, maxBytes - 32)).toString("utf8")}
56
+ [diagnostic truncated]`;
57
+ }
58
+
59
+ // src/domains/providers/runtimes/antigravity/antigravity-code.ts
60
+ var ANTIGRAVITY_AUTH_NOTICE = "Experimental local delegation through your installed Antigravity (`agy`) CLI. Clio neither signs in nor stores or inspects Antigravity credentials. Run `agy` yourself and complete sign-in before probing this target.";
21
61
  var ANTIGRAVITY_MODELS = [
22
- "Gemini 3.5 Flash (High)",
23
- "Gemini 3.5 Flash (Medium)",
24
- "Gemini 3.5 Flash (Low)",
25
- "Gemini 3.1 Pro (High)",
26
- "Gemini 3.1 Pro (Low)",
27
- "Claude Sonnet 4.6 (Thinking)",
28
- "Claude Opus 4.6 (Thinking)",
29
- "GPT-OSS 120B (Medium)"
62
+ "gemini-3.8-flash-high",
63
+ "gemini-3.8-flash-medium",
64
+ "gemini-3.8-flash-low",
65
+ "gemini-3.1-pro-high",
66
+ "gemini-3.1-pro-low"
30
67
  ];
31
68
  var antigravityCapabilities = {
32
69
  chat: true,
33
- tools: true,
34
- toolCallFormat: "openai",
35
- reasoning: true,
36
- vision: true,
70
+ tools: false,
71
+ reasoning: false,
72
+ vision: false,
37
73
  audio: false,
38
74
  embeddings: false,
39
75
  rerank: false,
40
76
  fim: false,
41
- contextWindow: 1e6,
42
- maxTokens: 8192
77
+ contextWindow: 0,
78
+ maxTokens: 0
79
+ };
80
+ var ANTIGRAVITY_MAX_CATALOG_BYTES = 1024 * 1024;
81
+ var ANTIGRAVITY_MAX_DISCOVERED_MODELS = 4096;
82
+ var MAX_MODEL_ID_CHARS = 1024;
83
+ var MAX_MODEL_LABEL_CHARS = 1024;
84
+ var AntigravityCatalogError = class extends Error {
85
+ kind;
86
+ constructor(kind, message) {
87
+ super(message);
88
+ this.name = "AntigravityCatalogError";
89
+ this.kind = kind;
90
+ }
43
91
  };
92
+ function record(value) {
93
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : null;
94
+ }
95
+ function parseAntigravityModelCatalogDetails(output) {
96
+ let decoded;
97
+ try {
98
+ decoded = JSON.parse(output);
99
+ } catch {
100
+ throw new AntigravityCatalogError(
101
+ "unsupported-feature",
102
+ "agy returned an unreadable model catalog; update the Antigravity CLI and retry"
103
+ );
104
+ }
105
+ const envelope = record(decoded);
106
+ const command = record(envelope?.command);
107
+ const data = record(command?.data);
108
+ if (envelope?.status !== "SUCCESS") {
109
+ const detail = boundedExternalDiagnostic(
110
+ typeof envelope?.error === "string" ? envelope.error : typeof command?.error === "string" ? command.error : "agy could not list models"
111
+ );
112
+ const kind = classifyAntigravityDiagnostic(detail);
113
+ throw new AntigravityCatalogError(kind, antigravityProbeMessage(kind, detail));
114
+ }
115
+ if (command?.name !== "models" || !Array.isArray(data?.models)) {
116
+ throw new AntigravityCatalogError(
117
+ "unsupported-feature",
118
+ "agy returned an unsupported model catalog; update the Antigravity CLI and retry"
119
+ );
120
+ }
121
+ if (data.models.length === 0) {
122
+ throw new AntigravityCatalogError(
123
+ "catalog-unavailable",
124
+ "agy returned no available models; run `agy` locally and verify the signed-in account has model access"
125
+ );
126
+ }
127
+ if (data.models.length > ANTIGRAVITY_MAX_DISCOVERED_MODELS) {
128
+ throw new AntigravityCatalogError(
129
+ "catalog-unavailable",
130
+ `agy returned more than ${ANTIGRAVITY_MAX_DISCOVERED_MODELS} models; the authoritative catalog was refused rather than truncated`
131
+ );
132
+ }
133
+ const models = [];
134
+ const labels = {};
135
+ const seen = /* @__PURE__ */ new Set();
136
+ for (const value of data.models) {
137
+ const model = record(value);
138
+ const id = typeof model?.id === "string" ? model.id.trim() : "";
139
+ const label = typeof model?.label === "string" ? model.label.trim() : "";
140
+ if (id.length === 0 || id.length > MAX_MODEL_ID_CHARS || /[\r\n\0]/u.test(id)) {
141
+ throw new AntigravityCatalogError("catalog-unavailable", "agy returned an invalid model identifier");
142
+ }
143
+ if (label.length === 0 || label.length > MAX_MODEL_LABEL_CHARS || /[\r\n\0]/u.test(label)) {
144
+ throw new AntigravityCatalogError("catalog-unavailable", `agy returned an invalid label for model '${id}'`);
145
+ }
146
+ if (seen.has(id)) {
147
+ if (labels[id] !== label) {
148
+ throw new AntigravityCatalogError(
149
+ "catalog-unavailable",
150
+ `agy returned conflicting labels for duplicate model '${id}'`
151
+ );
152
+ }
153
+ continue;
154
+ }
155
+ seen.add(id);
156
+ models.push(id);
157
+ labels[id] = label;
158
+ }
159
+ return { models, labels };
160
+ }
161
+ function classifyAntigravityDiagnostic(detail) {
162
+ if (/(?:enoent|not found|cannot find|could not start|spawn .*agy)/iu.test(detail)) return "missing";
163
+ if (/(?:sign[ -]?in|log[ -]?in|unauthori[sz]ed|authenticat|credential|account.*required)/iu.test(detail)) {
164
+ return "authentication";
165
+ }
166
+ if (/(?:unknown|unsupported|unrecognized|invalid) (?:option|argument|command)|output-format|models command/iu.test(detail)) {
167
+ return "unsupported-feature";
168
+ }
169
+ return "generic";
170
+ }
171
+ function antigravityProbeMessage(kind, detail) {
172
+ const safeDetail = boundedExternalDiagnostic(detail || "no diagnostic was provided");
173
+ switch (kind) {
174
+ case "missing":
175
+ return "Antigravity CLI is not installed or `agy` is not on PATH";
176
+ case "authentication":
177
+ return `Antigravity sign-in is required; run \`agy\` yourself and complete sign-in (${safeDetail})`;
178
+ case "unsupported-feature":
179
+ return `the installed Antigravity CLI does not expose the required structured model catalog; update \`agy\` (${safeDetail})`;
180
+ case "catalog-unavailable":
181
+ return safeDetail;
182
+ case "cancelled":
183
+ return "Antigravity model discovery was cancelled";
184
+ default:
185
+ return `Antigravity model discovery failed: ${safeDetail}`;
186
+ }
187
+ }
188
+ async function probeAntigravityModelCatalog(ctx, runner = runCommandVector) {
189
+ const result = await runner("agy", ["--output-format", "json", "models"], {
190
+ cwd: process.cwd(),
191
+ workspaceRoot: process.cwd(),
192
+ timeoutMs: Math.max(1, ctx.httpTimeoutMs),
193
+ maxOutputBytes: ANTIGRAVITY_MAX_CATALOG_BYTES,
194
+ ...ctx.signal ? { signal: ctx.signal } : {}
195
+ });
196
+ if (result.aborted || result.timedOut) {
197
+ return {
198
+ ok: false,
199
+ latencyMs: result.durationMs,
200
+ failureKind: "cancelled",
201
+ error: antigravityProbeMessage("cancelled", "")
202
+ };
203
+ }
204
+ if (result.outputCapped) {
205
+ return {
206
+ ok: false,
207
+ latencyMs: result.durationMs,
208
+ failureKind: "catalog-unavailable",
209
+ error: `agy model catalog exceeded ${ANTIGRAVITY_MAX_CATALOG_BYTES} bytes`
210
+ };
211
+ }
212
+ if (result.exitCode !== 0) {
213
+ const detail = boundedExternalDiagnostic(result.stderr || result.stdout || `agy exited ${String(result.exitCode)}`);
214
+ const kind = classifyAntigravityDiagnostic(detail);
215
+ return { ok: false, latencyMs: result.durationMs, failureKind: kind, error: antigravityProbeMessage(kind, detail) };
216
+ }
217
+ try {
218
+ const catalog = parseAntigravityModelCatalogDetails(result.stdout);
219
+ return {
220
+ ok: true,
221
+ latencyMs: result.durationMs,
222
+ models: catalog.models,
223
+ modelLabels: catalog.labels
224
+ };
225
+ } catch (cause) {
226
+ const kind = cause instanceof AntigravityCatalogError ? cause.kind : "generic";
227
+ const detail = cause instanceof Error ? cause.message : String(cause);
228
+ return { ok: false, latencyMs: result.durationMs, failureKind: kind, error: boundedExternalDiagnostic(detail) };
229
+ }
230
+ }
44
231
  var antigravityCodeRuntime = {
45
232
  id: "antigravity-code",
46
- displayName: "Antigravity CLI",
233
+ displayName: "Antigravity CLI \u2014 experimental local delegation",
47
234
  kind: "subprocess",
48
235
  tier: "subscription",
49
- // Reuses the existing `google-generative-ai` api family: the worker branches
50
- // to its own runner before any pi-ai inference, so this only needs to be a
51
- // valid, google-backed family. The runner is selected by runtime id, and the
52
- // plain-text parser is named by `outputParser`.
53
- apiFamily: "google-generative-ai",
236
+ apiFamily: "external-agent-subprocess",
54
237
  auth: "none",
55
238
  authNotice: ANTIGRAVITY_AUTH_NOTICE,
56
239
  knownModels: [...ANTIGRAVITY_MODELS],
57
240
  binaryName: "agy",
58
- headlessCommand: "agy --print",
59
- outputParser: "antigravity-print-text",
241
+ headlessCommand: "agy --input-format stream-json --output-format stream-json",
242
+ outputParser: "antigravity-stream-json",
60
243
  defaultCapabilities: antigravityCapabilities,
244
+ externalAgentLoop: {
245
+ tools: "externally-governed-unobserved",
246
+ network: "externally-governed-unobserved",
247
+ budget: "external-one-shot",
248
+ generatingRetry: "forbidden",
249
+ modelCatalog: "live-authoritative"
250
+ },
251
+ async probe(_target, ctx) {
252
+ try {
253
+ return await probeAntigravityModelCatalog(ctx);
254
+ } catch (cause) {
255
+ const detail = boundedExternalDiagnostic(cause instanceof Error ? cause.message : String(cause));
256
+ const kind = classifyAntigravityDiagnostic(detail);
257
+ return { ok: false, failureKind: kind, error: antigravityProbeMessage(kind, detail) };
258
+ }
259
+ },
61
260
  synthesizeModel(target, wireModelId, kb) {
62
261
  return synthesizeCatalogBackedModel({
63
262
  target,
@@ -65,9 +264,9 @@ var antigravityCodeRuntime = {
65
264
  kb,
66
265
  defaultCapabilities: antigravityCapabilities,
67
266
  runtimeId: "antigravity-code",
68
- api: "google-generative-ai",
69
- provider: "google",
70
- defaultBaseUrl: "antigravity://local"
267
+ api: "external-agent-subprocess",
268
+ provider: "antigravity",
269
+ defaultBaseUrl: "external-agent://antigravity/local"
71
270
  });
72
271
  }
73
272
  };
@@ -577,7 +776,8 @@ function synthLocalModel(input) {
577
776
  ...target.gateway === true ? { gateway: true } : {},
578
777
  ...kb?.entry.family ? { family: kb.entry.family } : {},
579
778
  ...quirks ? { quirks } : {},
580
- ...target.lmstudio ? { lmstudio: target.lmstudio } : {}
779
+ ...target.lmstudio ? { lmstudio: target.lmstudio } : {},
780
+ ...target.litellm ? { litellm: target.litellm } : {}
581
781
  }
582
782
  };
583
783
  if (headers) model.headers = headers;
@@ -750,41 +950,41 @@ function isRecord2(value) {
750
950
  function positiveNumber(value) {
751
951
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
752
952
  }
753
- function firstPositiveNumber(record, keys) {
953
+ function firstPositiveNumber(record2, keys) {
754
954
  for (const key of keys) {
755
- const value = positiveNumber(record[key]);
955
+ const value = positiveNumber(record2[key]);
756
956
  if (value !== void 0) return value;
757
957
  }
758
958
  return void 0;
759
959
  }
760
- function capabilityListFlag(record, name) {
761
- const list = record.capabilities;
960
+ function capabilityListFlag(record2, name) {
961
+ const list = record2.capabilities;
762
962
  if (!Array.isArray(list)) return void 0;
763
963
  return list.some((entry) => entry === name) ? true : void 0;
764
964
  }
765
- function booleanFromAny(record, keys) {
965
+ function booleanFromAny(record2, keys) {
766
966
  for (const key of keys) {
767
- const value = record[key];
967
+ const value = record2[key];
768
968
  if (typeof value === "boolean") return value;
769
969
  }
770
970
  return void 0;
771
971
  }
772
- function nestedRecord(record, key) {
773
- const value = record[key];
972
+ function nestedRecord(record2, key) {
973
+ const value = record2[key];
774
974
  return isRecord2(value) ? value : null;
775
975
  }
776
- function firstString(record, keys) {
777
- if (!record) return void 0;
976
+ function firstString(record2, keys) {
977
+ if (!record2) return void 0;
778
978
  for (const key of keys) {
779
- const value = record[key];
979
+ const value = record2[key];
780
980
  if (typeof value === "string" && value.trim().length > 0) return value.trim();
781
981
  }
782
982
  return void 0;
783
983
  }
784
- function firstBoolean(record, keys) {
785
- if (!record) return void 0;
984
+ function firstBoolean(record2, keys) {
985
+ if (!record2) return void 0;
786
986
  for (const key of keys) {
787
- const value = record[key];
987
+ const value = record2[key];
788
988
  if (typeof value === "boolean") return value;
789
989
  }
790
990
  return void 0;
@@ -2678,8 +2878,8 @@ function lmStudioReasoningLevels(options) {
2678
2878
  return [...new Set(levels)];
2679
2879
  }
2680
2880
  function lmStudioReasoningEffort(level, options) {
2881
+ if (options?.includes("on") && options.includes("off")) return level === "off" ? "none" : void 0;
2681
2882
  if (level === "off") return "none";
2682
- if (options?.includes("on") && !options.includes("medium") && !options.includes("high")) return "low";
2683
2883
  if (level === "medium" && options?.includes("medium") !== false) return "medium";
2684
2884
  if ((level === "high" || level === "xhigh" || level === "max") && options?.includes("high") !== false) return "high";
2685
2885
  return "low";
@@ -3118,7 +3318,7 @@ var defaultCapabilities25 = {
3118
3318
  embeddings: false,
3119
3319
  rerank: false,
3120
3320
  fim: false,
3121
- structuredOutputs: "json-schema",
3321
+ structuredOutputs: "none",
3122
3322
  contextWindow: CLIO_MIN_CONTEXT_WINDOW,
3123
3323
  maxTokens: CLIO_MIN_MAX_OUTPUT_TOKENS
3124
3324
  };
@@ -3143,6 +3343,8 @@ function boolean(value) {
3143
3343
  }
3144
3344
  function capabilitiesFromLiteLLMModelInfo(info) {
3145
3345
  const caps = {};
3346
+ if (info.runtime === "lm-studio") caps.thinkingControlRuntime = "lmstudio";
3347
+ else if (info.runtime === "llama.cpp") caps.thinkingControlRuntime = "llamacpp";
3146
3348
  const contextWindow = positiveInteger(info.max_input_tokens) ?? positiveInteger(info.max_tokens);
3147
3349
  if (contextWindow !== void 0) caps.contextWindow = contextWindow;
3148
3350
  const maxTokens = positiveInteger(info.max_output_tokens);
@@ -3164,36 +3366,96 @@ function capabilitiesFromLiteLLMModelInfo(info) {
3164
3366
  caps.rerank = true;
3165
3367
  }
3166
3368
  if (info.mode === "chat") caps.chat = true;
3167
- if (boolean(info.supports_response_schema) === true) caps.structuredOutputs = "json-schema";
3369
+ const responseSchema = boolean(info.supports_response_schema);
3370
+ if (responseSchema !== void 0) caps.structuredOutputs = responseSchema ? "json-schema" : "none";
3168
3371
  return caps;
3169
3372
  }
3170
- var EMPTY_CATALOG = { models: [], modelCapabilities: {}, modelStates: {}, deployments: {} };
3373
+ var BOOLEAN_CAPABILITIES = [
3374
+ "chat",
3375
+ "tools",
3376
+ "reasoning",
3377
+ "vision",
3378
+ "audio",
3379
+ "embeddings",
3380
+ "rerank",
3381
+ "fim"
3382
+ ];
3383
+ function aggregateLiteLLMCapabilities(rows) {
3384
+ if (rows.length === 0) return {};
3385
+ const aggregate = {};
3386
+ for (const key of ["contextWindow", "maxTokens"]) {
3387
+ const values = rows.map((row) => row[key]);
3388
+ if (values.every((value) => typeof value === "number")) {
3389
+ aggregate[key] = Math.min(...values);
3390
+ }
3391
+ }
3392
+ for (const key of BOOLEAN_CAPABILITIES) {
3393
+ const values = rows.map((row) => row[key]);
3394
+ if (values.some((value) => value === false)) aggregate[key] = false;
3395
+ else if (values.every((value) => value === true)) aggregate[key] = true;
3396
+ }
3397
+ const controlRuntime = rows[0]?.thinkingControlRuntime;
3398
+ if (controlRuntime !== void 0 && rows.every((row) => row.thinkingControlRuntime === controlRuntime)) {
3399
+ aggregate.thinkingControlRuntime = controlRuntime;
3400
+ }
3401
+ const structuredOutputs = rows.map((row) => row.structuredOutputs);
3402
+ if (structuredOutputs.some((value) => value === "none")) aggregate.structuredOutputs = "none";
3403
+ else if (structuredOutputs.every((value) => value === "json-schema")) aggregate.structuredOutputs = "json-schema";
3404
+ return aggregate;
3405
+ }
3406
+ var EMPTY_CATALOG = {
3407
+ models: [],
3408
+ modelCapabilities: {},
3409
+ modelStates: {},
3410
+ deployments: {},
3411
+ authFailed: false
3412
+ };
3413
+ function isAuthError(leg) {
3414
+ return !leg.ok && /^HTTP 40[13]\b/u.test(leg.error ?? "");
3415
+ }
3171
3416
  async function fetchCatalog(base, ctx, headers) {
3172
3417
  const detailOpts = { url: `${base}/v1/model/info`, timeoutMs: ctx.httpTimeoutMs, headers };
3173
3418
  const detail = await (ctx.signal ? probeJson({ ...detailOpts, signal: ctx.signal }) : probeJson(detailOpts));
3174
3419
  if (detail.ok && Array.isArray(detail.data?.data)) {
3175
- const catalog = { models: [], modelCapabilities: {}, modelStates: {}, deployments: {} };
3420
+ const catalog = {
3421
+ models: [],
3422
+ modelCapabilities: {},
3423
+ modelStates: {},
3424
+ deployments: {},
3425
+ authFailed: false
3426
+ };
3427
+ const capabilityRows = {};
3176
3428
  for (const row of detail.data.data) {
3177
3429
  if (typeof row?.model_name !== "string" || row.model_name.length === 0) continue;
3178
3430
  const alias = row.model_name;
3179
- if (catalog.deployments[alias] !== void 0) continue;
3180
- catalog.models.push(alias);
3431
+ if (catalog.deployments[alias] === void 0) {
3432
+ catalog.models.push(alias);
3433
+ catalog.deployments[alias] = [];
3434
+ capabilityRows[alias] = [];
3435
+ }
3181
3436
  const caps = row.model_info ? capabilitiesFromLiteLLMModelInfo(row.model_info) : {};
3182
- if (Object.keys(caps).length > 0) catalog.modelCapabilities[alias] = caps;
3437
+ capabilityRows[alias]?.push(caps);
3183
3438
  const upstream = row.litellm_params?.model;
3184
3439
  const apiBase = row.litellm_params?.api_base;
3185
- catalog.deployments[alias] = {
3440
+ catalog.deployments[alias]?.push({
3186
3441
  model: typeof upstream === "string" ? upstream : alias,
3187
3442
  ...typeof apiBase === "string" ? { apiBase } : {}
3188
- };
3443
+ });
3444
+ }
3445
+ for (const alias of catalog.models) {
3446
+ const caps = aggregateLiteLLMCapabilities(capabilityRows[alias] ?? []);
3447
+ if (Object.keys(caps).length > 0) catalog.modelCapabilities[alias] = caps;
3189
3448
  }
3190
3449
  if (catalog.models.length > 0) return catalog;
3191
3450
  }
3451
+ const detailAuthFailed = isAuthError(detail);
3192
3452
  const listOpts = { url: `${base}/v1/models`, timeoutMs: ctx.httpTimeoutMs, headers };
3193
3453
  const list = await (ctx.signal ? probeJson({ ...listOpts, signal: ctx.signal }) : probeJson(listOpts));
3194
- if (!list.ok || !Array.isArray(list.data?.data)) return EMPTY_CATALOG;
3454
+ if (!list.ok || !Array.isArray(list.data?.data)) {
3455
+ return { ...EMPTY_CATALOG, authFailed: detailAuthFailed || isAuthError(list) };
3456
+ }
3195
3457
  const models = list.data.data.map((row) => typeof row?.id === "string" ? row.id : null).filter((id) => id !== null && id.length > 0);
3196
- return { models, modelCapabilities: {}, modelStates: {}, deployments: {} };
3458
+ return { models, modelCapabilities: {}, modelStates: {}, deployments: {}, authFailed: false };
3197
3459
  }
3198
3460
  var litellmRuntime = {
3199
3461
  id: "litellm",
@@ -3214,8 +3476,9 @@ var litellmRuntime = {
3214
3476
  if (catalog.models.length === 0) {
3215
3477
  const result2 = {
3216
3478
  ok: false,
3217
- error: "gateway is live but served no model catalog; check the target's API key"
3479
+ error: catalog.authFailed ? "gateway rejected the key" : "gateway is live but served no model catalog; check the target's API key"
3218
3480
  };
3481
+ if (catalog.authFailed) result2.authFailed = true;
3219
3482
  if (live.latencyMs !== void 0) result2.latencyMs = live.latencyMs;
3220
3483
  return result2;
3221
3484
  }
@@ -3235,7 +3498,18 @@ var litellmRuntime = {
3235
3498
  if (configured && !catalog.models.includes(configured)) {
3236
3499
  notes.push(`configured model '${configured}' is not in the gateway catalog`);
3237
3500
  }
3238
- const routed = Object.entries(catalog.deployments).map(([alias, deployment]) => `${alias}=${deployment.model}`).sort();
3501
+ const routeEntries = Object.entries(catalog.deployments);
3502
+ const physical = routeEntries.filter(([alias, deployments]) => {
3503
+ const slash = alias.indexOf("/");
3504
+ if (slash <= 0 || deployments.length !== 1) return false;
3505
+ const upstream = deployments[0]?.model.replace(/^openai\//u, "");
3506
+ return upstream === alias.slice(slash + 1);
3507
+ });
3508
+ if (physical.length > 0) notes.push(`physical routes: ${physical.length} node/model names map one-to-one`);
3509
+ const routed = routeEntries.filter(([alias]) => !physical.some(([physicalAlias]) => physicalAlias === alias)).map(([alias, deployments]) => {
3510
+ const models = [...new Set(deployments.map((deployment) => deployment.model))];
3511
+ return `${alias}=${models.join("|")}`;
3512
+ }).sort();
3239
3513
  if (routed.length > 0) notes.push(`routes: ${routed.join(", ")}`);
3240
3514
  if (notes.length > 0) result.notes = notes;
3241
3515
  return result;
@@ -3318,8 +3592,9 @@ export {
3318
3592
  lmStudioReasoningEffort,
3319
3593
  listLmStudioModels,
3320
3594
  greetLmStudio,
3595
+ boundedExternalDiagnostic,
3321
3596
  formatContextWindowSlots,
3322
3597
  BUILTIN_RUNTIMES,
3323
3598
  registerBuiltinRuntimes
3324
3599
  };
3325
- //# sourceMappingURL=chunk-IMXMHHMQ.js.map
3600
+ //# sourceMappingURL=chunk-VW6DOEDG.js.map
@@ -2,12 +2,12 @@ import { createRequire as __clioCreateRequire } from "node:module"; const requir
2
2
  import {
3
3
  canonicalJson,
4
4
  sha256
5
- } from "./chunk-B74PXLU7.js";
5
+ } from "./chunk-IWT4SF4R.js";
6
6
  import {
7
7
  addResponseModelIdObservationCount,
8
8
  emptyResponseModelIdObservationCounts,
9
9
  responseModelIdObservationFromRecord
10
- } from "./chunk-X7IARSHT.js";
10
+ } from "./chunk-JKKCYP3C.js";
11
11
  import {
12
12
  uncachedPrefillTokens
13
13
  } from "./chunk-3DPEIQKN.js";
@@ -17,16 +17,16 @@ import {
17
17
  import {
18
18
  ceilChars,
19
19
  extractReasoningTokens
20
- } from "./chunk-CWVRRIEI.js";
20
+ } from "./chunk-NZMNUPZZ.js";
21
21
  import {
22
22
  settingsPath
23
- } from "./chunk-34BHNEE3.js";
23
+ } from "./chunk-GHS5EBTQ.js";
24
24
  import {
25
25
  expandConfigPath
26
26
  } from "./chunk-336NSSKI.js";
27
27
  import {
28
28
  isEngineContextOverflow
29
- } from "./chunk-VXMFAE2W.js";
29
+ } from "./chunk-YPC6ZR5L.js";
30
30
  import {
31
31
  init_esm_shims
32
32
  } from "./chunk-3R73A4XB.js";
@@ -426,7 +426,16 @@ function assistantSessionPayload(message, failure) {
426
426
  if (Array.isArray(raw.content)) payload.content = raw.content;
427
427
  if (thinking.length > 0) payload.thinking = thinking;
428
428
  payload.responseModelIdObservation = responseModelIdObservationFromRecord(raw, "not-observed");
429
- for (const key of ["usage", "api", "provider", "model", "responseModel", "responseId", "diagnostics"]) {
429
+ for (const key of [
430
+ "usage",
431
+ "api",
432
+ "provider",
433
+ "model",
434
+ "responseModel",
435
+ "responseId",
436
+ "gatewayRouting",
437
+ "diagnostics"
438
+ ]) {
430
439
  if (raw[key] !== void 0) payload[key] = raw[key];
431
440
  }
432
441
  if (failure && !isSelfExplainingAbort({ stopReason: raw.stopReason, errorMessage: raw.errorMessage, text })) {
@@ -1185,4 +1194,4 @@ export {
1185
1194
  readFileArgsAsync,
1186
1195
  expandInlineFileReferencesAsync
1187
1196
  };
1188
- //# sourceMappingURL=chunk-XOXV5GKE.js.map
1197
+ //# sourceMappingURL=chunk-W6RRQCPQ.js.map
@@ -2,22 +2,22 @@ import { createRequire as __clioCreateRequire } from "node:module"; const requir
2
2
  import {
3
3
  readStrictLayeredSettings,
4
4
  updateLayeredSettings
5
- } from "./chunk-M2DAX4F6.js";
5
+ } from "./chunk-4WR7VSYB.js";
6
+ import {
7
+ assertAgentIdNamespace
8
+ } from "./chunk-DR52UMZW.js";
6
9
  import {
7
10
  resolveShutdownHookBudgetMs,
8
11
  runWithBudget,
9
12
  writeShutdownNotice
10
13
  } from "./chunk-4O6MANBS.js";
11
14
  import {
12
- assertAgentIdNamespace
13
- } from "./chunk-DR52UMZW.js";
15
+ formatSettingsFailure,
16
+ settingsPath
17
+ } from "./chunk-GHS5EBTQ.js";
14
18
  import {
15
19
  getSharedBus
16
20
  } from "./chunk-PMZVFWSR.js";
17
- import {
18
- formatSettingsFailure,
19
- settingsPath
20
- } from "./chunk-34BHNEE3.js";
21
21
  import {
22
22
  BusChannels
23
23
  } from "./chunk-F4EKGO4N.js";
@@ -377,4 +377,4 @@ export {
377
377
  ConfigDomainModule,
378
378
  createConfigDomainModule
379
379
  };
380
- //# sourceMappingURL=chunk-CYZW7JHJ.js.map
380
+ //# sourceMappingURL=chunk-WBKFA554.js.map
@@ -4,23 +4,23 @@ import {
4
4
  loadProjectRules,
5
5
  renderOperatorProfile,
6
6
  selectActiveRules
7
- } from "./chunk-SSEYRH53.js";
7
+ } from "./chunk-KK4JZPBQ.js";
8
8
  import {
9
9
  loadFragments
10
- } from "./chunk-AZ4WMN4W.js";
10
+ } from "./chunk-Y3CBHOR6.js";
11
11
  import {
12
12
  compile,
13
13
  compileWorker
14
- } from "./chunk-I66ZTYNP.js";
14
+ } from "./chunk-AF4YM7Z4.js";
15
15
  import {
16
16
  sha256
17
- } from "./chunk-B74PXLU7.js";
17
+ } from "./chunk-IWT4SF4R.js";
18
18
  import {
19
19
  classifyProjectPreload
20
20
  } from "./chunk-JVCV3ICN.js";
21
21
  import {
22
22
  isUserVisibleAgent
23
- } from "./chunk-PGF63K6I.js";
23
+ } from "./chunk-B4OAX3SI.js";
24
24
  import {
25
25
  BusChannels
26
26
  } from "./chunk-F4EKGO4N.js";
@@ -36,7 +36,7 @@ var FLEET_PROMPT_PURPOSE_MAX_CHARS = 64;
36
36
  var FLEET_HANDOFF_RULE = "A file you assigned to a worker is not yours to edit while its dispatch is pending or after it succeeds; if you already changed it, say so in your report.";
37
37
  var FLEET_REFUSAL_DISCLOSURE = "When admission refuses a dispatch, report the refusal and the reason it gave; never substitute another agent without saying why.";
38
38
  var FLEET_ANTI_CHURN_RULE = "A dispatch with the same target files and the same goal as one you already ran is a repeat however differently you word it: read that run's receipt, or run the check yourself, instead of dispatching again.";
39
- var FLEET_SPECIALIST_ROUTING = "Pick by job: receipts, diffs, or telemetry -> provenance; external docs -> researcher; broad recon -> scout; tests -> tester; gates or review -> verifier.";
39
+ var FLEET_SPECIALIST_ROUTING = "Pick by job: supplied URLs, standards, or papers -> researcher; current ecosystems or an open-world second opinion -> world-knowledge; repository recon -> scout; receipts -> provenance; tests -> tester; gates -> verifier.";
40
40
  function fleetPromptPurpose(description) {
41
41
  const trimmed = description.trim().replace(/\s+/gu, " ");
42
42
  if (trimmed.length === 0) return "";
@@ -720,4 +720,4 @@ export {
720
720
  createPromptsDomainModule,
721
721
  SchedulingDomainModule
722
722
  };
723
- //# sourceMappingURL=chunk-BO7Y52RY.js.map
723
+ //# sourceMappingURL=chunk-WCXUNS7U.js.map