@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
@@ -0,0 +1,88 @@
1
+ import type { SessionPromptInputs } from "../domains/prompts/compiler.js";
2
+ import { canonicalJson, sha256 } from "../domains/prompts/hash.js";
3
+ import type { ContextWindowSource } from "../domains/providers/index.js";
4
+ import type { AutonomyLevel } from "../domains/safety/autonomy.js";
5
+
6
+ /** The exact schema bytes pi attaches to a provider request for one tool. */
7
+ export interface AttachedToolSchema {
8
+ name: string;
9
+ description: string;
10
+ parameters: unknown;
11
+ }
12
+
13
+ /**
14
+ * Project the live agent tools onto the schema fields sent to the provider.
15
+ * Array order is preserved because providers serialize the attached tools in
16
+ * that order, so reordering them changes prompt-prefix bytes too.
17
+ */
18
+ export function attachedToolSchemasFromState(tools: ReadonlyArray<unknown>): AttachedToolSchema[] {
19
+ const schemas: AttachedToolSchema[] = [];
20
+ for (const tool of tools) {
21
+ if (!tool || typeof tool !== "object" || Array.isArray(tool)) continue;
22
+ const record = tool as Record<string, unknown>;
23
+ schemas.push({
24
+ name: typeof record.name === "string" ? record.name : "",
25
+ description: typeof record.description === "string" ? record.description : "",
26
+ parameters: record.parameters ?? null,
27
+ });
28
+ }
29
+ return schemas;
30
+ }
31
+
32
+ /**
33
+ * Serialize the exact ordered schema sequence attached to a provider request.
34
+ *
35
+ * `canonicalJson` is deliberately not used here: provider JSON preserves tool
36
+ * array order and nested object insertion order, so canonicalizing parameters
37
+ * can alias two byte-distinct request prefixes. Standard `JSON.stringify`
38
+ * matches the request serialization boundary and throws for unsupported
39
+ * values such as circular references and bigint.
40
+ */
41
+ export function attachedToolSchemaBytes(schemas: ReadonlyArray<AttachedToolSchema>): string {
42
+ try {
43
+ const bytes = JSON.stringify(schemas);
44
+ if (bytes === undefined) throw new Error("JSON.stringify returned undefined");
45
+ return bytes;
46
+ } catch (err) {
47
+ const reason = err instanceof Error ? err.message : String(err);
48
+ throw new Error(`attached tool schemas are not JSON-serializable: ${reason}`, { cause: err });
49
+ }
50
+ }
51
+
52
+ export interface MainPromptCacheIdentityInput {
53
+ targetId: string;
54
+ runtimeId: string;
55
+ wireModelId: string;
56
+ autonomy: AutonomyLevel;
57
+ sessionId: string;
58
+ cwd: string;
59
+ workingContextPaths: ReadonlyArray<string>;
60
+ contextWindowSource: ContextWindowSource | null;
61
+ promptInputEpoch: string;
62
+ sessionInputs: SessionPromptInputs;
63
+ attachedToolSchemas: ReadonlyArray<AttachedToolSchema>;
64
+ }
65
+
66
+ /**
67
+ * Canonical identity for the interactive session-prompt compile cache.
68
+ * Config hot reload explicitly invalidates compiler-owned fragments and
69
+ * rosters; this identity covers every live/caller input resolved per turn.
70
+ */
71
+ export function mainPromptCacheIdentity(input: MainPromptCacheIdentityInput): string {
72
+ return sha256(
73
+ canonicalJson({
74
+ version: 2,
75
+ targetId: input.targetId,
76
+ runtimeId: input.runtimeId,
77
+ wireModelId: input.wireModelId,
78
+ autonomy: input.autonomy,
79
+ sessionId: input.sessionId,
80
+ cwd: input.cwd,
81
+ workingContextPaths: [...input.workingContextPaths].sort((a, b) => a.localeCompare(b)),
82
+ contextWindowSource: input.contextWindowSource,
83
+ promptInputEpoch: input.promptInputEpoch,
84
+ sessionInputs: input.sessionInputs,
85
+ attachedToolSchemaBytes: attachedToolSchemaBytes(input.attachedToolSchemas),
86
+ }),
87
+ );
88
+ }
@@ -206,6 +206,36 @@ function researchReport(value: Record<string, unknown>): PresentedContractAnswer
206
206
  return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `source ${value.source}` };
207
207
  }
208
208
 
209
+ function worldKnowledgeReport(value: Record<string, unknown>): PresentedContractAnswer | null {
210
+ if (
211
+ (value.discovery !== "performed" &&
212
+ value.discovery !== "caller-supplied-only" &&
213
+ value.discovery !== "unavailable") ||
214
+ !Array.isArray(value.facts) ||
215
+ !isStringArray(value.synthesis) ||
216
+ !isStringArray(value.uncertainties) ||
217
+ !isStringArray(value.followUpVerification)
218
+ ) {
219
+ return null;
220
+ }
221
+ const lines: string[] = [];
222
+ for (const raw of value.facts) {
223
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return null;
224
+ const fact = raw as Record<string, unknown>;
225
+ const claim = reportString(fact.claim);
226
+ const evidence = reportString(fact.evidence);
227
+ if (claim === null || evidence === null || !isStringArray(fact.sources)) return null;
228
+ lines.push(`- ${claim}`, ` support: ${evidence}`);
229
+ if (fact.sources.length > 0) lines.push(` sources: ${fact.sources.join(", ")}`);
230
+ }
231
+ if (value.synthesis.length > 0) lines.push("Synthesis:", ...value.synthesis.map((item) => `- ${item}`));
232
+ if (value.uncertainties.length > 0) lines.push("Uncertainties:", ...value.uncertainties.map((item) => `- ${item}`));
233
+ if (value.followUpVerification.length > 0) {
234
+ lines.push("Verify next:", ...value.followUpVerification.map((item) => `- ${item}`));
235
+ }
236
+ return { lines: lines.length === 0 ? ["No findings reported."] : lines, footer: `discovery ${value.discovery}` };
237
+ }
238
+
209
239
  function scoutReport(value: Record<string, unknown>): PresentedContractAnswer | null {
210
240
  if (!Array.isArray(value.findings) || typeof value.needsSplit !== "boolean") return null;
211
241
  const lines: string[] = [];
@@ -250,6 +280,8 @@ function presentedContractAnswer(entry: WorkerEntryState): PresentedContractAnsw
250
280
  return verifierReport(value);
251
281
  case "research-report":
252
282
  return researchReport(value);
283
+ case "world-knowledge-report":
284
+ return worldKnowledgeReport(value);
253
285
  case "scout-report":
254
286
  return scoutReport(value);
255
287
  }
@@ -13,12 +13,12 @@ import type { ReceiptIntegrityOutcome } from "../domains/evidence/trust-status.j
13
13
  import type { InstalledExtension } from "../domains/extensions/index.js";
14
14
  import type { InteropAgentId, InteropProposal, InteropReport } from "../domains/interop/index.js";
15
15
  import {
16
- isPanesPresetId,
17
16
  PANES_PRESET_IDS,
18
17
  PANES_PRESETS,
19
18
  type PanesOperations,
20
19
  type PanesPresetId,
21
20
  type PanesStatus,
21
+ resolvePanesPresetId,
22
22
  } from "../domains/mux/operations.js";
23
23
  import type { ProvidersContract, ResolvedModelRef } from "../domains/providers/index.js";
24
24
  import { resolveModelReference } from "../domains/providers/index.js";
@@ -28,9 +28,10 @@ import type {
28
28
  PromptTemplateExpansion,
29
29
  ResourceList,
30
30
  } from "../domains/resources/index.js";
31
- import { parseSkillCommand } from "../domains/resources/index.js";
31
+ import { parseSkillCommand, SKILL_SURFACE_CLEAR_ARG } from "../domains/resources/index.js";
32
32
  import type { ShareImportPlan } from "../domains/share/index.js";
33
33
  import type { UserTask } from "../domains/user-tasks/store.js";
34
+ import type { ExtensionReloadOutcome } from "../entry/extension-reload.js";
34
35
  import { isToolProfileName, TOOL_PROFILE_NAMES, type ToolProfileName } from "../tools/profiles.js";
35
36
  import type { NoticeLevel } from "./command-output.js";
36
37
  import {
@@ -115,8 +116,10 @@ type SlashCommandVariant =
115
116
  /** `ref` is the turnId an `[evicted ...]` marker names. */
116
117
  | { kind: "context-recall"; ref: string }
117
118
  | { kind: "skill-selector" }
118
- | { kind: "resources"; family?: "skills" | "prompts" | "extensions"; tab?: LibraryEntryKind }
119
+ | { kind: "resources"; family?: "skills" | "prompts" | "extensions"; tab?: LibraryEntryKind; action?: "reload" }
119
120
  | { kind: "skill-invocation"; text: string }
121
+ /** `/skill off`: drop the tool surface an activated skill armed for the session. */
122
+ | { kind: "skill-surface-clear" }
120
123
  | ShareCommandVariant
121
124
  | ArchiveCommandVariant
122
125
  /** `source` is the line the operator typed, echoed above the run's transcript block. */
@@ -161,6 +164,9 @@ type SlashCommandVariant =
161
164
  | { kind: "panes-zoom"; target: string }
162
165
  | { kind: "panes-close"; target: string }
163
166
  | { kind: "panes-usage"; reason?: string }
167
+ /** `/files`: toggle the files pane; `pick` borrows it for one selection; `close` closes it. */
168
+ | { kind: "files"; action: "toggle" | "open" | "close" | "pick" }
169
+ | { kind: "files-usage"; reason: string }
164
170
  | { kind: "thinking-set"; level: string }
165
171
  | { kind: "thinking-picker" }
166
172
  | { kind: "output-set"; verbosity: string }
@@ -591,6 +597,12 @@ export interface SlashCommandContext {
591
597
  */
592
598
  runContextRecall?: (ref: string) => void;
593
599
  openSkillsHub?: (tab?: LibraryEntryKind) => void;
600
+ /**
601
+ * `/skill off`: drop the tool surface an activated skill armed for the
602
+ * session. Returns the names that were armed. Absent on a host with no
603
+ * chat loop, where nothing can be armed in the first place.
604
+ */
605
+ clearSkillSurface?: () => ReadonlyArray<string>;
594
606
  listPrompts: () => ResourceList<PromptTemplate>;
595
607
  /**
596
608
  * Resolve a `/name` against the loaded prompt templates. Absent when the host
@@ -599,6 +611,13 @@ export interface SlashCommandContext {
599
611
  */
600
612
  expandPromptTemplate?: (text: string) => PromptTemplateExpansion;
601
613
  listExtensions?: () => ReadonlyArray<InstalledExtension>;
614
+ /**
615
+ * `/resources extensions reload`: build, validate, and commit the next
616
+ * extension generation together with its user hooks, or report why it was
617
+ * refused. Absent on a host without the reload coordinator, in which case
618
+ * the command says so instead of pretending.
619
+ */
620
+ reloadExtensions?: () => ExtensionReloadOutcome;
602
621
  /** Detection report, pending proposals, and the two consent actions `/interop` drives. */
603
622
  interop?: {
604
623
  report: () => InteropReport | null;
@@ -901,9 +920,9 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
901
920
  },
902
921
  {
903
922
  name: "skill",
904
- description: "Open the Skills Hub or invoke a skill",
923
+ description: "Open the Skills Hub, invoke a skill, or `off` to drop an active skill's tool surface",
905
924
  group: "Work",
906
- kinds: ["skill-selector", "skill-invocation"],
925
+ kinds: ["skill-selector", "skill-invocation", "skill-surface-clear"],
907
926
  args: {
908
927
  positionals: [
909
928
  { name: "name", required: false },
@@ -915,16 +934,26 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
915
934
  return { kind: "skill-selector" };
916
935
  }
917
936
  const command = parseSkillCommand(trimmed);
918
- if (command) {
919
- return { kind: "skill-invocation", text: trimmed };
937
+ if (!command) return null;
938
+ // `off` is the one reserved name: an installed skill called `off`
939
+ // would still be reachable from the hub, and clearing the armed
940
+ // surface has to stay typeable without a second command.
941
+ if (command.name === SKILL_SURFACE_CLEAR_ARG && command.args.length === 0) {
942
+ return { kind: "skill-surface-clear" };
920
943
  }
921
- return null;
944
+ return { kind: "skill-invocation", text: trimmed };
922
945
  },
923
946
  handle(command, ctx) {
924
947
  if (command.kind === "skill-selector") {
925
948
  ctx.openSkillsHub?.();
926
949
  } else if (command.kind === "skill-invocation") {
927
950
  ctx.submitChat(command.text);
951
+ } else if (command.kind === "skill-surface-clear") {
952
+ const cleared = ctx.clearSkillSurface?.() ?? [];
953
+ ctx.notice(
954
+ "info",
955
+ cleared.length > 0 ? `Skill tool surface cleared: ${cleared.join(", ")}.` : "No skill tool surface is active.",
956
+ );
928
957
  }
929
958
  },
930
959
  },
@@ -937,22 +966,27 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
937
966
  skills: "Browse installed skills",
938
967
  prompts: "Browse prompt templates",
939
968
  library: "Browse resource libraries",
940
- extensions: "Browse installed extensions",
969
+ extensions: "Browse installed extensions; `reload` commits a new extension generation",
941
970
  },
942
971
  args: {
943
972
  subcommands: {
944
973
  skills: {},
945
974
  prompts: {},
946
975
  library: { positionals: [{ name: "kind", required: false }] },
947
- extensions: {},
976
+ extensions: { positionals: [{ name: "action", required: false, values: ["reload"] }] },
948
977
  },
949
978
  },
950
979
  fromArgs(parsed) {
951
980
  if (parsed.error) return { kind: "usage-error", command: "resources", reason: parsed.error };
952
981
  if (parsed.subcommand === undefined || parsed.subcommand === "skills")
953
982
  return { kind: "resources", family: "skills" };
954
- if (parsed.subcommand === "prompts" || parsed.subcommand === "extensions")
955
- return { kind: "resources", family: parsed.subcommand };
983
+ if (parsed.subcommand === "prompts") return { kind: "resources", family: "prompts" };
984
+ if (parsed.subcommand === "extensions") {
985
+ const action = parsed.positionals[0];
986
+ if (action === undefined) return { kind: "resources", family: "extensions" };
987
+ if (action === "reload") return { kind: "resources", family: "extensions", action: "reload" };
988
+ return { kind: "usage-error", command: "resources", reason: `Unknown action: ${action} (one of reload)` };
989
+ }
956
990
  const tab = parsed.positionals[0];
957
991
  if (tab === undefined) return { kind: "resources" };
958
992
  if (!isLibraryTab(tab)) {
@@ -964,8 +998,10 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
964
998
  handle(command, ctx) {
965
999
  if (command.kind !== "resources") return;
966
1000
  if (command.family === "prompts") ctx.openPrompts();
967
- else if (command.family === "extensions") ctx.openExtensions();
968
- else ctx.openSkillsHub?.(command.tab);
1001
+ else if (command.family === "extensions") {
1002
+ if (command.action === "reload") reloadExtensionsCommand(ctx);
1003
+ else ctx.openExtensions();
1004
+ } else ctx.openSkillsHub?.(command.tab);
969
1005
  },
970
1006
  },
971
1007
  {
@@ -1643,7 +1679,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1643
1679
  },
1644
1680
  subcommandDescriptions: {
1645
1681
  show: "watch a live run or agent in the watch pane",
1646
- open: `open a utility pane (${PANES_PRESET_IDS.join(", ")}, or a command)`,
1682
+ open: `open a utility pane (${PANES_PRESET_IDS.join(", ")}, \`files --once\` for one pick, or a command)`,
1647
1683
  zoom: "toggle zoom on a Clio-owned pane (default: the watch pane)",
1648
1684
  close: "close a Clio-owned pane, or all of them",
1649
1685
  },
@@ -1659,9 +1695,10 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1659
1695
  const first = argv[0] ?? "";
1660
1696
  // A bare preset name is a preset; anything else is operator argv,
1661
1697
  // which the tool surface deliberately cannot ask for.
1662
- if (argv.length === 1 && isPanesPresetId(first)) return { kind: "panes-open", preset: first };
1663
- if (argv.length === 2 && first === "yazi" && argv[1] === "--once") {
1664
- return { kind: "panes-open", preset: "yazi", once: true };
1698
+ const preset = resolvePanesPresetId(first);
1699
+ if (argv.length === 1 && preset !== null) return { kind: "panes-open", preset };
1700
+ if (argv.length === 2 && preset === "files" && argv[1] === "--once") {
1701
+ return { kind: "panes-open", preset: "files", once: true };
1665
1702
  }
1666
1703
  return { kind: "panes-open", argv };
1667
1704
  }
@@ -1691,7 +1728,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1691
1728
  // every `--with-panes` session, even one where no pane host answered.
1692
1729
  ctx.notice(
1693
1730
  "info",
1694
- "panes are inactive: this session started without them. Restart with `clio-coder --with-panes`, or set panes.enabled=auto",
1731
+ "panes are inactive: this session started without them. Restart with `clio-coder --with-panes`, or set interface.panes.enabled=auto",
1695
1732
  );
1696
1733
  return;
1697
1734
  }
@@ -1728,7 +1765,14 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1728
1765
  // The in-terminal chooser has already restored the TUI by the
1729
1766
  // time this resolves. A pick emitted its composer notice; an empty
1730
1767
  // chooser was cancellation and deliberately stays silent.
1731
- if (result.paneId !== null) ctx.notice("success", `opened pane ${result.label} (${result.paneId})`);
1768
+ if (result.paneId !== null) {
1769
+ ctx.notice(
1770
+ "success",
1771
+ result.existing
1772
+ ? `focused pane ${result.label} (${result.paneId})`
1773
+ : `opened pane ${result.label} (${result.paneId})`,
1774
+ );
1775
+ }
1732
1776
  } else if (result.status === "missing-binary") {
1733
1777
  // This is a synchronous slash-surface line, not a transient pane-host
1734
1778
  // notification. It remains visible when no pane was ever created and
@@ -1768,6 +1812,62 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1768
1812
  });
1769
1813
  },
1770
1814
  },
1815
+ {
1816
+ name: "files",
1817
+ description: "Toggle the files pane; picks land in the composer as @ mentions",
1818
+ group: "Inspect",
1819
+ kinds: ["files", "files-usage"],
1820
+ args: { positionals: [{ name: "action", required: false }] },
1821
+ subcommandDescriptions: {
1822
+ open: "open the files pane, or focus it when it is already open",
1823
+ close: "close the files pane",
1824
+ pick: "borrow the files pane for one selection, then close it",
1825
+ },
1826
+ fromArgs(parsed) {
1827
+ if (parsed.error) return { kind: "files-usage", reason: parsed.error };
1828
+ const action = parsed.positionals[0];
1829
+ if (action === undefined) return { kind: "files", action: "toggle" };
1830
+ if (action === "open" || action === "close" || action === "pick" || action === "toggle") {
1831
+ return { kind: "files", action };
1832
+ }
1833
+ return { kind: "files-usage", reason: `Unexpected argument: ${action}` };
1834
+ },
1835
+ handle(command, ctx) {
1836
+ if (command.kind === "files-usage") {
1837
+ ctx.notice("info", `${command.reason}\nusage: /files [open|close|pick]`);
1838
+ return;
1839
+ }
1840
+ if (command.kind !== "files") return;
1841
+ const panes = ctx.panes;
1842
+ if (!panes) {
1843
+ ctx.notice(
1844
+ "info",
1845
+ "the files pane is inactive: this session started without panes. Restart with `clio-coder --with-panes`, or set interface.panes.enabled=auto",
1846
+ );
1847
+ return;
1848
+ }
1849
+ const runLocal = ctx.runLocalOperation ?? ((operation: () => Promise<void>) => void operation());
1850
+ runLocal(async () => {
1851
+ const result = await panes.files(command.action);
1852
+ if (result.status === "opened") {
1853
+ // The in-terminal chooser reports through its own composer notice.
1854
+ if (result.paneId !== null) {
1855
+ ctx.notice(
1856
+ "success",
1857
+ result.existing ? `files pane focused (${result.paneId})` : `files pane opened (${result.paneId})`,
1858
+ );
1859
+ }
1860
+ } else if (result.status === "closed") {
1861
+ ctx.notice("info", "files pane closed");
1862
+ } else if (result.status === "missing-binary") {
1863
+ ctx.io.stdout(`${result.detail}\n`);
1864
+ ctx.render();
1865
+ } else {
1866
+ ctx.notice("warn", result.reason);
1867
+ }
1868
+ });
1869
+ },
1870
+ },
1771
1871
  {
1772
1872
  name: "thinking",
1773
1873
  description: "Set the chat thinking level",
@@ -2069,6 +2169,39 @@ function retiredCommandHint(token: string): string | undefined {
2069
2169
  }
2070
2170
 
2071
2171
  /** Pure slash-command parser: no I/O, no side effects. Walks the registry in order. */
2172
+ /**
2173
+ * One notice line for a reload outcome. Success when the generation committed
2174
+ * cleanly; warn when it committed with dropped hooks or declaration issues;
2175
+ * error when it was refused and the previous generation stays active.
2176
+ */
2177
+ export function formatExtensionReloadNotice(outcome: ExtensionReloadOutcome): [NoticeLevel, string] {
2178
+ if (outcome.status !== "committed") {
2179
+ return ["error", `extensions: reload rejected (${outcome.reason}); generation ${outcome.generation} stays active`];
2180
+ }
2181
+ const delta = outcome.changed
2182
+ ? `changed: +${outcome.added.length} -${outcome.removed.length} ~${outcome.modified.length}`
2183
+ : "unchanged";
2184
+ const issueCount = outcome.hooks.fileIssues + outcome.hooks.issues;
2185
+ const hookParts = [`${outcome.hooks.registered} registered`];
2186
+ if (outcome.hooks.dropped > 0) hookParts.push(`${outcome.hooks.dropped} dropped`);
2187
+ if (issueCount > 0) hookParts.push(`${issueCount} issue${issueCount === 1 ? "" : "s"}`);
2188
+ if (outcome.hooks.overridden > 0) hookParts.push(`${outcome.hooks.overridden} overridden`);
2189
+ const level: NoticeLevel = outcome.hooks.dropped > 0 || issueCount > 0 ? "warn" : "success";
2190
+ return [level, `extensions: generation ${outcome.generation} committed (${delta}); hooks: ${hookParts.join(", ")}`];
2191
+ }
2192
+
2193
+ function reloadExtensionsCommand(ctx: SlashCommandContext): void {
2194
+ if (!ctx.reloadExtensions) {
2195
+ ctx.notice("warn", "extensions: reload is unavailable in this session; restart to pick up installed changes");
2196
+ return;
2197
+ }
2198
+ const outcome = ctx.reloadExtensions();
2199
+ const [level, text] = formatExtensionReloadNotice(outcome);
2200
+ ctx.notice(level, text);
2201
+ for (const line of outcome.lines) ctx.notice("warn", line);
2202
+ if (outcome.status === "committed") ctx.openExtensions();
2203
+ }
2204
+
2072
2205
  export function parseSlashCommand(input: string): SlashCommand {
2073
2206
  const trimmed = input.trim();
2074
2207
  if (trimmed.length === 0) return { kind: "empty" };
@@ -1,28 +1,6 @@
1
- import type { SmoothStreaming } from "../core/defaults.js";
2
-
3
- export const SMOOTH_STREAM_ENV = "CLIO_CODER_SMOOTH_STREAM";
4
-
5
- /**
6
- * One-process override precedence: a valid environment value wins, while an
7
- * invalid value can never accidentally enable animation. `0` is the immediate
8
- * escape hatch; `1` is accepted as the explicit `on` spelling.
9
- */
10
- export function resolveSmoothStreamingMode(
11
- configured: SmoothStreaming,
12
- env: NodeJS.ProcessEnv = process.env,
13
- ): SmoothStreaming {
14
- const raw = env[SMOOTH_STREAM_ENV]?.trim().toLowerCase();
15
- if (!raw) return configured;
16
- if (raw === "0" || raw === "off" || raw === "false") return "off";
17
- if (raw === "auto") return "auto";
18
- if (raw === "1" || raw === "on" || raw === "true") return "on";
19
- return "off";
20
- }
21
-
22
1
  export interface AutoPacingEnvironment {
23
2
  isTTY: boolean;
24
3
  term?: string;
25
- termProgram?: string;
26
4
  sshConnection?: string;
27
5
  sshTty?: string;
28
6
  tmux?: string;
@@ -53,7 +31,6 @@ export function processAutoPacingAllowed(backpressureObserved: boolean, env: Nod
53
31
  return autoPacingAllowed({
54
32
  isTTY: process.stdout.isTTY === true,
55
33
  ...(env.TERM === undefined ? {} : { term: env.TERM }),
56
- ...(env.TERM_PROGRAM === undefined ? {} : { termProgram: env.TERM_PROGRAM }),
57
34
  ...(env.SSH_CONNECTION === undefined ? {} : { sshConnection: env.SSH_CONNECTION }),
58
35
  ...(env.SSH_TTY === undefined ? {} : { sshTty: env.SSH_TTY }),
59
36
  ...(env.TMUX === undefined ? {} : { tmux: env.TMUX }),
@@ -1,23 +1,29 @@
1
1
  /**
2
2
  * Abbreviate a wire model id for chips and dashboards without amputating a
3
- * version suffix. Whole dash-separated parts are kept while the joined result
4
- * stays within 18 characters, so `claude-sonnet-5` and `claude-opus-4-8`
5
- * survive intact and `qwen3-coder-30b-a3b-instruct` collapses to
6
- * `qwen3-coder-30b`. A single part longer than 18 characters is hard-clipped.
3
+ * meaningful placement prefix or version suffix. `dynamo/qwen3.8-27b` remains
4
+ * visible as selected; only the leaf is shortened when the complete route is
5
+ * wider than 24 characters.
7
6
  */
8
7
  export function abbreviateModelId(modelId: string | null | undefined): string {
9
- const base = (modelId ?? "").trim().split("/").filter(Boolean).pop() ?? "";
8
+ const segments = (modelId ?? "").trim().split("/").filter(Boolean);
9
+ const base = segments.pop() ?? "";
10
10
  if (base.length === 0) return "model";
11
+ const prefix = segments[0];
12
+ const maxLeaf = prefix ? Math.max(8, 24 - prefix.length - 1) : 18;
11
13
  const parts = base.split("-").filter((part) => part.length > 0);
12
- if (parts.length <= 1) return base.length > 18 ? base.slice(0, 18) : base;
13
- const kept: string[] = [];
14
- for (const part of parts) {
15
- const next = [...kept, part].join("-");
16
- if (kept.length > 0 && next.length > 18) break;
17
- kept.push(part);
14
+ let leaf: string;
15
+ if (parts.length <= 1) leaf = base.length > maxLeaf ? base.slice(0, maxLeaf) : base;
16
+ else {
17
+ const kept: string[] = [];
18
+ for (const part of parts) {
19
+ const next = [...kept, part].join("-");
20
+ if (kept.length > 0 && next.length > maxLeaf) break;
21
+ kept.push(part);
22
+ }
23
+ const joined = kept.join("-");
24
+ leaf = joined.length > maxLeaf ? joined.slice(0, maxLeaf) : joined;
18
25
  }
19
- const joined = kept.join("-");
20
- return joined.length > 18 ? joined.slice(0, 18) : joined;
26
+ return prefix ? `${prefix}/${leaf}` : leaf;
21
27
  }
22
28
 
23
29
  export interface TargetLabelOptions {
@@ -81,7 +81,7 @@ import {
81
81
  type SessionPromptCompileRecord,
82
82
  } from "../domains/session/prompt-manifest.js";
83
83
  import type { AgentMessage, Usage } from "../engine/types.js";
84
- import type { ToolRegistry } from "../tools/registry.js";
84
+ import { resolveToolPromptHint, type ToolRegistry } from "../tools/registry.js";
85
85
  import {
86
86
  backendCacheVerdict,
87
87
  extractUserText,
@@ -90,6 +90,7 @@ import {
90
90
  toolNamesFromAgentState,
91
91
  } from "./chat-loop-messages.js";
92
92
  import { buildModelReplayAgentMessagesFromTurns } from "./model-session-replay.js";
93
+ import { attachedToolSchemasFromState, mainPromptCacheIdentity } from "./prompt-cache-identity.js";
93
94
  import { renderCompactionSummaryLine, renderEvictionSkipLine } from "./renderers/compaction-summary.js";
94
95
  import type { TurnMiddleware } from "./turn-middleware.js";
95
96
  import type { AgentRuntime, ChatTurnState } from "./turn-state.js";
@@ -270,8 +271,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
270
271
  // before the operator did.
271
272
  let lastPrewarm: PrewarmStats | null = null;
272
273
  // The session system prompt, compiled once per session. Recompiles happen
273
- // only on explicit events: the compile key (target, model, safety level,
274
- // session id) changes, or a config hot-reload invalidates the cache. A
274
+ // only when the canonical identity of every live compile input changes, or
275
+ // a config hot-reload invalidates compiler-owned inputs. A
275
276
  // recompile that changes the prompt text appends a "promptRecompiled"
276
277
  // ledger entry so a cold provider cache is always explainable.
277
278
  let sessionPrompt: CompiledSessionPrompt | null = null;
@@ -640,8 +641,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
640
641
  if (!usage || !deps.observability) return;
641
642
  if (usage.totalTokens <= 0 && usage.cost.total <= 0) return;
642
643
  deps.observability.recordTokens(
643
- agentRuntime.targetId,
644
- agentRuntime.wireModelId,
644
+ usage.targetId ?? agentRuntime.targetId,
645
+ usage.modelId ?? agentRuntime.wireModelId,
645
646
  usage.totalTokens,
646
647
  usage.cost.total,
647
648
  {
@@ -653,7 +654,11 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
653
654
  totalTokens: usage.totalTokens,
654
655
  apiCalls: Math.max(1, Math.round(usage.apiCalls)),
655
656
  },
656
- agentRuntime.runtimeResolution.costProvenance,
657
+ usage.targetId === undefined && usage.modelId === undefined
658
+ ? agentRuntime.runtimeResolution.costProvenance
659
+ : usage.cost.total > 0
660
+ ? "estimated"
661
+ : "unknown",
657
662
  );
658
663
  };
659
664
 
@@ -914,8 +919,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
914
919
  if (!summaryLifecycleStarted) startSummaryLifecycle();
915
920
  deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
916
921
 
917
- // The summarization call spends tokens on the same target the turn would
918
- // have. The ledger entry carries its usage for a later reseed; this is the
922
+ // The checkpoint identifies the selected summary route; older results
923
+ // fall back to the active chat route. The ledger carries usage for reseed; this is the
919
924
  // live sink, so `/cost` and the footer move the moment /context compact
920
925
  // returns instead of staying byte-identical to before it ran.
921
926
  recordCompactionUsage(agentRuntime, result);
@@ -1021,8 +1026,8 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1021
1026
 
1022
1027
  /**
1023
1028
  * Ensure the session system prompt is compiled and applied to the live
1024
- * agent. Compiles only when the compile key (target, model, safety
1025
- * level, session id) changes or a config hot-reload invalidated the
1029
+ * agent. Compiles only when the canonical live-input identity changes
1030
+ * or a config hot-reload invalidated compiler-owned inputs in the
1026
1031
  * cache; every other submit reuses the cached prompt byte-for-byte. A
1027
1032
  * compile whose text differs from the previous prompt queues a
1028
1033
  * "promptRecompiled" ledger entry (written once the session exists).
@@ -1032,14 +1037,9 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1032
1037
  const settings = deps.getSettings();
1033
1038
  const autonomy = settings.safety.autonomy ?? "auto-edit";
1034
1039
  const sessionId = deps.session?.current()?.id ?? "";
1035
- const workingContextKey = [...sessionWorkingContextPaths].sort().join("\0");
1036
- const key = `${agentRuntime.targetId}|${agentRuntime.wireModelId}|${autonomy}|${sessionId}|${workingContextKey}`;
1037
- if (sessionPrompt && sessionPromptKey === key) {
1038
- lastSystemPromptReused = true;
1039
- return sessionPrompt;
1040
- }
1040
+ const cwd = process.cwd();
1041
1041
  const modelState = agentRuntime.agent.state.model as
1042
- | (typeof agentRuntime.agent.state.model & { clio?: { quirks?: LocalModelQuirks } })
1042
+ | (typeof agentRuntime.agent.state.model & { clioCoder?: { quirks?: LocalModelQuirks } })
1043
1043
  | undefined;
1044
1044
  // `Context window: N` is the window the backend will actually serve
1045
1045
  // this session, taken from the resolution the turn already ran rather
@@ -1057,13 +1057,14 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1057
1057
  const contextWindow = typeof resolvedWindow === "number" && resolvedWindow > 0 ? resolvedWindow : null;
1058
1058
  const contextWindowSource: ContextWindowSource | null =
1059
1059
  contextWindow === null ? null : windowDetails.contextWindowSource;
1060
- const guidance = modelState?.clio?.quirks?.thinking?.guidance;
1060
+ const guidance = modelState?.clioCoder?.quirks?.thinking?.guidance;
1061
1061
  // Per-tool prompt hints come from registry metadata, derived once from
1062
1062
  // the frozen surface per compile. The compiler renders them sorted by
1063
1063
  // tool name, so the compiled text stays byte-stable for a given surface.
1064
1064
  const toolNames = toolNamesFromAgentState(agentRuntime.agent.state.tools);
1065
+ const attachedToolSchemas = attachedToolSchemasFromState(agentRuntime.agent.state.tools);
1065
1066
  const toolPromptHints = toolNames.flatMap((name) => {
1066
- const hint = deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint;
1067
+ const hint = resolveToolPromptHint(deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint, "session");
1067
1068
  return hint ? [{ tool: name, hint }] : [];
1068
1069
  });
1069
1070
  const sessionInputs: SessionPromptInputs = {
@@ -1085,11 +1086,29 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
1085
1086
  );
1086
1087
  }
1087
1088
  }
1089
+ const key = mainPromptCacheIdentity({
1090
+ targetId: agentRuntime.targetId,
1091
+ runtimeId: agentRuntime.runtimeId,
1092
+ wireModelId: agentRuntime.wireModelId,
1093
+ autonomy,
1094
+ sessionId,
1095
+ cwd,
1096
+ workingContextPaths: [...sessionWorkingContextPaths],
1097
+ contextWindowSource,
1098
+ promptInputEpoch: deps.prompts.inputEpoch(),
1099
+ sessionInputs,
1100
+ attachedToolSchemas,
1101
+ });
1102
+ if (sessionPrompt && sessionPromptKey === key) {
1103
+ lastSystemPromptReused = true;
1104
+ return sessionPrompt;
1105
+ }
1088
1106
  try {
1089
1107
  const result = await deps.prompts.compileSessionPrompt({
1108
+ sessionId,
1090
1109
  sessionInputs,
1091
1110
  autonomy,
1092
- cwd: process.cwd(),
1111
+ cwd,
1093
1112
  workingContextPaths: [...sessionWorkingContextPaths],
1094
1113
  });
1095
1114
  const previousHash = sessionPromptHash ?? lastRecordedPromptHash();