@iowarp/clio-coder 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -16,7 +16,7 @@ import { emitResidencyMutation, emitResidencyNotice, reconcileResidency, residen
16
16
  import { withResidencyLock } from "./residency-lock.js";
17
17
 
18
18
  interface LmStudioModelMetadata {
19
- clio?: {
19
+ clioCoder?: {
20
20
  targetId: string;
21
21
  runtimeId: string;
22
22
  lifecycle?: "user-managed" | "clio-coder-managed";
@@ -42,8 +42,8 @@ function responseInstanceId(data: unknown): string | undefined {
42
42
  return typeof id === "string" && id.trim().length > 0 ? id.trim() : undefined;
43
43
  }
44
44
 
45
- function metadata(model: Model<Api>): NonNullable<LmStudioModelMetadata["clio"]> | undefined {
46
- return (model as Model<Api> & LmStudioModelMetadata).clio;
45
+ function metadata(model: Model<Api>): NonNullable<LmStudioModelMetadata["clioCoder"]> | undefined {
46
+ return (model as Model<Api> & LmStudioModelMetadata).clioCoder;
47
47
  }
48
48
 
49
49
  function targetForModel(model: Model<"openai-completions">): TargetDescriptor | null {
@@ -32,7 +32,7 @@ import {
32
32
  } from "../../domains/providers/index.js";
33
33
  import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/types/local-model-quirks.js";
34
34
  import { calculateEngineCost } from "../ai.js";
35
- import { createGemmaChannelFilter } from "../gemma-channel-filter.js";
35
+ import { createGemmaChannelFilter, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
36
36
  import { createSentinelStripper } from "../strip-tokenizer-sentinels.js";
37
37
  import { remainingContextMaxTokens } from "./output-budget.js";
38
38
  import { type ResidencyAdapter, reconcileResidency, residencyManagedFor } from "./residency.js";
@@ -43,7 +43,7 @@ import type { EngineApiProvider } from "./types.js";
43
43
  const REASONING_CHARS_PER_TOKEN = 4;
44
44
 
45
45
  interface ClioRuntimeMetadata {
46
- clio?: {
46
+ clioCoder?: {
47
47
  targetId: string;
48
48
  runtimeId: string;
49
49
  /** Present only when settings set the target lifecycle explicitly. */
@@ -55,11 +55,11 @@ interface ClioRuntimeMetadata {
55
55
  }
56
56
 
57
57
  function clioQuirks(model: Model<"ollama-native">): LocalModelQuirks | undefined {
58
- return (model as Model<"ollama-native"> & ClioRuntimeMetadata).clio?.quirks;
58
+ return (model as Model<"ollama-native"> & ClioRuntimeMetadata).clioCoder?.quirks;
59
59
  }
60
60
 
61
61
  function ollamaTargetId(model: Model<"ollama-native">): string {
62
- return (model as Model<"ollama-native"> & ClioRuntimeMetadata).clio?.targetId ?? model.provider;
62
+ return (model as Model<"ollama-native"> & ClioRuntimeMetadata).clioCoder?.targetId ?? model.provider;
63
63
  }
64
64
 
65
65
  /**
@@ -74,7 +74,7 @@ function ollamaTargetId(model: Model<"ollama-native">): string {
74
74
  async function reconcileOllamaResidency(model: Model<"ollama-native">, headers: Record<string, string>): Promise<void> {
75
75
  const baseUrl = model.baseUrl;
76
76
  if (!baseUrl) return;
77
- const metadata = (model as Model<"ollama-native"> & ClioRuntimeMetadata).clio;
77
+ const metadata = (model as Model<"ollama-native"> & ClioRuntimeMetadata).clioCoder;
78
78
  const adapter: ResidencyAdapter = {
79
79
  targetKey: residencyTargetKey("ollama-native", baseUrl),
80
80
  targetId: ollamaTargetId(model),
@@ -384,7 +384,7 @@ function runStream(
384
384
  let doneReason: string | undefined;
385
385
  const sentinelStripper = createSentinelStripper();
386
386
  const resolved = resolveModelRuntimeCapabilitiesForModel(model, thinkingLevel);
387
- const channelFilter = resolved.family === "gemma-4" ? createGemmaChannelFilter() : null;
387
+ const channelFilter = usesGemmaChannelMarkers(resolved.modelId) ? createGemmaChannelFilter() : null;
388
388
  const closeActiveThinking = () => {
389
389
  if (!activeThinking) return;
390
390
  stream.push({
@@ -17,6 +17,11 @@ import {
17
17
  } from "@earendil-works/pi-ai";
18
18
  import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
19
19
  import type { BackendCompletionTimings, BackendTimingsSource } from "../../core/cache-telemetry.js";
20
+ import {
21
+ type GatewayRoutingObservation,
22
+ liteLLMGatewayRoutingFromHeaders,
23
+ liteLLMRouteFailureMessage,
24
+ } from "../../core/gateway-routing.js";
20
25
  import type { ResponseModelIdObservation } from "../../core/response-model-id.js";
21
26
  import {
22
27
  type AppliedThinking,
@@ -27,13 +32,13 @@ import {
27
32
  import { lmStudioReasoningEffort } from "../../domains/providers/runtimes/common/lmstudio-http.js";
28
33
  import type { ThinkingLevel } from "../../domains/providers/types/capability-flags.js";
29
34
  import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/types/local-model-quirks.js";
30
- import type { LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
31
- import { filterGemmaChannelStream } from "../gemma-channel-filter.js";
35
+ import type { LiteLLMTargetSettings, LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
36
+ import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
32
37
  import { HarmonyResponseParser } from "../harmony-response.js";
33
38
  import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
34
39
  import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
35
40
  import { ensureLmStudioResidency } from "./lmstudio.js";
36
- import { LOCAL_TOOL_TURN_MAX_OUTPUT_TOKENS, remainingContextMaxTokens } from "./output-budget.js";
41
+ import { remainingContextMaxTokens } from "./output-budget.js";
37
42
  import { residencyManagedFor } from "./residency.js";
38
43
  import { mergeSamplingOverride } from "./sampling-overrides.js";
39
44
  import type { EngineApiProvider } from "./types.js";
@@ -42,6 +47,8 @@ declare module "@earendil-works/pi-ai" {
42
47
  interface AssistantMessage {
43
48
  /** Direct observation of model-id presence in an OpenAI-compatible response. */
44
49
  responseModelIdObservation?: ResponseModelIdObservation;
50
+ /** Route, fallback, retry, and proxy timing facts reported by LiteLLM. */
51
+ gatewayRouting?: GatewayRoutingObservation;
45
52
  /** Backend-reported prefill and prediction timings when available. */
46
53
  backendTimings?: BackendCompletionTimings;
47
54
  }
@@ -60,7 +67,7 @@ const REASONING_CHARS_PER_TOKEN = 4;
60
67
  export { estimateInputTokensFromContext, remainingContextMaxTokens } from "./output-budget.js";
61
68
 
62
69
  interface ClioRuntimeMetadata {
63
- clio?: {
70
+ clioCoder?: {
64
71
  targetId: string;
65
72
  runtimeId: string;
66
73
  /** Present only when settings set the target lifecycle explicitly. */
@@ -69,17 +76,18 @@ interface ClioRuntimeMetadata {
69
76
  quirks?: LocalModelQuirks;
70
77
  chatTemplateKwargsUnsupported?: boolean;
71
78
  lmstudio?: LmStudioTargetSettings;
79
+ litellm?: LiteLLMTargetSettings;
72
80
  lmstudioReasoningOptions?: ReadonlyArray<string>;
73
81
  lmstudioDefaultModel?: string;
74
82
  };
75
83
  }
76
84
 
77
85
  function chatTemplateKwargsUnsupported(model: Model<Api>): boolean {
78
- return (model as Model<Api> & ClioRuntimeMetadata).clio?.chatTemplateKwargsUnsupported === true;
86
+ return (model as Model<Api> & ClioRuntimeMetadata).clioCoder?.chatTemplateKwargsUnsupported === true;
79
87
  }
80
88
 
81
89
  function clioQuirks(model: Model<"openai-completions">): LocalModelQuirks | undefined {
82
- return (model as Model<"openai-completions"> & ClioRuntimeMetadata).clio?.quirks;
90
+ return (model as Model<"openai-completions"> & ClioRuntimeMetadata).clioCoder?.quirks;
83
91
  }
84
92
 
85
93
  function pickSamplingProfile(
@@ -101,6 +109,7 @@ interface ResponseModelIdCapture {
101
109
  modelIdDone: boolean;
102
110
  backendTimings: BackendCompletionTimings | null;
103
111
  backendTimingsSource: BackendTimingsSource | null;
112
+ gatewayRouting: GatewayRoutingObservation | null;
104
113
  buffer: string;
105
114
  decoder: TextDecoder | null;
106
115
  }
@@ -138,7 +147,7 @@ function backendCompletionTimings(value: unknown, source: BackendTimingsSource):
138
147
  }
139
148
 
140
149
  function backendTimingsSourceForModel(model: Model<Api>): BackendTimingsSource | null {
141
- const metadata = (model as Model<Api> & ClioRuntimeMetadata).clio;
150
+ const metadata = (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
142
151
  if (model.provider === "llamacpp" && metadata?.runtimeId === "llamacpp") return "llamacpp-timings";
143
152
  if (model.provider === "lmstudio" && metadata?.runtimeId === "lmstudio") return "lmstudio-timings";
144
153
  return null;
@@ -199,7 +208,10 @@ function observeResponseModelIdBytes(
199
208
  if (captureCanStopEarly(capture) || flush) capture.decoder = null;
200
209
  }
201
210
 
202
- function captureResponseModelId(response: Response, capture: ResponseModelIdCapture): Response {
211
+ function captureResponseModelId(response: Response, capture: ResponseModelIdCapture, model: Model<Api>): Response {
212
+ if (runtimeMetadata(model)?.runtimeId === "litellm") {
213
+ capture.gatewayRouting = liteLLMGatewayRoutingFromHeaders(response.headers);
214
+ }
203
215
  if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
204
216
  return response;
205
217
  }
@@ -234,6 +246,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
234
246
  modelIdDone: false,
235
247
  backendTimings: null,
236
248
  backendTimingsSource: backendTimingsSourceForModel(model),
249
+ gatewayRouting: null,
237
250
  buffer: "",
238
251
  decoder: new TextDecoder(),
239
252
  };
@@ -241,7 +254,7 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
241
254
  options.fetch ?? ((input, init) => globalThis.fetch(input, init));
242
255
  const capturedOptions = {
243
256
  ...options,
244
- fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture),
257
+ fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture, model),
245
258
  } as TOptions;
246
259
  const source = sourceFactory(capturedOptions);
247
260
  const annotated = createAssistantMessageEventStream();
@@ -255,9 +268,11 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
255
268
  : { state: "not-observed" };
256
269
  if (event.type === "done") {
257
270
  event.message.responseModelIdObservation = observation;
271
+ if (capture.gatewayRouting !== null) event.message.gatewayRouting = capture.gatewayRouting;
258
272
  if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
259
273
  } else if (event.type === "error") {
260
274
  event.error.responseModelIdObservation = observation;
275
+ if (capture.gatewayRouting !== null) event.error.gatewayRouting = capture.gatewayRouting;
261
276
  if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
262
277
  }
263
278
  annotated.push(event as AssistantMessageEvent);
@@ -271,6 +286,31 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
271
286
  return annotated;
272
287
  }
273
288
 
289
+ /** Make a failed physical gateway route final and useful to an operator. */
290
+ function withLiteLLMRouteFailureAdvice(
291
+ model: Model<"openai-completions">,
292
+ source: AssistantMessageEventStream,
293
+ ): AssistantMessageEventStream {
294
+ const metadata = runtimeMetadata(model);
295
+ if (metadata?.runtimeId !== "litellm") return source;
296
+ const advised = createAssistantMessageEventStream();
297
+ (async () => {
298
+ try {
299
+ for await (const event of source) {
300
+ if (event.type === "error") {
301
+ event.error.errorMessage = liteLLMRouteFailureMessage(event.error.errorMessage, metadata.targetId, model.id);
302
+ }
303
+ advised.push(event as AssistantMessageEvent);
304
+ }
305
+ advised.end();
306
+ } catch (err) {
307
+ const message = err instanceof Error ? err.message : String(err);
308
+ throw new Error(liteLLMRouteFailureMessage(message, metadata.targetId, model.id));
309
+ }
310
+ })();
311
+ return advised;
312
+ }
313
+
274
314
  function samplingParamsFromProfile(profile: SamplingProfile): Record<string, unknown> {
275
315
  return {
276
316
  ...(profile.topP !== undefined ? { top_p: profile.topP } : {}),
@@ -371,8 +411,23 @@ function applyThinkingPayload(
371
411
  resolved: ResolvedModelRuntimeCapabilities,
372
412
  model: Model<Api>,
373
413
  ): Record<string, unknown> {
374
- if (applied.mechanism === "none") return stripThinkingRequestFields(payload);
375
- if (applied.mechanism === "always-on") return payload;
414
+ if (applied.mechanism === "none") {
415
+ const next = stripThinkingRequestFields(payload);
416
+ if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
417
+ const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
418
+ next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
419
+ }
420
+ return next;
421
+ }
422
+ if (applied.mechanism === "always-on") {
423
+ if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
424
+ const next: Record<string, unknown> = { ...payload };
425
+ const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
426
+ next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
427
+ return next;
428
+ }
429
+ return payload;
430
+ }
376
431
  const next: Record<string, unknown> = { ...payload };
377
432
  if (
378
433
  resolved.request.reasoningEffort &&
@@ -380,6 +435,17 @@ function applyThinkingPayload(
380
435
  ) {
381
436
  next.reasoning_effort = resolved.request.reasoningEffort;
382
437
  }
438
+ // LiteLLM generic openai/<local model> routes otherwise drop this standard
439
+ // parameter. Allow only the effort this model/runtime actually resolved;
440
+ // unknown off controls and unrelated caller parameters gain no allowance.
441
+ if (
442
+ resolved.runtimeId === "litellm" &&
443
+ resolved.request.reasoningEffort &&
444
+ next.reasoning_effort === resolved.request.reasoningEffort
445
+ ) {
446
+ const allowed = Array.isArray(next.allowed_openai_params) ? next.allowed_openai_params : [];
447
+ next.allowed_openai_params = [...new Set([...allowed, "reasoning_effort"])];
448
+ }
383
449
  if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
384
450
  const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
385
451
  next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
@@ -418,15 +484,15 @@ function applyLmStudioPayload(
418
484
  if (request?.ttlSeconds !== undefined) next.ttl = request.ttlSeconds;
419
485
  if (request?.draftModel !== undefined) next.draft_model = request.draftModel;
420
486
  if (resolved.thinking.mechanism === "none" || resolved.thinking.mechanism === "always-on") return next;
421
- const resolvedEffort =
422
- resolved.request.reasoningEffort ??
423
- lmStudioReasoningEffort(resolved.thinking.effectiveLevel, runtimeMetadata(model)?.lmstudioReasoningOptions);
487
+ const resolvedEffort = runtimeMetadata(model)?.lmstudioReasoningOptions
488
+ ? lmStudioReasoningEffort(resolved.thinking.effectiveLevel, runtimeMetadata(model)?.lmstudioReasoningOptions)
489
+ : (resolved.request.reasoningEffort ?? lmStudioReasoningEffort(resolved.thinking.effectiveLevel));
424
490
  switch (request?.reasoning) {
425
491
  case "off":
426
- next.reasoning_effort = "none";
492
+ next.reasoning_effort = lmStudioReasoningEffort("off", runtimeMetadata(model)?.lmstudioReasoningOptions);
427
493
  break;
428
494
  case "on":
429
- next.reasoning_effort = "low";
495
+ next.reasoning_effort = lmStudioReasoningEffort("low", runtimeMetadata(model)?.lmstudioReasoningOptions);
430
496
  break;
431
497
  case "low":
432
498
  case "medium":
@@ -563,21 +629,53 @@ function withRemainingContextBudget<TOptions extends StreamOptions>(
563
629
  context: Context,
564
630
  options: TOptions | undefined,
565
631
  ): TOptions {
566
- const metadata = runtimeMetadata(model);
567
- const localToolOutputLimit =
568
- options?.maxTokens === undefined &&
569
- (context.tools?.length ?? 0) > 0 &&
570
- (model.provider === "llamacpp" || metadata?.runtimeId === "llamacpp")
571
- ? LOCAL_TOOL_TURN_MAX_OUTPUT_TOKENS
572
- : undefined;
573
632
  return {
574
633
  ...(options ?? {}),
575
- maxTokens: remainingContextMaxTokens(
576
- model,
577
- context,
578
- options,
579
- localToolOutputLimit === undefined ? undefined : { maxOutputTokens: localToolOutputLimit },
580
- ),
634
+ maxTokens: remainingContextMaxTokens(model, context, options),
635
+ } as TOptions;
636
+ }
637
+
638
+ function hasHeader(headers: Readonly<Record<string, unknown>> | undefined, name: string): boolean {
639
+ if (!headers) return false;
640
+ const wanted = name.toLowerCase();
641
+ return Object.keys(headers).some((key) => key.toLowerCase() === wanted);
642
+ }
643
+
644
+ /**
645
+ * Apply LiteLLM's request-control headers at the final transport boundary.
646
+ *
647
+ * The OpenAI SDK otherwise retries twice below Clio's visible recovery loop and
648
+ * below LiteLLM's own router, multiplying a single failure into several hidden
649
+ * attempts. Gateway requests use zero client retries by default; optional
650
+ * `numRetries` controls the proxy router itself, where any configured attempts
651
+ * remain observable. A physical-routing gateway should leave it at zero.
652
+ */
653
+ function withLiteLLMRequestOptions<TOptions extends StreamOptions>(
654
+ model: Model<"openai-completions">,
655
+ options: TOptions,
656
+ ): TOptions {
657
+ const metadata = runtimeMetadata(model);
658
+ if (metadata?.runtimeId !== "litellm") return options;
659
+ const request = metadata.litellm?.request;
660
+ const modelHeaders = model.headers as Readonly<Record<string, unknown>> | undefined;
661
+ const optionHeaders = options.headers as Readonly<Record<string, unknown>> | undefined;
662
+ const headers: Record<string, string | null> = { ...(options.headers ?? {}) };
663
+ const setDefault = (name: string, value: string | undefined): void => {
664
+ if (value === undefined || hasHeader(modelHeaders, name) || hasHeader(optionHeaders, name)) return;
665
+ headers[name] = value;
666
+ };
667
+ setDefault("x-litellm-tags", ["clio-coder", ...(request?.tags ?? [])].join(","));
668
+ if (request?.sendSessionId !== false) setDefault("x-litellm-session-id", options.sessionId);
669
+ setDefault("x-litellm-timeout", request?.timeoutSeconds?.toString());
670
+ setDefault("x-litellm-stream-timeout", request?.streamTimeoutSeconds?.toString());
671
+ setDefault("x-litellm-num-retries", request?.numRetries?.toString());
672
+ return {
673
+ ...options,
674
+ headers,
675
+ // Never hide duplicate attempts inside the OpenAI SDK beneath Clio's
676
+ // operator-visible failure. The gateway may still be configured to retry,
677
+ // but physical-routing deployments should keep that policy at zero too.
678
+ maxRetries: options.maxRetries ?? 0,
581
679
  } as TOptions;
582
680
  }
583
681
 
@@ -593,8 +691,8 @@ function hasEmptyArguments(args: Record<string, unknown>): boolean {
593
691
  return Object.keys(args).length === 0;
594
692
  }
595
693
 
596
- function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["clio"]> | undefined {
597
- return (model as Model<Api> & ClioRuntimeMetadata).clio;
694
+ function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["clioCoder"]> | undefined {
695
+ return (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
598
696
  }
599
697
 
600
698
  function emptyErrorMessage(model: Model<"openai-completions">, message: string): AssistantMessage {
@@ -918,15 +1016,18 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
918
1016
  const resolved = resolvedCapabilitiesForModel(model, defaultLevel);
919
1017
  const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
920
1018
  const withSamplers = withSamplingOverrides(model, options, resolved);
1019
+ const withGatewayOptions = withLiteLLMRequestOptions(
1020
+ model,
1021
+ withRemainingContextBudget(model, effectiveContext, withSamplers),
1022
+ );
921
1023
  return guardMalformedToolCalls(
922
1024
  withReasoningTokenEstimate(
923
1025
  stripSentinelsFromStream(
924
1026
  stripNeverReasoningFromStream(
925
1027
  filterGemmaChannelStream(
926
- withResponseModelIdCapture(
1028
+ withLiteLLMRouteFailureAdvice(
927
1029
  model,
928
- withRemainingContextBudget(model, effectiveContext, withSamplers),
929
- (capturedOptions) =>
1030
+ withResponseModelIdCapture(model, withGatewayOptions, (capturedOptions) =>
930
1031
  withLocalResidency(
931
1032
  model,
932
1033
  {
@@ -935,8 +1036,9 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
935
1036
  },
936
1037
  (requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions),
937
1038
  ),
1039
+ ),
938
1040
  ),
939
- resolved.family === "gemma-4",
1041
+ usesGemmaChannelMarkers(resolved.modelId),
940
1042
  ),
941
1043
  resolved,
942
1044
  ),
@@ -951,15 +1053,18 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
951
1053
  const resolved = resolvedCapabilitiesForModel(model, thinkingLevelFromSimple(options));
952
1054
  const effectiveContext = stripsThinking(resolved) ? stripThinkingFromContext(context) : context;
953
1055
  const withSamplers = withSamplingOverrides(model, options, resolved);
1056
+ const withGatewayOptions = withLiteLLMRequestOptions(
1057
+ model,
1058
+ withRemainingContextBudget(model, effectiveContext, withSamplers),
1059
+ );
954
1060
  return guardMalformedToolCalls(
955
1061
  withReasoningTokenEstimate(
956
1062
  stripSentinelsFromStream(
957
1063
  stripNeverReasoningFromStream(
958
1064
  filterGemmaChannelStream(
959
- withResponseModelIdCapture(
1065
+ withLiteLLMRouteFailureAdvice(
960
1066
  model,
961
- withRemainingContextBudget(model, effectiveContext, withSamplers),
962
- (capturedOptions) =>
1067
+ withResponseModelIdCapture(model, withGatewayOptions, (capturedOptions) =>
963
1068
  withLocalResidency(
964
1069
  model,
965
1070
  {
@@ -968,8 +1073,9 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
968
1073
  },
969
1074
  (requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions),
970
1075
  ),
1076
+ ),
971
1077
  ),
972
- resolved.family === "gemma-4",
1078
+ usesGemmaChannelMarkers(resolved.modelId),
973
1079
  ),
974
1080
  resolved,
975
1081
  ),
@@ -13,7 +13,7 @@ const DEFAULT_MAX_OUTPUT_TOKENS = CLIO_MIN_MAX_OUTPUT_TOKENS;
13
13
 
14
14
  /**
15
15
  * Process-wide default output budget requested per turn, sourced from
16
- * settings.defaults.maxTokens at session start (see
16
+ * chat.maxOutputTokens at session start (see
17
17
  * {@link setGlobalDefaultMaxOutputTokens}). 0 means unset: callers fall back to
18
18
  * the model's advertised cap as before.
19
19
  */
@@ -30,19 +30,6 @@ export function setGlobalDefaultMaxOutputTokens(value: number): void {
30
30
  globalDefaultMaxOutputTokens = Number.isFinite(value) && value > 0 ? Math.floor(value) : 0;
31
31
  }
32
32
 
33
- /**
34
- * Output ceiling applied to a llama.cpp tool-bearing turn when the caller did
35
- * not request an explicit limit. It bounds a genuinely runaway local
36
- * generation without muzzling real work: a single tool call that writes a
37
- * sizable file (a full HTML page, a multi-function source module) needs far
38
- * more than a few thousand tokens of argument, and the tool-call argument
39
- * counts against this same response budget. Narration loops where a local
40
- * model keeps saying it will call a tool without emitting one are caught
41
- * separately by assessToolProseLoop, so this number only has to be large
42
- * enough to let legitimate large outputs through.
43
- */
44
- export const LOCAL_TOOL_TURN_MAX_OUTPUT_TOKENS = CLIO_MIN_MAX_OUTPUT_TOKENS;
45
-
46
33
  /**
47
34
  * Tokens a preflight context check should hold back for the response: the
48
35
  * smaller of the model's advertised output limit and the default output
@@ -84,15 +71,18 @@ export function remainingContextMaxTokens(
84
71
  const modelLimit = model.maxTokens > 0 ? model.maxTokens : Number.POSITIVE_INFINITY;
85
72
  // Precedence for the requested ceiling when the caller gave no explicit
86
73
  // maxTokens: a more-specific tool-turn limit, then the global default, then
87
- // the model's advertised cap. Math.min below clamps the result down to the
88
- // model cap and the remaining context budget regardless, so the global
89
- // default never lets a small model overshoot what it supports.
74
+ // the model's advertised cap. A model that advertises no cap uses the product
75
+ // floor instead of requesting its entire remaining context window. Math.min
76
+ // below clamps the result down to every known boundary, so frontier providers
77
+ // with a known cap never receive a larger max_tokens value.
90
78
  const defaultLimit =
91
79
  limits?.maxOutputTokens !== undefined && limits.maxOutputTokens > 0
92
80
  ? limits.maxOutputTokens
93
81
  : globalDefaultMaxOutputTokens > 0
94
82
  ? globalDefaultMaxOutputTokens
95
- : modelLimit;
83
+ : model.maxTokens > 0
84
+ ? modelLimit
85
+ : DEFAULT_MAX_OUTPUT_TOKENS;
96
86
  const requested = options?.maxTokens ?? defaultLimit;
97
87
  const resolved = Math.min(requested, modelLimit, budget);
98
88
  return Number.isFinite(resolved) ? resolved : DEFAULT_MAX_OUTPUT_TOKENS;
@@ -26,8 +26,8 @@
26
26
  *
27
27
  * The reconciler is best-effort and non-blocking. A slow or unreachable
28
28
  * server, or a malformed resident listing, degrades to observe-only and never
29
- * crashes a turn. `CLIO_CODER_RESIDENCY=observe` and an explicit target
30
- * `lifecycle: user-managed` both force observe-only on every runtime path.
29
+ * crashes a turn. An explicit target `lifecycle: user-managed` forces
30
+ * observe-only on every runtime path.
31
31
  * Every collision or stress case emits a notice over the event bus instead of
32
32
  * a thrown error. One reconcile decision holds per (target, model) within a
33
33
  * TTL, and mutations for a target are serialized across processes through a
@@ -280,7 +280,7 @@ function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): Resid
280
280
  facts,
281
281
  "swap",
282
282
  "warning",
283
- `swapping resident '${entry.modelId}' for requested '${facts.keepModelId}' on '${facts.targetId}' (Clio did not load it; recorded transition instead of a silent unload; set CLIO_CODER_RESIDENCY=observe or lifecycle: user-managed to forbid swaps).`,
283
+ `swapping resident '${entry.modelId}' for requested '${facts.keepModelId}' on '${facts.targetId}' (Clio did not load it; recorded transition instead of a silent unload; set lifecycle: user-managed to forbid swaps).`,
284
284
  {
285
285
  ...(entry.sizeVramBytes !== undefined ? { freedVramBytes: entry.sizeVramBytes } : {}),
286
286
  swappedOut: entry.modelId,
@@ -775,29 +775,10 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
775
775
  }
776
776
 
777
777
  /**
778
- * The env-level residency opt-out. Clio manages residency for every
779
- * manageable runtime by default; `CLIO_CODER_RESIDENCY=observe` (or off/0/false/
780
- * user) flips the whole process to observe-only. Per-target opt-out goes
781
- * through {@link residencyManagedFor}.
778
+ * Residency policy for one target. An absent lifecycle means the operator made
779
+ * no choice and Clio manages by default; runtime synthesis only sets the
780
+ * metadata field when settings carry an explicit value.
782
781
  */
783
- export function residencyManaged(env: NodeJS.ProcessEnv = process.env): boolean {
784
- const opt = (env.CLIO_CODER_RESIDENCY ?? "").trim().toLowerCase();
785
- if (opt === "observe" || opt === "off" || opt === "0" || opt === "false" || opt === "user" || opt === "user-managed") {
786
- return false;
787
- }
788
- return true;
789
- }
790
-
791
- /**
792
- * Combined residency opt-out for one target: the process-wide env switch plus
793
- * the target's explicit `lifecycle: user-managed`. An absent lifecycle means
794
- * the operator made no choice, and Clio manages by default; runtime synthesis
795
- * only sets the metadata field when settings carry an explicit value.
796
- */
797
- export function residencyManagedFor(
798
- lifecycle: "user-managed" | "clio-coder-managed" | undefined,
799
- env: NodeJS.ProcessEnv = process.env,
800
- ): boolean {
801
- if (lifecycle === "user-managed") return false;
802
- return residencyManaged(env);
782
+ export function residencyManagedFor(lifecycle: "user-managed" | "clio-coder-managed" | undefined): boolean {
783
+ return lifecycle !== "user-managed";
803
784
  }