@iowarp/clio-coder 0.4.0 → 0.4.2

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 (751) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/CONTRIBUTING.md +59 -36
  3. package/README.md +407 -375
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
  6. package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
  9. package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
  10. package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
  11. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  12. package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
  13. package/dist/chunk-2X4RYJTJ.js +39 -0
  14. package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
  15. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  16. package/dist/chunk-34BHNEE3.js +1846 -0
  17. package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
  18. package/dist/chunk-3EBYEESD.js +314 -0
  19. package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
  20. package/dist/chunk-3KIPBMUA.js +308 -0
  21. package/dist/chunk-3M6DQK6S.js +362 -0
  22. package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
  23. package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
  24. package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
  25. package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
  26. package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
  27. package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
  28. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  29. package/dist/chunk-77QIVUZB.js +1334 -0
  30. package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
  33. package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
  34. package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
  35. package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
  36. package/dist/chunk-BTK3SSSK.js +67 -0
  37. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  38. package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
  39. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  40. package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
  41. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  42. package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
  43. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  44. package/dist/chunk-D7E7WCDF.js +27 -0
  45. package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
  46. package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
  47. package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
  48. package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
  49. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  50. package/dist/chunk-F2I26BDK.js +66 -0
  51. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  52. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  53. package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
  54. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  55. package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
  56. package/dist/chunk-HJWWJ6IL.js +184 -0
  57. package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
  58. package/dist/chunk-HLAFFSEK.js +360 -0
  59. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  60. package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
  61. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  62. package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
  63. package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
  64. package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
  65. package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
  66. package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
  67. package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
  68. package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
  69. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  70. package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
  71. package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
  72. package/dist/chunk-KPXDY6QF.js +47 -0
  73. package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
  74. package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
  75. package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
  76. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  77. package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
  78. package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
  79. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  80. package/dist/chunk-NDDGJUXD.js +81 -0
  81. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  82. package/dist/chunk-NMJXSHBJ.js +283 -0
  83. package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
  86. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  87. package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
  88. package/dist/chunk-PJX3WQUQ.js +42 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
  91. package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
  92. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  93. package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
  94. package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
  95. package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
  96. package/dist/chunk-SZAA6XDG.js +30 -0
  97. package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
  98. package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
  99. package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
  100. package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
  101. package/dist/chunk-UXCU4E3T.js +303 -0
  102. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  103. package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
  104. package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
  105. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  106. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  107. package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
  108. package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
  109. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  110. package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
  111. package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
  112. package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
  113. package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
  114. package/dist/chunk-XQRY4DTA.js +657 -0
  115. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  116. package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
  117. package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
  118. package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
  119. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  120. package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
  121. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  122. package/dist/cli/index.js +38 -37
  123. package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
  124. package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
  125. package/dist/codewiki/build-worker.js +1 -1
  126. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  127. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  128. package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
  129. package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
  130. package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
  131. package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
  132. package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
  133. package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
  134. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
  135. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
  136. package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
  137. package/dist/doctor-LHBD36VU.js +773 -0
  138. package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
  139. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
  140. package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
  141. package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
  142. package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
  143. package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
  144. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
  145. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
  146. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
  147. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
  148. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
  149. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
  150. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
  151. package/dist/fleet-view-TWHJKCN6.js +96 -0
  152. package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
  153. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  154. package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
  155. package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
  156. package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
  157. package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
  158. package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
  159. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
  160. package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
  161. package/dist/panes-IXKLOKA2.js +75 -0
  162. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  163. package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
  164. package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
  165. package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
  166. package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
  167. package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
  168. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
  169. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
  170. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
  171. package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
  172. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  173. package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
  174. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
  175. package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
  176. package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
  177. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  178. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  179. package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
  180. package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
  181. package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
  182. package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
  183. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
  184. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
  185. package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
  186. package/dist/worker/entry.js +83 -63
  187. package/docs/README.md +176 -81
  188. package/docs/{acp.md → architecture/acp.md} +36 -20
  189. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  190. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  191. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
  192. package/docs/architecture/artifact-versions.md +90 -0
  193. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  194. package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
  195. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  196. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  197. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  198. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  199. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  200. package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
  201. package/docs/{observability.md → architecture/observability.md} +26 -13
  202. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  203. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
  204. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
  205. package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
  206. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  207. package/docs/architecture/time-conventions.md +125 -0
  208. package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
  209. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  210. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  211. package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
  212. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
  213. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
  214. package/docs/guide/configuration-reference.md +1158 -0
  215. package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
  216. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
  217. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  218. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
  219. package/docs/{glossary.md → guide/glossary.md} +14 -11
  220. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
  221. package/docs/guide/panes-and-files.md +290 -0
  222. package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
  223. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  224. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
  225. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  226. package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
  227. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
  228. package/docs/history/release-cut-checklist.md +207 -0
  229. package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
  230. package/docs/process/documentation-coverage.md +100 -0
  231. package/docs/process/documentation-guide.md +187 -0
  232. package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
  233. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  234. package/docs/{evolution.md → process/evolution.md} +2 -2
  235. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
  236. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  237. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  238. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  239. package/evals/README.md +5 -0
  240. package/evals/behavioral-corpus-grader.mjs +103 -0
  241. package/evals/behavioral-machinery-baseline.json +2276 -0
  242. package/evals/behavioral-machinery-driver.ts +250 -0
  243. package/evals/behavioral-machinery-support.ts +253 -0
  244. package/evals/behavioral-machinery.yaml +614 -0
  245. package/evals/behavioral-model-negative-control.yaml +68 -0
  246. package/evals/behavioral-model.yaml +216 -0
  247. package/evals/fixtures/behavioral-facts.txt +3 -0
  248. package/evals/fixtures/behavioral-main.ts +7 -0
  249. package/evals/fixtures/decoy/note.txt +2 -0
  250. package/evals/fixtures/private/credentials.txt +1 -0
  251. package/evals/tracked-metrics-baseline.yaml +229 -0
  252. package/evals/tracked-metrics-grader.mjs +129 -0
  253. package/package.json +13 -21
  254. package/skills/README.md +51 -42
  255. package/skills/coding/ast-grep/SKILL.md +9 -3
  256. package/skills/coding/coding-standards/SKILL.md +9 -3
  257. package/skills/coding/prototype/SKILL.md +9 -3
  258. package/skills/coding/tdd/SKILL.md +9 -3
  259. package/skills/context/context-handoff/SKILL.md +13 -4
  260. package/skills/context/context-handoff/evals.md +3 -3
  261. package/skills/context/context-prime/SKILL.md +9 -3
  262. package/skills/context/context-prime/evals.md +2 -2
  263. package/skills/git/file-ticket/SKILL.md +10 -5
  264. package/skills/git/file-ticket/evals.md +2 -2
  265. package/skills/git/fix-issue/SKILL.md +12 -5
  266. package/skills/git/fix-issue/evals.md +4 -4
  267. package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
  268. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  269. package/skills/git/ship/SKILL.md +10 -4
  270. package/skills/git/ship/evals.md +4 -4
  271. package/skills/git/worktree-create/SKILL.md +8 -3
  272. package/skills/git/worktree-create/evals.md +6 -6
  273. package/skills/git/worktree-merge/SKILL.md +8 -3
  274. package/skills/git/worktree-merge/evals.md +6 -6
  275. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
  276. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
  277. package/skills/meta/clio-coder-test/SKILL.md +146 -0
  278. package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
  279. package/skills/meta/clio-coder-test/references/harness.md +102 -0
  280. package/skills/meta/clio-coder-test/references/test-map.md +96 -0
  281. package/skills/meta/credentials/SKILL.md +10 -3
  282. package/skills/meta/find-skills/SKILL.md +9 -3
  283. package/skills/meta/herdr/SKILL.md +9 -3
  284. package/skills/meta/skill-craft/SKILL.md +39 -16
  285. package/skills/planning/architecture/SKILL.md +9 -3
  286. package/skills/planning/backlog/SKILL.md +9 -3
  287. package/skills/planning/prd/SKILL.md +9 -3
  288. package/skills/planning/product-intent/SKILL.md +9 -3
  289. package/skills/planning/tech-spec/SKILL.md +9 -3
  290. package/skills/registry.yaml +66 -66
  291. package/skills/research/arxiv-literature/SKILL.md +9 -3
  292. package/skills/research/experiment-protocol/SKILL.md +10 -3
  293. package/skills/research/scientific-debugging/SKILL.md +10 -3
  294. package/skills/research/scientific-debugging/evals.md +2 -2
  295. package/skills/research/scientific-modernization/SKILL.md +10 -3
  296. package/skills/skill-marketplace.json +285 -66
  297. package/skills/workflow/cut-it/SKILL.md +11 -3
  298. package/skills/workflow/design-council/SKILL.md +12 -3
  299. package/skills/workflow/grill-me/SKILL.md +9 -3
  300. package/skills/workflow/workflow-distiller/SKILL.md +9 -3
  301. package/src/cli/acp.ts +2 -2
  302. package/src/cli/args.ts +2 -2
  303. package/src/cli/auth.ts +2 -2
  304. package/src/cli/bootstrap-generate.ts +6 -6
  305. package/src/cli/clio.ts +6 -1
  306. package/src/cli/config-inspect.ts +68 -15
  307. package/src/cli/configure-interop.ts +1 -1
  308. package/src/cli/configure.ts +27 -31
  309. package/src/cli/default-target.ts +1 -1
  310. package/src/cli/docs.ts +28 -20
  311. package/src/cli/doctor-naming.ts +323 -0
  312. package/src/cli/doctor-panes.ts +46 -14
  313. package/src/cli/doctor-toolchain.ts +31 -10
  314. package/src/cli/doctor.ts +15 -1
  315. package/src/cli/eval-inventory.ts +8 -8
  316. package/src/cli/eval.ts +1 -2
  317. package/src/cli/evidence-detail.ts +1 -1
  318. package/src/cli/evidence-inventory.ts +1 -1
  319. package/src/cli/extensions.ts +2 -1
  320. package/src/cli/fleet-decisions.ts +1 -1
  321. package/src/cli/fleet-inspect.ts +1 -1
  322. package/src/cli/fleet-preflight.ts +1 -1
  323. package/src/cli/fleet-verify.ts +1 -1
  324. package/src/cli/fleet-view.ts +40 -23
  325. package/src/cli/fleet.ts +9 -6
  326. package/src/cli/index.ts +2 -1
  327. package/src/cli/internal-dispatch.ts +3 -4
  328. package/src/cli/interop-inspect.ts +2 -2
  329. package/src/cli/models.ts +3 -3
  330. package/src/cli/modes/print.ts +1 -1
  331. package/src/cli/panes.ts +19 -5
  332. package/src/cli/reset.ts +1 -1
  333. package/src/cli/run.ts +13 -17
  334. package/src/cli/share.ts +6 -2
  335. package/src/cli/skills-eval.ts +14 -14
  336. package/src/cli/targets.ts +25 -30
  337. package/src/cli/trace-inspect.ts +1 -1
  338. package/src/cli/trace.ts +96 -4
  339. package/src/cli/uninstall.ts +2 -2
  340. package/src/cli/upgrade.ts +29 -34
  341. package/src/cli/usage.ts +2 -2
  342. package/src/cli/validate-model.ts +1 -1
  343. package/src/cli/verifiers-inspect.ts +1 -1
  344. package/src/cli/wiki-generate.ts +6 -6
  345. package/src/core/artifact-paths.ts +1 -1
  346. package/src/core/bash-exec.ts +132 -87
  347. package/src/core/boot-trace.ts +3 -3
  348. package/src/core/bus-events.ts +51 -6
  349. package/src/core/bus-trace.ts +2 -2
  350. package/src/core/compile-cache.ts +1 -1
  351. package/src/core/config.ts +1066 -886
  352. package/src/core/defaults.ts +326 -530
  353. package/src/core/dispatch-outcome.ts +16 -0
  354. package/src/core/domain-loader.ts +6 -4
  355. package/src/core/event-bus.ts +1 -1
  356. package/src/core/file-references.ts +78 -88
  357. package/src/core/git-commit-attribution.ts +3 -9
  358. package/src/core/guardrails.ts +33 -52
  359. package/src/core/naming-compat.ts +45 -0
  360. package/src/core/naming-events.ts +62 -0
  361. package/src/core/prompt-hint.ts +9 -0
  362. package/src/core/recent-models.ts +1 -7
  363. package/src/core/residency-protection.ts +4 -8
  364. package/src/core/resolve-config-value.ts +1 -1
  365. package/src/core/response-model-id.ts +0 -14
  366. package/src/core/session-routing.ts +84 -74
  367. package/src/core/skill-activation.ts +18 -0
  368. package/src/core/termination.ts +4 -4
  369. package/src/core/timers.ts +2 -12
  370. package/src/domains/agents/builtins/architect.md +2 -3
  371. package/src/domains/agents/builtins/coder.md +3 -2
  372. package/src/domains/agents/builtins/debugger.md +2 -2
  373. package/src/domains/agents/builtins/documenter.md +2 -2
  374. package/src/domains/agents/builtins/git-master.md +1 -1
  375. package/src/domains/agents/builtins/oracle.md +1 -1
  376. package/src/domains/agents/builtins/provenance.md +1 -1
  377. package/src/domains/agents/builtins/researcher.md +1 -1
  378. package/src/domains/agents/builtins/scout.md +1 -1
  379. package/src/domains/agents/builtins/tester.md +2 -2
  380. package/src/domains/agents/builtins/verifier.md +2 -2
  381. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  382. package/src/domains/agents/catalog.ts +14 -26
  383. package/src/domains/agents/contract.ts +2 -0
  384. package/src/domains/agents/extension.ts +26 -4
  385. package/src/domains/agents/registry.ts +7 -7
  386. package/src/domains/agents/result-contract.ts +1 -1
  387. package/src/domains/agents/spec.ts +0 -11
  388. package/src/domains/config/classify.ts +35 -47
  389. package/src/domains/config/extension.ts +5 -5
  390. package/src/domains/config/keybindings.ts +56 -47
  391. package/src/domains/config/watcher.ts +1 -1
  392. package/src/domains/context/codewiki/indexer.ts +1 -1
  393. package/src/domains/context/extension.ts +3 -6
  394. package/src/domains/context/prompt-context.ts +1 -1
  395. package/src/domains/context/wiki/assemble.ts +2 -2
  396. package/src/domains/context/working-set/path-index.ts +1 -0
  397. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  398. package/src/domains/context/working-set/replay/report.ts +1 -1
  399. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  400. package/src/domains/dispatch/active-route-planner.ts +2 -2
  401. package/src/domains/dispatch/agent-candidates.ts +1 -1
  402. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  403. package/src/domains/dispatch/agent-ledger.ts +1 -1
  404. package/src/domains/dispatch/assignment.ts +5 -5
  405. package/src/domains/dispatch/capability-match.ts +10 -0
  406. package/src/domains/dispatch/capacity-lease.ts +2 -5
  407. package/src/domains/dispatch/code-step.ts +1 -1
  408. package/src/domains/dispatch/contract.ts +2 -2
  409. package/src/domains/dispatch/extension.ts +169 -82
  410. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  411. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  412. package/src/domains/dispatch/fleet-run.ts +0 -7
  413. package/src/domains/dispatch/gate-decisions.ts +25 -14
  414. package/src/domains/dispatch/host-verification.ts +435 -39
  415. package/src/domains/dispatch/intent-requirements.ts +10 -0
  416. package/src/domains/dispatch/intent.ts +18 -1
  417. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  418. package/src/domains/dispatch/path-scope.ts +220 -70
  419. package/src/domains/dispatch/placement.ts +2 -2
  420. package/src/domains/dispatch/receipt-findings.ts +1 -1
  421. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  422. package/src/domains/dispatch/reservation-store.ts +0 -23
  423. package/src/domains/dispatch/route-decision.ts +1 -1
  424. package/src/domains/dispatch/route-history.ts +1 -1
  425. package/src/domains/dispatch/route-policy.ts +1 -1
  426. package/src/domains/dispatch/route-readiness.ts +0 -28
  427. package/src/domains/dispatch/run-event-journal.ts +9 -19
  428. package/src/domains/dispatch/state.ts +2 -3
  429. package/src/domains/dispatch/tool-stats.ts +1 -1
  430. package/src/domains/dispatch/transport.ts +47 -40
  431. package/src/domains/dispatch/types.ts +58 -6
  432. package/src/domains/dispatch/worker-protocol.ts +2 -2
  433. package/src/domains/eval/artifacts/store.ts +10 -4
  434. package/src/domains/eval/compare/thresholds.ts +0 -8
  435. package/src/domains/eval/execution-provenance.ts +1 -1
  436. package/src/domains/eval/metrics/token-stream.ts +0 -7
  437. package/src/domains/eval/report.ts +1 -1
  438. package/src/domains/eval/runner.ts +1 -1
  439. package/src/domains/eval/runners/clio-run.ts +7 -6
  440. package/src/domains/eval/runners/external-command.ts +4 -3
  441. package/src/domains/eval/schema/artifact.ts +1 -1
  442. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  443. package/src/domains/eval/schema/behavioral.ts +7 -6
  444. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  445. package/src/domains/eval/schema/naming.ts +10 -0
  446. package/src/domains/eval/schema/suite.ts +2 -2
  447. package/src/domains/eval/schema/validate.ts +9 -5
  448. package/src/domains/eval/schema/verdict.ts +4 -2
  449. package/src/domains/eval/store.ts +20 -3
  450. package/src/domains/eval/suites/run.ts +12 -6
  451. package/src/domains/eval/types.ts +1 -1
  452. package/src/domains/eval/workspaces/git.ts +1 -1
  453. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  454. package/src/domains/evidence/build.ts +13 -5
  455. package/src/domains/evidence/trust-status.ts +10 -1
  456. package/src/domains/extensions/contract.ts +15 -1
  457. package/src/domains/extensions/discovery.ts +238 -41
  458. package/src/domains/extensions/extension.ts +105 -6
  459. package/src/domains/extensions/index.ts +24 -0
  460. package/src/domains/extensions/integrity.ts +189 -0
  461. package/src/domains/extensions/manager.ts +17 -1
  462. package/src/domains/extensions/resource-path.ts +27 -0
  463. package/src/domains/extensions/resources.ts +18 -38
  464. package/src/domains/extensions/snapshot-store.ts +39 -0
  465. package/src/domains/extensions/snapshot.ts +180 -0
  466. package/src/domains/extensions/state.ts +385 -57
  467. package/src/domains/extensions/types.ts +118 -1
  468. package/src/domains/interop/consent.ts +7 -7
  469. package/src/domains/interop/extension.ts +1 -1
  470. package/src/domains/lifecycle/doctor.ts +27 -21
  471. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  472. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  473. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  474. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  475. package/src/domains/lifecycle/migrations/index.ts +22 -1
  476. package/src/domains/lifecycle/naming-history.ts +153 -0
  477. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  478. package/src/domains/lifecycle/naming-resources.ts +276 -0
  479. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  480. package/src/domains/lifecycle/naming-yazi.ts +86 -0
  481. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  482. package/src/domains/memory/task-memory-handoff.ts +6 -3
  483. package/src/domains/middleware/contract.ts +26 -0
  484. package/src/domains/middleware/extension.ts +24 -24
  485. package/src/domains/middleware/hook-receipts.ts +27 -4
  486. package/src/domains/middleware/hooks-io.ts +65 -32
  487. package/src/domains/middleware/hooks.ts +64 -0
  488. package/src/domains/middleware/index.ts +35 -4
  489. package/src/domains/middleware/marketplace-offer.ts +339 -0
  490. package/src/domains/middleware/registrations.ts +326 -0
  491. package/src/domains/middleware/runtime.ts +30 -2
  492. package/src/domains/middleware/snapshot.ts +20 -7
  493. package/src/domains/mux/contract.ts +195 -25
  494. package/src/domains/mux/detect.ts +23 -6
  495. package/src/domains/mux/dock-controller.ts +365 -0
  496. package/src/domains/mux/extension.ts +7 -1
  497. package/src/domains/mux/index.ts +21 -1
  498. package/src/domains/mux/operations.ts +72 -5
  499. package/src/domains/mux/protocol.ts +19 -6
  500. package/src/domains/mux/socket-client.ts +167 -19
  501. package/src/domains/mux/types.ts +49 -6
  502. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  503. package/src/domains/mux/yazi/event-stream.ts +6 -4
  504. package/src/domains/mux/yazi/profile.ts +1 -1
  505. package/src/domains/mux/yazi/session.ts +79 -7
  506. package/src/domains/mux/yazi/theme.ts +117 -17
  507. package/src/domains/observability/contract.ts +10 -11
  508. package/src/domains/observability/extension.ts +12 -4
  509. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  510. package/src/domains/observability/projection.ts +15 -91
  511. package/src/domains/observability/trace-store.ts +65 -19
  512. package/src/domains/prompts/compiler.ts +75 -55
  513. package/src/domains/prompts/contract.ts +15 -3
  514. package/src/domains/prompts/extension.ts +100 -12
  515. package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
  516. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  517. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  518. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  519. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  520. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  521. package/src/domains/prompts/fragments/operating/skills.md +11 -18
  522. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  523. package/src/domains/providers/extension.ts +5 -5
  524. package/src/domains/providers/index.ts +1 -1
  525. package/src/domains/providers/knowledge-base-path.ts +1 -1
  526. package/src/domains/providers/model-runtime-capabilities.ts +99 -23
  527. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  528. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
  529. package/src/domains/providers/plugins.ts +1 -1
  530. package/src/domains/providers/resolver.ts +1 -1
  531. package/src/domains/providers/runtime-resolution.ts +31 -0
  532. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  533. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  534. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
  536. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  537. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  538. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  539. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  540. package/src/domains/providers/types/cost-provenance.ts +19 -0
  541. package/src/domains/providers/types/knowledge-base.ts +13 -0
  542. package/src/domains/providers/types/local-model-quirks.ts +87 -39
  543. package/src/domains/providers/types/target-descriptor.ts +3 -3
  544. package/src/domains/resources/extension.ts +1 -1
  545. package/src/domains/resources/library.ts +6 -6
  546. package/src/domains/resources/prompts/loader.ts +1 -1
  547. package/src/domains/resources/skills/content-hash.ts +7 -6
  548. package/src/domains/resources/skills/evals.ts +1 -1
  549. package/src/domains/resources/skills/install.ts +36 -12
  550. package/src/domains/resources/skills/loader.ts +41 -18
  551. package/src/domains/resources/skills/marketplace.ts +21 -2
  552. package/src/domains/resources/skills/promotion.ts +214 -0
  553. package/src/domains/safety/audit.ts +2 -2
  554. package/src/domains/safety/call-target.ts +1 -1
  555. package/src/domains/safety/finish-contract.ts +2 -1
  556. package/src/domains/safety/loop-detector.ts +7 -4
  557. package/src/domains/safety/run-effects.ts +1 -1
  558. package/src/domains/scheduling/extension.ts +4 -4
  559. package/src/domains/session/archive-readers.ts +9 -1
  560. package/src/domains/session/compaction/branch-summary.ts +4 -0
  561. package/src/domains/session/compaction/compact.ts +1 -1
  562. package/src/domains/session/compaction/tokens.ts +4 -0
  563. package/src/domains/session/context-accounting.ts +1 -1
  564. package/src/domains/session/decision-board.ts +1 -1
  565. package/src/domains/session/extension.ts +1 -1
  566. package/src/domains/session/handoff.ts +2 -2
  567. package/src/domains/session/prompt-manifest.ts +0 -5
  568. package/src/domains/session/protected-artifact-journal.ts +12 -6
  569. package/src/domains/session/retry.ts +1 -1
  570. package/src/domains/session/task-board.ts +10 -9
  571. package/src/domains/share/archive.ts +249 -43
  572. package/src/domains/toolchain/install.ts +1 -1
  573. package/src/engine/acp/adapter.ts +3 -3
  574. package/src/engine/acp/event-mapper.ts +3 -3
  575. package/src/engine/acp/server.ts +89 -35
  576. package/src/engine/acp/tool-mediator.ts +2 -2
  577. package/src/engine/acp/types.ts +1 -1
  578. package/src/engine/alcf-oauth.ts +5 -5
  579. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  580. package/src/engine/api-registry.ts +1 -1
  581. package/src/engine/apis/llamacpp-residency.ts +4 -23
  582. package/src/engine/apis/lmstudio.ts +4 -9
  583. package/src/engine/apis/ollama-native.ts +9 -9
  584. package/src/engine/apis/openai-completions.ts +30 -27
  585. package/src/engine/apis/output-budget.ts +8 -18
  586. package/src/engine/apis/residency.ts +10 -35
  587. package/src/engine/claude/sdk-module.ts +1 -12
  588. package/src/engine/claude/sdk-runtime.ts +6 -6
  589. package/src/engine/claude/subprocess-runtime.ts +1 -1
  590. package/src/engine/claude/tool-safety.ts +4 -4
  591. package/src/engine/gemma-channel-filter.ts +19 -0
  592. package/src/engine/loop-guard.ts +92 -17
  593. package/src/engine/session.ts +14 -7
  594. package/src/engine/tui-primitives.ts +1 -1
  595. package/src/engine/worker-events.ts +6 -6
  596. package/src/engine/worker-runtime.ts +54 -24
  597. package/src/engine/worker-tools.ts +3 -1
  598. package/src/entry/extension-hook-sources.ts +28 -0
  599. package/src/entry/extension-reload.ts +309 -0
  600. package/src/entry/orchestrator.ts +163 -120
  601. package/src/interactive/application-controller.ts +23 -22
  602. package/src/interactive/bus-notices.ts +10 -3
  603. package/src/interactive/chat-loop-messages.ts +3 -13
  604. package/src/interactive/chat-loop.ts +18 -9
  605. package/src/interactive/chat-panel.ts +37 -14
  606. package/src/interactive/chat-renderer.ts +71 -7
  607. package/src/interactive/clio-editor.ts +105 -1
  608. package/src/interactive/context-activity.ts +8 -6
  609. package/src/interactive/context-meter.ts +3 -6
  610. package/src/interactive/context-overlay.ts +1 -1
  611. package/src/interactive/cost-overlay.ts +1 -1
  612. package/src/interactive/council-grid.ts +2 -2
  613. package/src/interactive/dispatch-board.ts +36 -44
  614. package/src/interactive/editor-bash.ts +21 -0
  615. package/src/interactive/editor-steer.ts +9 -4
  616. package/src/interactive/editor-submit.ts +24 -18
  617. package/src/interactive/external-editor.ts +1 -1
  618. package/src/interactive/file-reference-completion.ts +360 -0
  619. package/src/interactive/footer/dashboard.ts +15 -17
  620. package/src/interactive/footer/notifications.ts +14 -8
  621. package/src/interactive/footer/widgets.ts +15 -44
  622. package/src/interactive/interactive-application.ts +116 -61
  623. package/src/interactive/interactive-event-projection.ts +1 -1
  624. package/src/interactive/interactive-input-runtime.ts +6 -2
  625. package/src/interactive/interactive-presentation.ts +22 -17
  626. package/src/interactive/interactive-shell.ts +2 -2
  627. package/src/interactive/interactive-slash-runtime.ts +65 -17
  628. package/src/interactive/interactive-subscriptions.ts +1 -1
  629. package/src/interactive/interactive-tickers.ts +1 -1
  630. package/src/interactive/keybinding-manager.ts +4 -4
  631. package/src/interactive/layout.ts +1 -1
  632. package/src/interactive/memory-overlay.ts +2 -2
  633. package/src/interactive/modal-marker.ts +2 -21
  634. package/src/interactive/mutation-preview.ts +1 -1
  635. package/src/interactive/overlay-frame.ts +4 -12
  636. package/src/interactive/overlay-general-openers.ts +6 -2
  637. package/src/interactive/overlay-key-routing.ts +7 -7
  638. package/src/interactive/overlay-lifecycle.ts +1 -1
  639. package/src/interactive/overlay-model-selectors.ts +3 -3
  640. package/src/interactive/overlays/agents.ts +2 -2
  641. package/src/interactive/overlays/ask-user.ts +25 -11
  642. package/src/interactive/overlays/context-reset.ts +28 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  644. package/src/interactive/overlays/decisions.ts +4 -2
  645. package/src/interactive/overlays/extensions.ts +9 -1
  646. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  647. package/src/interactive/overlays/handoff-review.ts +2 -2
  648. package/src/interactive/overlays/help-reference.ts +13 -0
  649. package/src/interactive/overlays/interop.ts +1 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  651. package/src/interactive/overlays/message-picker.ts +1 -1
  652. package/src/interactive/overlays/model-selector.ts +39 -31
  653. package/src/interactive/overlays/prompts.ts +10 -4
  654. package/src/interactive/overlays/session-selector.ts +2 -2
  655. package/src/interactive/overlays/settings.ts +360 -303
  656. package/src/interactive/overlays/side-question.ts +2 -2
  657. package/src/interactive/overlays/skills-hub.ts +8 -8
  658. package/src/interactive/overlays/tree-selector.ts +2 -2
  659. package/src/interactive/panes-runtime.ts +145 -43
  660. package/src/interactive/permission-overlay.ts +2 -2
  661. package/src/interactive/prompt-cache-identity.ts +88 -0
  662. package/src/interactive/renderers/retry-status.ts +12 -4
  663. package/src/interactive/renderers/tool-execution.ts +4 -4
  664. package/src/interactive/session-transcript.ts +3 -3
  665. package/src/interactive/slash-autocomplete.ts +454 -165
  666. package/src/interactive/slash-commands.ts +401 -190
  667. package/src/interactive/slash-spec.ts +160 -17
  668. package/src/interactive/status/controller.ts +2 -2
  669. package/src/interactive/stream-pacing-policy.ts +1 -24
  670. package/src/interactive/tasks-overlay.ts +20 -13
  671. package/src/interactive/terminal-lease.ts +6 -7
  672. package/src/interactive/turn-context.ts +41 -26
  673. package/src/interactive/turn-persistence.ts +2 -2
  674. package/src/interactive/turn-prewarm.ts +2 -2
  675. package/src/interactive/turn-runtime.ts +8 -8
  676. package/src/interactive/turn-state.ts +1 -1
  677. package/src/interactive/view/artifacts.ts +12 -9
  678. package/src/interactive/view/view-overlay.ts +13 -10
  679. package/src/interactive/watch-pane.ts +38 -10
  680. package/src/interactive/welcome-dashboard.ts +15 -15
  681. package/src/interactive/worker-progress.ts +4 -4
  682. package/src/interactive/worker-receipts.ts +1 -1
  683. package/src/interactive/worker-stream.ts +1 -4
  684. package/src/interactive/yazi-bridge.ts +72 -11
  685. package/src/tools/agent-tools.ts +30 -1
  686. package/src/tools/artifact.ts +2 -2
  687. package/src/tools/ask-user.ts +6 -6
  688. package/src/tools/bash.ts +2 -2
  689. package/src/tools/bootstrap.ts +4 -0
  690. package/src/tools/builtin-tool-catalog.ts +52 -22
  691. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  692. package/src/tools/codewiki/code-nav.ts +99 -13
  693. package/src/tools/compete-worktrees.ts +27 -17
  694. package/src/tools/context/docs-engine.ts +20 -7
  695. package/src/tools/context/index.ts +44 -13
  696. package/src/tools/core-bootstrap.ts +28 -6
  697. package/src/tools/credential-present.ts +1 -2
  698. package/src/tools/dispatch-admission.ts +4 -2
  699. package/src/tools/dispatch-arguments.ts +6 -2
  700. package/src/tools/dispatch-plan.ts +48 -15
  701. package/src/tools/dispatch-run-events.ts +13 -11
  702. package/src/tools/dispatch-runner.ts +11 -6
  703. package/src/tools/dispatch-schema.ts +338 -0
  704. package/src/tools/dispatch-types.ts +3 -0
  705. package/src/tools/dispatch.ts +9 -254
  706. package/src/tools/find.ts +1 -6
  707. package/src/tools/ledger.ts +3 -5
  708. package/src/tools/monitor-surface.ts +5 -13
  709. package/src/tools/monitor.ts +4 -4
  710. package/src/tools/observation.ts +4 -5
  711. package/src/tools/observers.ts +0 -33
  712. package/src/tools/panes-surface.ts +4 -11
  713. package/src/tools/panes.ts +4 -2
  714. package/src/tools/policy.ts +15 -2
  715. package/src/tools/read.ts +5 -6
  716. package/src/tools/registry.ts +30 -7
  717. package/src/tools/result-shaping.ts +18 -14
  718. package/src/tools/steer-surface.ts +1 -1
  719. package/src/tools/task-worktree.ts +28 -7
  720. package/src/tools/tasks.ts +1 -1
  721. package/src/tools/truncate.ts +6 -5
  722. package/src/tools/verify/authoring.ts +3 -6
  723. package/src/tools/verify/frontend.ts +1 -1
  724. package/src/tools/verify/surface.ts +6 -12
  725. package/src/tools/web-fetch-surface.ts +1 -3
  726. package/src/tools/web-fetch.ts +1 -1
  727. package/src/worker/entry.ts +4 -3
  728. package/src/worker/protocol.ts +16 -14
  729. package/src/worker/spec-contract.ts +2 -2
  730. package/src/worker/stdin-demux.ts +2 -2
  731. package/dist/chunk-36EJLSQQ.js +0 -814
  732. package/dist/chunk-GXNLGKAB.js +0 -571
  733. package/dist/chunk-K7VKOLQQ.js +0 -15
  734. package/dist/chunk-PMZCIOCJ.js +0 -25
  735. package/dist/chunk-SUCTJL45.js +0 -45
  736. package/dist/chunk-SUW5DORT.js +0 -819
  737. package/dist/chunk-TZ3SGWZZ.js +0 -48
  738. package/dist/chunk-UOV2BYIW.js +0 -107
  739. package/dist/chunk-VFA6GDY5.js +0 -1625
  740. package/dist/doctor-QOA5FNY5.js +0 -313
  741. package/dist/fleet-view-ZCON35AG.js +0 -102
  742. package/dist/panes-HMABYVO4.js +0 -58
  743. package/docs/artifact-versions.md +0 -67
  744. package/docs/documentation-coverage.md +0 -46
  745. package/docs/documentation-guide.md +0 -167
  746. package/docs/release-cut-checklist.md +0 -193
  747. package/docs/time-conventions.md +0 -101
  748. package/skills/meta/clio-test/SKILL.md +0 -133
  749. package/skills/meta/clio-test/references/harness.md +0 -126
  750. package/skills/meta/clio-test/references/test-map.md +0 -69
  751. package/src/engine/apis/degraded-inference.ts +0 -95
@@ -28,12 +28,12 @@ import { lmStudioReasoningEffort } from "../../domains/providers/runtimes/common
28
28
  import type { ThinkingLevel } from "../../domains/providers/types/capability-flags.js";
29
29
  import type { LocalModelQuirks, SamplingProfile } from "../../domains/providers/types/local-model-quirks.js";
30
30
  import type { LmStudioTargetSettings } from "../../domains/providers/types/target-descriptor.js";
31
- import { filterGemmaChannelStream } from "../gemma-channel-filter.js";
31
+ import { filterGemmaChannelStream, usesGemmaChannelMarkers } from "../gemma-channel-filter.js";
32
32
  import { HarmonyResponseParser } from "../harmony-response.js";
33
33
  import { createSentinelStripper, stripTokenizerSentinels } from "../strip-tokenizer-sentinels.js";
34
34
  import { ensureLlamaCppResidency } from "./llamacpp-residency.js";
35
35
  import { ensureLmStudioResidency } from "./lmstudio.js";
36
- import { LOCAL_TOOL_TURN_MAX_OUTPUT_TOKENS, remainingContextMaxTokens } from "./output-budget.js";
36
+ import { remainingContextMaxTokens } from "./output-budget.js";
37
37
  import { residencyManagedFor } from "./residency.js";
38
38
  import { mergeSamplingOverride } from "./sampling-overrides.js";
39
39
  import type { EngineApiProvider } from "./types.js";
@@ -60,11 +60,11 @@ const REASONING_CHARS_PER_TOKEN = 4;
60
60
  export { estimateInputTokensFromContext, remainingContextMaxTokens } from "./output-budget.js";
61
61
 
62
62
  interface ClioRuntimeMetadata {
63
- clio?: {
63
+ clioCoder?: {
64
64
  targetId: string;
65
65
  runtimeId: string;
66
66
  /** Present only when settings set the target lifecycle explicitly. */
67
- lifecycle?: "user-managed" | "clio-managed";
67
+ lifecycle?: "user-managed" | "clio-coder-managed";
68
68
  gateway?: boolean;
69
69
  quirks?: LocalModelQuirks;
70
70
  chatTemplateKwargsUnsupported?: boolean;
@@ -75,11 +75,11 @@ interface ClioRuntimeMetadata {
75
75
  }
76
76
 
77
77
  function chatTemplateKwargsUnsupported(model: Model<Api>): boolean {
78
- return (model as Model<Api> & ClioRuntimeMetadata).clio?.chatTemplateKwargsUnsupported === true;
78
+ return (model as Model<Api> & ClioRuntimeMetadata).clioCoder?.chatTemplateKwargsUnsupported === true;
79
79
  }
80
80
 
81
81
  function clioQuirks(model: Model<"openai-completions">): LocalModelQuirks | undefined {
82
- return (model as Model<"openai-completions"> & ClioRuntimeMetadata).clio?.quirks;
82
+ return (model as Model<"openai-completions"> & ClioRuntimeMetadata).clioCoder?.quirks;
83
83
  }
84
84
 
85
85
  function pickSamplingProfile(
@@ -138,7 +138,7 @@ function backendCompletionTimings(value: unknown, source: BackendTimingsSource):
138
138
  }
139
139
 
140
140
  function backendTimingsSourceForModel(model: Model<Api>): BackendTimingsSource | null {
141
- const metadata = (model as Model<Api> & ClioRuntimeMetadata).clio;
141
+ const metadata = (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
142
142
  if (model.provider === "llamacpp" && metadata?.runtimeId === "llamacpp") return "llamacpp-timings";
143
143
  if (model.provider === "lmstudio" && metadata?.runtimeId === "lmstudio") return "lmstudio-timings";
144
144
  return null;
@@ -371,8 +371,23 @@ function applyThinkingPayload(
371
371
  resolved: ResolvedModelRuntimeCapabilities,
372
372
  model: Model<Api>,
373
373
  ): Record<string, unknown> {
374
- if (applied.mechanism === "none") return stripThinkingRequestFields(payload);
375
- if (applied.mechanism === "always-on") return payload;
374
+ if (applied.mechanism === "none") {
375
+ const next = stripThinkingRequestFields(payload);
376
+ if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
377
+ const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
378
+ next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
379
+ }
380
+ return next;
381
+ }
382
+ if (applied.mechanism === "always-on") {
383
+ if (resolved.request.chatTemplateKwargs && !chatTemplateKwargsUnsupported(model)) {
384
+ const next: Record<string, unknown> = { ...payload };
385
+ const existing = isPlainRecord(next.chat_template_kwargs) ? next.chat_template_kwargs : {};
386
+ next.chat_template_kwargs = { ...existing, ...resolved.request.chatTemplateKwargs };
387
+ return next;
388
+ }
389
+ return payload;
390
+ }
376
391
  const next: Record<string, unknown> = { ...payload };
377
392
  if (
378
393
  resolved.request.reasoningEffort &&
@@ -563,21 +578,9 @@ function withRemainingContextBudget<TOptions extends StreamOptions>(
563
578
  context: Context,
564
579
  options: TOptions | undefined,
565
580
  ): 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
581
  return {
574
582
  ...(options ?? {}),
575
- maxTokens: remainingContextMaxTokens(
576
- model,
577
- context,
578
- options,
579
- localToolOutputLimit === undefined ? undefined : { maxOutputTokens: localToolOutputLimit },
580
- ),
583
+ maxTokens: remainingContextMaxTokens(model, context, options),
581
584
  } as TOptions;
582
585
  }
583
586
 
@@ -593,8 +596,8 @@ function hasEmptyArguments(args: Record<string, unknown>): boolean {
593
596
  return Object.keys(args).length === 0;
594
597
  }
595
598
 
596
- function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["clio"]> | undefined {
597
- return (model as Model<Api> & ClioRuntimeMetadata).clio;
599
+ function runtimeMetadata(model: Model<Api>): NonNullable<ClioRuntimeMetadata["clioCoder"]> | undefined {
600
+ return (model as Model<Api> & ClioRuntimeMetadata).clioCoder;
598
601
  }
599
602
 
600
603
  function emptyErrorMessage(model: Model<"openai-completions">, message: string): AssistantMessage {
@@ -679,7 +682,7 @@ function hasReportedReasoningUsage(usage: Usage): boolean {
679
682
  * upstream already reported reasoning usage, because ACP consumers accept all
680
683
  * three field spellings for cross-agent compatibility.
681
684
  */
682
- export function applyOpenAICompatReasoningEstimate(message: AssistantMessage): void {
685
+ function applyOpenAICompatReasoningEstimate(message: AssistantMessage): void {
683
686
  if (hasReportedReasoningUsage(message.usage)) return;
684
687
  const estimated = estimateReasoningTokens(message.content);
685
688
  const reportedOutput = message.usage.output;
@@ -936,7 +939,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
936
939
  (requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions),
937
940
  ),
938
941
  ),
939
- resolved.family === "gemma-4",
942
+ usesGemmaChannelMarkers(resolved.modelId),
940
943
  ),
941
944
  resolved,
942
945
  ),
@@ -969,7 +972,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
969
972
  (requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions),
970
973
  ),
971
974
  ),
972
- resolved.family === "gemma-4",
975
+ usesGemmaChannelMarkers(resolved.modelId),
973
976
  ),
974
977
  resolved,
975
978
  ),
@@ -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
@@ -130,7 +130,7 @@ export function residentTagProtected(tags: ReadonlyArray<string> | undefined): b
130
130
  const clioLoaded = new Map<string, Set<string>>();
131
131
 
132
132
  /** Record that Clio loaded `modelId` on the target identified by `targetKey`. */
133
- export function markClioLoaded(targetKey: string, modelId: string): void {
133
+ function markClioLoaded(targetKey: string, modelId: string): void {
134
134
  let set = clioLoaded.get(targetKey);
135
135
  if (!set) {
136
136
  set = new Set();
@@ -156,12 +156,6 @@ function isClioLoaded(targetKey: string, entry: ResidentModelInfo): boolean {
156
156
  export const RECONCILE_TTL_MS = 60_000;
157
157
  const reconcileCache = new Map<string, { modelId: string; decision: "reconcile" | "observe"; at: number }>();
158
158
 
159
- /** Test-only: clear the cross-call Clio-loaded registry and TTL cache. */
160
- export function resetResidencyState(): void {
161
- clioLoaded.clear();
162
- reconcileCache.clear();
163
- }
164
-
165
159
  // --- residency decision (pure) ----------------------------------------------
166
160
 
167
161
  /**
@@ -286,7 +280,7 @@ function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): Resid
286
280
  facts,
287
281
  "swap",
288
282
  "warning",
289
- `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).`,
290
284
  {
291
285
  ...(entry.sizeVramBytes !== undefined ? { freedVramBytes: entry.sizeVramBytes } : {}),
292
286
  swappedOut: entry.modelId,
@@ -301,7 +295,7 @@ function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): Resid
301
295
  * tiers, eviction order, and every notice case directly testable without a
302
296
  * server.
303
297
  */
304
- export function decideResidency(facts: ResidencyFacts): ResidencyPlan {
298
+ function decideResidency(facts: ResidencyFacts): ResidencyPlan {
305
299
  const notices: ResidencyNotice[] = [];
306
300
  const keepResident = facts.resident.some((entry) => residentMatchesKeep(entry, facts.keepModelId));
307
301
  const others = facts.resident.filter((entry) => !residentMatchesKeep(entry, facts.keepModelId));
@@ -781,29 +775,10 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
781
775
  }
782
776
 
783
777
  /**
784
- * The env-level residency opt-out. Clio manages residency for every
785
- * manageable runtime by default; `CLIO_CODER_RESIDENCY=observe` (or off/0/false/
786
- * user) flips the whole process to observe-only. Per-target opt-out goes
787
- * through {@link residencyManagedFor}.
788
- */
789
- export function residencyManaged(env: NodeJS.ProcessEnv = process.env): boolean {
790
- const opt = (env.CLIO_CODER_RESIDENCY ?? "").trim().toLowerCase();
791
- if (opt === "observe" || opt === "off" || opt === "0" || opt === "false" || opt === "user" || opt === "user-managed") {
792
- return false;
793
- }
794
- return true;
795
- }
796
-
797
- /**
798
- * Combined residency opt-out for one target: the process-wide env switch plus
799
- * the target's explicit `lifecycle: user-managed`. An absent lifecycle means
800
- * the operator made no choice, and Clio manages by default; runtime synthesis
801
- * only sets the metadata field when settings carry an explicit value.
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.
802
781
  */
803
- export function residencyManagedFor(
804
- lifecycle: "user-managed" | "clio-managed" | undefined,
805
- env: NodeJS.ProcessEnv = process.env,
806
- ): boolean {
807
- if (lifecycle === "user-managed") return false;
808
- return residencyManaged(env);
782
+ export function residencyManagedFor(lifecycle: "user-managed" | "clio-coder-managed" | undefined): boolean {
783
+ return lifecycle !== "user-managed";
809
784
  }
@@ -66,20 +66,9 @@ export type ClaudeAgentSdkLoader = () => Promise<ClaudeAgentSdkModule>;
66
66
  // runtime `import()`.
67
67
  const realLoader: ClaudeAgentSdkLoader = async () => await import("@anthropic-ai/claude-agent-sdk");
68
68
 
69
- let loader: ClaudeAgentSdkLoader = realLoader;
69
+ const loader: ClaudeAgentSdkLoader = realLoader;
70
70
  let cached: ClaudeAgentSdkModule | null = null;
71
71
 
72
- /**
73
- * Swap the import used by {@link loadClaudeAgentSdk}. The absence of a 224MB
74
- * optional package cannot be staged inside a normal test process, so the
75
- * contract test intercepts the import here; passing `null` restores the real
76
- * one and clears the cache.
77
- */
78
- export function setClaudeAgentSdkLoader(next: ClaudeAgentSdkLoader | null): void {
79
- loader = next ?? realLoader;
80
- cached = null;
81
- }
82
-
83
72
  /**
84
73
  * Resolve the SDK, or fail with {@link ClaudeAgentSdkUnavailableError}. A load
85
74
  * error that is not a resolution failure (a broken install, a throwing module
@@ -53,11 +53,11 @@ async function* oneSdkUserMessage(message: SDKUserMessage): AsyncIterable<SDKUse
53
53
  yield message;
54
54
  }
55
55
 
56
- export function claudeSdkPermissionModeForAutonomy(_level: AutonomyLevel | undefined): PermissionMode {
56
+ function claudeSdkPermissionModeForAutonomy(_level: AutonomyLevel | undefined): PermissionMode {
57
57
  return "default";
58
58
  }
59
59
 
60
- export function claudeSdkToolsForAutonomy(_level: AutonomyLevel | undefined): NonNullable<Options["tools"]> {
60
+ function claudeSdkToolsForAutonomy(_level: AutonomyLevel | undefined): NonNullable<Options["tools"]> {
61
61
  return DEFAULT_CLAUDE_TOOLS;
62
62
  }
63
63
 
@@ -314,7 +314,7 @@ export interface ClaudeWorkerBudgetGate {
314
314
  }
315
315
 
316
316
  /** Canonical call counter shared by the SDK's PreToolUse/canUseTool mediation seam. */
317
- export function createClaudeWorkerBudgetGate(
317
+ function createClaudeWorkerBudgetGate(
318
318
  budget: WorkerBudget,
319
319
  onBoundary: () => void,
320
320
  onHardCap: () => void,
@@ -438,7 +438,7 @@ function decideToolUse(
438
438
  }
439
439
 
440
440
  /** Share one logical permission decision across the SDK hook/callback pair. */
441
- export function decideClaudeSdkToolUseOnce(
441
+ function decideClaudeSdkToolUseOnce(
442
442
  handled: Map<string, ClaudeToolPermissionDecision>,
443
443
  toolUseID: string | undefined,
444
444
  decide: () => ClaudeToolPermissionDecision,
@@ -536,7 +536,7 @@ export function startClaudeSdkWorkerRun(input: WorkerRunInput, emit: WorkerEvent
536
536
  () => {},
537
537
  () => {
538
538
  budgetFailure = true;
539
- emit({ type: "clio_run_outcome", payload: { outcomeCode: "worker_tool_call_cap_exhausted" } });
539
+ emit({ type: "clio_coder_run_outcome", payload: { outcomeCode: "worker_tool_call_cap_exhausted" } });
540
540
  abort();
541
541
  },
542
542
  resolveDeliveryTools(allowedToolSet, input.product),
@@ -563,7 +563,7 @@ export function startClaudeSdkWorkerRun(input: WorkerRunInput, emit: WorkerEvent
563
563
  if (hookInput.hook_event_name !== "PostToolBatch" || !budgetGate?.phaseReached()) return { continue: true };
564
564
  if (input.budget?.synthesis === false) {
565
565
  budgetFailure = true;
566
- emit({ type: "clio_run_outcome", payload: { outcomeCode: "worker_tool_call_cap_exhausted" } });
566
+ emit({ type: "clio_coder_run_outcome", payload: { outcomeCode: "worker_tool_call_cap_exhausted" } });
567
567
  return { continue: false, stopReason: `worker agent budget reached (${input.budget.toolCalls})` };
568
568
  }
569
569
  return {
@@ -54,7 +54,7 @@ function buildClaudeCodePrompt(input: WorkerRunInput): string {
54
54
  return parts.join("\n\n");
55
55
  }
56
56
 
57
- export function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
57
+ function buildClaudeCodeArgs(input: WorkerRunInput): string[] {
58
58
  assertToolProfileEnforceable(input.toolProfile, "claude-code");
59
59
  const permission = claudeSubprocessPermissionConfigForAutonomy(input.autonomy);
60
60
  const args = [
@@ -227,7 +227,7 @@ function budgetDenial(
227
227
  };
228
228
  }
229
229
 
230
- export function evaluateClaudeToolPermission(input: EvaluateClaudeToolPermissionInput): ClaudeToolPermissionDecision {
230
+ function evaluateClaudeToolPermission(input: EvaluateClaudeToolPermissionInput): ClaudeToolPermissionDecision {
231
231
  const mapped = mapClaudeToolCall(input.toolName, input.input, input.cwd);
232
232
  const call: ClassifierCall = { tool: mapped.clioToolName, args: mapped.args };
233
233
  const attempt = input.budgetGate?.attempt(mapped.clioToolName);
@@ -346,7 +346,7 @@ function emitToolFinish(
346
346
  const finalReasonCode = reasonCode ?? decision.policy?.reasonCode;
347
347
  if (finalReasonCode !== undefined) event.reasonCode = finalReasonCode;
348
348
  if (decision.policy?.policySource !== undefined) event.policySource = decision.policy.policySource;
349
- emit({ type: "clio_tool_finish", payload: event });
349
+ emit({ type: "clio_coder_tool_finish", payload: event });
350
350
  }
351
351
 
352
352
  export function emitClaudeToolPermissionDecision(input: EmitClaudeToolPermissionInput): ClaudeToolPermissionDecision {
@@ -366,7 +366,7 @@ export function emitClaudeToolPermissionDecision(input: EmitClaudeToolPermission
366
366
  startedAt,
367
367
  ...(action !== null ? { action } : {}),
368
368
  };
369
- input.emit({ type: "clio_tool_start", payload: start });
369
+ input.emit({ type: "clio_coder_tool_start", payload: start });
370
370
  if (decision.kind === "allow") {
371
371
  emitToolFinish(
372
372
  input.emit,
@@ -383,7 +383,7 @@ export function emitClaudeToolPermissionDecision(input: EmitClaudeToolPermission
383
383
  if (decision.permissionRequired) {
384
384
  const mode = input.onPermission ?? "deny";
385
385
  input.emit({
386
- type: "clio_permission_resolved",
386
+ type: "clio_coder_permission_resolved",
387
387
  payload: {
388
388
  tool: decision.mapped.clioToolName,
389
389
  actionClass: decision.decision.classification.actionClass,
@@ -6,6 +6,25 @@ import type {
6
6
  ThinkingContent,
7
7
  } from "@earendil-works/pi-ai";
8
8
  import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
9
+ import { inferLocalModelFamily } from "../domains/providers/model-family.js";
10
+
11
+ /**
12
+ * Whether a model id names a Gemma 4 checkpoint, whose chat template writes its
13
+ * private channel with the markers below when llama-server leaves the thought
14
+ * inline in `content` instead of extracting it to `reasoning_content`.
15
+ *
16
+ * Keyed on the wire model id rather than on the resolved family, because
17
+ * `capabilityFamily` returns the knowledge-base family whenever the catalog
18
+ * matches an id and every Gemma entry there names a build (`gemma4-26b-a4b`,
19
+ * `gemma-4-31b-it-qat-mtp`, `gemopus-4-31b-it`), never the literal `gemma-4`
20
+ * that `inferLocalModelFamily` produces for an id the catalog does not match.
21
+ * Gating on the family therefore ran the filter only for Gemma ids the catalog
22
+ * did not know, so naming `gemma4-26b-moe` and `gemma4-31b-dense` in it (issue
23
+ * #263) turned the filter off for the two ids the router actually serves.
24
+ */
25
+ export function usesGemmaChannelMarkers(modelId: string): boolean {
26
+ return inferLocalModelFamily(modelId) === "gemma-4";
27
+ }
9
28
 
10
29
  const THOUGHT_START = /<\|channel>[^\n]*\n/;
11
30
  const BARE_THOUGHT_START = /^\s*(?:thought|own[- ]?(?:thought|think))\s*\n/i;
@@ -87,9 +87,9 @@ export const LOOP_SYNTHESIS_BACKSTOP_DENIALS = 2;
87
87
  export const WIDE_BATCH_DENIAL_FLOOR = 32;
88
88
 
89
89
  /**
90
- * Default lifetime tool-call cap for a worker run. Value and env override live
91
- * in core/guardrails.ts (`CLIO_CODER_WORKER_TOOL_CALL_CAP`); re-exported here for
92
- * tests and callers that reason about the guard's tuning in one place.
90
+ * Default lifetime tool-call cap for a worker run. The configurable value lives
91
+ * at `fleet.limits.toolCallsPerRun`; this default is re-exported for tests and
92
+ * callers that reason about the guard's tuning in one place.
93
93
  */
94
94
  export const DEFAULT_WORKER_TOOL_CALL_CAP = GUARDRAIL_DEFAULTS.workerToolCallCap;
95
95
 
@@ -105,7 +105,7 @@ export const DEFAULT_WORKER_TOOL_CALL_CAP = GUARDRAIL_DEFAULTS.workerToolCallCap
105
105
  * DISTINCT unproductive calls. Legitimate deep work (a repo-wide audit runs
106
106
  * 25+ productive calls in one turn) must not be decapitated by it; mainstream
107
107
  * harnesses run 100+ calls per turn with no ceiling at all. Value and env
108
- * override (`CLIO_CODER_TURN_TOOL_CALL_BUDGET`) live in core/guardrails.ts.
108
+ * live at `safety.limits.chatToolCallsPerTurn`.
109
109
  */
110
110
  export const DEFAULT_ORCH_TURN_TOOL_CALL_BUDGET = GUARDRAIL_DEFAULTS.turnToolCallBudget;
111
111
  /**
@@ -185,6 +185,70 @@ function loopBlockBaseReason(tool: string, repeatCount: number, priorSuccesses:
185
185
  );
186
186
  }
187
187
 
188
+ /** True when a sanitized locked reply holds nothing but the fallback notice. */
189
+ export function isLockedSynthesisFallbackOnly(message: AgentMessage | undefined): boolean {
190
+ if (!message || typeof message !== "object" || (message as { role?: unknown }).role !== "assistant") return false;
191
+ const content = (message as { content?: unknown }).content;
192
+ if (!Array.isArray(content)) return false;
193
+ const text = content
194
+ .filter((block): block is { type: "text"; text: string } => block?.type === "text" && typeof block.text === "string")
195
+ .map((block) => block.text)
196
+ .join("")
197
+ .trim();
198
+ return text === lockedSynthesisFallbackText();
199
+ }
200
+
201
+ export const LOCKED_SYNTHESIS_REPROMPT_TOOL = "clio_synthesis_reprompt";
202
+
203
+ /**
204
+ * One bounded re-prompt after a locked round came back as tool-call markup
205
+ * only. Delivered as a paired synthetic tool exchange, never a user turn, for
206
+ * the same reason the result-contract repair is (#55: a late user message
207
+ * re-renders every earlier assistant turn on templates keyed off the last
208
+ * user message and invalidates the whole prompt cache).
209
+ */
210
+ export function lockedSynthesisRepromptMessages(
211
+ attempt: number,
212
+ origin: { provider: string; api: string; model: string },
213
+ ): ReadonlyArray<AgentMessage> {
214
+ const id = `clio-synthesis-reprompt-${attempt}`;
215
+ const timestamp = Date.now();
216
+ return [
217
+ {
218
+ role: "assistant",
219
+ content: [{ type: "toolCall", id, name: LOCKED_SYNTHESIS_REPROMPT_TOOL, arguments: {} }],
220
+ stopReason: "toolUse",
221
+ usage: {
222
+ input: 0,
223
+ output: 0,
224
+ cacheRead: 0,
225
+ cacheWrite: 0,
226
+ totalTokens: 0,
227
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
228
+ },
229
+ ...origin,
230
+ timestamp,
231
+ },
232
+ {
233
+ role: "toolResult",
234
+ toolCallId: id,
235
+ toolName: LOCKED_SYNTHESIS_REPROMPT_TOOL,
236
+ content: [
237
+ {
238
+ type: "text",
239
+ text:
240
+ "Your previous reply contained only tool-call markup, which cannot run: tool calls are disabled for " +
241
+ "the rest of this run. Everything you gathered is already in the conversation above. Write the " +
242
+ "final answer now as plain prose (or the exact result format the task asked for), with no tool-call " +
243
+ "markup of any kind.",
244
+ },
245
+ ],
246
+ isError: true,
247
+ timestamp,
248
+ },
249
+ ] as unknown as ReadonlyArray<AgentMessage>;
250
+ }
251
+
188
252
  /**
189
253
  * Directive returned when a turn is locked to synthesis: tool use is over, so
190
254
  * the model must answer from what it already gathered. Fed back to the model as
@@ -352,11 +416,6 @@ export function isLoopGuardSynthesisBackstopReason(reason: string): boolean {
352
416
  return /^loop guard: tool calls stayed disabled and .+ was called again instead of answering/.test(reason);
353
417
  }
354
418
 
355
- /** Worker lifetime tool-call cap: env > settings guardrails > default. */
356
- export function readWorkerToolCallCap(env: NodeJS.ProcessEnv = process.env): number {
357
- return resolveGuardrail("workerToolCallCap", env);
358
- }
359
-
360
419
  /** Soft/hard per-turn tool-call budget for the interactive orchestrator. */
361
420
  export interface OrchTurnToolCallBudget {
362
421
  /** Distinct calls in a turn that trigger the re-plan nudge. */
@@ -365,8 +424,8 @@ export interface OrchTurnToolCallBudget {
365
424
  hard: number;
366
425
  }
367
426
 
368
- export function readOrchTurnToolCallBudget(env: NodeJS.ProcessEnv = process.env): OrchTurnToolCallBudget {
369
- const soft = resolveGuardrail("turnToolCallBudget", env);
427
+ export function readOrchTurnToolCallBudget(): OrchTurnToolCallBudget {
428
+ const soft = resolveGuardrail("turnToolCallBudget");
370
429
  return { soft, hard: soft + ORCH_TURN_TOOL_CALL_HARD_MARGIN };
371
430
  }
372
431
 
@@ -421,7 +480,7 @@ export interface CreateLoopGuardRegistrationOptions {
421
480
  * the turn over the bus. Absent for workers, which rely on the lifetime
422
481
  * {@link toolCallCap} instead.
423
482
  */
424
- turnToolCallBudget?: OrchTurnToolCallBudget;
483
+ turnToolCallBudget?: OrchTurnToolCallBudget | (() => OrchTurnToolCallBudget);
425
484
  /**
426
485
  * When the per-turn loop-block budget is exhausted, lock tool use for the
427
486
  * rest of the turn instead of cancelling it outright. Every further call is
@@ -472,7 +531,6 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
472
531
  (cap === undefined || options.toolCallSoftLimit <= cap)
473
532
  ? options.toolCallSoftLimit
474
533
  : undefined;
475
- const turnBudget = options.turnToolCallBudget;
476
534
  const synthesisLockout = options.turnSynthesisLockout === true;
477
535
  let softReadReserve = options.toolCallSoftReadReserve ?? 0;
478
536
  let softReadReserveThreshold =
@@ -521,6 +579,12 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
521
579
  let reserveDirectiveEmitted = false;
522
580
  const blocksByTurn = new Map<string, number>();
523
581
  const callsByTurn = new Map<string, number>();
582
+ /**
583
+ * Per-turn count of successful write or edit calls. The identical-call key
584
+ * carries it, so a check rerun after a change (fix-verify) is a fresh call
585
+ * while a verbatim repeat with nothing changed in between still counts.
586
+ */
587
+ const mutationEpochByTurn = new Map<string, number>();
524
588
  /**
525
589
  * Turns whose tool use is locked to synthesis after reaching the block
526
590
  * budget. Key present means locked; the value carries the block that tripped
@@ -599,6 +663,9 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
599
663
  // (admission returns before execution), so only real results anchor.
600
664
  const recordSuccessfulResult = (input: MiddlewareHookInput): void => {
601
665
  if (input.metadata?.resultKind !== "ok") return;
666
+ if (input.toolName === ToolNames.Write || input.toolName === ToolNames.Edit) {
667
+ bumpBoundedCounter(mutationEpochByTurn, input.turnId ?? NO_TURN_BUCKET);
668
+ }
602
669
  if (!resultCarriesEvidence(input.toolResultDetails)) return;
603
670
  const tool = input.toolName;
604
671
  if (typeof tool !== "string" || tool.length === 0) return;
@@ -753,11 +820,11 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
753
820
 
754
821
  const emitBudgetEvent = (
755
822
  input: MiddlewareHookInput,
823
+ turnBudget: OrchTurnToolCallBudget,
756
824
  callsThisTurn: number,
757
825
  interrupted: boolean,
758
826
  at: number,
759
827
  ): void => {
760
- if (turnBudget === undefined) return;
761
828
  const payload: ToolBudgetExceededPayload = {
762
829
  tool: input.toolName ?? "unknown",
763
830
  callsThisTurn,
@@ -771,6 +838,8 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
771
838
  };
772
839
 
773
840
  const evaluateTurnBudget = (input: MiddlewareHookInput, now: number): ReadonlyArray<MiddlewareEffect> | null => {
841
+ const budgetSource = options.turnToolCallBudget;
842
+ const turnBudget = typeof budgetSource === "function" ? budgetSource() : budgetSource;
774
843
  if (turnBudget === undefined) return null;
775
844
  const turnKey = input.turnId ?? NO_TURN_BUCKET;
776
845
  const callsThisTurn = bumpBoundedCounter(callsByTurn, turnKey);
@@ -778,7 +847,7 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
778
847
  // Hard ceiling: interrupt the turn the same way the block budget does.
779
848
  // The bus event drives chat.cancel() in the interactive layer; the
780
849
  // block effect makes the in-flight attempt fail with the same reason.
781
- if (callsThisTurn === turnBudget.hard) emitBudgetEvent(input, callsThisTurn, true, now);
850
+ if (callsThisTurn === turnBudget.hard) emitBudgetEvent(input, turnBudget, callsThisTurn, true, now);
782
851
  return [
783
852
  {
784
853
  kind: "block_tool",
@@ -797,7 +866,7 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
797
866
  // ever run. The operator sees one warn notice per turn (the first
798
867
  // crossing); the model keeps getting the directive on every further
799
868
  // over-budget attempt so it cannot quietly resume spraying calls.
800
- if (callsThisTurn === turnBudget.soft) emitBudgetEvent(input, callsThisTurn, false, now);
869
+ if (callsThisTurn === turnBudget.soft) emitBudgetEvent(input, turnBudget, callsThisTurn, false, now);
801
870
  return [
802
871
  {
803
872
  kind: "block_tool",
@@ -1089,7 +1158,13 @@ export function createLoopGuardRegistration(options: CreateLoopGuardRegistration
1089
1158
  // regardless of age, so an unscoped key would let one identical call
1090
1159
  // per user turn (rerunning a build across turns) accumulate into a
1091
1160
  // false loop.
1092
- const verdict = options.safety.observeLoop(`${turnKey}|${fingerprint}`, now);
1161
+ // The epoch scopes repeats to "since the last successful write or
1162
+ // edit": a live session repeated a batch of eleven read-only bash
1163
+ // calls five times, every one admitted, because the detector kept
1164
+ // only a 30 s window or the last four attempts and no batch ever
1165
+ // showed a third repeat inside either.
1166
+ const epoch = mutationEpochByTurn.get(turnKey) ?? 0;
1167
+ const verdict = options.safety.observeLoop(`${turnKey}|${epoch}|${fingerprint}`, now);
1093
1168
  if (verdict.looping) {
1094
1169
  const tool = input.toolName ?? "unknown";
1095
1170
  const priorSuccesses = succeededFingerprints.get(fingerprint) ?? 0;