@iowarp/clio-coder 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -72,6 +72,10 @@ export function listMigrations(): ReadonlyArray<Migration> {
72
72
  return REGISTRY;
73
73
  }
74
74
 
75
+ export function readMigrationManifest(stateDir: string): MigrationManifest {
76
+ return readManifest(manifestPath(stateDir));
77
+ }
78
+
75
79
  function manifestPath(stateDir: string): string {
76
80
  return join(stateDir, "migrations.json");
77
81
  }
@@ -29,11 +29,16 @@ export interface TaskMemoryTrajectoryStep {
29
29
  resultDigestProvenance: ToolResultDigestProvenance;
30
30
  }
31
31
 
32
+ /** Admission changed while a client prepared; no inference request was sent. */
33
+ export class TaskMemoryEndpointBusyError extends Error {}
34
+
32
35
  export interface TaskMemoryModelRequest {
33
36
  systemPrompt: string;
34
37
  userPrompt: string;
35
38
  maxTokens: number;
36
39
  signal: AbortSignal;
40
+ /** Known usage may arrive even when completion rejects or the policy has been canceled. */
41
+ onUsage?: (usage: TaskMemoryStepUsage) => void;
37
42
  }
38
43
 
39
44
  /**
@@ -116,10 +121,8 @@ export type TaskMemoryPolicyReason =
116
121
  */
117
122
  | "timed_out"
118
123
  /**
119
- * The step would have run on the endpoint the chat target is streaming
120
- * against, so it never started. A single-slot local server queues the memory
121
- * call behind the operator's own turn, or evicts the resident model to serve
122
- * it; neither is a cost a background step may impose.
124
+ * Known occupancy exhausts the endpoint request capacity, so no step starts.
125
+ * A shared gateway URL alone does not establish a one-slot capacity bound.
123
126
  */
124
127
  | "endpoint_busy"
125
128
  /** The model client threw: unreachable route, auth failure, malformed request. */
@@ -139,7 +142,9 @@ export type TaskMemoryPolicyReason =
139
142
  /** Rules tier: the turn ended with no repeated failure worth reporting. */
140
143
  | "no_repeated_failure"
141
144
  /** Rules tier: compaction reactivation found no knowledge entries to restore. */
142
- | "bank_empty";
145
+ | "bank_empty"
146
+ /** The owning session/branch generation was invalidated. */
147
+ | "scope_changed";
143
148
 
144
149
  /**
145
150
  * The model's own words for one step, handed to an observer before they are
@@ -161,6 +166,12 @@ export interface TaskMemoryEnvelope {
161
166
  }
162
167
 
163
168
  export interface TaskMemoryPolicyInput {
169
+ /** Content authority, checked after inference and before any bank write. */
170
+ isCurrent?: () => boolean;
171
+ /** Cancellation releases policy bookkeeping even if the transport ignores abort. */
172
+ signal?: AbortSignal;
173
+ /** Reports actual provider usage, including responses arriving after cancellation/deadline. */
174
+ onStepUsage?: (usage: TaskMemoryStepUsage) => void;
164
175
  task: string;
165
176
  trajectory: ReadonlyArray<TaskMemoryTrajectoryStep>;
166
177
  deterministicTrigger: boolean;
@@ -246,10 +257,31 @@ export async function runTaskMemoryPolicy(
246
257
  const timeoutMs = positiveInteger(input.timeoutMs, TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS);
247
258
  const timeoutMarker = Symbol("task-memory-timeout");
248
259
  let timer: NodeJS.Timeout | undefined;
260
+ const cancelledMarker = Symbol("task-memory-cancelled");
261
+ let cancel: () => void = () => {};
262
+ const cancelled = new Promise<typeof cancelledMarker>((resolve) => {
263
+ cancel = () => {
264
+ controller.abort();
265
+ resolve(cancelledMarker);
266
+ };
267
+ });
268
+ input.signal?.addEventListener("abort", cancel, { once: true });
269
+ if (input.signal?.aborted) cancel();
249
270
  let userPrompt = "";
250
271
  let rawResponse = "";
251
272
  let clientError: string | null = null;
252
273
  let stepUsage: TaskMemoryStepUsage | null = null;
274
+ let usageReported = false;
275
+ const reportUsage = (usage: TaskMemoryStepUsage): void => {
276
+ if (usageReported) return;
277
+ usageReported = true;
278
+ stepUsage = usage;
279
+ try {
280
+ input.onStepUsage?.(usage);
281
+ } catch {
282
+ /* Accounting cannot steer content. */
283
+ }
284
+ };
253
285
  // Every exit reports through here so the trace sees the same envelope the
254
286
  // telemetry row summarizes, including the paths that used to throw away both.
255
287
  const settle = (
@@ -263,54 +295,64 @@ export async function runTaskMemoryPolicy(
263
295
  bankOperations: parts.bankOperations ?? 0,
264
296
  droppedOperations: parts.droppedOperations ?? 0,
265
297
  reminder: parts.reminder ?? null,
266
- inputTokens: parts.inputTokens ?? 0,
267
- outputTokens: parts.outputTokens ?? 0,
298
+ inputTokens: parts.inputTokens ?? stepUsage?.input ?? 0,
299
+ outputTokens: parts.outputTokens ?? stepUsage?.output ?? 0,
268
300
  usage: stepUsage,
269
301
  };
270
302
  try {
271
- input.onEnvelope?.({
272
- systemPrompt: MEMORY_INTERVENTION_SYSTEM_PROMPT,
273
- userPrompt,
274
- response: rawResponse,
275
- decision,
276
- reason,
277
- bankOperations: result.bankOperations,
278
- droppedOperations: result.droppedOperations,
279
- reminder: result.reminder,
280
- error: clientError,
281
- });
303
+ if (input.isCurrent?.() !== false)
304
+ input.onEnvelope?.({
305
+ systemPrompt: MEMORY_INTERVENTION_SYSTEM_PROMPT,
306
+ userPrompt,
307
+ response: rawResponse,
308
+ decision,
309
+ reason,
310
+ bankOperations: result.bankOperations,
311
+ droppedOperations: result.droppedOperations,
312
+ reminder: result.reminder,
313
+ error: clientError,
314
+ });
282
315
  } catch {
283
316
  // A failing observer is an operator's diagnostic, never the policy's problem.
284
317
  }
285
318
  return result;
286
319
  };
287
320
  try {
321
+ if (input.signal?.aborted || input.isCurrent?.() === false) return settle("silent", "scope_changed");
288
322
  userPrompt = buildMemoryInterventionUserPrompt({
289
323
  task: input.task.slice(0, TASK_PROMPT_MAX_CHARS),
290
324
  bank: bank.render(input.maxTokens),
291
325
  trajectory: renderTrajectory(input.trajectory),
292
326
  });
293
- const completion = client.complete({
294
- systemPrompt: MEMORY_INTERVENTION_SYSTEM_PROMPT,
295
- userPrompt,
296
- maxTokens: positiveInteger(input.modelMaxTokens, input.maxTokens),
297
- signal: controller.signal,
298
- });
327
+ const completion = client
328
+ .complete({
329
+ systemPrompt: MEMORY_INTERVENTION_SYSTEM_PROMPT,
330
+ userPrompt,
331
+ maxTokens: positiveInteger(input.modelMaxTokens, input.maxTokens),
332
+ signal: controller.signal,
333
+ onUsage: reportUsage,
334
+ })
335
+ .then((response) => {
336
+ if (response.usage !== undefined) reportUsage(response.usage);
337
+ return response;
338
+ });
299
339
  const timeout = new Promise<typeof timeoutMarker>((resolve) => {
300
340
  timer = setTimeout(() => resolve(timeoutMarker), timeoutMs);
301
341
  });
302
- const response = await Promise.race([completion, timeout]);
342
+ const response = await Promise.race([completion, timeout, cancelled]);
343
+ if (response === cancelledMarker) return settle("silent", "scope_changed");
303
344
  if (response === timeoutMarker) {
304
345
  controller.abort();
305
346
  void completion.catch(() => undefined);
306
347
  return settle("timeout", "deadline");
307
348
  }
308
349
  rawResponse = typeof response.text === "string" ? response.text : "";
309
- stepUsage = response.usage ?? null;
350
+ stepUsage = response.usage ?? stepUsage;
310
351
  const usage = {
311
352
  inputTokens: nonNegativeInteger(response.inputTokens ?? stepUsage?.input),
312
353
  outputTokens: nonNegativeInteger(response.outputTokens ?? stepUsage?.output),
313
354
  };
355
+ if (input.signal?.aborted || input.isCurrent?.() === false) return settle("silent", "scope_changed", usage);
314
356
  const read = readPolicyStep(rawResponse);
315
357
  if (!read.ok) return settle("malformed", read.reason, { ...usage, droppedOperations: read.dropped });
316
358
  const operations = resolveOperations(bank, read.step.operations);
@@ -336,6 +378,7 @@ export async function runTaskMemoryPolicy(
336
378
  bank.recordInjection(citedIds);
337
379
  return settle("injected", "intervened", { ...counts, reminder });
338
380
  } catch (error) {
381
+ if (error instanceof TaskMemoryEndpointBusyError) return settle("silent", "endpoint_busy");
339
382
  clientError = errorMessage(error);
340
383
  // A transport that aborted at its own deadline spent the whole budget and
341
384
  // produced nothing. Reporting it as silence made a step that held a local
@@ -345,6 +388,7 @@ export async function runTaskMemoryPolicy(
345
388
  return settle("silent", "client_error");
346
389
  } finally {
347
390
  if (timer !== undefined) clearTimeout(timer);
391
+ input.signal?.removeEventListener("abort", cancel);
348
392
  }
349
393
  }
350
394
 
@@ -229,6 +229,7 @@ const REASONS = new Set<TaskMemoryPolicyReason>([
229
229
  "llm_timeout_backoff",
230
230
  "no_repeated_failure",
231
231
  "bank_empty",
232
+ "scope_changed",
232
233
  ]);
233
234
 
234
235
  function entryDelta(
@@ -88,7 +88,6 @@ export {
88
88
  createMarketplaceOfferRegistration,
89
89
  MARKETPLACE_OFFER_REGISTRATION_ID,
90
90
  type MarketplaceOfferDeps,
91
- marketplaceAutoInstallReminder,
92
91
  marketplaceOfferReminder,
93
92
  } from "./marketplace-offer.js";
94
93
  export {
@@ -15,7 +15,6 @@ import {
15
15
  readPromotionDeclines,
16
16
  recordPromotionNeverDecline,
17
17
  } from "../resources/skills/promotion.js";
18
- import type { AutonomyLevel } from "../safety/autonomy.js";
19
18
  import type { MiddlewareHookRegistration } from "./runtime.js";
20
19
  import { isSubstantiveUserTurn } from "./skills-reminder.js";
21
20
  import { type MiddlewareEffect, type MiddlewareHookInput, metadataNumber } from "./types.js";
@@ -34,9 +33,8 @@ import { type MiddlewareEffect, type MiddlewareHookInput, metadataNumber } from
34
33
  * becomes a nag. Detection is the local lexical matcher in
35
34
  * resources/skills/promotion.ts — no request text leaves the machine.
36
35
  *
37
- * At full-auto the offer collapses into an autonomous install, but ONLY from
38
- * Clio's own marketplace: every promotion-flow install (consented or
39
- * autonomous) passes `assertPromotionInstallSource`, the hard runtime gate
36
+ * Every autonomy level requires an explicit operator answer. Each consented
37
+ * promotion-flow install passes `assertPromotionInstallSource`, the hard runtime gate
40
38
  * that rejects public registries in code rather than prompt text.
41
39
  *
42
40
  * Coordinator-only by wiring: this registration is created in the
@@ -48,19 +46,19 @@ export const MARKETPLACE_OFFER_REGISTRATION_ID = "observer.marketplace-offer";
48
46
 
49
47
  export interface MarketplaceOfferInstallResult {
50
48
  path: string;
51
- /** The source the skill was fetched from; surfaced so an autonomous install stays auditable. */
49
+ /** The source the skill was fetched from; retained with the installation result for provenance. */
52
50
  sourceUrl: string;
53
51
  /** Normalized content hash of what was written; the integrity record the consent overlay would have shown. */
54
52
  installedHash: string;
55
53
  }
56
54
 
57
55
  export interface MarketplaceOfferDeps {
56
+ /** Whether the session can render ask_user. Defaults to interactive offers. */
57
+ interactive?: boolean;
58
58
  /** Installed skill names the matcher must exclude. */
59
59
  listInstalledSkillNames(): ReadonlyArray<string>;
60
60
  /** The local marketplace lookup (catalog + index); already local-only. */
61
61
  listMarketplaceEntries(): ReadonlyArray<MarketplaceSkill>;
62
- /** The session's effective autonomy at evaluation time. */
63
- getAutonomy(): AutonomyLevel;
64
62
  /** Perform the install; the registration gates the source before calling. */
65
63
  installEntry(entry: MarketplaceSkill, scope: "user" | "project"): MarketplaceOfferInstallResult;
66
64
  /** Decline persistence; defaults to the promotion module's config-dir store. Keyed by name+version. */
@@ -84,10 +82,18 @@ export function offerBindingTag(offerTag: string): string {
84
82
  return `[clio-install:${offerTag}]`;
85
83
  }
86
84
 
85
+ function boundedDescription(text: string): string {
86
+ return text
87
+ .replace(/\[[^[\]]*\]/gu, " ")
88
+ .replace(/\s+/gu, " ")
89
+ .trim()
90
+ .slice(0, 200);
91
+ }
92
+
87
93
  export function marketplaceOfferReminder(entry: MarketplaceSkill, offerTag: string): string {
88
94
  return (
89
95
  `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has ` +
90
- `"${entry.name}" (not installed): ${entry.description} ` +
96
+ `"${entry.name}" (not installed): ${boundedDescription(entry.description)} ` +
91
97
  `First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit ` +
92
98
  `and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") ` +
93
99
  `whether to install ${entry.name}, offering exactly these options in this order: ` +
@@ -100,19 +106,6 @@ export function marketplaceOfferReminder(entry: MarketplaceSkill, offerTag: stri
100
106
  );
101
107
  }
102
108
 
103
- export function marketplaceAutoInstallReminder(entry: MarketplaceSkill, result: MarketplaceOfferInstallResult): string {
104
- // Full-auto skips the operator's yes/no, never the integrity record. The
105
- // consent overlay states the source and the SHA-256 of what it writes; the
106
- // autonomous path computes the same hash and must surface it here, so an
107
- // install nobody was asked about is still traceable to its source and bytes.
108
- return (
109
- `[Marketplace] Installed skill "${entry.name}" from Clio's own local marketplace (full-auto) to ${result.path}. ` +
110
- `Source ${result.sourceUrl}, sha256 ${result.installedHash}. ${entry.description} ` +
111
- `It is installed but not active — activation stays operator-gated. If it fits this task, ` +
112
- `suggest /skill ${entry.name} to the operator; never load it yourself.`
113
- );
114
- }
115
-
116
109
  interface AnswerLike {
117
110
  question: string;
118
111
  answer: string;
@@ -316,20 +309,14 @@ export function createMarketplaceOfferRegistration(deps: MarketplaceOfferDeps):
316
309
  const match = bestMatch(input.text ?? "");
317
310
  if (!match) return NO_EFFECTS;
318
311
  offeredNames.add(match.entry.name);
319
- if (deps.getAutonomy() === "full-auto") {
320
- try {
321
- const result = installGated(match.entry, "project");
322
- return [
323
- {
324
- kind: "inject_reminder",
325
- severity: "info",
326
- message: marketplaceAutoInstallReminder(match.entry, result),
327
- },
328
- ];
329
- } catch {
330
- // Gate refusal or install failure: fall back to the consent offer
331
- // so the operator still hears about the match.
332
- }
312
+ if (deps.interactive === false) {
313
+ return [
314
+ {
315
+ kind: "inject_reminder",
316
+ severity: "info",
317
+ message: `[Marketplace] Skill "${match.entry.name}" matches this request; install with clio-coder skills install ${match.entry.name}.`,
318
+ },
319
+ ];
333
320
  }
334
321
  const tag = newOfferTag();
335
322
  pendingOffer = { entry: match.entry, tag };
@@ -78,13 +78,13 @@ export interface MemoryInterventionDeps {
78
78
  everyNTools?: number;
79
79
  /** Lazily resolves the explicitly configured background role. Null means rules-only. */
80
80
  getModelClient?: () => TaskMemoryModelClient | null;
81
+ /** One alternative route after a client error; never used after timeout, cancellation or model output. */
82
+ getFallbackModelClient?: () => TaskMemoryModelClient | null;
81
83
  /** Completion budget derived from the resolved background model capability. */
82
84
  getModelMaxTokens?: (configuredMaxTokens: number) => number;
83
85
  /**
84
- * True when the background target's inference endpoint is already serving the
85
- * chat target's stream. A memory step then either queues behind the operator's
86
- * own turn on a single-slot server or makes the server evict the resident
87
- * model to serve it, so the boundary is skipped and the skip is recorded.
86
+ * True when known endpoint occupancy exhausts the resolved capacity bound.
87
+ * A shared gateway URL alone is not evidence that its request slots are full.
88
88
  */
89
89
  backgroundEndpointBusy?: () => boolean;
90
90
  /**
@@ -92,6 +92,8 @@ export interface MemoryInterventionDeps {
92
92
  * routes it to the cost ledger; the middleware never prices anything.
93
93
  */
94
94
  onStepUsage?: (usage: TaskMemoryStepUsage) => void;
95
+ /** Capture immutable accounting ownership at launch, before awaiting inference. */
96
+ captureStepUsage?: () => (usage: TaskMemoryStepUsage, isCurrent: boolean) => void;
95
97
  /**
96
98
  * Bank entries an llm-tier reminder cited when it reached the operator. The
97
99
  * composition root proposes them into the durable memory store, which is what
@@ -139,6 +141,10 @@ export interface MemoryPromptedStepResult extends TaskMemoryPolicyResult {
139
141
  }
140
142
 
141
143
  export interface MemoryInterventionRegistration extends MiddlewareHookRegistration {
144
+ /** Invalidate pending content and discard all transient session/branch state. */
145
+ reset(): void;
146
+ /** Invalidate immediately without waiting for the model; refuse further work. */
147
+ dispose(): void;
142
148
  evaluateAsync(
143
149
  input: MiddlewareHookInput,
144
150
  context?: MiddlewareHookEvaluationContext,
@@ -154,10 +160,9 @@ export interface MemoryInterventionRegistration extends MiddlewareHookRegistrati
154
160
  /** True while a detached background memory step is still running. */
155
161
  stepInFlight(): boolean;
156
162
  /**
157
- * Resolves once no detached memory step is outstanding. Teardown does not
158
- * await it: a step runs tens of seconds on a local route and shutdown cannot
159
- * wait that long, which is why a surface with no next turn declines to start
160
- * one at all rather than starting one it will abandon.
163
+ * Resolves when this generation's detached policy settles. Reset/shutdown
164
+ * release the policy immediately; an abort-ignoring transport can still
165
+ * finish later, with authority only to report its originating usage.
161
166
  */
162
167
  whenIdle(): Promise<void>;
163
168
  }
@@ -167,6 +172,10 @@ export interface MemoryInterventionRegistration extends MiddlewareHookRegistrati
167
172
  * emits only cited, advisory reminders through the existing visible channel.
168
173
  */
169
174
  export function createMemoryInterventionRegistration(deps: MemoryInterventionDeps): MemoryInterventionRegistration {
175
+ let generation = 0;
176
+ let generationController = new AbortController();
177
+ let observedSessionId: string | undefined;
178
+ let disposed = false;
170
179
  const pending = new Map<string, PendingToolStep>();
171
180
  const trajectory: TrajectoryStep[] = [];
172
181
  const failures = new Map<string, FailedAttempt>();
@@ -194,11 +203,17 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
194
203
  let consecutiveLlmTimeouts = 0;
195
204
 
196
205
  return {
206
+ reset,
207
+ dispose(): void {
208
+ disposed = true;
209
+ reset();
210
+ },
197
211
  id: MEMORY_INTERVENTION_REGISTRATION_ID,
198
212
  description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
199
213
  hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
200
214
  evaluate(input): ReadonlyArray<MiddlewareEffect> {
201
- if (!settings().enabled) return NO_EFFECTS;
215
+ observeSession(input);
216
+ if (disposed || !settings().enabled) return NO_EFFECTS;
202
217
  try {
203
218
  switch (input.hook) {
204
219
  case "before_tool":
@@ -274,7 +289,8 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
274
289
  * would have been buffered anyway.
275
290
  */
276
291
  async evaluateAsync(input, context): Promise<ReadonlyArray<MiddlewareEffect>> {
277
- if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
292
+ observeSession(input);
293
+ if (disposed || !settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
278
294
  const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
279
295
  if (boundary === lastPromptedBoundary) return NO_EFFECTS;
280
296
  // One row rather than none, so a headless operator reading the log sees
@@ -316,6 +332,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
316
332
  ) ??
317
333
  false);
318
334
  rulesInjectedSincePromptedStep = false;
335
+ const stepGeneration = generation;
319
336
  promptedStepInFlight = true;
320
337
  outstandingStep = runPromptedStep({
321
338
  deterministicTrigger: triggers.some((trigger) => trigger !== "interval"),
@@ -323,6 +340,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
323
340
  triggerReasons: triggers,
324
341
  })
325
342
  .then((result) => {
343
+ if (stepGeneration !== generation || disposed) return;
326
344
  // A rules-only reminder can win the visible boundary while the optional
327
345
  // background route resolves to null. Preserve the operator-visible
328
346
  // injected outcome instead of overwriting it with that no-client silence.
@@ -336,13 +354,13 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
336
354
  // covers a throwing delivery sink, which must not surface anywhere.
337
355
  })
338
356
  .finally(() => {
339
- promptedStepInFlight = false;
357
+ if (stepGeneration === generation) promptedStepInFlight = false;
340
358
  });
341
359
  return NO_EFFECTS;
342
360
  },
343
361
  runPromptedStep,
344
362
  signalLoop(): void {
345
- if (settings().enabled) pendingTriggers.add("loop_signal");
363
+ if (!disposed && settings().enabled) pendingTriggers.add("loop_signal");
346
364
  },
347
365
  lastDecision: () => lastDecision,
348
366
  recentActivity: () => [...activity],
@@ -350,6 +368,43 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
350
368
  whenIdle: () => outstandingStep,
351
369
  };
352
370
 
371
+ function observeSession(input: MiddlewareHookInput): void {
372
+ if (input.sessionId === undefined) return;
373
+ if (observedSessionId !== undefined && observedSessionId !== input.sessionId) reset();
374
+ observedSessionId = input.sessionId;
375
+ }
376
+
377
+ function reset(): void {
378
+ generation += 1;
379
+ generationController.abort();
380
+ generationController = new AbortController();
381
+ deps.bank.clear();
382
+ pending.clear();
383
+ trajectory.length = 0;
384
+ failures.clear();
385
+ toolStep = 0;
386
+ lastTurnEndStep = 0;
387
+ reactivateAfterCompaction = false;
388
+ lastInjectedOperationFingerprint = null;
389
+ currentTask = "(current task unavailable)";
390
+ toolsSinceMemoryStep = 0;
391
+ consecutiveErrors = 0;
392
+ lastPromptedBoundary = null;
393
+ lastInjectedMessage = null;
394
+ lastDecision = null;
395
+ pendingTriggers.clear();
396
+ activity.length = 0;
397
+ annotatedThisTurn.clear();
398
+ telemetryBankSnapshot = deps.bank.snapshot();
399
+ promptedStepInFlight = false;
400
+ promptedStepTier = "rules";
401
+ outstandingStep = Promise.resolve();
402
+ rulesInjectedSincePromptedStep = false;
403
+ annotatedSinceTurnEnd = false;
404
+ consecutiveLlmTimeouts = 0;
405
+ observedSessionId = undefined;
406
+ }
407
+
353
408
  function settings(): MemoryInterventionSettings {
354
409
  const live = deps.getSettings?.();
355
410
  return {
@@ -377,12 +432,16 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
377
432
  effects: NO_EFFECTS,
378
433
  });
379
434
  const live = settings();
380
- if (!live.enabled) {
435
+ const stepGeneration = generation;
436
+ const isCurrent = () => !disposed && stepGeneration === generation;
437
+ const usageSink = deps.captureStepUsage?.();
438
+ if (disposed || !live.enabled) {
381
439
  const result = silent("no_client");
382
440
  lastDecision = result.decision;
383
441
  return result;
384
442
  }
385
443
  const started = process.hrtime.bigint();
444
+ let attemptStarted = started;
386
445
  const triggers = input.triggerReasons?.length ? input.triggerReasons : ["manual" as const];
387
446
  let tier: TaskMemoryTelemetryTier = "rules";
388
447
  promptedStepTier = tier;
@@ -407,17 +466,58 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
407
466
  } else {
408
467
  tier = "llm";
409
468
  promptedStepTier = tier;
410
- promptedResult = await runTaskMemoryPolicy(deps.bank, client, {
411
- task: input.task?.trim() || currentTask,
412
- trajectory: [...trajectory],
413
- deterministicTrigger: input.deterministicTrigger,
414
- maxTokens: live.maxTokens,
415
- modelMaxTokens: positiveInteger(deps.getModelMaxTokens?.(live.maxTokens), live.maxTokens),
416
- ...(input.suppressIntervention === undefined ? {} : { suppressIntervention: input.suppressIntervention }),
417
- previousReminder: lastInjectedMessage,
418
- timeoutMs: live.timeoutMs,
419
- ...(deps.onEnvelope === undefined ? {} : { onEnvelope: deps.onEnvelope }),
420
- });
469
+ const runClient = (selected: TaskMemoryModelClient, timeoutMs: number) =>
470
+ runTaskMemoryPolicy(deps.bank, selected, {
471
+ isCurrent,
472
+ signal: generationController.signal,
473
+ onStepUsage: (usage) => {
474
+ if (usageSink) usageSink(usage, isCurrent());
475
+ else deps.onStepUsage?.(usage);
476
+ },
477
+ task: input.task?.trim() || currentTask,
478
+ trajectory: [...trajectory],
479
+ deterministicTrigger: input.deterministicTrigger,
480
+ maxTokens: live.maxTokens,
481
+ modelMaxTokens: positiveInteger(deps.getModelMaxTokens?.(live.maxTokens), live.maxTokens),
482
+ ...(input.suppressIntervention === undefined ? {} : { suppressIntervention: input.suppressIntervention }),
483
+ previousReminder: lastInjectedMessage,
484
+ timeoutMs,
485
+ ...(deps.onEnvelope === undefined ? {} : { onEnvelope: deps.onEnvelope }),
486
+ });
487
+ const remainingMs = () => Math.floor(live.timeoutMs - Number(process.hrtime.bigint() - started) / 1_000_000);
488
+ const initialTimeoutMs = remainingMs();
489
+ promptedResult =
490
+ initialTimeoutMs <= 0
491
+ ? { ...silent("deadline"), decision: "timeout" }
492
+ : await runClient(client, initialTimeoutMs);
493
+ if (promptedResult.reason === "client_error" && isCurrent() && remainingMs() > 0) {
494
+ let fallback: TaskMemoryModelClient | null = null;
495
+ let fallbackReady = false;
496
+ try {
497
+ fallback = deps.getFallbackModelClient?.() ?? null;
498
+ fallbackReady = fallback !== null && deps.backgroundEndpointBusy?.() !== true;
499
+ } catch {
500
+ /* Fail closed and preserve the original call if routing or capacity is unreadable. */
501
+ }
502
+ const fallbackTimeoutMs = remainingMs();
503
+ if (fallback !== null && fallbackReady && isCurrent() && fallbackTimeoutMs > 0) {
504
+ // Each attempted call keeps its own telemetry and origin usage.
505
+ // The returned policy result describes the final attempt only.
506
+ emitTelemetry(
507
+ triggers,
508
+ tier,
509
+ promptedResult.decision,
510
+ promptedResult.reason,
511
+ 0,
512
+ promptedResult.inputTokens,
513
+ promptedResult.outputTokens,
514
+ started,
515
+ { bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations },
516
+ );
517
+ attemptStarted = process.hrtime.bigint();
518
+ promptedResult = await runClient(fallback, fallbackTimeoutMs);
519
+ }
520
+ }
421
521
  }
422
522
  }
423
523
  } catch (error) {
@@ -436,16 +536,11 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
436
536
  error: error instanceof Error ? error.message : "resolving the background model client failed",
437
537
  });
438
538
  }
539
+ if (!isCurrent()) return { ...promptedResult, reminder: null, effects: NO_EFFECTS };
540
+ if (promptedResult.reason === "endpoint_busy") telemetryDecision = "dropped";
439
541
  if (tier === "llm" && promptedResult.decision === "timeout") consecutiveLlmTimeouts += 1;
440
542
  else if (tier === "llm" && telemetryDecision !== "dropped") consecutiveLlmTimeouts = 0;
441
543
  lastDecision = promptedResult.decision;
442
- if (promptedResult.usage !== null) {
443
- try {
444
- deps.onStepUsage?.(promptedResult.usage);
445
- } catch {
446
- // Accounting is bookkeeping. A failing sink never changes memory behavior.
447
- }
448
- }
449
544
  if (promptedResult.decision === "injected") reportInjectedEntries(promptedResult.reminder);
450
545
  emitTelemetry(
451
546
  triggers,
@@ -455,7 +550,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
455
550
  citedEntryCount(promptedResult.reminder),
456
551
  promptedResult.inputTokens,
457
552
  promptedResult.outputTokens,
458
- started,
553
+ attemptStarted,
459
554
  { bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations },
460
555
  );
461
556
  return {
@@ -50,8 +50,9 @@ export function announceMemoryStepEndpoint<Request, Response>(
50
50
  const { bus, endpointKey, targetId } = deps;
51
51
  if (endpointKey === null) return complete;
52
52
  return async (request: Request): Promise<Response> => {
53
- // `runPromptedStep` performs its busy check before it invokes `complete`,
54
- // so this registration counts the outgoing request without self-refusing.
53
+ // The production client rechecks capacity after asynchronous preparation,
54
+ // immediately before calling this wrapper. Register synchronously so no
55
+ // local foreground launch can interleave between that check and this hold.
55
56
  const releaseEndpointSlot = registerForegroundStream(endpointKey);
56
57
  try {
57
58
  return await complete(request);
@@ -110,9 +110,13 @@ export type MiddlewareDiagnostic =
110
110
  export type MiddlewareDiagnosticSink = (diagnostic: MiddlewareDiagnostic) => void;
111
111
 
112
112
  /**
113
- * Default diagnostic sink. stderr-only for now; once the typed bus lands a
114
- * `middleware.hookFailed` channel, the composition root supplies a sink that
115
- * also emits there.
113
+ * Default diagnostic sink, and the one the domain loader constructs the
114
+ * bundle with. It writes to stderr only. The composition root
115
+ * (src/entry/orchestrator.ts) replaces it through setDiagnosticSink with a
116
+ * sink that publishes every diagnostic on the typed bus as
117
+ * `middleware.hookFailed`, which the interactive warn notice consumes, and
118
+ * that still calls this writer for non-interactive runs, which have no
119
+ * notice subscriber.
116
120
  */
117
121
  export function writeMiddlewareDiagnosticToStderr(diagnostic: MiddlewareDiagnostic): void {
118
122
  if (diagnostic.kind === "hook_failed") {