@iowarp/clio-coder 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1187) hide show
  1. package/CHANGELOG.md +123 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +295 -627
  4. package/dist/acp-BIYHVZIM.js +128 -0
  5. package/dist/{agents-Q4MYPMUW.js → agents-YT6SSRIT.js} +52 -27
  6. package/dist/assets/codewiki.json +1 -0
  7. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
  8. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
  9. package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
  10. package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
  11. package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
  12. package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
  13. package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
  14. package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
  15. package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
  16. package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
  17. package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
  18. package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
  19. package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
  20. package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
  21. package/dist/assets/grammars/tree-sitter.wasm +0 -0
  22. package/dist/{auth-O6HYIJ6J.js → auth-5TWEIYDN.js} +30 -15
  23. package/dist/chunk-2EHAIA3X.js +481 -0
  24. package/dist/{chunk-ME6DNWIU.js → chunk-2IR2NMPA.js} +12 -4
  25. package/dist/chunk-2SFS6XQE.js +122 -0
  26. package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
  27. package/dist/chunk-2VTFPG5O.js +48 -0
  28. package/dist/chunk-3I7MS7N2.js +40 -0
  29. package/dist/chunk-3R73A4XB.js +69 -0
  30. package/dist/{chunk-JPOWPFCU.js → chunk-3ZXDFGR5.js} +52 -23
  31. package/dist/chunk-4BJ5BYCE.js +61 -0
  32. package/dist/{chunk-26BZQOAD.js → chunk-4BPJXDWC.js} +161 -260
  33. package/dist/chunk-4KLWL3UC.js +18 -0
  34. package/dist/{chunk-5LDRNKX2.js → chunk-4VP4KH3K.js} +161 -262
  35. package/dist/chunk-4ZG3XFUR.js +77 -0
  36. package/dist/chunk-5B2AEOW5.js +5407 -0
  37. package/dist/chunk-5TSRNF4G.js +510 -0
  38. package/dist/{chunk-WD6AJM35.js → chunk-5UUP6MWO.js} +48 -69
  39. package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
  40. package/dist/chunk-65DEGPJ6.js +52 -0
  41. package/dist/chunk-6EJMN2Y3.js +17 -0
  42. package/dist/chunk-6EJV5X2W.js +16405 -0
  43. package/dist/chunk-6N5PTWMY.js +136 -0
  44. package/dist/chunk-6XLNIQDB.js +27 -0
  45. package/dist/{chunk-XNISANGE.js → chunk-77VKQEHF.js} +171 -74
  46. package/dist/chunk-7CR24IG7.js +242 -0
  47. package/dist/{chunk-UWIJNAOB.js → chunk-7EYHLWU7.js} +907 -638
  48. package/dist/chunk-7MNJORFF.js +22 -0
  49. package/dist/{chunk-JWHCJDCI.js → chunk-A3CYT5EX.js} +257 -79
  50. package/dist/chunk-AGYYIBLL.js +1069 -0
  51. package/dist/chunk-AO4RKG4M.js +277 -0
  52. package/dist/chunk-APJ265NV.js +7410 -0
  53. package/dist/chunk-ARBGF5F7.js +174 -0
  54. package/dist/{chunk-TFSSEXL6.js → chunk-BMEMKKIT.js} +14 -4
  55. package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
  56. package/dist/chunk-CBCAPZAA.js +229 -0
  57. package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
  58. package/dist/chunk-CMZWFGD2.js +352 -0
  59. package/dist/chunk-ECH6PKUQ.js +39 -0
  60. package/dist/{chunk-67MTHP2E.js → chunk-ED4KHGC3.js} +13 -5
  61. package/dist/chunk-EKMEHE4H.js +340 -0
  62. package/dist/{chunk-O4EJEDHO.js → chunk-EPVUXGXG.js} +50 -35
  63. package/dist/chunk-FCSXB6T2.js +338 -0
  64. package/dist/chunk-FJ3H4MN5.js +48 -0
  65. package/dist/chunk-FQ4SKYE4.js +29 -0
  66. package/dist/chunk-G2DE3C7R.js +644 -0
  67. package/dist/chunk-G4BMMOKF.js +182 -0
  68. package/dist/{chunk-7BHLZB3A.js → chunk-GGXXDWE4.js} +190 -1218
  69. package/dist/chunk-HC4CLZ2Y.js +68 -0
  70. package/dist/{chunk-E3NYWENM.js → chunk-HFSBBKSQ.js} +55 -61
  71. package/dist/chunk-HKIYEGME.js +30 -0
  72. package/dist/chunk-I4HZDVNP.js +73 -0
  73. package/dist/chunk-IGLFWIYI.js +161 -0
  74. package/dist/chunk-IHXBNWMM.js +137 -0
  75. package/dist/chunk-IKCO5N3L.js +162 -0
  76. package/dist/chunk-IR4CFBFN.js +56 -0
  77. package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
  78. package/dist/{chunk-VOO7NYPP.js → chunk-J5HN4RYU.js} +27 -9
  79. package/dist/{chunk-4UQA7NCT.js → chunk-J5Q24KAG.js} +7 -2
  80. package/dist/{chunk-KBR4MZZR.js → chunk-JVCV3ICN.js} +7 -1
  81. package/dist/chunk-KJ5LWLOE.js +1077 -0
  82. package/dist/chunk-LBMZMYH2.js +285 -0
  83. package/dist/{chunk-3DANZDGR.js → chunk-LBNRH5WM.js} +100 -161
  84. package/dist/{chunk-TKHQ4DGZ.js → chunk-LZSJBIVT.js} +7358 -7414
  85. package/dist/{chunk-UGYAX5YI.js → chunk-M6SHUN7Q.js} +13 -8
  86. package/dist/chunk-MAW544W2.js +1882 -0
  87. package/dist/chunk-MBS4V7ZP.js +217 -0
  88. package/dist/{chunk-2J63S4SF.js → chunk-MFFY33HR.js} +167 -140
  89. package/dist/chunk-MNA4JGU4.js +255 -0
  90. package/dist/chunk-MQSRRFWA.js +3428 -0
  91. package/dist/{chunk-RQDWMVRB.js → chunk-MVVUPGPW.js} +138 -137
  92. package/dist/chunk-OAO4GE4M.js +619 -0
  93. package/dist/chunk-OHHN2SO4.js +5135 -0
  94. package/dist/chunk-OKGUZO2U.js +34 -0
  95. package/dist/{chunk-BBUH4VAA.js → chunk-OOJYHWRB.js} +60 -361
  96. package/dist/{chunk-D5YD55AR.js → chunk-OQ33BKR3.js} +12 -1
  97. package/dist/chunk-OQE5J4C6.js +73 -0
  98. package/dist/{chunk-AMFR5YA3.js → chunk-ORBHGJC5.js} +26 -12
  99. package/dist/chunk-POHLU5DW.js +1186 -0
  100. package/dist/chunk-QKMUKYO7.js +4961 -0
  101. package/dist/{chunk-7RBKDI66.js → chunk-QTYWRVRA.js} +104 -12
  102. package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
  103. package/dist/chunk-SRF2PJNW.js +184 -0
  104. package/dist/chunk-SST6Z5JA.js +80 -0
  105. package/dist/{chunk-XV4ZJ6ZM.js → chunk-STBPMHSX.js} +473 -1194
  106. package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
  107. package/dist/chunk-T6YILFSB.js +80 -0
  108. package/dist/chunk-TXOTCRLG.js +15 -0
  109. package/dist/chunk-TZTZS7QK.js +227 -0
  110. package/dist/chunk-UOV2BYIW.js +107 -0
  111. package/dist/{chunk-527KG6XR.js → chunk-V4RXGQ5Q.js} +72 -185
  112. package/dist/chunk-VAKQQHWR.js +434 -0
  113. package/dist/chunk-VG7TBQIY.js +128 -0
  114. package/dist/chunk-VJWL6YS5.js +244 -0
  115. package/dist/chunk-WEH5XRJQ.js +32 -0
  116. package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
  117. package/dist/chunk-WMSVI4G2.js +2095 -0
  118. package/dist/chunk-WVO7V2QY.js +797 -0
  119. package/dist/chunk-X4RCMKVQ.js +641 -0
  120. package/dist/chunk-X75S7HFS.js +374 -0
  121. package/dist/chunk-XN3L4EYL.js +46 -0
  122. package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
  123. package/dist/{chunk-PIDUD6M2.js → chunk-YCWGATWI.js} +12 -5
  124. package/dist/chunk-YHZX5GEU.js +193 -0
  125. package/dist/chunk-YXLYO42X.js +91 -0
  126. package/dist/{chunk-UHTSULZS.js → chunk-ZDOOVTXZ.js} +38 -73
  127. package/dist/chunk-ZI647VB5.js +37 -0
  128. package/dist/{chunk-CLJ5HLUD.js → chunk-ZWLZP4ZT.js} +25 -6
  129. package/dist/cli/index.js +70 -56
  130. package/dist/clio-4LY5K2AC.js +25 -0
  131. package/dist/code-nav-7AX6FYE6.js +600 -0
  132. package/dist/codewiki/build-worker.js +66 -0
  133. package/dist/compile-cache-CVJMMODC.js +18 -0
  134. package/dist/{components-JVHMUBEB.js → components-KELWS457.js} +31 -9
  135. package/dist/{config-ZFCDBMDC.js → config-GTLUW2PR.js} +104 -56
  136. package/dist/configure-R6A64DHX.js +42 -0
  137. package/dist/context-5VKGUVJJ.js +866 -0
  138. package/dist/{context-CDXTP2MP.js → context-JFZEJ7W5.js} +21 -13
  139. package/dist/{context-E3KIFVXI.js → context-RW5HC47S.js} +77 -36
  140. package/dist/{context-clear-3F4PLXOS.js → context-clear-6ZHBAZZT.js} +64 -30
  141. package/dist/{context-index-Q7YSYTR3.js → context-index-BZ4UYMTC.js} +36 -24
  142. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  143. package/dist/{docs-YIETIWZI.js → docs-2C2LTVT2.js} +32 -13
  144. package/dist/doctor-KI767GSN.js +87 -0
  145. package/dist/{eval-B3KZZESM.js → eval-XSSNATB4.js} +93 -27
  146. package/dist/{evidence-V67CHM35.js → evidence-UA6AWDQQ.js} +55 -27
  147. package/dist/{evolve-YDZSUQYA.js → evolve-QNTFGV6Z.js} +59 -26
  148. package/dist/{extensions-SRG7XCAH.js → extensions-QVDOHDGJ.js} +23 -8
  149. package/dist/{fleet-CA2CRTVG.js → fleet-Q7UOMUSG.js} +173 -56
  150. package/dist/fleet-preflight-DDN536IT.js +26 -0
  151. package/dist/{init-2OZDJE2D.js → init-WBB65ZHQ.js} +79 -34
  152. package/dist/{memory-3PIQQAKX.js → memory-MD3O64RI.js} +57 -28
  153. package/dist/{models-DY35XI7Y.js → models-BZU34YWD.js} +49 -24
  154. package/dist/monitor-MEQA5C3I.js +661 -0
  155. package/dist/{chunk-PS4PFJQP.js → orchestrator-CGFKEP27.js} +22837 -18564
  156. package/dist/{paths-5OMXW7Z4.js → paths-UXLN5YYZ.js} +17 -6
  157. package/dist/preload-P6DGH2PZ.js +13 -0
  158. package/dist/{reset-PIFYNOS3.js → reset-L2FQEE3E.js} +25 -13
  159. package/dist/{run-3VSPP24F.js → run-IV4Q6RLN.js} +115 -63
  160. package/dist/{share-D36RQCXM.js → share-S5BZQC5I.js} +23 -10
  161. package/dist/{skills-F2MRLELY.js → skills-LQEKRDTN.js} +42 -15
  162. package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-3DC4HEWS.js} +90 -45
  163. package/dist/steer-GGWFUJUD.js +77 -0
  164. package/dist/{targets-DZMEZAH4.js → targets-C4SSGQOB.js} +78 -60
  165. package/dist/terminal-lease-IT5JW2NR.js +395 -0
  166. package/dist/{trace-7NYCUI2J.js → trace-PNCASAXC.js} +48 -17
  167. package/dist/tree-sitter-HGKH6LG4.js +4673 -0
  168. package/dist/{uninstall-AD3JWHBB.js → uninstall-FZCQCDKC.js} +19 -8
  169. package/dist/{upgrade-WYYBKGDY.js → upgrade-7TT7SQ3G.js} +66 -24
  170. package/dist/{usage-ULIDAGFF.js → usage-GV4PKT3M.js} +71 -32
  171. package/dist/verify-G6V4D2G7.js +716 -0
  172. package/dist/version-KGEG7EPO.js +21 -0
  173. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  174. package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-DQF6Z66B.js} +98 -48
  175. package/dist/worker/entry.js +297 -54
  176. package/dist/workspace-G4ZWUIPR.js +22 -0
  177. package/docs/README.md +29 -21
  178. package/docs/acp.md +191 -16
  179. package/docs/alcf-provider.md +1 -1
  180. package/docs/architecture.md +157 -7
  181. package/docs/artifact-placement.md +101 -0
  182. package/docs/artifact-versions.md +1 -1
  183. package/docs/built-in-agents.md +4 -2
  184. package/docs/capacity-and-scheduling.md +1 -1
  185. package/docs/commands-and-modes.md +224 -97
  186. package/docs/config-knobs-audit.md +1 -3
  187. package/docs/configuration-and-targets.md +236 -38
  188. package/docs/context-engine.md +34 -7
  189. package/docs/development-pipeline.md +102 -0
  190. package/docs/dispatch-architecture-rationale.md +1 -1
  191. package/docs/documentation-coverage.md +4 -4
  192. package/docs/documentation-guide.md +3 -3
  193. package/docs/environment-variables.md +15 -6
  194. package/docs/eval-runner.md +3 -3
  195. package/docs/evals-internal.md +2 -2
  196. package/docs/evidence-and-memory.md +10 -2
  197. package/docs/evolution.md +2 -2
  198. package/docs/exit-codes-and-output.md +15 -9
  199. package/docs/extensions-and-sharing.md +25 -18
  200. package/docs/fleet-demo-runbook.md +22 -23
  201. package/docs/fleet-dispatch.md +117 -16
  202. package/docs/git-commit-provenance.md +120 -0
  203. package/docs/glossary.md +107 -15
  204. package/docs/installation-and-lifecycle.md +75 -17
  205. package/docs/middleware-and-components.md +1 -1
  206. package/docs/model-catalog.md +46 -15
  207. package/docs/observability.md +8 -5
  208. package/docs/performance-methodology.md +491 -0
  209. package/docs/pi-boundary.md +72 -0
  210. package/docs/proactive-memory.md +14 -14
  211. package/docs/prompt-envelope-and-tools.md +25 -4
  212. package/docs/provider-adapter-cookbook.md +57 -4
  213. package/docs/release-cut-checklist.md +129 -111
  214. package/docs/safety-model.md +28 -8
  215. package/docs/scientific-validation.md +3 -3
  216. package/docs/session-lifecycle.md +55 -12
  217. package/docs/skills-marketplace.md +12 -8
  218. package/docs/time-conventions.md +101 -0
  219. package/docs/tool-usage.md +6 -5
  220. package/docs/trace-store.md +1 -1
  221. package/docs/troubleshooting.md +10 -7
  222. package/docs/tui-design.md +121 -28
  223. package/docs/worker-dispatch-mechanics.md +3 -3
  224. package/package.json +33 -36
  225. package/skills/README.md +5 -6
  226. package/skills/coding/ast-grep/SKILL.md +136 -0
  227. package/skills/coding/ast-grep/evals.md +56 -0
  228. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  229. package/skills/coding/coding-standards/SKILL.md +113 -0
  230. package/skills/coding/coding-standards/evals.md +34 -0
  231. package/skills/coding/prototype/SKILL.md +86 -0
  232. package/skills/coding/prototype/evals.md +42 -0
  233. package/skills/coding/prototype/references/LOGIC.md +67 -0
  234. package/skills/coding/prototype/references/UI.md +112 -0
  235. package/skills/coding/tdd/SKILL.md +101 -0
  236. package/skills/coding/tdd/evals.md +41 -0
  237. package/skills/coding/tdd/references/mocking.md +59 -0
  238. package/skills/coding/tdd/references/tests.md +77 -0
  239. package/skills/context/context-handoff/SKILL.md +126 -0
  240. package/skills/context/context-handoff/evals.md +57 -0
  241. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  242. package/skills/context/context-prime/SKILL.md +95 -0
  243. package/skills/context/context-prime/evals.md +54 -0
  244. package/skills/git/file-ticket/SKILL.md +107 -0
  245. package/skills/git/file-ticket/evals.md +54 -0
  246. package/skills/git/fix-issue/SKILL.md +106 -0
  247. package/skills/git/fix-issue/evals.md +71 -0
  248. package/skills/git/ship/SKILL.md +92 -0
  249. package/skills/git/ship/evals.md +72 -0
  250. package/skills/meta/clio-dev/SKILL.md +91 -0
  251. package/skills/meta/clio-dev/evals.md +45 -0
  252. package/skills/meta/clio-test/SKILL.md +130 -0
  253. package/skills/meta/clio-test/evals.md +43 -0
  254. package/skills/meta/clio-test/references/harness.md +97 -0
  255. package/skills/meta/clio-test/references/test-map.md +59 -0
  256. package/skills/meta/credentials/SKILL.md +125 -0
  257. package/skills/meta/credentials/evals.md +104 -0
  258. package/skills/meta/find-skills/SKILL.md +72 -0
  259. package/skills/meta/find-skills/evals.md +47 -0
  260. package/skills/meta/herdr/SKILL.md +127 -0
  261. package/skills/meta/herdr/evals.md +38 -0
  262. package/skills/meta/skill-craft/SKILL.md +102 -0
  263. package/skills/meta/skill-craft/evals.md +41 -0
  264. package/skills/planning/architecture/SKILL.md +129 -0
  265. package/skills/planning/architecture/evals.md +36 -0
  266. package/skills/planning/backlog/SKILL.md +90 -0
  267. package/skills/planning/backlog/evals.md +43 -0
  268. package/skills/planning/prd/SKILL.md +82 -0
  269. package/skills/planning/prd/evals.md +49 -0
  270. package/skills/planning/product-intent/SKILL.md +112 -0
  271. package/skills/planning/product-intent/evals.md +36 -0
  272. package/skills/planning/tech-spec/SKILL.md +115 -0
  273. package/skills/planning/tech-spec/evals.md +47 -0
  274. package/skills/registry.yaml +136 -0
  275. package/skills/research/arxiv-literature/SKILL.md +104 -0
  276. package/skills/research/arxiv-literature/evals.md +58 -0
  277. package/skills/research/experiment-protocol/SKILL.md +122 -0
  278. package/skills/research/experiment-protocol/evals.md +91 -0
  279. package/skills/research/scientific-debugging/SKILL.md +119 -0
  280. package/skills/research/scientific-debugging/evals.md +138 -0
  281. package/skills/research/scientific-modernization/SKILL.md +138 -0
  282. package/skills/research/scientific-modernization/evals.md +84 -0
  283. package/skills/skill-marketplace.json +12 -20
  284. package/skills/workflow/design-council/SKILL.md +139 -0
  285. package/skills/workflow/design-council/evals.md +97 -0
  286. package/skills/workflow/grill-me/SKILL.md +186 -0
  287. package/skills/workflow/grill-me/evals.md +78 -0
  288. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  289. package/skills/workflow/workflow-distiller/evals.md +107 -0
  290. package/src/cli/acp.ts +115 -0
  291. package/src/cli/agents.ts +60 -0
  292. package/src/cli/args.ts +280 -0
  293. package/src/cli/argv.ts +170 -0
  294. package/src/cli/ask.ts +34 -0
  295. package/src/cli/auth.ts +468 -0
  296. package/src/cli/bootstrap-generate.ts +498 -0
  297. package/src/cli/clio.ts +96 -0
  298. package/src/cli/components.ts +195 -0
  299. package/src/cli/config-inspect.ts +336 -0
  300. package/src/cli/config.ts +72 -0
  301. package/src/cli/configure-interop.ts +67 -0
  302. package/src/cli/configure-layout.ts +172 -0
  303. package/src/cli/configure.ts +1525 -0
  304. package/src/cli/context-clear.ts +76 -0
  305. package/src/cli/context-index.ts +100 -0
  306. package/src/cli/context.ts +321 -0
  307. package/src/cli/default-target.ts +55 -0
  308. package/src/cli/docs.ts +346 -0
  309. package/src/cli/doctor.ts +54 -0
  310. package/src/cli/eval.ts +315 -0
  311. package/src/cli/evidence.ts +225 -0
  312. package/src/cli/evolve.ts +219 -0
  313. package/src/cli/extensions.ts +214 -0
  314. package/src/cli/fleet.ts +868 -0
  315. package/src/cli/index.ts +338 -0
  316. package/src/cli/init.ts +219 -0
  317. package/src/cli/initial-message.ts +47 -0
  318. package/src/cli/internal-dispatch.ts +55 -0
  319. package/src/cli/memory.ts +182 -0
  320. package/src/cli/models.ts +257 -0
  321. package/src/cli/modes/json-stream.ts +121 -0
  322. package/src/cli/modes/jsonl.ts +9 -0
  323. package/src/cli/modes/print.ts +604 -0
  324. package/src/cli/oauth-manual-input.ts +72 -0
  325. package/src/cli/oauth-select.ts +36 -0
  326. package/src/cli/output-guard.ts +48 -0
  327. package/src/cli/paths.ts +44 -0
  328. package/src/cli/provider-target.ts +113 -0
  329. package/src/cli/removal.ts +72 -0
  330. package/src/cli/reset.ts +253 -0
  331. package/src/cli/run.ts +497 -0
  332. package/src/cli/share.ts +243 -0
  333. package/src/cli/shared.ts +60 -0
  334. package/src/cli/skills-eval.ts +1240 -0
  335. package/src/cli/skills.ts +485 -0
  336. package/src/cli/steer-channel.ts +86 -0
  337. package/src/cli/targets.ts +1154 -0
  338. package/src/cli/text-layout.ts +112 -0
  339. package/src/cli/trace.ts +322 -0
  340. package/src/cli/uninstall.ts +405 -0
  341. package/src/cli/upgrade.ts +286 -0
  342. package/src/cli/usage.ts +876 -0
  343. package/src/cli/validate-model.ts +28 -0
  344. package/src/cli/version.ts +7 -0
  345. package/src/cli/wiki-generate.ts +510 -0
  346. package/src/core/agent-environment.ts +7 -0
  347. package/src/core/artifact-paths.ts +43 -0
  348. package/src/core/bash-exec.ts +313 -0
  349. package/src/core/boot-trace.ts +42 -0
  350. package/src/core/bus-events.ts +744 -0
  351. package/src/core/bus-trace.ts +53 -0
  352. package/src/core/c-header-language.ts +265 -0
  353. package/src/core/clio-repo.ts +78 -0
  354. package/src/core/commit-attribution.ts +157 -0
  355. package/src/core/compile-cache.ts +159 -0
  356. package/src/core/config.ts +1722 -0
  357. package/src/core/context-floor.ts +33 -0
  358. package/src/core/defaults.ts +659 -0
  359. package/src/core/domain-loader.ts +177 -0
  360. package/src/core/event-bus.ts +94 -0
  361. package/src/core/file-references.ts +282 -0
  362. package/src/core/git-commit-attribution.ts +362 -0
  363. package/src/core/guardrails.ts +185 -0
  364. package/src/core/headless-permission.ts +21 -0
  365. package/src/core/incomplete-installation.ts +45 -0
  366. package/src/core/init.ts +223 -0
  367. package/src/core/json-payload.ts +58 -0
  368. package/src/core/package-root.ts +54 -0
  369. package/src/core/path-canonical.ts +37 -0
  370. package/src/core/process-identity.ts +41 -0
  371. package/src/core/recent-models.ts +91 -0
  372. package/src/core/residency-protection.ts +56 -0
  373. package/src/core/resolve-config-value.ts +88 -0
  374. package/src/core/response-schema.ts +279 -0
  375. package/src/core/run-overrides.ts +77 -0
  376. package/src/core/safe-exec.ts +205 -0
  377. package/src/core/safe-id.ts +37 -0
  378. package/src/core/safe-resource-write.ts +162 -0
  379. package/src/core/session-routing.ts +339 -0
  380. package/src/core/settings-layers.ts +354 -0
  381. package/src/core/shared-bus.ts +8 -0
  382. package/src/core/shell-quote.ts +26 -0
  383. package/src/core/skill-activation.ts +190 -0
  384. package/src/core/startup-timer.ts +37 -0
  385. package/src/core/state-file-lock.ts +219 -0
  386. package/src/core/termination.ts +275 -0
  387. package/src/core/timers.ts +38 -0
  388. package/src/core/tool-names.ts +65 -0
  389. package/src/core/verification-scripts.ts +13 -0
  390. package/src/core/workspace-files.ts +492 -0
  391. package/src/core/xdg.ts +177 -0
  392. package/src/domains/agents/builtins/architect.md +4 -4
  393. package/src/domains/agents/builtins/coder.md +3 -2
  394. package/src/domains/agents/builtins/debugger.md +1 -1
  395. package/src/domains/agents/builtins/documenter.md +1 -1
  396. package/src/domains/agents/builtins/git-master.md +3 -3
  397. package/src/domains/agents/builtins/provenance.md +1 -1
  398. package/src/domains/agents/builtins/researcher.md +1 -1
  399. package/src/domains/agents/builtins/scout.md +1 -1
  400. package/src/domains/agents/builtins/tester.md +1 -1
  401. package/src/domains/agents/builtins/verifier.md +1 -1
  402. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  403. package/src/domains/agents/catalog.ts +172 -0
  404. package/src/domains/agents/contract.ts +16 -0
  405. package/src/domains/agents/extension.ts +110 -0
  406. package/src/domains/agents/fleet-commands.ts +154 -0
  407. package/src/domains/agents/fleet-contract.ts +797 -0
  408. package/src/domains/agents/frontmatter.ts +40 -0
  409. package/src/domains/agents/index.ts +102 -0
  410. package/src/domains/agents/manifest.ts +6 -0
  411. package/src/domains/agents/recipe-schema.ts +202 -0
  412. package/src/domains/agents/recipe.ts +125 -0
  413. package/src/domains/agents/registry.ts +111 -0
  414. package/src/domains/agents/result-contract.ts +1265 -0
  415. package/src/domains/agents/spec.ts +371 -0
  416. package/src/domains/agents/write-boundary.ts +109 -0
  417. package/src/domains/components/diff.ts +99 -0
  418. package/src/domains/components/hash.ts +21 -0
  419. package/src/domains/components/index.ts +3 -0
  420. package/src/domains/components/scan.ts +304 -0
  421. package/src/domains/components/snapshot.ts +108 -0
  422. package/src/domains/components/types.ts +82 -0
  423. package/src/domains/config/agent-namespace.ts +13 -0
  424. package/src/domains/config/classify.ts +106 -0
  425. package/src/domains/config/contract.ts +22 -0
  426. package/src/domains/config/extension.ts +142 -0
  427. package/src/domains/config/index.ts +23 -0
  428. package/src/domains/config/keybindings.ts +200 -0
  429. package/src/domains/config/manifest.ts +6 -0
  430. package/src/domains/config/watcher.ts +41 -0
  431. package/src/domains/context/adoption.ts +880 -0
  432. package/src/domains/context/bootstrap-prompt.ts +273 -0
  433. package/src/domains/context/bootstrap.ts +1502 -0
  434. package/src/domains/context/clear.ts +91 -0
  435. package/src/domains/context/clio-md.ts +429 -0
  436. package/src/domains/context/codewiki/artifact.ts +400 -0
  437. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  438. package/src/domains/context/codewiki/build-worker.ts +54 -0
  439. package/src/domains/context/codewiki/cmake.ts +356 -0
  440. package/src/domains/context/codewiki/cooperative.ts +46 -0
  441. package/src/domains/context/codewiki/coordinator.ts +182 -0
  442. package/src/domains/context/codewiki/digest.ts +135 -0
  443. package/src/domains/context/codewiki/grammar-assets.ts +33 -0
  444. package/src/domains/context/codewiki/indexer.ts +1529 -0
  445. package/src/domains/context/codewiki/paths.ts +67 -0
  446. package/src/domains/context/codewiki/schema.ts +80 -0
  447. package/src/domains/context/codewiki/tree-sitter.ts +771 -0
  448. package/src/domains/context/contract.ts +68 -0
  449. package/src/domains/context/excluded-dirs.ts +1 -0
  450. package/src/domains/context/extension.ts +358 -0
  451. package/src/domains/context/fingerprint.ts +198 -0
  452. package/src/domains/context/index.ts +154 -0
  453. package/src/domains/context/init-options.ts +69 -0
  454. package/src/domains/context/manifest.ts +6 -0
  455. package/src/domains/context/operator-profile.ts +157 -0
  456. package/src/domains/context/project-metadata.ts +529 -0
  457. package/src/domains/context/project-rules.ts +227 -0
  458. package/src/domains/context/prompt-context.ts +61 -0
  459. package/src/domains/context/refresh.ts +178 -0
  460. package/src/domains/context/runtime.ts +17 -0
  461. package/src/domains/context/sibling-files.ts +10 -0
  462. package/src/domains/context/state.ts +237 -0
  463. package/src/domains/context/wiki/assemble.ts +303 -0
  464. package/src/domains/context/wiki/frontmatter.ts +210 -0
  465. package/src/domains/context/wiki/generate.ts +595 -0
  466. package/src/domains/context/wiki/layout.ts +111 -0
  467. package/src/domains/context/wiki/meta.ts +221 -0
  468. package/src/domains/context/wiki/plan-store.ts +217 -0
  469. package/src/domains/context/wiki/plan.ts +250 -0
  470. package/src/domains/context/wiki/prompts.ts +283 -0
  471. package/src/domains/context/wiki/staleness.ts +198 -0
  472. package/src/domains/dispatch/active-route-planner.ts +168 -0
  473. package/src/domains/dispatch/admission-queue.ts +150 -0
  474. package/src/domains/dispatch/admission.ts +334 -0
  475. package/src/domains/dispatch/agent-candidates.ts +307 -0
  476. package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
  477. package/src/domains/dispatch/agent-ledger-store.ts +257 -0
  478. package/src/domains/dispatch/agent-ledger.ts +212 -0
  479. package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
  480. package/src/domains/dispatch/assignment-events.ts +132 -0
  481. package/src/domains/dispatch/assignment-reconcile.ts +76 -0
  482. package/src/domains/dispatch/assignment-store.ts +162 -0
  483. package/src/domains/dispatch/assignment.ts +278 -0
  484. package/src/domains/dispatch/backoff.ts +59 -0
  485. package/src/domains/dispatch/batch-store.ts +134 -0
  486. package/src/domains/dispatch/batch-tracker.ts +66 -0
  487. package/src/domains/dispatch/capability-match.ts +155 -0
  488. package/src/domains/dispatch/capacity-lease.ts +413 -0
  489. package/src/domains/dispatch/code-step-store.ts +52 -0
  490. package/src/domains/dispatch/code-step.ts +387 -0
  491. package/src/domains/dispatch/contract.ts +278 -0
  492. package/src/domains/dispatch/dedup.ts +133 -0
  493. package/src/domains/dispatch/event-pump.ts +251 -0
  494. package/src/domains/dispatch/execution-handoff.ts +29 -0
  495. package/src/domains/dispatch/execution-plan.ts +328 -0
  496. package/src/domains/dispatch/execution-role.ts +277 -0
  497. package/src/domains/dispatch/execution-scheduler.ts +583 -0
  498. package/src/domains/dispatch/extension.ts +6006 -0
  499. package/src/domains/dispatch/failure-classification.ts +147 -0
  500. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  501. package/src/domains/dispatch/fleet-plan.ts +225 -0
  502. package/src/domains/dispatch/fleet-preflight.ts +394 -0
  503. package/src/domains/dispatch/gate-decisions.ts +1040 -0
  504. package/src/domains/dispatch/gate-role-prompts.ts +58 -0
  505. package/src/domains/dispatch/heartbeat.ts +27 -0
  506. package/src/domains/dispatch/index.ts +137 -0
  507. package/src/domains/dispatch/joint-route-adapter.ts +114 -0
  508. package/src/domains/dispatch/joint-route-resolver.ts +283 -0
  509. package/src/domains/dispatch/manifest.ts +6 -0
  510. package/src/domains/dispatch/orphan-recovery.ts +266 -0
  511. package/src/domains/dispatch/outcome.ts +109 -0
  512. package/src/domains/dispatch/phase-timing.ts +47 -0
  513. package/src/domains/dispatch/placement.ts +202 -0
  514. package/src/domains/dispatch/receipt-findings.ts +255 -0
  515. package/src/domains/dispatch/receipt-integrity.ts +383 -0
  516. package/src/domains/dispatch/recovery-candidates.ts +74 -0
  517. package/src/domains/dispatch/reproducibility.ts +48 -0
  518. package/src/domains/dispatch/reservation-store.ts +501 -0
  519. package/src/domains/dispatch/route-approval.ts +177 -0
  520. package/src/domains/dispatch/route-candidates.ts +57 -0
  521. package/src/domains/dispatch/route-decision.ts +1079 -0
  522. package/src/domains/dispatch/route-facts.ts +187 -0
  523. package/src/domains/dispatch/route-history.ts +238 -0
  524. package/src/domains/dispatch/route-observer.ts +488 -0
  525. package/src/domains/dispatch/route-policy.ts +327 -0
  526. package/src/domains/dispatch/route-quality.ts +256 -0
  527. package/src/domains/dispatch/route-readiness.ts +120 -0
  528. package/src/domains/dispatch/routing-intent.ts +287 -0
  529. package/src/domains/dispatch/run-identity.ts +56 -0
  530. package/src/domains/dispatch/scout-transition.ts +130 -0
  531. package/src/domains/dispatch/state.ts +302 -0
  532. package/src/domains/dispatch/tool-stats.ts +132 -0
  533. package/src/domains/dispatch/transport.ts +210 -0
  534. package/src/domains/dispatch/types.ts +799 -0
  535. package/src/domains/dispatch/validation-grounding.ts +154 -0
  536. package/src/domains/dispatch/validation.ts +721 -0
  537. package/src/domains/dispatch/worker-protocol.ts +275 -0
  538. package/src/domains/dispatch/worker-spawn.ts +585 -0
  539. package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
  540. package/src/domains/dispatch/write-boundary.ts +426 -0
  541. package/src/domains/eval/artifacts/redact.ts +42 -0
  542. package/src/domains/eval/artifacts/store.ts +173 -0
  543. package/src/domains/eval/compare/compare.ts +33 -0
  544. package/src/domains/eval/compare/gates.ts +66 -0
  545. package/src/domains/eval/compare/thresholds.ts +92 -0
  546. package/src/domains/eval/harness-metrics.ts +62 -0
  547. package/src/domains/eval/index.ts +66 -0
  548. package/src/domains/eval/metrics/chaos-stream.ts +93 -0
  549. package/src/domains/eval/metrics/context.ts +34 -0
  550. package/src/domains/eval/metrics/coverage.ts +21 -0
  551. package/src/domains/eval/metrics/evidence.ts +182 -0
  552. package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
  553. package/src/domains/eval/metrics/invariants.ts +736 -0
  554. package/src/domains/eval/metrics/latency.ts +4 -0
  555. package/src/domains/eval/metrics/token-stream.ts +139 -0
  556. package/src/domains/eval/metrics/tokens.ts +51 -0
  557. package/src/domains/eval/metrics/tool-calls.ts +7 -0
  558. package/src/domains/eval/proactive-memory.ts +279 -0
  559. package/src/domains/eval/provenance.ts +35 -0
  560. package/src/domains/eval/report.ts +234 -0
  561. package/src/domains/eval/reports/json.ts +5 -0
  562. package/src/domains/eval/reports/junit.ts +23 -0
  563. package/src/domains/eval/reports/markdown.ts +20 -0
  564. package/src/domains/eval/reports/swe-jsonl.ts +16 -0
  565. package/src/domains/eval/reports/text.ts +25 -0
  566. package/src/domains/eval/run-compare.ts +274 -0
  567. package/src/domains/eval/runner.ts +244 -0
  568. package/src/domains/eval/runners/clio-run.ts +148 -0
  569. package/src/domains/eval/runners/context-index.ts +56 -0
  570. package/src/domains/eval/runners/context-init.ts +203 -0
  571. package/src/domains/eval/runners/external-command.ts +350 -0
  572. package/src/domains/eval/runtime-paths.ts +171 -0
  573. package/src/domains/eval/schema/artifact.ts +75 -0
  574. package/src/domains/eval/schema/suite.ts +235 -0
  575. package/src/domains/eval/schema/validate.ts +339 -0
  576. package/src/domains/eval/store.ts +392 -0
  577. package/src/domains/eval/suites/load.ts +74 -0
  578. package/src/domains/eval/suites/matrix.ts +19 -0
  579. package/src/domains/eval/suites/resolve.ts +44 -0
  580. package/src/domains/eval/suites/run.ts +325 -0
  581. package/src/domains/eval/task-file.ts +186 -0
  582. package/src/domains/eval/types.ts +140 -0
  583. package/src/domains/eval/verifiers/command.ts +27 -0
  584. package/src/domains/eval/verifiers/file-exists.ts +6 -0
  585. package/src/domains/eval/verifiers/patch.ts +22 -0
  586. package/src/domains/eval/workspaces/git.ts +41 -0
  587. package/src/domains/eval/workspaces/local.ts +17 -0
  588. package/src/domains/eval/workspaces/temp-copy.ts +29 -0
  589. package/src/domains/evidence/build.ts +1754 -0
  590. package/src/domains/evidence/eval.ts +605 -0
  591. package/src/domains/evidence/failure-attribution.ts +54 -0
  592. package/src/domains/evidence/finish-contract-map.ts +42 -0
  593. package/src/domains/evidence/index.ts +55 -0
  594. package/src/domains/evidence/provenance.ts +200 -0
  595. package/src/domains/evidence/redact.ts +81 -0
  596. package/src/domains/evidence/store.ts +291 -0
  597. package/src/domains/evidence/types.ts +325 -0
  598. package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
  599. package/src/domains/evolution/index.ts +26 -0
  600. package/src/domains/evolution/manifest.ts +154 -0
  601. package/src/domains/evolution/validate.ts +304 -0
  602. package/src/domains/extensions/contract.ts +22 -0
  603. package/src/domains/extensions/discovery.ts +193 -0
  604. package/src/domains/extensions/extension.ts +46 -0
  605. package/src/domains/extensions/index.ts +34 -0
  606. package/src/domains/extensions/manager.ts +30 -0
  607. package/src/domains/extensions/manifest.ts +6 -0
  608. package/src/domains/extensions/resources.ts +38 -0
  609. package/src/domains/extensions/state.ts +224 -0
  610. package/src/domains/extensions/types.ts +83 -0
  611. package/src/domains/interop/consent.ts +185 -0
  612. package/src/domains/interop/contract.ts +29 -0
  613. package/src/domains/interop/detect.ts +173 -0
  614. package/src/domains/interop/extension.ts +59 -0
  615. package/src/domains/interop/index.ts +34 -0
  616. package/src/domains/interop/manifest.ts +6 -0
  617. package/src/domains/interop/registry.ts +139 -0
  618. package/src/domains/interop/state.ts +92 -0
  619. package/src/domains/interop/types.ts +109 -0
  620. package/src/domains/lifecycle/contract.ts +11 -0
  621. package/src/domains/lifecycle/doctor.ts +536 -0
  622. package/src/domains/lifecycle/extension.ts +23 -0
  623. package/src/domains/lifecycle/index.ts +21 -0
  624. package/src/domains/lifecycle/install-method.ts +51 -0
  625. package/src/domains/lifecycle/manifest.ts +6 -0
  626. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  627. package/src/domains/lifecycle/migrations/index.ts +114 -0
  628. package/src/domains/lifecycle/state.ts +93 -0
  629. package/src/domains/lifecycle/upgrade-notice.ts +35 -0
  630. package/src/domains/lifecycle/version.ts +35 -0
  631. package/src/domains/memory/index.ts +128 -0
  632. package/src/domains/memory/operations.ts +143 -0
  633. package/src/domains/memory/prompt-section.ts +86 -0
  634. package/src/domains/memory/proposal.ts +180 -0
  635. package/src/domains/memory/store.ts +163 -0
  636. package/src/domains/memory/task-bank.ts +229 -0
  637. package/src/domains/memory/task-memory-handoff.ts +222 -0
  638. package/src/domains/memory/task-memory-policy.ts +602 -0
  639. package/src/domains/memory/task-memory-status.ts +58 -0
  640. package/src/domains/memory/task-memory-telemetry.ts +346 -0
  641. package/src/domains/memory/task-memory-trace.ts +89 -0
  642. package/src/domains/memory/types.ts +74 -0
  643. package/src/domains/memory/validate.ts +297 -0
  644. package/src/domains/middleware/budget.ts +216 -0
  645. package/src/domains/middleware/contract.ts +35 -0
  646. package/src/domains/middleware/dispatch-nudge.ts +469 -0
  647. package/src/domains/middleware/extension.ts +129 -0
  648. package/src/domains/middleware/hook-receipts.ts +70 -0
  649. package/src/domains/middleware/hooks-io.ts +186 -0
  650. package/src/domains/middleware/hooks.ts +432 -0
  651. package/src/domains/middleware/index.ts +154 -0
  652. package/src/domains/middleware/manifest.ts +6 -0
  653. package/src/domains/middleware/memory-intervention.ts +701 -0
  654. package/src/domains/middleware/rules.ts +42 -0
  655. package/src/domains/middleware/runtime.ts +333 -0
  656. package/src/domains/middleware/skills-reminder.ts +202 -0
  657. package/src/domains/middleware/snapshot.ts +71 -0
  658. package/src/domains/middleware/stalled-turn.ts +71 -0
  659. package/src/domains/middleware/task-board-reminder.ts +87 -0
  660. package/src/domains/middleware/task-nudge.ts +77 -0
  661. package/src/domains/middleware/tool-choice-control.ts +42 -0
  662. package/src/domains/middleware/types.ts +131 -0
  663. package/src/domains/middleware/validate.ts +329 -0
  664. package/src/domains/observability/accountability.ts +67 -0
  665. package/src/domains/observability/contract.ts +168 -0
  666. package/src/domains/observability/cost.ts +206 -0
  667. package/src/domains/observability/evidence-index.ts +123 -0
  668. package/src/domains/observability/extension.ts +281 -0
  669. package/src/domains/observability/index.ts +78 -0
  670. package/src/domains/observability/manifest.ts +10 -0
  671. package/src/domains/observability/metrics.ts +37 -0
  672. package/src/domains/observability/projection.ts +477 -0
  673. package/src/domains/observability/telemetry.ts +89 -0
  674. package/src/domains/observability/trace-store.ts +1454 -0
  675. package/src/domains/prompts/compiler.ts +614 -0
  676. package/src/domains/prompts/contract.ts +46 -0
  677. package/src/domains/prompts/extension.ts +336 -0
  678. package/src/domains/prompts/fragment-loader.ts +138 -0
  679. package/src/domains/prompts/fragments/identity/clio.md +5 -6
  680. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  681. package/src/domains/prompts/fragments/identity/self-awareness.md +19 -0
  682. package/src/domains/prompts/fragments/operating/contract.md +4 -41
  683. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  684. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  685. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  686. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  687. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  688. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  689. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  690. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  691. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  692. package/src/domains/prompts/hash.ts +73 -0
  693. package/src/domains/prompts/index.ts +32 -0
  694. package/src/domains/prompts/manifest.ts +8 -0
  695. package/src/domains/prompts/memory-intervention.ts +57 -0
  696. package/src/domains/prompts/preload.ts +82 -0
  697. package/src/domains/providers/auth/api-key.ts +47 -0
  698. package/src/domains/providers/auth/backend-file.ts +79 -0
  699. package/src/domains/providers/auth/backend-memory.ts +72 -0
  700. package/src/domains/providers/auth/boot-status.ts +65 -0
  701. package/src/domains/providers/auth/index.ts +37 -0
  702. package/src/domains/providers/auth/oauth.ts +37 -0
  703. package/src/domains/providers/auth/storage.ts +726 -0
  704. package/src/domains/providers/capabilities.ts +58 -0
  705. package/src/domains/providers/catalog.ts +162 -0
  706. package/src/domains/providers/contract.ts +162 -0
  707. package/src/domains/providers/credentials.ts +20 -0
  708. package/src/domains/providers/eligibility.ts +24 -0
  709. package/src/domains/providers/errors.ts +64 -0
  710. package/src/domains/providers/extension.ts +548 -0
  711. package/src/domains/providers/index.ts +142 -0
  712. package/src/domains/providers/knowledge-base-path.ts +102 -0
  713. package/src/domains/providers/manifest.ts +6 -0
  714. package/src/domains/providers/model-capabilities.ts +136 -0
  715. package/src/domains/providers/model-discovery.ts +144 -0
  716. package/src/domains/providers/model-family.ts +32 -0
  717. package/src/domains/providers/model-runtime-capabilities.ts +723 -0
  718. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +120 -37
  719. package/src/domains/providers/plugins.ts +61 -0
  720. package/src/domains/providers/probe/fingerprint.ts +64 -0
  721. package/src/domains/providers/probe/http.ts +114 -0
  722. package/src/domains/providers/probe/reasoning.ts +111 -0
  723. package/src/domains/providers/registry.ts +187 -0
  724. package/src/domains/providers/resolver.ts +156 -0
  725. package/src/domains/providers/runtime-resolution.ts +720 -0
  726. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
  727. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  728. package/src/domains/providers/runtimes/builtins.ts +78 -0
  729. package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
  730. package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
  731. package/src/domains/providers/runtimes/claude/common.ts +55 -0
  732. package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
  733. package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
  734. package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
  735. package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
  736. package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
  737. package/src/domains/providers/runtimes/cloud/google.ts +41 -0
  738. package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
  739. package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
  740. package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
  741. package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
  742. package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
  743. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  744. package/src/domains/providers/runtimes/common/local-synth.ts +164 -0
  745. package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
  746. package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
  747. package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
  748. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
  749. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
  750. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
  751. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
  752. package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
  753. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  754. package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
  755. package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
  756. package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
  757. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
  758. package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
  759. package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
  760. package/src/domains/providers/runtimes/protocol/google.ts +27 -0
  761. package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
  762. package/src/domains/providers/support.ts +241 -0
  763. package/src/domains/providers/thinking-control-policy.ts +85 -0
  764. package/src/domains/providers/types/capability-flags.ts +114 -0
  765. package/src/domains/providers/types/cost-provenance.ts +7 -0
  766. package/src/domains/providers/types/inference.ts +41 -0
  767. package/src/domains/providers/types/knowledge-base.ts +156 -0
  768. package/src/domains/providers/types/local-model-quirks.ts +216 -0
  769. package/src/domains/providers/types/runtime-descriptor.ts +181 -0
  770. package/src/domains/providers/types/target-descriptor.ts +60 -0
  771. package/src/domains/resources/collision.ts +92 -0
  772. package/src/domains/resources/common-loader.ts +140 -0
  773. package/src/domains/resources/contract.ts +24 -0
  774. package/src/domains/resources/extension.ts +59 -0
  775. package/src/domains/resources/index.ts +74 -0
  776. package/src/domains/resources/loader.ts +85 -0
  777. package/src/domains/resources/manifest.ts +6 -0
  778. package/src/domains/resources/prompts/loader.ts +246 -0
  779. package/src/domains/resources/prompts/substitute.ts +1 -0
  780. package/src/domains/resources/skills/content-hash.ts +107 -0
  781. package/src/domains/resources/skills/evals.ts +175 -0
  782. package/src/domains/resources/skills/install.ts +427 -0
  783. package/src/domains/resources/skills/loader.ts +985 -0
  784. package/src/domains/resources/skills/marketplace.ts +301 -0
  785. package/src/domains/resources/skills/provenance-pin.ts +115 -0
  786. package/src/domains/safety/action-classifier.ts +270 -0
  787. package/src/domains/safety/approval-axis.ts +23 -0
  788. package/src/domains/safety/audit.ts +493 -0
  789. package/src/domains/safety/autonomy.ts +174 -0
  790. package/src/domains/safety/call-target.ts +59 -0
  791. package/src/domains/safety/contract.ts +65 -0
  792. package/src/domains/safety/damage-control.ts +44 -0
  793. package/src/domains/safety/default-path-policy.ts +117 -0
  794. package/src/domains/safety/extension.ts +383 -0
  795. package/src/domains/safety/finish-contract-registration.ts +128 -0
  796. package/src/domains/safety/finish-contract.ts +554 -0
  797. package/src/domains/safety/index.ts +44 -0
  798. package/src/domains/safety/loop-detector.ts +143 -0
  799. package/src/domains/safety/manifest.ts +6 -0
  800. package/src/domains/safety/path-policy.ts +164 -0
  801. package/src/domains/safety/policy-engine.ts +994 -0
  802. package/src/domains/safety/project-policy.ts +391 -0
  803. package/src/domains/safety/protected-artifacts-registration.ts +189 -0
  804. package/src/domains/safety/protected-artifacts.ts +993 -0
  805. package/src/domains/safety/rejection-feedback.ts +102 -0
  806. package/src/domains/safety/rigor.ts +72 -0
  807. package/src/domains/safety/rule-compiler.ts +48 -0
  808. package/src/domains/safety/rule-pack-loader.ts +92 -0
  809. package/src/domains/safety/run-effects.ts +197 -0
  810. package/src/domains/safety/scope.ts +61 -0
  811. package/src/domains/scheduling/budget.ts +35 -0
  812. package/src/domains/scheduling/cluster.ts +175 -0
  813. package/src/domains/scheduling/contract.ts +30 -0
  814. package/src/domains/scheduling/extension.ts +91 -0
  815. package/src/domains/scheduling/index.ts +12 -0
  816. package/src/domains/scheduling/manifest.ts +6 -0
  817. package/src/domains/session/archive-readers.ts +208 -0
  818. package/src/domains/session/checkpoint.ts +38 -0
  819. package/src/domains/session/compaction/auto.ts +89 -0
  820. package/src/domains/session/compaction/branch-summary.ts +187 -0
  821. package/src/domains/session/compaction/compact.ts +493 -0
  822. package/src/domains/session/compaction/cut-point.ts +172 -0
  823. package/src/domains/session/compaction/defaults.ts +34 -0
  824. package/src/domains/session/compaction/mask-observations.ts +265 -0
  825. package/src/domains/session/compaction/session-entries.ts +18 -0
  826. package/src/domains/session/compaction/tokens.ts +148 -0
  827. package/src/domains/session/context-accounting.ts +583 -0
  828. package/src/domains/session/context-ledger.ts +362 -0
  829. package/src/domains/session/contract.ts +159 -0
  830. package/src/domains/session/cwd-fallback.ts +65 -0
  831. package/src/domains/session/decision-board.ts +190 -0
  832. package/src/domains/session/entries.ts +572 -0
  833. package/src/domains/session/extension.ts +403 -0
  834. package/src/domains/session/history.ts +172 -0
  835. package/src/domains/session/index.ts +84 -0
  836. package/src/domains/session/manager.ts +128 -0
  837. package/src/domains/session/manifest.ts +6 -0
  838. package/src/domains/session/migrations/index.ts +27 -0
  839. package/src/domains/session/prompt-manifest.ts +173 -0
  840. package/src/domains/session/protected-artifact-journal.ts +241 -0
  841. package/src/domains/session/protected-artifacts.ts +90 -0
  842. package/src/domains/session/retry.ts +230 -0
  843. package/src/domains/session/session-artifacts.ts +107 -0
  844. package/src/domains/session/task-board.ts +569 -0
  845. package/src/domains/session/tree/active-path.ts +137 -0
  846. package/src/domains/session/tree/fork.ts +159 -0
  847. package/src/domains/session/tree/manager.ts +128 -0
  848. package/src/domains/session/tree/navigator.ts +177 -0
  849. package/src/domains/session/tree/preview.ts +259 -0
  850. package/src/domains/session/usage.ts +148 -0
  851. package/src/domains/session/workspace/git-probe.ts +167 -0
  852. package/src/domains/session/workspace/index.ts +4 -0
  853. package/src/domains/session/workspace/project-type.ts +217 -0
  854. package/src/domains/session/workspace/snapshot.ts +74 -0
  855. package/src/domains/share/archive.ts +684 -0
  856. package/src/domains/share/contract.ts +9 -0
  857. package/src/domains/share/extension.ts +26 -0
  858. package/src/domains/share/index.ts +28 -0
  859. package/src/domains/share/manifest.ts +6 -0
  860. package/src/domains/user-tasks/store.ts +297 -0
  861. package/src/engine/acp/adapter.ts +397 -0
  862. package/src/engine/acp/errors.ts +128 -0
  863. package/src/engine/acp/event-mapper.ts +154 -0
  864. package/src/engine/acp/server.ts +2238 -0
  865. package/src/engine/acp/tool-mediator.ts +686 -0
  866. package/src/engine/acp/transport.ts +775 -0
  867. package/src/engine/acp/types.ts +196 -0
  868. package/src/engine/agent.ts +29 -0
  869. package/src/engine/ai.ts +207 -0
  870. package/src/engine/alcf-oauth.ts +205 -0
  871. package/src/engine/antigravity/subprocess-runtime.ts +205 -0
  872. package/src/engine/api-registry.ts +223 -0
  873. package/src/engine/apis/degraded-inference.ts +95 -0
  874. package/src/engine/apis/index.ts +16 -0
  875. package/src/engine/apis/llamacpp-residency.ts +292 -0
  876. package/src/engine/apis/lmstudio-residency.ts +76 -0
  877. package/src/engine/apis/lmstudio.ts +243 -0
  878. package/src/engine/apis/ollama-native.ts +528 -0
  879. package/src/engine/apis/openai-completions.ts +795 -0
  880. package/src/engine/apis/output-budget.ts +99 -0
  881. package/src/engine/apis/residency-lock.ts +29 -0
  882. package/src/engine/apis/residency.ts +776 -0
  883. package/src/engine/apis/resident-models.ts +42 -0
  884. package/src/engine/apis/sampling-overrides.ts +38 -0
  885. package/src/engine/apis/types.ts +16 -0
  886. package/src/engine/claude/sdk-runtime.ts +685 -0
  887. package/src/engine/claude/session-id.ts +5 -0
  888. package/src/engine/claude/subprocess-runtime.ts +316 -0
  889. package/src/engine/claude/tool-safety.ts +400 -0
  890. package/src/engine/env-api-keys.ts +98 -0
  891. package/src/engine/external-subprocess.ts +23 -0
  892. package/src/engine/gemma-channel-filter.ts +223 -0
  893. package/src/engine/harmony-response.ts +165 -0
  894. package/src/engine/instrumented-tui.ts +192 -0
  895. package/src/engine/loop-guard.ts +1127 -0
  896. package/src/engine/messages.ts +14 -0
  897. package/src/engine/models.ts +42 -0
  898. package/src/engine/oauth.ts +196 -0
  899. package/src/engine/pi-mono-names.ts +13 -0
  900. package/src/engine/prompt-templates.ts +1 -0
  901. package/src/engine/provider-payload.ts +272 -0
  902. package/src/engine/select-list.ts +53 -0
  903. package/src/engine/session.ts +834 -0
  904. package/src/engine/strip-tokenizer-sentinels.ts +125 -0
  905. package/src/engine/truncate.ts +9 -0
  906. package/src/engine/tui.ts +111 -0
  907. package/src/engine/types.ts +63 -0
  908. package/src/engine/worker-events.ts +100 -0
  909. package/src/engine/worker-runtime-capabilities.ts +5 -0
  910. package/src/engine/worker-runtime.ts +1022 -0
  911. package/src/engine/worker-tools.ts +208 -0
  912. package/src/entry/boot-options.ts +50 -0
  913. package/src/entry/orchestrator.ts +2011 -0
  914. package/src/interactive/application-controller.ts +433 -0
  915. package/src/interactive/bus-notices.ts +265 -0
  916. package/src/interactive/chat-loop-messages.ts +626 -0
  917. package/src/interactive/chat-loop-policy.ts +18 -0
  918. package/src/interactive/chat-loop.ts +1090 -0
  919. package/src/interactive/chat-panel.ts +1820 -0
  920. package/src/interactive/chat-renderer.ts +1228 -0
  921. package/src/interactive/clio-editor.ts +161 -0
  922. package/src/interactive/command-fallbacks.ts +23 -0
  923. package/src/interactive/command-output.ts +85 -0
  924. package/src/interactive/context-activity.ts +203 -0
  925. package/src/interactive/context-meter.ts +223 -0
  926. package/src/interactive/context-overlay.ts +246 -0
  927. package/src/interactive/cost-overlay.ts +279 -0
  928. package/src/interactive/dispatch-board.ts +1319 -0
  929. package/src/interactive/dispatch-steering.ts +86 -0
  930. package/src/interactive/editor-bash.ts +46 -0
  931. package/src/interactive/editor-steer.ts +51 -0
  932. package/src/interactive/editor-submit.ts +507 -0
  933. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  934. package/src/interactive/export-html/index.ts +51 -0
  935. package/src/interactive/export-html/template.ts +45 -0
  936. package/src/interactive/export-html/tool-renderer.ts +54 -0
  937. package/src/interactive/external-editor.ts +67 -0
  938. package/src/interactive/follow-up-queue-panel.ts +75 -0
  939. package/src/interactive/footer/dashboard.ts +538 -0
  940. package/src/interactive/footer/notifications.ts +275 -0
  941. package/src/interactive/footer/widgets.ts +1264 -0
  942. package/src/interactive/footer-panel.ts +187 -0
  943. package/src/interactive/format-time.ts +97 -0
  944. package/src/interactive/index.ts +11 -0
  945. package/src/interactive/interactive-application.ts +939 -0
  946. package/src/interactive/interactive-event-projection.ts +385 -0
  947. package/src/interactive/interactive-input-runtime.ts +307 -0
  948. package/src/interactive/interactive-presentation.ts +584 -0
  949. package/src/interactive/interactive-shell.ts +388 -0
  950. package/src/interactive/interactive-slash-runtime.ts +554 -0
  951. package/src/interactive/interactive-subscriptions.ts +111 -0
  952. package/src/interactive/interactive-tickers.ts +183 -0
  953. package/src/interactive/keybinding-manager.ts +496 -0
  954. package/src/interactive/layout.ts +57 -0
  955. package/src/interactive/leader-key.ts +143 -0
  956. package/src/interactive/loop-guard-interrupt.ts +101 -0
  957. package/src/interactive/memory-overlay.ts +280 -0
  958. package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
  959. package/src/interactive/overlay-auth-lifecycle.ts +308 -0
  960. package/src/interactive/overlay-frame.ts +502 -0
  961. package/src/interactive/overlay-general-openers.ts +274 -0
  962. package/src/interactive/overlay-key-routing.ts +216 -0
  963. package/src/interactive/overlay-lifecycle.ts +426 -0
  964. package/src/interactive/overlay-model-selectors.ts +127 -0
  965. package/src/interactive/overlay-permission-lifecycle.ts +345 -0
  966. package/src/interactive/overlay-resource-openers.ts +112 -0
  967. package/src/interactive/overlay-session-lifecycle.ts +327 -0
  968. package/src/interactive/overlay-transitions.ts +57 -0
  969. package/src/interactive/overlays/agents.ts +69 -0
  970. package/src/interactive/overlays/ask-user.ts +921 -0
  971. package/src/interactive/overlays/auth-dialog.ts +221 -0
  972. package/src/interactive/overlays/context-reset.ts +108 -0
  973. package/src/interactive/overlays/cwd-fallback.ts +141 -0
  974. package/src/interactive/overlays/decisions.ts +300 -0
  975. package/src/interactive/overlays/extensions.ts +54 -0
  976. package/src/interactive/overlays/help-reference.ts +145 -0
  977. package/src/interactive/overlays/interop.ts +139 -0
  978. package/src/interactive/overlays/keybinding-detail.ts +90 -0
  979. package/src/interactive/overlays/list-overlay.ts +606 -0
  980. package/src/interactive/overlays/message-picker.ts +155 -0
  981. package/src/interactive/overlays/model-selector.ts +1109 -0
  982. package/src/interactive/overlays/prompts.ts +72 -0
  983. package/src/interactive/overlays/session-selector-search.ts +31 -0
  984. package/src/interactive/overlays/session-selector.ts +284 -0
  985. package/src/interactive/overlays/settings.ts +3451 -0
  986. package/src/interactive/overlays/skills-hub.ts +237 -0
  987. package/src/interactive/overlays/tree-selector.ts +422 -0
  988. package/src/interactive/permission-overlay.ts +170 -0
  989. package/src/interactive/render-trace.ts +534 -0
  990. package/src/interactive/renderers/branch-summary.ts +86 -0
  991. package/src/interactive/renderers/code-ink.ts +420 -0
  992. package/src/interactive/renderers/compaction-summary.ts +112 -0
  993. package/src/interactive/renderers/diff.ts +137 -0
  994. package/src/interactive/renderers/mermaid.ts +53 -0
  995. package/src/interactive/renderers/notice.ts +28 -0
  996. package/src/interactive/renderers/retry-status.ts +31 -0
  997. package/src/interactive/renderers/structured.ts +89 -0
  998. package/src/interactive/renderers/tool-execution.ts +1357 -0
  999. package/src/interactive/renderers/worker-entry.ts +280 -0
  1000. package/src/interactive/session-last-turn.ts +186 -0
  1001. package/src/interactive/session-switch-settlement.ts +10 -0
  1002. package/src/interactive/session-transcript.ts +105 -0
  1003. package/src/interactive/session-usage-reseed.ts +74 -0
  1004. package/src/interactive/slash-autocomplete.ts +256 -0
  1005. package/src/interactive/slash-commands.ts +1407 -0
  1006. package/src/interactive/slash-spec.ts +424 -0
  1007. package/src/interactive/status/controller.ts +260 -0
  1008. package/src/interactive/status/index.ts +23 -0
  1009. package/src/interactive/status/state-machine.ts +530 -0
  1010. package/src/interactive/status/summary.ts +170 -0
  1011. package/src/interactive/status/types.ts +121 -0
  1012. package/src/interactive/status/verbs.ts +163 -0
  1013. package/src/interactive/status/watchdog.ts +24 -0
  1014. package/src/interactive/stdout-backpressure.ts +99 -0
  1015. package/src/interactive/stream-pacer.ts +530 -0
  1016. package/src/interactive/stream-pacing-policy.ts +66 -0
  1017. package/src/interactive/tasks-overlay.ts +540 -0
  1018. package/src/interactive/terminal-lease.ts +485 -0
  1019. package/src/interactive/theme/components.ts +55 -0
  1020. package/src/interactive/theme/glyphs.ts +70 -0
  1021. package/src/interactive/theme/index.ts +15 -0
  1022. package/src/interactive/theme/labels.ts +88 -0
  1023. package/src/interactive/theme/rules.ts +138 -0
  1024. package/src/interactive/theme/segments.ts +88 -0
  1025. package/src/interactive/theme/tokens.ts +121 -0
  1026. package/src/interactive/thinking-level-policy.ts +6 -0
  1027. package/src/interactive/tool-prose-loop.ts +122 -0
  1028. package/src/interactive/tool-prose-registration.ts +48 -0
  1029. package/src/interactive/turn-context.ts +855 -0
  1030. package/src/interactive/turn-middleware.ts +283 -0
  1031. package/src/interactive/turn-persistence.ts +458 -0
  1032. package/src/interactive/turn-queues.ts +181 -0
  1033. package/src/interactive/turn-recovery.ts +323 -0
  1034. package/src/interactive/turn-runtime.ts +869 -0
  1035. package/src/interactive/turn-state.ts +133 -0
  1036. package/src/interactive/view/artifacts.ts +1452 -0
  1037. package/src/interactive/view/view-overlay.ts +735 -0
  1038. package/src/interactive/welcome-dashboard.ts +537 -0
  1039. package/src/interactive/worker-receipts.ts +143 -0
  1040. package/src/interactive/worker-replay.ts +111 -0
  1041. package/src/interactive/worker-share.ts +100 -0
  1042. package/src/interactive/worker-stream.ts +446 -0
  1043. package/src/interactive/workspace-facts.ts +141 -0
  1044. package/src/tools/agent-tools.ts +402 -0
  1045. package/src/tools/artifact.ts +103 -0
  1046. package/src/tools/ask-user.ts +666 -0
  1047. package/src/tools/bash.ts +204 -0
  1048. package/src/tools/bootstrap.ts +77 -0
  1049. package/src/tools/builtin-tool-catalog.ts +265 -0
  1050. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  1051. package/src/tools/codewiki/code-nav.ts +549 -0
  1052. package/src/tools/codewiki/shared.ts +118 -0
  1053. package/src/tools/compete-worktrees.ts +898 -0
  1054. package/src/tools/context/docs-engine.ts +630 -0
  1055. package/src/tools/context/index.ts +514 -0
  1056. package/src/tools/context/surface.ts +19 -0
  1057. package/src/tools/core-bootstrap.ts +168 -0
  1058. package/src/tools/credential-present.ts +151 -0
  1059. package/src/tools/dispatch-admission.ts +533 -0
  1060. package/src/tools/dispatch-arguments.ts +228 -0
  1061. package/src/tools/dispatch-background.ts +54 -0
  1062. package/src/tools/dispatch-event-text.ts +6 -0
  1063. package/src/tools/dispatch-plan.ts +746 -0
  1064. package/src/tools/dispatch-run-events.ts +238 -0
  1065. package/src/tools/dispatch-runner.ts +2370 -0
  1066. package/src/tools/dispatch-scout-admission.ts +295 -0
  1067. package/src/tools/dispatch-scout.ts +461 -0
  1068. package/src/tools/dispatch-types.ts +77 -0
  1069. package/src/tools/dispatch.ts +244 -0
  1070. package/src/tools/edit-diff.ts +534 -0
  1071. package/src/tools/edit.ts +128 -0
  1072. package/src/tools/executables.ts +22 -0
  1073. package/src/tools/file-mutation-queue.ts +35 -0
  1074. package/src/tools/find.ts +294 -0
  1075. package/src/tools/grep.ts +495 -0
  1076. package/src/tools/ignore-policy.ts +169 -0
  1077. package/src/tools/lazy-tool.ts +60 -0
  1078. package/src/tools/ledger.ts +206 -0
  1079. package/src/tools/ls.ts +110 -0
  1080. package/src/tools/monitor-surface.ts +36 -0
  1081. package/src/tools/monitor.ts +767 -0
  1082. package/src/tools/network-policy.ts +29 -0
  1083. package/src/tools/observation.ts +421 -0
  1084. package/src/tools/observers.ts +99 -0
  1085. package/src/tools/path-utils.ts +79 -0
  1086. package/src/tools/policy.ts +154 -0
  1087. package/src/tools/profiles.ts +108 -0
  1088. package/src/tools/read.ts +173 -0
  1089. package/src/tools/registry.ts +1169 -0
  1090. package/src/tools/result-shaping.ts +204 -0
  1091. package/src/tools/safe-exec.ts +128 -0
  1092. package/src/tools/spawn-hygiene.ts +182 -0
  1093. package/src/tools/steer-surface.ts +17 -0
  1094. package/src/tools/steer.ts +77 -0
  1095. package/src/tools/tasks.ts +265 -0
  1096. package/src/tools/truncate-utf8.ts +17 -0
  1097. package/src/tools/truncate.ts +43 -0
  1098. package/src/tools/verify/frontend.ts +687 -0
  1099. package/src/tools/verify/index.ts +31 -0
  1100. package/src/tools/verify/scripts.ts +108 -0
  1101. package/src/tools/verify/surface.ts +46 -0
  1102. package/src/tools/web-fetch-surface.ts +23 -0
  1103. package/src/tools/web-fetch.ts +759 -0
  1104. package/src/tools/worker-evidence.ts +215 -0
  1105. package/src/tools/write.ts +57 -0
  1106. package/src/utils/exif-orientation.ts +192 -0
  1107. package/src/utils/git.ts +24 -0
  1108. package/src/utils/image-resize.ts +148 -0
  1109. package/src/utils/photon.ts +103 -0
  1110. package/src/worker/control-lane.ts +22 -0
  1111. package/src/worker/entry.ts +294 -0
  1112. package/src/worker/event-projection.ts +56 -0
  1113. package/src/worker/heartbeat.ts +24 -0
  1114. package/src/worker/ledger-mirror.ts +95 -0
  1115. package/src/worker/ndjson.ts +40 -0
  1116. package/src/worker/protocol.ts +529 -0
  1117. package/src/worker/resource-facts.ts +79 -0
  1118. package/src/worker/runtime-registry.ts +12 -0
  1119. package/src/worker/spec-contract.ts +675 -0
  1120. package/src/worker/stdin-demux.ts +316 -0
  1121. package/dist/acp-UMLFVA3F.js +0 -92
  1122. package/dist/chunk-262G75JS.js +0 -35
  1123. package/dist/chunk-6CWDTGUC.js +0 -20
  1124. package/dist/chunk-BYEU76JP.js +0 -899
  1125. package/dist/chunk-GNGDQYDU.js +0 -34688
  1126. package/dist/chunk-GOTUR54M.js +0 -9
  1127. package/dist/chunk-NI4DEJMC.js +0 -88
  1128. package/dist/chunk-TPOCL34A.js +0 -2876
  1129. package/dist/chunk-UU3R62TT.js +0 -128
  1130. package/dist/clio-KIQ5SNDS.js +0 -53
  1131. package/dist/configure-G4E3A2PG.js +0 -27
  1132. package/dist/doctor-M5HJJZOL.js +0 -61
  1133. package/dist/domains/agents/builtins/architect.md +0 -33
  1134. package/dist/domains/agents/builtins/coder.md +0 -31
  1135. package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
  1136. package/dist/domains/agents/builtins/debugger.md +0 -30
  1137. package/dist/domains/agents/builtins/documenter.md +0 -31
  1138. package/dist/domains/agents/builtins/git-master.md +0 -30
  1139. package/dist/domains/agents/builtins/provenance.md +0 -30
  1140. package/dist/domains/agents/builtins/researcher.md +0 -71
  1141. package/dist/domains/agents/builtins/scout.md +0 -42
  1142. package/dist/domains/agents/builtins/tester.md +0 -31
  1143. package/dist/domains/agents/builtins/verifier.md +0 -30
  1144. package/dist/domains/agents/builtins/wiki-writer.md +0 -41
  1145. package/dist/fleet-preflight-CLIAX7YR.js +0 -21
  1146. package/dist/preload-KZVHET2B.js +0 -11
  1147. package/dist/version-ROZ6CZKH.js +0 -16
  1148. package/docs/html/agents_blueprint.html +0 -936
  1149. package/docs/html/alcf_blueprint.html +0 -324
  1150. package/docs/html/architecture_blueprint.html +0 -850
  1151. package/docs/html/commands_blueprint.html +0 -794
  1152. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  1153. package/docs/html/configuration_blueprint.html +0 -1080
  1154. package/docs/html/context_blueprint.html +0 -603
  1155. package/docs/html/documentation_blueprint.html +0 -832
  1156. package/docs/html/environment_blueprint.html +0 -404
  1157. package/docs/html/eval_blueprint.html +0 -743
  1158. package/docs/html/evals_internal_blueprint.html +0 -190
  1159. package/docs/html/evolution_blueprint.html +0 -674
  1160. package/docs/html/extensions_blueprint.html +0 -2065
  1161. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  1162. package/docs/html/index.html +0 -919
  1163. package/docs/html/lifecycle_blueprint.html +0 -723
  1164. package/docs/html/memory_blueprint.html +0 -699
  1165. package/docs/html/middleware_blueprint.html +0 -664
  1166. package/docs/html/models_blueprint.html +0 -2366
  1167. package/docs/html/observability_blueprint.html +0 -683
  1168. package/docs/html/provider_adapter_blueprint.html +0 -245
  1169. package/docs/html/safety_blueprint.html +0 -1386
  1170. package/docs/html/shared.css +0 -571
  1171. package/docs/html/shared.js +0 -143
  1172. package/docs/html/skills_blueprint.html +0 -671
  1173. package/docs/html/soak_blueprint.html +0 -182
  1174. package/docs/html/tool_usage_blueprint.html +0 -350
  1175. package/docs/html/tools_blueprint.html +0 -2249
  1176. package/docs/html/trace_blueprint.html +0 -235
  1177. package/docs/html/tui_design_blueprint.html +0 -314
  1178. package/docs/html/validation_blueprint.html +0 -961
  1179. package/docs/html/worker_dispatch_blueprint.html +0 -231
  1180. package/skills/git/commit-crafting/SKILL.md +0 -79
  1181. package/skills/git/commit-crafting/evals.md +0 -92
  1182. package/skills/git/create-pr/SKILL.md +0 -116
  1183. package/skills/git/create-pr/evals.md +0 -114
  1184. package/skills/git/investigate-issue/SKILL.md +0 -139
  1185. package/skills/git/investigate-issue/evals.md +0 -94
  1186. package/skills/git/review-changes/SKILL.md +0 -103
  1187. package/skills/git/review-changes/evals.md +0 -85
@@ -0,0 +1,2095 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ hashToolCall
4
+ } from "./chunk-UOV2BYIW.js";
5
+ import {
6
+ TASK_MEMORY_DEFAULT_PROCEDURAL_CAP,
7
+ TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
8
+ runTaskMemoryPolicy,
9
+ taskMemoryBankDelta
10
+ } from "./chunk-OAO4GE4M.js";
11
+ import {
12
+ isTerminalRunEnvelope,
13
+ taskBoardCounts
14
+ } from "./chunk-MQSRRFWA.js";
15
+ import {
16
+ SKILL_SUGGESTION_ANCHOR
17
+ } from "./chunk-T6YILFSB.js";
18
+ import {
19
+ ToolNames
20
+ } from "./chunk-CGKSTWHD.js";
21
+ import {
22
+ ceilChars
23
+ } from "./chunk-LZSJBIVT.js";
24
+ import {
25
+ reportCommitAttributionDiagnostic,
26
+ withManagedGitCommitAttributionEnvironment
27
+ } from "./chunk-X75S7HFS.js";
28
+ import {
29
+ require_dist
30
+ } from "./chunk-APJ265NV.js";
31
+ import {
32
+ safeResourceWrite
33
+ } from "./chunk-WEPFGWHJ.js";
34
+ import {
35
+ __toESM,
36
+ init_esm_shims
37
+ } from "./chunk-3R73A4XB.js";
38
+
39
+ // src/domains/middleware/runtime.ts
40
+ init_esm_shims();
41
+
42
+ // src/domains/middleware/budget.ts
43
+ init_esm_shims();
44
+
45
+ // src/domains/middleware/types.ts
46
+ init_esm_shims();
47
+ var MIDDLEWARE_HOOKS = ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"];
48
+ var MIDDLEWARE_EFFECT_KINDS = [
49
+ "inject_reminder",
50
+ "annotate_tool_result",
51
+ "block_tool",
52
+ "protect_path",
53
+ "request_continuation",
54
+ "require_tool",
55
+ "lock_tools"
56
+ ];
57
+ var MIDDLEWARE_REMINDER_SEVERITIES = ["info", "advisory", "warn", "hard-block"];
58
+ var MIDDLEWARE_ANNOTATION_SEVERITIES = ["info", "warn"];
59
+ var MIDDLEWARE_HOOK_TEXT_MAX_CHARS = 16e3;
60
+ function metadataNumber(input, key) {
61
+ const value = input.metadata?.[key];
62
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
63
+ }
64
+ function isMiddlewareHook(value) {
65
+ return MIDDLEWARE_HOOKS.includes(value);
66
+ }
67
+ function isMiddlewareEffectKind(value) {
68
+ return MIDDLEWARE_EFFECT_KINDS.includes(value);
69
+ }
70
+ function isMiddlewareReminderSeverity(value) {
71
+ return MIDDLEWARE_REMINDER_SEVERITIES.includes(value);
72
+ }
73
+ function isMiddlewareAnnotationSeverity(value) {
74
+ return MIDDLEWARE_ANNOTATION_SEVERITIES.includes(value);
75
+ }
76
+
77
+ // src/domains/middleware/budget.ts
78
+ var DEFAULT_MIDDLEWARE_HOOK_BUDGETS_MS = {
79
+ before_tool: 25,
80
+ after_tool: 25,
81
+ turn_start: 50,
82
+ turn_end: 75,
83
+ on_compaction: 150
84
+ };
85
+ var DEFAULT_HOOK_BUDGET_WARMUP_CALLS = 1;
86
+ var DEFAULT_HOOK_BUDGET_WINDOW = 5;
87
+ var DEFAULT_HOOK_BUDGET_THRESHOLD = 3;
88
+ function parsePositiveMs(raw) {
89
+ if (raw === void 0) return null;
90
+ const value = Number(raw);
91
+ return Number.isFinite(value) && value > 0 ? value : null;
92
+ }
93
+ function parsePositiveInt(raw) {
94
+ if (raw === void 0) return null;
95
+ const value = Number(raw);
96
+ return Number.isInteger(value) && value > 0 ? value : null;
97
+ }
98
+ function parseNonNegativeInt(raw) {
99
+ if (raw === void 0) return null;
100
+ const value = Number(raw);
101
+ return Number.isInteger(value) && value >= 0 ? value : null;
102
+ }
103
+ function hookEnvSuffix(hook) {
104
+ return hook.toUpperCase();
105
+ }
106
+ function resolveHookBudgetsFromEnv(env = process.env) {
107
+ const global = parsePositiveMs(env.CLIO_CODER_HOOK_BUDGET_MS);
108
+ const map = {};
109
+ for (const hook of MIDDLEWARE_HOOKS) {
110
+ const perPhase = parsePositiveMs(env[`CLIO_CODER_HOOK_BUDGET_${hookEnvSuffix(hook)}_MS`]);
111
+ map[hook] = perPhase ?? global ?? DEFAULT_MIDDLEWARE_HOOK_BUDGETS_MS[hook];
112
+ }
113
+ return map;
114
+ }
115
+ function resolveHookBudgetTunablesFromEnv(env = process.env) {
116
+ return {
117
+ warmupCalls: parseNonNegativeInt(env.CLIO_CODER_HOOK_BUDGET_WARMUP_CALLS) ?? DEFAULT_HOOK_BUDGET_WARMUP_CALLS,
118
+ windowSize: parsePositiveInt(env.CLIO_CODER_HOOK_BUDGET_WINDOW) ?? DEFAULT_HOOK_BUDGET_WINDOW,
119
+ threshold: parsePositiveInt(env.CLIO_CODER_HOOK_BUDGET_THRESHOLD) ?? DEFAULT_HOOK_BUDGET_THRESHOLD
120
+ };
121
+ }
122
+ function percentile(sortedAscending, p) {
123
+ if (sortedAscending.length === 0) return 0;
124
+ const rank = Math.ceil(p / 100 * sortedAscending.length);
125
+ const index = Math.min(sortedAscending.length - 1, Math.max(0, rank - 1));
126
+ return sortedAscending[index] ?? 0;
127
+ }
128
+ function createHookBudgetTracker(options = {}) {
129
+ const budgets = { ...DEFAULT_MIDDLEWARE_HOOK_BUDGETS_MS, ...options.budgets ?? {} };
130
+ const warmupCalls = Math.max(0, options.warmupCalls ?? DEFAULT_HOOK_BUDGET_WARMUP_CALLS);
131
+ const windowSize = Math.max(1, options.windowSize ?? DEFAULT_HOOK_BUDGET_WINDOW);
132
+ const threshold = Math.min(windowSize, Math.max(1, options.threshold ?? DEFAULT_HOOK_BUDGET_THRESHOLD));
133
+ const states = /* @__PURE__ */ new Map();
134
+ function statsFor(state, budgetMs) {
135
+ const sorted = [...state.window].sort((a, b) => a - b);
136
+ const overCount = state.window.reduce((count, ms) => ms > budgetMs ? count + 1 : count, 0);
137
+ return {
138
+ sampleCount: state.postWarmupCalls,
139
+ window: state.window.length,
140
+ overCount,
141
+ p50Ms: percentile(sorted, 50),
142
+ p95Ms: percentile(sorted, 95)
143
+ };
144
+ }
145
+ return {
146
+ budgetFor(hook) {
147
+ return budgets[hook];
148
+ },
149
+ record(registrationId, hook, elapsedMs) {
150
+ const budgetMs = budgets[hook];
151
+ const exceeded = elapsedMs > budgetMs;
152
+ const key = `${registrationId}\0${hook}`;
153
+ let state = states.get(key);
154
+ if (state === void 0) {
155
+ state = { calls: 0, postWarmupCalls: 0, window: [] };
156
+ states.set(key, state);
157
+ }
158
+ state.calls += 1;
159
+ if (state.calls <= warmupCalls) {
160
+ return {
161
+ budgetMs,
162
+ exceeded,
163
+ warmup: true,
164
+ warn: false,
165
+ stats: { sampleCount: 0, window: 0, overCount: 0, p50Ms: 0, p95Ms: 0 }
166
+ };
167
+ }
168
+ state.postWarmupCalls += 1;
169
+ state.window.push(elapsedMs);
170
+ if (state.window.length > windowSize) state.window.shift();
171
+ const stats = statsFor(state, budgetMs);
172
+ return {
173
+ budgetMs,
174
+ exceeded,
175
+ warmup: false,
176
+ warn: exceeded && stats.overCount >= threshold,
177
+ stats
178
+ };
179
+ }
180
+ };
181
+ }
182
+
183
+ // src/domains/middleware/rules.ts
184
+ init_esm_shims();
185
+
186
+ // src/domains/middleware/stalled-turn.ts
187
+ init_esm_shims();
188
+ var STALLED_TURN_REGISTRATION_ID = "nudge.stalled-turn";
189
+ var STALLED_TURN_REQUEST_CONTINUATION_MESSAGE = "You ended your turn after announcing an action without executing it: no tools were called. Continue now and perform the announced action, or state plainly that you are finished and waiting for the user.";
190
+ var INTENT_PATTERN = /\b(let me|i['’]ll|i will|i am going to|i['’]m going to|now i|next i|let's|let us)\b/i;
191
+ var LET_ME_KNOW_PATTERN = /\blet me know\b/i;
192
+ var COMPLETION_PATTERN = /^\s*(?:all\s+done|done|complete|completed|all\s+set)\b|^\s*(?:here(?:'s| is)\s+)?(?:a\s+)?summary\b|^\s*summary\s*:?$/i;
193
+ var STALLED_TURN_RULE_DEFINITION = {
194
+ rule: {
195
+ id: STALLED_TURN_REGISTRATION_ID,
196
+ source: "builtin",
197
+ description: "request an automatic continuation when a turn announces work but calls no tools",
198
+ enabled: true,
199
+ hooks: ["turn_end"],
200
+ effectKinds: ["request_continuation"]
201
+ },
202
+ effects: [{ kind: "request_continuation", message: STALLED_TURN_REQUEST_CONTINUATION_MESSAGE }],
203
+ predicate: shouldRequestStalledTurnContinuation
204
+ };
205
+ function shouldRequestStalledTurnContinuation(input) {
206
+ if (input.hook !== "turn_end") return false;
207
+ if (input.metadata?.turnToolCalls !== 0) return false;
208
+ if (!isNormalStopReason(input.metadata?.stopReason)) return false;
209
+ const lastLine = lastNonEmptyLine(input.text ?? "");
210
+ if (lastLine === null) return false;
211
+ const finalSentence = lastSentence(lastLine);
212
+ if (finalSentence.length === 0) return false;
213
+ if (isQuestion(finalSentence)) return false;
214
+ if (LET_ME_KNOW_PATTERN.test(finalSentence)) return false;
215
+ if (COMPLETION_PATTERN.test(lastLine) || COMPLETION_PATTERN.test(finalSentence)) return false;
216
+ return finalSentence.endsWith(":") || INTENT_PATTERN.test(finalSentence);
217
+ }
218
+ function isNormalStopReason(value) {
219
+ if (value === void 0 || value === null) return true;
220
+ if (typeof value !== "string") return false;
221
+ const normalized = value.trim().toLowerCase().replace(/[\s-]+/g, "_");
222
+ return normalized === "stop" || normalized === "end_turn" || normalized.startsWith("stop_sequence");
223
+ }
224
+ function lastNonEmptyLine(text) {
225
+ const lines = text.split(/\r?\n/);
226
+ for (let index = lines.length - 1; index >= 0; index -= 1) {
227
+ const line = lines[index]?.trim();
228
+ if (line && line.length > 0) return line;
229
+ }
230
+ return null;
231
+ }
232
+ function lastSentence(line) {
233
+ const matches = line.match(/[^.!?]+[.!?]+(?:["')\]]+)?|[^.!?]+$/g);
234
+ const sentence = matches?.at(-1)?.trim() ?? line.trim();
235
+ return sentence.replace(/^[\s"'([{-]+/, "").trim();
236
+ }
237
+ function isQuestion(sentence) {
238
+ return /[?]["')\]]*$/.test(sentence.trim());
239
+ }
240
+
241
+ // src/domains/middleware/rules.ts
242
+ var BUILTIN_MIDDLEWARE_RULE_DEFINITIONS = [STALLED_TURN_RULE_DEFINITION];
243
+ var BUILTIN_MIDDLEWARE_RULE_IDS = BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map((definition) => definition.rule.id);
244
+ function listMiddlewareRuleDefinitions() {
245
+ return BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map(cloneRuleDefinition);
246
+ }
247
+ function listMiddlewareRules() {
248
+ return BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map((definition) => cloneMiddlewareRule(definition.rule));
249
+ }
250
+ function cloneMiddlewareRule(rule) {
251
+ return {
252
+ id: rule.id,
253
+ source: rule.source,
254
+ description: rule.description,
255
+ enabled: rule.enabled,
256
+ hooks: [...rule.hooks],
257
+ effectKinds: [...rule.effectKinds]
258
+ };
259
+ }
260
+ function cloneRuleDefinition(definition) {
261
+ const cloned = {
262
+ rule: cloneMiddlewareRule(definition.rule),
263
+ effects: [...definition.effects]
264
+ };
265
+ if (definition.toolNames !== void 0) cloned.toolNames = [...definition.toolNames];
266
+ if (definition.predicate !== void 0) cloned.predicate = definition.predicate;
267
+ return cloned;
268
+ }
269
+
270
+ // src/domains/middleware/runtime.ts
271
+ function writeMiddlewareDiagnosticToStderr(diagnostic) {
272
+ if (diagnostic.kind === "hook_failed") {
273
+ process.stderr.write(
274
+ `[clio:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}
275
+ `
276
+ );
277
+ return;
278
+ }
279
+ if (!diagnostic.steadyStateWarn && process.env.CLIO_CODER_HOOK_BUDGET_DEBUG !== "1") return;
280
+ const stats = diagnostic.stats;
281
+ const trend = stats.window > 0 ? ` (slow on ${stats.overCount}/${stats.window} recent ${diagnostic.hook} calls, p95 ${stats.p95Ms.toFixed(1)}ms)` : "";
282
+ process.stderr.write(
283
+ `[clio:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}
284
+ `
285
+ );
286
+ }
287
+ function registrationFromRuleDefinition(definition) {
288
+ const registration = {
289
+ id: definition.rule.id,
290
+ description: definition.rule.description,
291
+ hooks: [...definition.rule.hooks],
292
+ evaluate: (input) => evaluateRuleDefinition(definition, input)
293
+ };
294
+ if (definition.toolNames !== void 0) registration.toolNames = [...definition.toolNames];
295
+ return registration;
296
+ }
297
+ function runMiddlewareRegistrations(input, registrations, options = {}) {
298
+ const onDiagnostic = options.onDiagnostic ?? writeMiddlewareDiagnosticToStderr;
299
+ const now = options.now ?? (() => performance.now());
300
+ const budgetTracker = options.budgetTracker ?? createHookBudgetTracker();
301
+ const effects = [];
302
+ const ruleIds = [];
303
+ for (const registration of registrations) {
304
+ if (!registration.hooks.includes(input.hook)) continue;
305
+ if (registration.toolNames !== void 0) {
306
+ if (input.toolName === void 0) continue;
307
+ if (!registration.toolNames.includes(input.toolName)) continue;
308
+ }
309
+ let emitted;
310
+ const startedAt = now();
311
+ try {
312
+ emitted = registration.evaluate(cloneHookInput(input), { priorEffects: [...effects] });
313
+ } catch (err) {
314
+ emitDiagnostic(onDiagnostic, {
315
+ kind: "hook_failed",
316
+ registrationId: registration.id,
317
+ hook: input.hook,
318
+ message: err instanceof Error ? err.message : String(err)
319
+ });
320
+ continue;
321
+ }
322
+ const elapsedMs = now() - startedAt;
323
+ const outcome = budgetTracker.record(registration.id, input.hook, elapsedMs);
324
+ if (outcome.exceeded && !outcome.warmup) {
325
+ emitDiagnostic(onDiagnostic, {
326
+ kind: "budget_exceeded",
327
+ registrationId: registration.id,
328
+ hook: input.hook,
329
+ elapsedMs,
330
+ budgetMs: outcome.budgetMs,
331
+ steadyStateWarn: outcome.warn,
332
+ stats: outcome.stats
333
+ });
334
+ }
335
+ if (emitted.length === 0) continue;
336
+ for (const effect of emitted) {
337
+ effects.push(cloneMiddlewareEffect(effect));
338
+ }
339
+ if (!ruleIds.includes(registration.id)) ruleIds.push(registration.id);
340
+ }
341
+ return {
342
+ hook: input.hook,
343
+ input: cloneHookInput(input),
344
+ effects,
345
+ ruleIds
346
+ };
347
+ }
348
+ async function runMiddlewareAsyncRegistrations(input, registrations, priorEffects = [], options = {}) {
349
+ const onDiagnostic = options.onDiagnostic ?? writeMiddlewareDiagnosticToStderr;
350
+ const effects = [];
351
+ const ruleIds = [];
352
+ for (const registration of registrations) {
353
+ if (registration.evaluateAsync === void 0 || !registration.hooks.includes(input.hook)) continue;
354
+ if (registration.toolNames !== void 0) {
355
+ if (input.toolName === void 0 || !registration.toolNames.includes(input.toolName)) continue;
356
+ }
357
+ let emitted;
358
+ try {
359
+ emitted = await registration.evaluateAsync(cloneHookInput(input), {
360
+ priorEffects: [...priorEffects, ...effects]
361
+ });
362
+ } catch (err) {
363
+ emitDiagnostic(onDiagnostic, {
364
+ kind: "hook_failed",
365
+ registrationId: registration.id,
366
+ hook: input.hook,
367
+ message: err instanceof Error ? err.message : String(err)
368
+ });
369
+ continue;
370
+ }
371
+ for (const effect of emitted) effects.push(cloneMiddlewareEffect(effect));
372
+ if (emitted.length > 0) ruleIds.push(registration.id);
373
+ }
374
+ return { hook: input.hook, input: cloneHookInput(input), effects, ruleIds };
375
+ }
376
+ function emitDiagnostic(sink, diagnostic) {
377
+ try {
378
+ sink(diagnostic);
379
+ } catch {
380
+ }
381
+ }
382
+ function evaluateRuleDefinition(definition, input) {
383
+ const rule = definition.rule;
384
+ if (!rule.enabled) return [];
385
+ if (!rule.hooks.includes(input.hook)) return [];
386
+ if (definition.toolNames !== void 0) {
387
+ if (input.toolName === void 0) return [];
388
+ if (!definition.toolNames.includes(input.toolName)) return [];
389
+ }
390
+ if (definition.predicate !== void 0 && !definition.predicate(input)) return [];
391
+ const declaredKinds = new Set(rule.effectKinds);
392
+ const emitted = [];
393
+ for (const effect of definition.effects) {
394
+ if (!declaredKinds.has(effect.kind)) continue;
395
+ emitted.push(cloneMiddlewareEffect(effect));
396
+ }
397
+ return emitted;
398
+ }
399
+ function cloneMiddlewareEffect(effect) {
400
+ switch (effect.kind) {
401
+ case "inject_reminder": {
402
+ const cloned = { kind: "inject_reminder", message: effect.message };
403
+ if (effect.severity !== void 0) cloned.severity = effect.severity;
404
+ return cloned;
405
+ }
406
+ case "annotate_tool_result": {
407
+ const cloned = { kind: "annotate_tool_result", message: effect.message };
408
+ if (effect.severity !== void 0) cloned.severity = effect.severity;
409
+ return cloned;
410
+ }
411
+ case "block_tool":
412
+ return { kind: "block_tool", reason: effect.reason, severity: effect.severity };
413
+ case "protect_path":
414
+ return { kind: "protect_path", path: effect.path, reason: effect.reason };
415
+ case "request_continuation":
416
+ return { kind: "request_continuation", message: effect.message };
417
+ case "require_tool":
418
+ return { kind: "require_tool", toolName: effect.toolName };
419
+ case "lock_tools":
420
+ return { kind: "lock_tools" };
421
+ }
422
+ }
423
+ function cloneHookInput(input) {
424
+ const cloned = { hook: input.hook };
425
+ if (input.runId !== void 0) cloned.runId = input.runId;
426
+ if (input.sessionId !== void 0) cloned.sessionId = input.sessionId;
427
+ if (input.turnId !== void 0) cloned.turnId = input.turnId;
428
+ if (input.toolCallId !== void 0) cloned.toolCallId = input.toolCallId;
429
+ if (input.correlationId !== void 0) cloned.correlationId = input.correlationId;
430
+ if (input.toolName !== void 0) cloned.toolName = input.toolName;
431
+ if (input.modelId !== void 0) cloned.modelId = input.modelId;
432
+ if (input.metadata !== void 0) cloned.metadata = { ...input.metadata };
433
+ if (input.toolArgs !== void 0) cloned.toolArgs = { ...input.toolArgs };
434
+ if (input.toolResultDetails !== void 0) cloned.toolResultDetails = { ...input.toolResultDetails };
435
+ if (input.text !== void 0) cloned.text = input.text.slice(0, MIDDLEWARE_HOOK_TEXT_MAX_CHARS);
436
+ return cloned;
437
+ }
438
+
439
+ // src/domains/middleware/dispatch-nudge.ts
440
+ init_esm_shims();
441
+ var DETACHED_DISPATCH_NUDGE_REGISTRATION_ID = "nudge.detached-dispatch";
442
+ var READ_ONLY_EXPLORATION_NUDGE_REGISTRATION_ID = "nudge.read-only-exploration";
443
+ var READ_ONLY_EXPLORATION_NUDGE_CALL_THRESHOLD = 9;
444
+ var UNBACKED_WORKER_CLAIM_REGISTRATION_ID = "rail.unbacked-worker-claim";
445
+ var SCOUT_AGENT_ID = "scout";
446
+ var EXPLORATION_TOOL_NAMES = /* @__PURE__ */ new Set([
447
+ ToolNames.Read,
448
+ ToolNames.Grep,
449
+ ToolNames.Find,
450
+ ToolNames.Ls,
451
+ ToolNames.CodeNav,
452
+ ToolNames.Context,
453
+ ToolNames.Git
454
+ ]);
455
+ var EXPLORATION_NUDGE_TURN_LIMIT = 32;
456
+ var NO_TURN = "no-turn";
457
+ var READ_ONLY_SHELL_COMMAND_PATTERN = /^\s*(?:awk|cat|fd|find|git|grep|head|jq|ls|rg|sed|tail|tree|wc)\b/;
458
+ function buildReadOnlyExplorationMessage() {
459
+ return `[Clio Coder] This turn used ${READ_ONLY_EXPLORATION_NUDGE_CALL_THRESHOLD}+ read-only exploration calls without a successful Scout dispatch; delegate broad repository reconnaissance to Scout.`;
460
+ }
461
+ function stringValue(value) {
462
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
463
+ }
464
+ function recordValue(value) {
465
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
466
+ }
467
+ function ordinaryDispatchAgents(args) {
468
+ if (!args || args.list === true || args.apply_winner !== void 0 || args.review !== void 0 && args.review !== false || args.mode === "compete") {
469
+ return null;
470
+ }
471
+ let tasks = args.tasks;
472
+ if (typeof tasks === "string") {
473
+ const raw = tasks.trim();
474
+ if (raw.startsWith("[") || raw.startsWith("{")) {
475
+ try {
476
+ tasks = JSON.parse(raw);
477
+ } catch {
478
+ }
479
+ }
480
+ }
481
+ if (recordValue(tasks) !== null || typeof tasks === "string") tasks = [tasks];
482
+ if (tasks === void 0 && typeof args.task === "string") tasks = [{ task: args.task }];
483
+ if (!Array.isArray(tasks) || tasks.length === 0) return null;
484
+ const sharedAgent = stringValue(args.agent) ?? stringValue(args.agent_id) ?? "coder";
485
+ const agents = [];
486
+ for (const task of tasks) {
487
+ if (typeof task === "string") {
488
+ if (stringValue(task) === null) return null;
489
+ agents.push(sharedAgent);
490
+ continue;
491
+ }
492
+ const record = recordValue(task);
493
+ if (!record || stringValue(record.task) === null) return null;
494
+ agents.push(stringValue(record.agent) ?? stringValue(record.agent_id) ?? sharedAgent);
495
+ }
496
+ return agents;
497
+ }
498
+ function dispatchTargetsScout(args) {
499
+ return ordinaryDispatchAgents(args)?.some((agent) => agent.toLowerCase() === SCOUT_AGENT_ID) === true;
500
+ }
501
+ function isNonRepositoryContextCall(input) {
502
+ if (input.toolName !== ToolNames.Context) return false;
503
+ const scope = stringValue(input.toolArgs?.scope)?.toLowerCase();
504
+ return scope !== null && scope !== "workspace";
505
+ }
506
+ function isReadOnlyExplorationCall(input) {
507
+ if (isNonRepositoryContextCall(input)) return false;
508
+ if (input.toolName && EXPLORATION_TOOL_NAMES.has(input.toolName)) return true;
509
+ if (input.toolName !== ToolNames.Bash) return false;
510
+ const command = input.toolArgs?.command;
511
+ return typeof command === "string" && READ_ONLY_SHELL_COMMAND_PATTERN.test(command);
512
+ }
513
+ function hasActiveTool(input, toolName) {
514
+ const activeToolNames = input.metadata?.activeToolNames;
515
+ return typeof activeToolNames === "string" && activeToolNames.split(",").map((name) => name.trim()).includes(toolName);
516
+ }
517
+ function newExplorationTurnState(advised = false) {
518
+ return {
519
+ readOnlyCalls: 0,
520
+ scoutSucceeded: false,
521
+ advised
522
+ };
523
+ }
524
+ function markScoutSuccess(state) {
525
+ state.scoutSucceeded = true;
526
+ }
527
+ function createReadOnlyExplorationNudgeRegistration() {
528
+ const byTurn = /* @__PURE__ */ new Map();
529
+ const turnKey = (input) => {
530
+ const userTurnId = input.hook === "turn_end" ? input.metadata?.userTurnId : void 0;
531
+ return (typeof userTurnId === "string" && userTurnId.length > 0 ? userTurnId : input.turnId) ?? input.runId ?? NO_TURN;
532
+ };
533
+ const remember = (key, state) => {
534
+ if (byTurn.size >= EXPLORATION_NUDGE_TURN_LIMIT && !byTurn.has(key)) {
535
+ const oldest = byTurn.keys().next().value;
536
+ if (oldest !== void 0) byTurn.delete(oldest);
537
+ }
538
+ byTurn.set(key, state);
539
+ return state;
540
+ };
541
+ const stateForTool = (key) => byTurn.get(key) ?? remember(key, newExplorationTurnState());
542
+ const takeTurnEndState = (key) => {
543
+ const bound = byTurn.get(key);
544
+ if (bound === void 0) return null;
545
+ byTurn.set(key, newExplorationTurnState(bound.advised));
546
+ return bound;
547
+ };
548
+ const markAdvised = (key) => {
549
+ const carried = byTurn.get(key);
550
+ if (carried) carried.advised = true;
551
+ };
552
+ return {
553
+ id: READ_ONLY_EXPLORATION_NUDGE_REGISTRATION_ID,
554
+ description: "advise Scout delegation after prolonged read-only repository exploration",
555
+ hooks: ["before_tool", "after_tool", "turn_end"],
556
+ evaluate(input) {
557
+ const key = turnKey(input);
558
+ if (input.hook === "before_tool" || input.hook === "after_tool") {
559
+ const state2 = stateForTool(key);
560
+ if (input.toolName === ToolNames.Dispatch) {
561
+ if (input.hook === "after_tool" && dispatchTargetsScout(input.toolArgs)) {
562
+ if (input.metadata?.resultKind === "ok") markScoutSuccess(state2);
563
+ }
564
+ return [];
565
+ }
566
+ if (input.hook === "after_tool" || !isReadOnlyExplorationCall(input)) return [];
567
+ state2.readOnlyCalls += 1;
568
+ return [];
569
+ }
570
+ if (input.hook !== "turn_end") return [];
571
+ const state = takeTurnEndState(key);
572
+ const stopReason = input.metadata?.stopReason;
573
+ if (stopReason !== void 0 && stopReason !== "stop") return [];
574
+ if (!hasActiveTool(input, ToolNames.Dispatch)) return [];
575
+ if (!state || state.advised || state.scoutSucceeded || state.readOnlyCalls < READ_ONLY_EXPLORATION_NUDGE_CALL_THRESHOLD) {
576
+ return [];
577
+ }
578
+ markAdvised(key);
579
+ return [{ kind: "inject_reminder", message: buildReadOnlyExplorationMessage(), severity: "info" }];
580
+ }
581
+ };
582
+ }
583
+ var WORKER_NOUN = "(?:scouts?|shadow (?:agent|worker)s?|sub-?agents?|workers?)";
584
+ var RESULT_VERB = "(?:found|reported|returned|investigated|explored|concluded|confirmed|discovered|surfaced|completed|is complete|came back)";
585
+ var WORKER_CLAIM_PATTERNS = [
586
+ // "the scout found ...", "the scout investigation is complete", "workers came back ..."
587
+ new RegExp(`\\b${WORKER_NOUN}\\b[^.\\n]{0,40}?\\b${RESULT_VERB}\\b`, "i"),
588
+ // "... reported by the scout"
589
+ new RegExp(`\\b${RESULT_VERB}\\b[^.\\n]{0,24}\\bby\\s+(?:the\\s+|a\\s+|our\\s+)?${WORKER_NOUN}\\b`, "i"),
590
+ // A titled worker deliverable: "Scout Shadow Report", "Worker findings".
591
+ /\b(?:scout|shadow|worker)\b[^\n]{0,20}\b(?:report|findings|summary)\b/i
592
+ ];
593
+ function claimsWorkerResults(text) {
594
+ if (typeof text !== "string" || text.trim().length === 0) return false;
595
+ return WORKER_CLAIM_PATTERNS.some((pattern) => pattern.test(text));
596
+ }
597
+ function buildUnbackedWorkerClaimMessage() {
598
+ return "[Clio Coder] no dispatch ran this turn; worker results named above are not backed by a receipt. Dispatch the work or state plainly that you did it inline.";
599
+ }
600
+ function createUnbackedWorkerClaimRegistration() {
601
+ const dispatchedTurns = /* @__PURE__ */ new Set();
602
+ const turnKey = (input) => {
603
+ const userTurnId = input.hook === "turn_end" ? input.metadata?.userTurnId : void 0;
604
+ return (typeof userTurnId === "string" && userTurnId.length > 0 ? userTurnId : input.turnId) ?? input.runId ?? NO_TURN;
605
+ };
606
+ const remember = (key) => {
607
+ if (dispatchedTurns.size >= EXPLORATION_NUDGE_TURN_LIMIT && !dispatchedTurns.has(key)) {
608
+ const oldest = dispatchedTurns.values().next().value;
609
+ if (oldest !== void 0) dispatchedTurns.delete(oldest);
610
+ }
611
+ dispatchedTurns.add(key);
612
+ };
613
+ return {
614
+ id: UNBACKED_WORKER_CLAIM_REGISTRATION_ID,
615
+ description: "contradict a worker/scout result claim that no dispatch call in the turn backs",
616
+ hooks: ["after_tool", "turn_end"],
617
+ evaluate(input) {
618
+ const key = turnKey(input);
619
+ if (input.hook === "after_tool") {
620
+ if (input.toolName === ToolNames.Dispatch) remember(key);
621
+ return [];
622
+ }
623
+ if (input.hook !== "turn_end") return [];
624
+ const dispatched = dispatchedTurns.delete(key);
625
+ const stopReason = input.metadata?.stopReason;
626
+ if (stopReason !== void 0 && stopReason !== "stop") return [];
627
+ if (!hasActiveTool(input, ToolNames.Dispatch)) return [];
628
+ if (input.metadata?.sharedWorkerNote === true) return [];
629
+ if (dispatched || !claimsWorkerResults(input.text)) return [];
630
+ return [{ kind: "inject_reminder", message: buildUnbackedWorkerClaimMessage(), severity: "warn" }];
631
+ }
632
+ };
633
+ }
634
+ var TERMINAL_OUTCOME_ORDER = [
635
+ "succeeded",
636
+ "canceled",
637
+ "failed",
638
+ "timed_out",
639
+ "stalled",
640
+ "denied_by_policy",
641
+ "spawn_failed",
642
+ "missing",
643
+ "unknown"
644
+ ];
645
+ function terminalOutcomeLabel(outcome) {
646
+ switch (outcome) {
647
+ case "timed_out":
648
+ return "timed out";
649
+ case "denied_by_policy":
650
+ return "denied by policy";
651
+ case "spawn_failed":
652
+ return "spawn failed";
653
+ case "missing":
654
+ return "ledger row missing";
655
+ case "unknown":
656
+ return "outcome unknown";
657
+ default:
658
+ return outcome;
659
+ }
660
+ }
661
+ function incrementTerminalOutcome(counts, outcome) {
662
+ counts[outcome] = (counts[outcome] ?? 0) + 1;
663
+ }
664
+ function openDetachedBatchViews(dispatch) {
665
+ const detached = dispatch.detached;
666
+ if (!detached) return [];
667
+ let records;
668
+ try {
669
+ records = detached.list();
670
+ } catch {
671
+ return [];
672
+ }
673
+ return records.map((record) => {
674
+ let terminal = 0;
675
+ const terminalOutcomes = {};
676
+ for (const run of record.runs) {
677
+ const row = dispatch.getRun(run.runId);
678
+ if (row === null) {
679
+ terminal += 1;
680
+ incrementTerminalOutcome(terminalOutcomes, "missing");
681
+ } else if (isTerminalRunEnvelope(row)) {
682
+ terminal += 1;
683
+ incrementTerminalOutcome(terminalOutcomes, row.outcome ?? "unknown");
684
+ }
685
+ }
686
+ return { id: record.id, total: record.runs.length, terminal, terminalOutcomes };
687
+ });
688
+ }
689
+ function detachedBatchProgress(view) {
690
+ const terminalOutcomes = view.terminalOutcomes ?? {};
691
+ if (view.terminal === view.total && terminalOutcomes.succeeded === view.total) {
692
+ return `${view.terminal}/${view.total} run(s) done`;
693
+ }
694
+ let accountedFor = 0;
695
+ const breakdown = TERMINAL_OUTCOME_ORDER.flatMap((outcome) => {
696
+ const count = terminalOutcomes[outcome] ?? 0;
697
+ accountedFor += count;
698
+ return count > 0 ? [`${count} ${terminalOutcomeLabel(outcome)}`] : [];
699
+ });
700
+ const unavailable = Math.max(0, view.terminal - accountedFor);
701
+ if (unavailable > 0) breakdown.push(`${unavailable} outcome unknown`);
702
+ return `${view.terminal}/${view.total} run(s) terminal (${breakdown.join(", ")})`;
703
+ }
704
+ function buildDetachedBatchesMessage(ready, running) {
705
+ const rows = ready.map((view) => ` - batch ${view.id}: ${detachedBatchProgress(view)}`);
706
+ const runningNote = running.length > 0 ? `
707
+ ${running.length} other detached batch(es) are still running; leave those for later.` : "";
708
+ return `[Clio Coder] ${ready.length} detached dispatch batch(es) finished and are uncollected:
709
+ ${rows.join("\n")}
710
+ Collect each with monitor mode="collect" batch_id=<id> before final synthesis and act on the results. A batch stays open (and keeps nudging) until it is collected.${runningNote}`;
711
+ }
712
+ function createDetachedDispatchNudgeRegistration(options) {
713
+ return {
714
+ id: DETACHED_DISPATCH_NUDGE_REGISTRATION_ID,
715
+ description: "carry the turn onward when detached dispatch results are ready to collect",
716
+ hooks: ["turn_end"],
717
+ evaluate(input) {
718
+ if (input.hook !== "turn_end") return [];
719
+ const stopReason = input.metadata?.stopReason;
720
+ if (stopReason !== void 0 && stopReason !== "stop") return [];
721
+ const activeToolNames = input.metadata?.activeToolNames;
722
+ if (typeof activeToolNames === "string" && !activeToolNames.split(",").includes(ToolNames.Monitor)) return [];
723
+ let views;
724
+ try {
725
+ views = options.getOpenBatches();
726
+ } catch {
727
+ return [];
728
+ }
729
+ const ready = views.filter((view) => view.total > 0 && view.terminal >= view.total);
730
+ if (ready.length === 0) return [];
731
+ const running = views.filter((view) => view.total > 0 && view.terminal < view.total);
732
+ const message = buildDetachedBatchesMessage(ready, running);
733
+ return [
734
+ { kind: "request_continuation", message },
735
+ { kind: "inject_reminder", message, severity: "warn" }
736
+ ];
737
+ }
738
+ };
739
+ }
740
+
741
+ // src/domains/middleware/hook-receipts.ts
742
+ init_esm_shims();
743
+ var HOOK_RECEIPT_LOG_CAPACITY = 200;
744
+ var PERSIST_THROTTLE_MS = 2e3;
745
+ function createHookReceiptLog(options = {}) {
746
+ const capacity = options.capacity ?? HOOK_RECEIPT_LOG_CAPACITY;
747
+ const now = options.now ?? Date.now;
748
+ const throttleMs = options.throttleMs ?? PERSIST_THROTTLE_MS;
749
+ const ring = [];
750
+ let lastPersistAt = 0;
751
+ let dirty = false;
752
+ const persist = () => {
753
+ if (options.persistPath === void 0) return;
754
+ const payload = { version: 1, receipts: ring };
755
+ try {
756
+ safeResourceWrite(options.persistPath, `${JSON.stringify(payload, null, 2)}
757
+ `, { encoding: "utf8" });
758
+ dirty = false;
759
+ } catch {
760
+ }
761
+ };
762
+ return {
763
+ record(receipt) {
764
+ ring.push(receipt);
765
+ while (ring.length > capacity) ring.shift();
766
+ dirty = true;
767
+ if (now() - lastPersistAt >= throttleMs) {
768
+ lastPersistAt = now();
769
+ persist();
770
+ }
771
+ },
772
+ list() {
773
+ return [...ring];
774
+ },
775
+ flush() {
776
+ if (dirty) persist();
777
+ }
778
+ };
779
+ }
780
+
781
+ // src/domains/middleware/hooks-io.ts
782
+ init_esm_shims();
783
+ var import_yaml = __toESM(require_dist(), 1);
784
+ import { spawnSync } from "node:child_process";
785
+ import { readFileSync } from "node:fs";
786
+ import { join } from "node:path";
787
+
788
+ // src/domains/middleware/hooks.ts
789
+ init_esm_shims();
790
+ import { createHash } from "node:crypto";
791
+ import { isAbsolute, resolve } from "node:path";
792
+
793
+ // src/domains/middleware/validate.ts
794
+ init_esm_shims();
795
+ function validateMiddlewareEffect(value, source = "$") {
796
+ const issues = [];
797
+ const effect = readMiddlewareEffect(value, source, issues);
798
+ if (issues.length > 0 || effect === null) return { valid: false, issues };
799
+ return { valid: true, effect, issues: [] };
800
+ }
801
+ function readMiddlewareEffect(value, path, issues) {
802
+ if (!isRecord(value)) {
803
+ issues.push({ path, message: "expected middleware effect object" });
804
+ return null;
805
+ }
806
+ const kindValue = value.kind;
807
+ if (typeof kindValue !== "string" || !isMiddlewareEffectKind(kindValue)) {
808
+ issues.push({ path: `${path}.kind`, message: "expected known middleware effect kind" });
809
+ return null;
810
+ }
811
+ switch (kindValue) {
812
+ case "inject_reminder":
813
+ return readInjectReminder(value, path, issues);
814
+ case "annotate_tool_result":
815
+ return readAnnotateToolResult(value, path, issues);
816
+ case "block_tool":
817
+ return readBlockTool(value, path, issues);
818
+ case "protect_path":
819
+ return readProtectPath(value, path, issues);
820
+ case "request_continuation":
821
+ return readRequestContinuation(value, path, issues);
822
+ case "require_tool":
823
+ return readRequireTool(value, path, issues);
824
+ case "lock_tools":
825
+ rejectUnexpectedFields(value, path, ["kind"], issues);
826
+ return { kind: "lock_tools" };
827
+ }
828
+ }
829
+ function readRequireTool(record, path, issues) {
830
+ rejectUnexpectedFields(record, path, ["kind", "toolName"], issues);
831
+ const toolName = readRequiredString(record, `${path}.toolName`, issues);
832
+ return toolName === null ? null : { kind: "require_tool", toolName };
833
+ }
834
+ function readInjectReminder(record, path, issues) {
835
+ rejectUnexpectedFields(record, path, ["kind", "message", "severity"], issues);
836
+ const message = readRequiredString(record, `${path}.message`, issues);
837
+ const severity = readOptionalString(record, `${path}.severity`, issues);
838
+ if (severity !== void 0 && !isMiddlewareReminderSeverity(severity)) {
839
+ issues.push({ path: `${path}.severity`, message: "expected info, advisory, warn, or hard-block" });
840
+ }
841
+ if (message === null) return null;
842
+ const effect = { kind: "inject_reminder", message };
843
+ if (severity !== void 0 && isMiddlewareReminderSeverity(severity)) effect.severity = severity;
844
+ return effect;
845
+ }
846
+ function readAnnotateToolResult(record, path, issues) {
847
+ rejectUnexpectedFields(record, path, ["kind", "message", "severity"], issues);
848
+ const message = readRequiredString(record, `${path}.message`, issues);
849
+ const severity = readOptionalString(record, `${path}.severity`, issues);
850
+ if (severity !== void 0 && !isMiddlewareAnnotationSeverity(severity)) {
851
+ issues.push({ path: `${path}.severity`, message: "expected info or warn" });
852
+ }
853
+ if (message === null) return null;
854
+ const effect = { kind: "annotate_tool_result", message };
855
+ if (severity !== void 0 && isMiddlewareAnnotationSeverity(severity)) effect.severity = severity;
856
+ return effect;
857
+ }
858
+ function readBlockTool(record, path, issues) {
859
+ rejectUnexpectedFields(record, path, ["kind", "reason", "severity"], issues);
860
+ const reason = readRequiredString(record, `${path}.reason`, issues);
861
+ const severity = readRequiredString(record, `${path}.severity`, issues);
862
+ if (severity !== null && severity !== "hard-block") {
863
+ issues.push({ path: `${path}.severity`, message: "expected hard-block" });
864
+ }
865
+ if (reason === null || severity !== "hard-block") return null;
866
+ return { kind: "block_tool", reason, severity };
867
+ }
868
+ function readProtectPath(record, path, issues) {
869
+ rejectUnexpectedFields(record, path, ["kind", "path", "reason"], issues);
870
+ const protectedPath = readRequiredString(record, `${path}.path`, issues);
871
+ const reason = readRequiredString(record, `${path}.reason`, issues);
872
+ if (protectedPath === null || reason === null) return null;
873
+ return { kind: "protect_path", path: protectedPath, reason };
874
+ }
875
+ function readRequestContinuation(record, path, issues) {
876
+ rejectUnexpectedFields(record, path, ["kind", "message"], issues);
877
+ const message = readRequiredString(record, `${path}.message`, issues);
878
+ if (message === null) return null;
879
+ return { kind: "request_continuation", message };
880
+ }
881
+ function readRequiredString(record, path, issues) {
882
+ const value = record[pathField(path)];
883
+ if (typeof value !== "string" || value.trim().length === 0) {
884
+ issues.push({ path, message: "expected non-empty string" });
885
+ return null;
886
+ }
887
+ return value;
888
+ }
889
+ function readOptionalString(record, path, issues) {
890
+ const field = pathField(path);
891
+ if (!Object.hasOwn(record, field)) return void 0;
892
+ const value = record[field];
893
+ if (typeof value !== "string" || value.trim().length === 0) {
894
+ issues.push({ path, message: "expected non-empty string" });
895
+ return void 0;
896
+ }
897
+ return value;
898
+ }
899
+ function rejectUnexpectedFields(record, path, allowedFields, issues) {
900
+ const allowed = new Set(allowedFields);
901
+ for (const field of Object.keys(record).sort((a, b) => a.localeCompare(b))) {
902
+ if (!allowed.has(field)) issues.push({ path: `${path}.${field}`, message: "unexpected field" });
903
+ }
904
+ }
905
+ function pathField(path) {
906
+ return path.slice(path.lastIndexOf(".") + 1);
907
+ }
908
+ function isRecord(value) {
909
+ return typeof value === "object" && value !== null && !Array.isArray(value);
910
+ }
911
+
912
+ // src/domains/middleware/hooks.ts
913
+ var USER_HOOK_ORIGIN_ORDER = ["extension", "user", "project", "project.local"];
914
+ var USER_HOOK_COMMAND_TIMEOUT_DEFAULT_MS = 2e3;
915
+ var USER_HOOK_COMMAND_TIMEOUT_MIN_MS = 100;
916
+ var USER_HOOK_COMMAND_TIMEOUT_MAX_MS = 5e3;
917
+ var USER_HOOK_COMMAND_OUTPUT_MAX_CHARS = 4e3;
918
+ var USER_HOOK_PROMPT_MAX_CHARS = 2e3;
919
+ function isRecord2(value) {
920
+ return value !== null && typeof value === "object" && !Array.isArray(value);
921
+ }
922
+ function stableHash(value) {
923
+ return createHash("sha256").update(canonicalJson(value)).digest("hex").slice(0, 16);
924
+ }
925
+ function canonicalJson(value) {
926
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
927
+ if (isRecord2(value)) {
928
+ const keys = Object.keys(value).sort();
929
+ return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(",")}}`;
930
+ }
931
+ return JSON.stringify(value) ?? "null";
932
+ }
933
+ function readStringArray(value) {
934
+ if (!Array.isArray(value)) return null;
935
+ const out = [];
936
+ for (const item of value) {
937
+ if (typeof item !== "string" || item.length === 0) return null;
938
+ out.push(item);
939
+ }
940
+ return out;
941
+ }
942
+ function normalizeCommandSpec(raw, options, issues) {
943
+ const argv = readStringArray(raw.argv);
944
+ if (!argv || argv.length === 0) {
945
+ issues.push("command.argv must be a non-empty array of non-empty strings");
946
+ return null;
947
+ }
948
+ const spec = {
949
+ kind: "command",
950
+ argv,
951
+ cwd: resolve(options.workspaceRoot),
952
+ timeoutMs: USER_HOOK_COMMAND_TIMEOUT_DEFAULT_MS,
953
+ as: "annotate"
954
+ };
955
+ if (raw.cwd !== void 0) {
956
+ if (typeof raw.cwd !== "string" || raw.cwd.length === 0) {
957
+ issues.push("command.cwd must be a non-empty string");
958
+ return null;
959
+ }
960
+ const resolved = isAbsolute(raw.cwd) ? resolve(raw.cwd) : resolve(options.workspaceRoot, raw.cwd);
961
+ if (!isWithin(resolved, options.workspaceRoot)) {
962
+ issues.push("command.cwd must resolve under the workspace root");
963
+ return null;
964
+ }
965
+ spec.cwd = resolved;
966
+ }
967
+ if (raw.timeoutMs !== void 0) {
968
+ if (typeof raw.timeoutMs !== "number" || !Number.isFinite(raw.timeoutMs)) {
969
+ issues.push("command.timeoutMs must be a number");
970
+ return null;
971
+ }
972
+ spec.timeoutMs = Math.min(
973
+ USER_HOOK_COMMAND_TIMEOUT_MAX_MS,
974
+ Math.max(USER_HOOK_COMMAND_TIMEOUT_MIN_MS, Math.floor(raw.timeoutMs))
975
+ );
976
+ }
977
+ if (raw.as !== void 0) {
978
+ if (raw.as !== "annotate" && raw.as !== "reminder") {
979
+ issues.push('command.as must be "annotate" or "reminder"');
980
+ return null;
981
+ }
982
+ spec.as = raw.as;
983
+ }
984
+ return spec;
985
+ }
986
+ function normalizePromptSpec(raw, issues) {
987
+ if (typeof raw.message !== "string" || raw.message.trim().length === 0) {
988
+ issues.push("prompt.message must be a non-empty string");
989
+ return null;
990
+ }
991
+ let severity = "info";
992
+ if (raw.severity !== void 0) {
993
+ if (typeof raw.severity !== "string" || !isMiddlewareReminderSeverity(raw.severity)) {
994
+ issues.push("prompt.severity must be info, advisory, warn, or hard-block");
995
+ return null;
996
+ }
997
+ severity = raw.severity;
998
+ }
999
+ return { kind: "prompt", message: raw.message.slice(0, USER_HOOK_PROMPT_MAX_CHARS), severity };
1000
+ }
1001
+ function normalizeEffectSpec(raw, issues) {
1002
+ const result = validateMiddlewareEffect(raw.effect ?? raw, "effect");
1003
+ if (!result.valid) {
1004
+ for (const issue of result.issues) issues.push(`effect: ${issue.message}`);
1005
+ return null;
1006
+ }
1007
+ return { kind: "effect", effect: result.effect };
1008
+ }
1009
+ function isWithin(child, parent) {
1010
+ const rel = resolve(child);
1011
+ const base = resolve(parent);
1012
+ return rel === base || rel.startsWith(`${base}/`);
1013
+ }
1014
+ function normalizeUserHook(raw, source, options) {
1015
+ const issues = [];
1016
+ if (!isRecord2(raw)) {
1017
+ return { issues: ["hook declaration must be an object"] };
1018
+ }
1019
+ if (raw.on === void 0 || typeof raw.on !== "string" || !isMiddlewareHook(raw.on)) {
1020
+ issues.push("on must be one of before_tool, after_tool, turn_start, turn_end, on_compaction");
1021
+ }
1022
+ let tools;
1023
+ if (raw.tools !== void 0) {
1024
+ const parsed = readStringArray(raw.tools);
1025
+ if (!parsed) issues.push("tools must be an array of non-empty tool names");
1026
+ else tools = parsed;
1027
+ }
1028
+ let enabled = true;
1029
+ if (raw.enabled !== void 0) {
1030
+ if (typeof raw.enabled !== "boolean") issues.push("enabled must be a boolean");
1031
+ else enabled = raw.enabled;
1032
+ }
1033
+ let spec = null;
1034
+ if (raw.kind === "command") spec = normalizeCommandSpec(raw, options, issues);
1035
+ else if (raw.kind === "prompt") spec = normalizePromptSpec(raw, issues);
1036
+ else if (raw.kind === "effect") spec = normalizeEffectSpec(raw, issues);
1037
+ else issues.push('kind must be "command", "prompt", or "effect"');
1038
+ if (issues.length > 0 || spec === null || raw.on === void 0 || typeof raw.on !== "string") {
1039
+ return { issues };
1040
+ }
1041
+ const on = raw.on;
1042
+ const hash = stableHash({ on, tools: tools ?? null, spec });
1043
+ const id = typeof raw.id === "string" && raw.id.length > 0 ? raw.id : `${source.sourceId ?? source.origin}.${spec.kind}.${hash}`;
1044
+ const hook = { id, source, hash, on, enabled, spec };
1045
+ if (tools !== void 0) hook.tools = tools;
1046
+ return { hook, issues };
1047
+ }
1048
+ function declarationsArray(declarations) {
1049
+ if (Array.isArray(declarations)) return declarations;
1050
+ if (isRecord2(declarations) && Array.isArray(declarations.hooks)) return declarations.hooks;
1051
+ return [];
1052
+ }
1053
+ function loadUserHooks(batches, options) {
1054
+ const ordered = [...batches].sort(
1055
+ (a, b) => USER_HOOK_ORIGIN_ORDER.indexOf(a.source.origin) - USER_HOOK_ORIGIN_ORDER.indexOf(b.source.origin)
1056
+ );
1057
+ const byId = /* @__PURE__ */ new Map();
1058
+ const overridden = [];
1059
+ const issues = [];
1060
+ for (const batch of ordered) {
1061
+ const declarations = declarationsArray(batch.declarations);
1062
+ declarations.forEach((raw, index) => {
1063
+ const result = normalizeUserHook(raw, batch.source, options);
1064
+ if (!result.hook) {
1065
+ issues.push({ source: batch.source, index, issues: result.issues });
1066
+ return;
1067
+ }
1068
+ const existing = byId.get(result.hook.id);
1069
+ if (existing) overridden.push({ winner: batch.source, loser: existing });
1070
+ byId.set(result.hook.id, result.hook);
1071
+ });
1072
+ }
1073
+ return { hooks: [...byId.values()], overridden, issues };
1074
+ }
1075
+ function reminderEffect(message, severity) {
1076
+ return severity === "info" ? { kind: "inject_reminder", message } : { kind: "inject_reminder", message, severity };
1077
+ }
1078
+ function commandEffect(hook, output) {
1079
+ const message = output.slice(0, USER_HOOK_COMMAND_OUTPUT_MAX_CHARS);
1080
+ return hook.as === "reminder" ? { kind: "inject_reminder", message } : { kind: "annotate_tool_result", message };
1081
+ }
1082
+ function userHookToRegistration(hook, deps) {
1083
+ const now = deps.now ?? Date.now;
1084
+ const baseReceipt = (input) => ({
1085
+ at: now(),
1086
+ hookId: hook.id,
1087
+ origin: hook.source.origin,
1088
+ sourcePath: hook.source.sourcePath,
1089
+ hash: hook.hash,
1090
+ hook: hook.on,
1091
+ kind: hook.spec.kind,
1092
+ ...input.toolName !== void 0 ? { toolName: input.toolName } : {}
1093
+ });
1094
+ const registration = {
1095
+ id: hook.id,
1096
+ description: `${hook.spec.kind} hook from ${hook.source.origin} (${hook.source.sourcePath})`,
1097
+ hooks: [hook.on],
1098
+ evaluate: (input) => {
1099
+ if (!hook.enabled) return [];
1100
+ try {
1101
+ return evaluateHook(hook, deps, baseReceipt(input));
1102
+ } catch {
1103
+ deps.recordReceipt({ ...baseReceipt(input), outcome: "skipped" });
1104
+ return [];
1105
+ }
1106
+ }
1107
+ };
1108
+ if (hook.tools !== void 0) registration.toolNames = [...hook.tools];
1109
+ return registration;
1110
+ }
1111
+ function evaluateHook(hook, deps, base) {
1112
+ if (hook.spec.kind === "prompt") {
1113
+ const effect2 = reminderEffect(hook.spec.message, hook.spec.severity);
1114
+ deps.recordReceipt({ ...base, outcome: "emitted", effectKinds: ["inject_reminder"] });
1115
+ return [effect2];
1116
+ }
1117
+ if (hook.spec.kind === "effect") {
1118
+ deps.recordReceipt({ ...base, outcome: "emitted", effectKinds: [hook.spec.effect.kind] });
1119
+ return [hook.spec.effect];
1120
+ }
1121
+ const result = deps.runCommand(hook.spec.argv, {
1122
+ timeoutMs: hook.spec.timeoutMs,
1123
+ ...hook.spec.cwd !== void 0 ? { cwd: hook.spec.cwd } : {}
1124
+ });
1125
+ const output = (result.stdout || result.stderr || "").trim();
1126
+ if (result.timedOut) {
1127
+ deps.recordReceipt({ ...base, outcome: "command-timeout", exitCode: result.code ?? -1, outputChars: output.length });
1128
+ return [];
1129
+ }
1130
+ const outcome = result.code === 0 ? "command-ok" : "command-failed";
1131
+ deps.recordReceipt({ ...base, outcome, exitCode: result.code ?? -1, outputChars: output.length });
1132
+ if (output.length === 0) return [];
1133
+ const effect = commandEffect(hook.spec, output);
1134
+ return [effect];
1135
+ }
1136
+
1137
+ // src/domains/middleware/hooks-io.ts
1138
+ var COMMAND_OUTPUT_MAX_BYTES = 1024 * 1024;
1139
+ function readBatch(source, filePath, fileIssues) {
1140
+ let text;
1141
+ try {
1142
+ text = readFileSync(filePath, "utf8");
1143
+ } catch {
1144
+ return null;
1145
+ }
1146
+ try {
1147
+ const parsed = (0, import_yaml.parse)(text);
1148
+ return { source, declarations: parsed ?? [] };
1149
+ } catch (err) {
1150
+ fileIssues.push({
1151
+ source,
1152
+ message: `failed to parse ${filePath}: ${err instanceof Error ? err.message : String(err)}`
1153
+ });
1154
+ return null;
1155
+ }
1156
+ }
1157
+ function readHookSources(options) {
1158
+ const fileIssues = [];
1159
+ const batches = [];
1160
+ for (const extension of options.extensions ?? []) {
1161
+ const source = {
1162
+ origin: "extension",
1163
+ sourcePath: `${extension.id}:hooks.yaml`,
1164
+ sourceId: extension.id
1165
+ };
1166
+ const batch = readBatch(source, join(extension.rootPath, "hooks.yaml"), fileIssues);
1167
+ if (batch) batches.push(batch);
1168
+ }
1169
+ const projectBatch = readBatch(
1170
+ { origin: "project", sourcePath: ".clio-coder/hooks.yaml" },
1171
+ join(options.cwd, ".clio-coder", "hooks.yaml"),
1172
+ fileIssues
1173
+ );
1174
+ if (projectBatch) batches.push(projectBatch);
1175
+ const localBatch = readBatch(
1176
+ { origin: "project.local", sourcePath: ".clio-coder/hooks.local.yaml" },
1177
+ join(options.cwd, ".clio-coder", "hooks.local.yaml"),
1178
+ fileIssues
1179
+ );
1180
+ if (localBatch) batches.push(localBatch);
1181
+ return { batches, fileIssues };
1182
+ }
1183
+ function installUserHooks(options) {
1184
+ const workspaceRoot = options.workspaceRoot ?? options.cwd;
1185
+ const readOptions = { cwd: options.cwd };
1186
+ if (options.extensions !== void 0) readOptions.extensions = options.extensions;
1187
+ const { batches, fileIssues } = readHookSources(readOptions);
1188
+ const loaded = loadUserHooks(batches, { workspaceRoot });
1189
+ const runCommand = options.runCommand ?? spawnSyncCommandRunner();
1190
+ for (const hook of loaded.hooks) {
1191
+ options.registerHook(
1192
+ userHookToRegistration(hook, {
1193
+ recordReceipt: options.recordReceipt,
1194
+ runCommand,
1195
+ ...options.now !== void 0 ? { now: options.now } : {}
1196
+ })
1197
+ );
1198
+ }
1199
+ return { ...loaded, fileIssues };
1200
+ }
1201
+ function spawnSyncCommandRunner() {
1202
+ return (argv, options) => {
1203
+ const [command, ...args] = argv;
1204
+ const attribution = withManagedGitCommitAttributionEnvironment(process.env, {
1205
+ cwd: options.cwd ?? process.cwd(),
1206
+ evidence: {}
1207
+ });
1208
+ reportCommitAttributionDiagnostic(attribution.diagnostic);
1209
+ const result = spawnSync(command ?? "", args, {
1210
+ ...options.cwd !== void 0 ? { cwd: options.cwd } : {},
1211
+ timeout: options.timeoutMs,
1212
+ maxBuffer: COMMAND_OUTPUT_MAX_BYTES,
1213
+ encoding: "utf8",
1214
+ shell: false,
1215
+ env: attribution.env
1216
+ });
1217
+ const timedOut = result.error !== void 0 && result.error.code === "ETIMEDOUT";
1218
+ return {
1219
+ code: result.status,
1220
+ timedOut,
1221
+ stdout: typeof result.stdout === "string" ? result.stdout : "",
1222
+ stderr: typeof result.stderr === "string" ? result.stderr : ""
1223
+ };
1224
+ };
1225
+ }
1226
+
1227
+ // src/domains/middleware/memory-intervention.ts
1228
+ init_esm_shims();
1229
+ import { createHash as createHash2 } from "node:crypto";
1230
+ var MEMORY_INTERVENTION_REGISTRATION_ID = "observer.memory-intervention";
1231
+ var MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS = 8;
1232
+ var MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS = 400;
1233
+ var MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS = 10;
1234
+ var MEMORY_INTERVENTION_ACTIVITY_LIMIT = 20;
1235
+ var RESULT_DIGEST_MAX_CHARS = 240;
1236
+ var CALL_DESCRIPTION_MAX_CHARS = 180;
1237
+ var NO_EFFECTS = [];
1238
+ function createMemoryInterventionRegistration(deps) {
1239
+ const pending = /* @__PURE__ */ new Map();
1240
+ const trajectory = [];
1241
+ const failures = /* @__PURE__ */ new Map();
1242
+ let toolStep = 0;
1243
+ let lastTurnEndStep = 0;
1244
+ let reactivateAfterCompaction = false;
1245
+ let lastInjectedFingerprint = null;
1246
+ let currentTask = "(current task unavailable)";
1247
+ let toolsSinceMemoryStep = 0;
1248
+ let consecutiveErrors = 0;
1249
+ let lastPromptedBoundary = null;
1250
+ let lastInjectedMessage = null;
1251
+ let lastDecision = null;
1252
+ const pendingTriggers = /* @__PURE__ */ new Set();
1253
+ const activity = [];
1254
+ const annotatedThisTurn = /* @__PURE__ */ new Set();
1255
+ let telemetryBankSnapshot = deps.bank.snapshot();
1256
+ let promptedStepInFlight = false;
1257
+ let promptedStepTier = "rules";
1258
+ let outstandingStep = Promise.resolve();
1259
+ let rulesInjectedSincePromptedStep = false;
1260
+ let annotatedSinceTurnEnd = false;
1261
+ return {
1262
+ id: MEMORY_INTERVENTION_REGISTRATION_ID,
1263
+ description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
1264
+ hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
1265
+ evaluate(input) {
1266
+ if (!settings().enabled) return NO_EFFECTS;
1267
+ try {
1268
+ switch (input.hook) {
1269
+ case "before_tool":
1270
+ observeBeforeTool(input);
1271
+ return NO_EFFECTS;
1272
+ case "after_tool":
1273
+ return observeAfterTool(input);
1274
+ case "turn_end": {
1275
+ if (toolStep <= lastTurnEndStep) return NO_EFFECTS;
1276
+ const alreadyReported = annotatedSinceTurnEnd;
1277
+ annotatedSinceTurnEnd = false;
1278
+ const started = process.hrtime.bigint();
1279
+ const effects = decideRepeatedFailure();
1280
+ if (alreadyReported && effects.length === 0) return effects;
1281
+ emitTelemetry(
1282
+ [effects.length > 0 ? "repeated_failure" : "turn_end"],
1283
+ "rules",
1284
+ effects.length > 0 ? "injected" : "silent",
1285
+ effects.length > 0 ? "intervened" : "no_repeated_failure",
1286
+ citedEntryCount(effects[0]?.kind === "inject_reminder" ? effects[0].message : null),
1287
+ 0,
1288
+ 0,
1289
+ started
1290
+ );
1291
+ return effects;
1292
+ }
1293
+ case "on_compaction":
1294
+ reactivateAfterCompaction = true;
1295
+ return NO_EFFECTS;
1296
+ case "turn_start": {
1297
+ if (input.text?.trim()) currentTask = shortText(input.text, 2e3);
1298
+ annotatedThisTurn.clear();
1299
+ const shouldReactivate = reactivateAfterCompaction;
1300
+ const started = process.hrtime.bigint();
1301
+ const effects = reactivateKnowledge();
1302
+ if (shouldReactivate) {
1303
+ emitTelemetry(
1304
+ ["post_compaction"],
1305
+ "rules",
1306
+ effects.length > 0 ? "injected" : "silent",
1307
+ effects.length > 0 ? "intervened" : "bank_empty",
1308
+ citedEntryCount(effects[0]?.kind === "inject_reminder" ? effects[0].message : null),
1309
+ 0,
1310
+ 0,
1311
+ started
1312
+ );
1313
+ }
1314
+ return effects;
1315
+ }
1316
+ }
1317
+ } catch {
1318
+ return NO_EFFECTS;
1319
+ }
1320
+ },
1321
+ /**
1322
+ * Kicks off the background memory step and returns immediately. The pi
1323
+ * agent does not go idle until every `agent_end` listener settles, so
1324
+ * awaiting a local memory model here would stall the visible turn for its
1325
+ * full latency. Small local models measure in tens of seconds, which is far
1326
+ * past any tolerable end-of-turn pause and past the policy timeout itself.
1327
+ * The reminder is delivered through `onDeferredReminder` instead, landing
1328
+ * in the next submitted turn, which is where an awaited turn_end reminder
1329
+ * would have been buffered anyway.
1330
+ */
1331
+ async evaluateAsync(input, context) {
1332
+ if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
1333
+ const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
1334
+ if (boundary === lastPromptedBoundary) return NO_EFFECTS;
1335
+ if (deps.deliversDeferredReminders === false) {
1336
+ emitTelemetry([...pendingTriggers], "rules", "silent", "no_consumer", 0, 0, 0, process.hrtime.bigint());
1337
+ pendingTriggers.clear();
1338
+ return NO_EFFECTS;
1339
+ }
1340
+ if (promptedStepInFlight) {
1341
+ emitTelemetry(
1342
+ [...pendingTriggers],
1343
+ promptedStepTier,
1344
+ "dropped",
1345
+ "step_in_flight",
1346
+ 0,
1347
+ 0,
1348
+ 0,
1349
+ process.hrtime.bigint()
1350
+ );
1351
+ return NO_EFFECTS;
1352
+ }
1353
+ lastPromptedBoundary = boundary;
1354
+ const triggers = [...pendingTriggers];
1355
+ pendingTriggers.clear();
1356
+ toolsSinceMemoryStep = 0;
1357
+ consecutiveErrors = 0;
1358
+ const rulesAlreadySpoke = rulesInjectedSincePromptedStep || (context?.priorEffects.some(
1359
+ (effect) => effect.kind === "inject_reminder" && effect.message.startsWith("Memory:")
1360
+ ) ?? false);
1361
+ rulesInjectedSincePromptedStep = false;
1362
+ promptedStepInFlight = true;
1363
+ outstandingStep = runPromptedStep({
1364
+ deterministicTrigger: triggers.some((trigger) => trigger !== "interval"),
1365
+ suppressIntervention: rulesAlreadySpoke,
1366
+ triggerReasons: triggers
1367
+ }).then((result) => {
1368
+ if (rulesAlreadySpoke && result.decision === "silent") lastDecision = "injected";
1369
+ if (result.reminder === null) return;
1370
+ lastInjectedMessage = result.reminder;
1371
+ deps.onDeferredReminder?.(result.reminder);
1372
+ }).catch(() => {
1373
+ }).finally(() => {
1374
+ promptedStepInFlight = false;
1375
+ });
1376
+ return NO_EFFECTS;
1377
+ },
1378
+ runPromptedStep,
1379
+ signalLoop() {
1380
+ if (settings().enabled) pendingTriggers.add("loop_signal");
1381
+ },
1382
+ lastDecision: () => lastDecision,
1383
+ recentActivity: () => [...activity],
1384
+ stepInFlight: () => promptedStepInFlight,
1385
+ whenIdle: () => outstandingStep
1386
+ };
1387
+ function settings() {
1388
+ const live = deps.getSettings?.();
1389
+ return {
1390
+ enabled: live?.enabled ?? deps.enabled ?? true,
1391
+ everyNTools: Math.max(
1392
+ 2,
1393
+ positiveInteger(live?.everyNTools ?? deps.everyNTools, MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS)
1394
+ ),
1395
+ windowSteps: positiveInteger(live?.windowSteps ?? deps.windowSteps, MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS),
1396
+ maxTokens: positiveInteger(live?.maxTokens ?? deps.maxTokens, MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS),
1397
+ timeoutMs: positiveInteger(live?.timeoutMs ?? deps.timeoutMs, TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS)
1398
+ };
1399
+ }
1400
+ async function runPromptedStep(input) {
1401
+ const silent = (reason) => ({
1402
+ decision: "silent",
1403
+ reason,
1404
+ bankOperations: 0,
1405
+ droppedOperations: 0,
1406
+ reminder: null,
1407
+ inputTokens: 0,
1408
+ outputTokens: 0,
1409
+ effects: NO_EFFECTS
1410
+ });
1411
+ const live = settings();
1412
+ if (!live.enabled) {
1413
+ const result = silent("no_client");
1414
+ lastDecision = result.decision;
1415
+ return result;
1416
+ }
1417
+ const started = process.hrtime.bigint();
1418
+ const triggers = input.triggerReasons?.length ? input.triggerReasons : ["manual"];
1419
+ let tier = "rules";
1420
+ promptedStepTier = tier;
1421
+ let promptedResult;
1422
+ try {
1423
+ const client = deps.getModelClient?.() ?? null;
1424
+ if (client === null) {
1425
+ promptedResult = silent("no_client");
1426
+ } else {
1427
+ tier = "llm";
1428
+ promptedStepTier = tier;
1429
+ promptedResult = await runTaskMemoryPolicy(deps.bank, client, {
1430
+ task: input.task?.trim() || currentTask,
1431
+ trajectory: [...trajectory],
1432
+ deterministicTrigger: input.deterministicTrigger,
1433
+ maxTokens: live.maxTokens,
1434
+ ...input.suppressIntervention === void 0 ? {} : { suppressIntervention: input.suppressIntervention },
1435
+ previousReminder: lastInjectedMessage,
1436
+ timeoutMs: live.timeoutMs,
1437
+ ...deps.onEnvelope === void 0 ? {} : { onEnvelope: deps.onEnvelope }
1438
+ });
1439
+ }
1440
+ } catch (error) {
1441
+ promptedResult = silent("client_error");
1442
+ deps.onEnvelope?.({
1443
+ systemPrompt: "",
1444
+ userPrompt: "",
1445
+ response: "",
1446
+ decision: "silent",
1447
+ reason: "client_error",
1448
+ bankOperations: 0,
1449
+ droppedOperations: 0,
1450
+ reminder: null,
1451
+ error: error instanceof Error ? error.message : "resolving the background model client failed"
1452
+ });
1453
+ }
1454
+ lastDecision = promptedResult.decision;
1455
+ emitTelemetry(
1456
+ triggers,
1457
+ tier,
1458
+ promptedResult.decision,
1459
+ promptedResult.reason,
1460
+ citedEntryCount(promptedResult.reminder),
1461
+ promptedResult.inputTokens,
1462
+ promptedResult.outputTokens,
1463
+ started,
1464
+ { bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations }
1465
+ );
1466
+ return {
1467
+ ...promptedResult,
1468
+ effects: promptedResult.reminder === null ? NO_EFFECTS : [{ kind: "inject_reminder", message: promptedResult.reminder, severity: "advisory" }]
1469
+ };
1470
+ }
1471
+ function emitTelemetry(triggerReasons, tier, decision, reason, citedEntries, inputTokens, outputTokens, started, operations = { bankOperations: 0, droppedOperations: 0 }) {
1472
+ const next = deps.bank.snapshot();
1473
+ const bankDelta = taskMemoryBankDelta(telemetryBankSnapshot, next);
1474
+ telemetryBankSnapshot = next;
1475
+ const latencyMs = Number(process.hrtime.bigint() - started) / 1e6;
1476
+ try {
1477
+ deps.telemetry?.record({
1478
+ triggerReasons,
1479
+ tier,
1480
+ bankDelta,
1481
+ decision,
1482
+ reason,
1483
+ bankOperations: operations.bankOperations,
1484
+ droppedOperations: operations.droppedOperations,
1485
+ citedEntries,
1486
+ inputTokens,
1487
+ outputTokens,
1488
+ latencyMs
1489
+ });
1490
+ } catch {
1491
+ }
1492
+ const event = {
1493
+ at: (/* @__PURE__ */ new Date()).toISOString(),
1494
+ triggerReasons: [...new Set(triggerReasons)],
1495
+ tier,
1496
+ decision,
1497
+ reason,
1498
+ citedEntries,
1499
+ bankWrites: countBankWrites(bankDelta),
1500
+ latencyMs
1501
+ };
1502
+ activity.unshift(event);
1503
+ if (activity.length > MEMORY_INTERVENTION_ACTIVITY_LIMIT) activity.length = MEMORY_INTERVENTION_ACTIVITY_LIMIT;
1504
+ }
1505
+ function citedEntryCount(message) {
1506
+ if (message === null) return 0;
1507
+ const snapshot = deps.bank.snapshot();
1508
+ return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`)).length;
1509
+ }
1510
+ function observeBeforeTool(input) {
1511
+ const prepared = prepareToolStep(input);
1512
+ if (prepared === null) return;
1513
+ setBounded(pending, pendingKey(input, prepared.fingerprint), prepared, settings().windowSteps);
1514
+ }
1515
+ function observeAfterTool(input) {
1516
+ const fallback = prepareToolStep(input);
1517
+ if (fallback === null) return NO_EFFECTS;
1518
+ const key = pendingKey(input, fallback.fingerprint);
1519
+ const prepared = pending.get(key) ?? fallback;
1520
+ pending.delete(key);
1521
+ const outcome = input.metadata?.resultKind === "error" ? "error" : "ok";
1522
+ toolStep += 1;
1523
+ toolsSinceMemoryStep += 1;
1524
+ const live = settings();
1525
+ if (toolsSinceMemoryStep >= live.everyNTools) pendingTriggers.add("interval");
1526
+ if (outcome === "error") {
1527
+ consecutiveErrors += 1;
1528
+ if (consecutiveErrors >= 2) pendingTriggers.add("tool_error_streak");
1529
+ } else {
1530
+ consecutiveErrors = 0;
1531
+ }
1532
+ const step = {
1533
+ ...prepared,
1534
+ step: toolStep,
1535
+ outcome,
1536
+ resultDigest: resultDigest(input, outcome)
1537
+ };
1538
+ trajectory.push(step);
1539
+ if (trajectory.length > live.windowSteps) trajectory.splice(0, trajectory.length - live.windowSteps);
1540
+ if (outcome !== "error") return NO_EFFECTS;
1541
+ rememberFailure(step);
1542
+ return annotateRepeatedFailure(step);
1543
+ }
1544
+ function annotateRepeatedFailure(step) {
1545
+ if (annotatedThisTurn.has(step.fingerprint)) return NO_EFFECTS;
1546
+ const occurrences = trajectory.filter(
1547
+ (candidate) => candidate.outcome === "error" && candidate.fingerprint === step.fingerprint
1548
+ ).length;
1549
+ const failure = failures.get(step.fingerprint);
1550
+ if (occurrences < 2 || failure === void 0) return NO_EFFECTS;
1551
+ const message = boundedReminder(
1552
+ `Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}. Change the approach rather than repeating it.`,
1553
+ settings().maxTokens
1554
+ );
1555
+ if (message.length === 0) return NO_EFFECTS;
1556
+ annotatedThisTurn.add(step.fingerprint);
1557
+ lastInjectedFingerprint = step.fingerprint;
1558
+ lastDecision = "injected";
1559
+ rulesInjectedSincePromptedStep = true;
1560
+ annotatedSinceTurnEnd = true;
1561
+ deps.bank.recordInjection([failure.entryId]);
1562
+ emitTelemetry(["repeated_failure"], "rules", "injected", "intervened", 1, 0, 0, process.hrtime.bigint());
1563
+ return [{ kind: "annotate_tool_result", message, severity: "warn" }];
1564
+ }
1565
+ function rememberFailure(step) {
1566
+ const previous = failures.get(step.fingerprint);
1567
+ const attempts = (previous?.attempts ?? 0) + 1;
1568
+ const firstStep = previous?.firstStep ?? step.step;
1569
+ const content = proceduralContent(step.callDescription, attempts, firstStep, step.resultDigest);
1570
+ let entryId;
1571
+ if (previous === void 0) {
1572
+ entryId = deps.bank.saveProcedural(content).id;
1573
+ } else {
1574
+ try {
1575
+ entryId = deps.bank.saveProcedural(content, { id: previous.entryId }).id;
1576
+ } catch {
1577
+ entryId = deps.bank.saveProcedural(content).id;
1578
+ }
1579
+ }
1580
+ setBounded(
1581
+ failures,
1582
+ step.fingerprint,
1583
+ {
1584
+ entryId,
1585
+ attempts,
1586
+ firstStep,
1587
+ callDescription: step.callDescription,
1588
+ errorDigest: step.resultDigest
1589
+ },
1590
+ TASK_MEMORY_DEFAULT_PROCEDURAL_CAP
1591
+ );
1592
+ }
1593
+ function decideRepeatedFailure() {
1594
+ try {
1595
+ for (let index = trajectory.length - 1; index >= 0; index -= 1) {
1596
+ const step = trajectory[index];
1597
+ if (step === void 0 || step.outcome !== "error" || step.step <= lastTurnEndStep || step.fingerprint === lastInjectedFingerprint) {
1598
+ continue;
1599
+ }
1600
+ const occurrences = trajectory.filter(
1601
+ (candidate) => candidate.outcome === "error" && candidate.fingerprint === step.fingerprint
1602
+ ).length;
1603
+ const failure = failures.get(step.fingerprint);
1604
+ if (occurrences < 2 || failure === void 0) continue;
1605
+ const message = boundedReminder(
1606
+ `Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}.`,
1607
+ settings().maxTokens
1608
+ );
1609
+ if (message.length === 0) return NO_EFFECTS;
1610
+ lastInjectedFingerprint = step.fingerprint;
1611
+ lastInjectedMessage = message;
1612
+ lastDecision = "injected";
1613
+ rulesInjectedSincePromptedStep = true;
1614
+ deps.bank.recordInjection([failure.entryId]);
1615
+ return [{ kind: "inject_reminder", message, severity: "advisory" }];
1616
+ }
1617
+ lastDecision = "silent";
1618
+ return NO_EFFECTS;
1619
+ } finally {
1620
+ lastTurnEndStep = toolStep;
1621
+ }
1622
+ }
1623
+ function reactivateKnowledge() {
1624
+ if (!reactivateAfterCompaction) return NO_EFFECTS;
1625
+ reactivateAfterCompaction = false;
1626
+ const prefix = "Memory: execution state restored after compaction:\n";
1627
+ const maxTokens = settings().maxTokens;
1628
+ const prefixTokens = ceilChars(prefix.length);
1629
+ const rendered = deps.bank.renderRestoredState(Math.max(0, maxTokens - prefixTokens));
1630
+ if (rendered.length === 0) {
1631
+ lastDecision = "silent";
1632
+ return NO_EFFECTS;
1633
+ }
1634
+ const message = boundedReminder(`${prefix}${rendered}`, maxTokens);
1635
+ if (message.length === 0) {
1636
+ lastDecision = "silent";
1637
+ return NO_EFFECTS;
1638
+ }
1639
+ const citedIds = [...message.matchAll(/\[([^\]]+)\]/gu)].map((match) => match[1]).filter((id) => id !== void 0);
1640
+ deps.bank.recordInjection(citedIds);
1641
+ lastInjectedMessage = message;
1642
+ lastDecision = "injected";
1643
+ return [{ kind: "inject_reminder", message, severity: "advisory" }];
1644
+ }
1645
+ }
1646
+ function prepareToolStep(input) {
1647
+ const toolName = input.toolName?.trim();
1648
+ if (!toolName) return null;
1649
+ const canonical = hashToolCall(toolName, input.toolArgs ?? {});
1650
+ return {
1651
+ toolName,
1652
+ fingerprint: createHash2("sha256").update(canonical).digest("hex").slice(0, 16),
1653
+ callDescription: shortText(canonical, CALL_DESCRIPTION_MAX_CHARS)
1654
+ };
1655
+ }
1656
+ function pendingKey(input, fingerprint) {
1657
+ return input.toolCallId ?? `anonymous:${fingerprint}`;
1658
+ }
1659
+ function resultDigest(input, outcome) {
1660
+ if (outcome === "error") {
1661
+ const metadataMessage = input.metadata?.errorMessage;
1662
+ if (typeof metadataMessage === "string" && metadataMessage.trim().length > 0) {
1663
+ return shortText(diagnosticLine(metadataMessage), RESULT_DIGEST_MAX_CHARS);
1664
+ }
1665
+ for (const key of ["error", "message"]) {
1666
+ const value = input.toolResultDetails?.[key];
1667
+ if (typeof value === "string" && value.trim().length > 0) {
1668
+ return shortText(diagnosticLine(value), RESULT_DIGEST_MAX_CHARS);
1669
+ }
1670
+ }
1671
+ return "an unknown tool error";
1672
+ }
1673
+ const resultFingerprint = input.metadata?.resultFingerprint;
1674
+ return typeof resultFingerprint === "string" ? `ok result ${resultFingerprint.slice(0, 16)}` : "ok";
1675
+ }
1676
+ var DIAGNOSTIC_HINT = /\b(error|failed|failure|cannot|unable|expected|refused|denied|missing|not found|timed out|timeout|fatal)\b/iu;
1677
+ function diagnosticLine(value) {
1678
+ const lines = value.split(/\r?\n/u).map((line) => line.trim()).filter((line) => line.length > 0);
1679
+ return lines.find((line) => DIAGNOSTIC_HINT.test(line)) ?? lines[0] ?? "";
1680
+ }
1681
+ function proceduralContent(call, attempts, firstStep, error) {
1682
+ return `${call} failed ${attempts} time${attempts === 1 ? "" : "s"}; first observed at step ${firstStep}: ${error}.`;
1683
+ }
1684
+ function boundedReminder(message, maxTokens) {
1685
+ const maxChars = maxTokens * 4;
1686
+ if (maxChars <= 0) return "";
1687
+ const normalized = message.replace(/[^\S\n]+/gu, " ").trim();
1688
+ return normalized.length <= maxChars ? normalized : normalized.slice(0, maxChars).trimEnd();
1689
+ }
1690
+ function shortText(value, maxChars) {
1691
+ const normalized = value.replace(/\s+/gu, " ").trim();
1692
+ return normalized.length <= maxChars ? normalized : `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}\u2026`;
1693
+ }
1694
+ function positiveInteger(value, fallback) {
1695
+ return value !== void 0 && Number.isInteger(value) && value > 0 ? value : fallback;
1696
+ }
1697
+ function countBankWrites(delta) {
1698
+ return [delta.status, delta.knowledge, delta.procedural].reduce(
1699
+ (total, entry) => total + entry.added + entry.updated + entry.deleted,
1700
+ 0
1701
+ );
1702
+ }
1703
+ function setBounded(map, key, value, capacity) {
1704
+ if (!map.has(key) && map.size >= capacity) {
1705
+ const oldest = map.keys().next().value;
1706
+ if (oldest !== void 0) map.delete(oldest);
1707
+ }
1708
+ map.set(key, value);
1709
+ }
1710
+
1711
+ // src/domains/middleware/skills-reminder.ts
1712
+ init_esm_shims();
1713
+ var SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
1714
+ function skillsReminderMessage(installed, installable = 0) {
1715
+ const counts = installable > 0 ? `${installed} installed, ${installable} installable from the marketplace` : `${installed} installed`;
1716
+ return `[Skills] ${counts}. Start this task by listing them with context(scope="skills") and checking for a match; if one matches, open your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) and wait for the operator; load only on operator request, and a marketplace skill is offered for install when the operator runs it. If none match, do not mention skills and continue with the task.`;
1717
+ }
1718
+ var NO_EFFECTS2 = [];
1719
+ var GREETING_WORDS = /* @__PURE__ */ new Set([
1720
+ "hi",
1721
+ "hello",
1722
+ "hey",
1723
+ "heya",
1724
+ "hiya",
1725
+ "howdy",
1726
+ "yo",
1727
+ "sup",
1728
+ "hola",
1729
+ "greetings",
1730
+ "gm",
1731
+ "gn",
1732
+ "morning",
1733
+ "afternoon",
1734
+ "evening",
1735
+ "good",
1736
+ "day",
1737
+ "night",
1738
+ "there",
1739
+ "you",
1740
+ "clio",
1741
+ "thanks",
1742
+ "thank",
1743
+ "thankyou",
1744
+ "thx",
1745
+ "ty",
1746
+ "ok",
1747
+ "okay",
1748
+ "k",
1749
+ "cool",
1750
+ "nice",
1751
+ "test",
1752
+ "testing",
1753
+ "ping",
1754
+ "pong"
1755
+ ]);
1756
+ function isSubstantiveUserTurn(text) {
1757
+ const normalized = (text ?? "").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
1758
+ if (normalized.length === 0) return false;
1759
+ const tokens = normalized.split(" ");
1760
+ if (tokens.length > 4) return true;
1761
+ return tokens.some((token) => !GREETING_WORDS.has(token));
1762
+ }
1763
+ function createSkillsReminderRegistration(deps) {
1764
+ let lastSeenSessionId;
1765
+ let spentForActiveSession = false;
1766
+ let observedFreshStart = false;
1767
+ let observedAnyTurn = false;
1768
+ return {
1769
+ id: SKILLS_REMINDER_REGISTRATION_ID,
1770
+ description: "once per session, on the first substantive turn, teaches the skill-suggestion reply protocol",
1771
+ hooks: ["turn_start"],
1772
+ evaluate(input) {
1773
+ const sessionId = input.sessionId ?? null;
1774
+ if (lastSeenSessionId === void 0) {
1775
+ lastSeenSessionId = sessionId;
1776
+ } else if (lastSeenSessionId === null && sessionId !== null) {
1777
+ lastSeenSessionId = sessionId;
1778
+ } else if (sessionId !== lastSeenSessionId) {
1779
+ lastSeenSessionId = sessionId;
1780
+ spentForActiveSession = false;
1781
+ observedFreshStart = false;
1782
+ observedAnyTurn = false;
1783
+ }
1784
+ if (spentForActiveSession) return NO_EFFECTS2;
1785
+ const conversationMessages = metadataNumber(input, "conversationMessages");
1786
+ if (!observedAnyTurn) {
1787
+ observedAnyTurn = true;
1788
+ if (conversationMessages === null || conversationMessages > 0) {
1789
+ spentForActiveSession = true;
1790
+ return NO_EFFECTS2;
1791
+ }
1792
+ observedFreshStart = true;
1793
+ }
1794
+ if (!observedFreshStart) {
1795
+ spentForActiveSession = true;
1796
+ return NO_EFFECTS2;
1797
+ }
1798
+ if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS2;
1799
+ spentForActiveSession = true;
1800
+ const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
1801
+ if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS2;
1802
+ let installed = 0;
1803
+ let installable = 0;
1804
+ try {
1805
+ installed = deps.countModelVisibleSkills();
1806
+ installable = deps.countInstallableSkills?.() ?? 0;
1807
+ } catch {
1808
+ return NO_EFFECTS2;
1809
+ }
1810
+ if (installed <= 0 && installable <= 0) return NO_EFFECTS2;
1811
+ return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
1812
+ }
1813
+ };
1814
+ }
1815
+
1816
+ // src/domains/middleware/task-board-reminder.ts
1817
+ init_esm_shims();
1818
+ var TASK_BOARD_REMINDER_REGISTRATION_ID = "observer.task-board-reminder";
1819
+ function taskBoardReminderMessage(steps) {
1820
+ return `[Tasks] This request enumerates ${steps} steps. Before the first edit, declare the task board: tasks action="plan" with a title and one task per step, then work them one at a time ("start", then "done" with an evidence note).`;
1821
+ }
1822
+ function countEnumeratedSteps(text) {
1823
+ const value = text ?? "";
1824
+ if (value.trim().length === 0) return 0;
1825
+ const markers = [];
1826
+ const markerPattern = /(?:^|[\s(])(?:step\s+)?([1-9])\s*[).:]\s/gi;
1827
+ let match = markerPattern.exec(value);
1828
+ while (match !== null) {
1829
+ const digit = Number(match[1]);
1830
+ if (Number.isInteger(digit)) markers.push(digit);
1831
+ match = markerPattern.exec(value);
1832
+ }
1833
+ let run = 0;
1834
+ for (const digit of markers) {
1835
+ if (digit === run + 1) run += 1;
1836
+ else if (digit === 1) run = 1;
1837
+ }
1838
+ if (run >= 3) return run;
1839
+ const bulletLines = value.split(/\r?\n/).filter((line) => /^\s*[-*]\s+\S/.test(line)).length;
1840
+ return bulletLines >= 3 ? bulletLines : 0;
1841
+ }
1842
+ var NO_EFFECTS3 = [];
1843
+ function createTaskBoardReminderRegistration() {
1844
+ let lastSeenSessionId;
1845
+ let spentForActiveSession = false;
1846
+ return {
1847
+ id: TASK_BOARD_REMINDER_REGISTRATION_ID,
1848
+ description: "once per session, on the first explicitly enumerated multi-step turn, teaches the board-first protocol",
1849
+ hooks: ["turn_start"],
1850
+ evaluate(input) {
1851
+ const sessionId = input.sessionId ?? null;
1852
+ if (lastSeenSessionId === void 0 || lastSeenSessionId === null && sessionId !== null) {
1853
+ lastSeenSessionId = sessionId;
1854
+ } else if (sessionId !== lastSeenSessionId) {
1855
+ lastSeenSessionId = sessionId;
1856
+ spentForActiveSession = false;
1857
+ }
1858
+ if (spentForActiveSession) return NO_EFFECTS3;
1859
+ const steps = countEnumeratedSteps(input.text);
1860
+ if (steps < 3) return NO_EFFECTS3;
1861
+ spentForActiveSession = true;
1862
+ const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
1863
+ if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS3;
1864
+ return [{ kind: "inject_reminder", severity: "info", message: taskBoardReminderMessage(steps) }];
1865
+ }
1866
+ };
1867
+ }
1868
+
1869
+ // src/domains/middleware/task-nudge.ts
1870
+ init_esm_shims();
1871
+ var TASK_NUDGE_REGISTRATION_ID = "nudge.open-tasks";
1872
+ function openTasks(board) {
1873
+ return board.tasks.filter((task) => task.status === "pending" || task.status === "active");
1874
+ }
1875
+ function buildOpenTasksMessage(board) {
1876
+ const open = openTasks(board);
1877
+ const counts = taskBoardCounts(board);
1878
+ const rows = open.map((task) => ` ${task.status === "active" ? "[>]" : "[ ]"} ${task.id} ${task.title}`);
1879
+ return `[Clio Coder] task board "${board.title}" still has ${open.length} of ${counts.total} task(s) open:
1880
+ ${rows.join("\n")}
1881
+ Continue working them, or record the honest state on the board: tasks action="done" with an evidence note, action="block" with a reason, or action="drop". Do not end the turn with a stale board.`;
1882
+ }
1883
+ function createTaskNudgeRegistration(options) {
1884
+ return {
1885
+ id: TASK_NUDGE_REGISTRATION_ID,
1886
+ description: "carry the turn onward when a work turn ends with open task-board tasks",
1887
+ hooks: ["turn_end"],
1888
+ evaluate(input) {
1889
+ if (input.hook !== "turn_end") return [];
1890
+ const stopReason = input.metadata?.stopReason;
1891
+ if (stopReason !== void 0 && stopReason !== "stop") return [];
1892
+ const turnToolCalls = input.metadata?.turnToolCalls;
1893
+ if (typeof turnToolCalls !== "number" || turnToolCalls <= 0) return [];
1894
+ const activeToolNames = input.metadata?.activeToolNames;
1895
+ if (typeof activeToolNames === "string" && !activeToolNames.split(",").includes(ToolNames.Tasks)) return [];
1896
+ let board;
1897
+ try {
1898
+ board = options.getBoard();
1899
+ } catch {
1900
+ return [];
1901
+ }
1902
+ if (board === null || openTasks(board).length === 0) return [];
1903
+ const message = buildOpenTasksMessage(board);
1904
+ return [
1905
+ { kind: "request_continuation", message },
1906
+ { kind: "inject_reminder", message, severity: "warn" }
1907
+ ];
1908
+ }
1909
+ };
1910
+ }
1911
+
1912
+ // src/domains/middleware/tool-choice-control.ts
1913
+ init_esm_shims();
1914
+ function createMiddlewareToolChoiceControl() {
1915
+ let choice = { kind: "auto" };
1916
+ return {
1917
+ apply(effects) {
1918
+ for (const effect of effects) {
1919
+ if (effect.kind === "lock_tools") {
1920
+ choice = { kind: "none" };
1921
+ continue;
1922
+ }
1923
+ if (effect.kind === "require_tool" && choice.kind !== "none") {
1924
+ choice = { kind: "required", toolName: effect.toolName };
1925
+ }
1926
+ }
1927
+ },
1928
+ current: () => choice,
1929
+ toolStarted(toolName) {
1930
+ if (choice.kind === "required" && choice.toolName === toolName) choice = { kind: "auto" };
1931
+ },
1932
+ reset() {
1933
+ choice = { kind: "auto" };
1934
+ }
1935
+ };
1936
+ }
1937
+
1938
+ // src/domains/middleware/index.ts
1939
+ init_esm_shims();
1940
+
1941
+ // src/domains/middleware/extension.ts
1942
+ init_esm_shims();
1943
+
1944
+ // src/domains/middleware/snapshot.ts
1945
+ init_esm_shims();
1946
+ function createMiddlewareSnapshot(rules = listMiddlewareRules()) {
1947
+ return {
1948
+ version: 1,
1949
+ rules: rules.map(cloneMiddlewareRule)
1950
+ };
1951
+ }
1952
+ function createMiddlewareContractFromSnapshot(snapshot) {
1953
+ const builtinById = new Map(listMiddlewareRuleDefinitions().map((definition) => [definition.rule.id, definition]));
1954
+ const definitions = snapshot.rules.map((rule) => {
1955
+ const builtin = builtinById.get(rule.id);
1956
+ const definition = {
1957
+ rule: cloneMiddlewareRule(rule),
1958
+ effects: builtin === void 0 ? [] : builtin.effects.map(cloneMiddlewareEffect)
1959
+ };
1960
+ if (builtin?.toolNames !== void 0) definition.toolNames = [...builtin.toolNames];
1961
+ if (builtin?.predicate !== void 0) definition.predicate = builtin.predicate;
1962
+ return definition;
1963
+ });
1964
+ const registrations = definitions.map(registrationFromRuleDefinition);
1965
+ const registeredIds = new Set(registrations.map((registration) => registration.id));
1966
+ const budgetTracker = createHookBudgetTracker({
1967
+ budgets: resolveHookBudgetsFromEnv(),
1968
+ ...resolveHookBudgetTunablesFromEnv()
1969
+ });
1970
+ let diagnosticSink;
1971
+ return {
1972
+ runHook(input) {
1973
+ return runMiddlewareRegistrations(input, registrations, {
1974
+ budgetTracker,
1975
+ ...diagnosticSink !== void 0 ? { onDiagnostic: diagnosticSink } : {}
1976
+ });
1977
+ },
1978
+ listRules() {
1979
+ return definitions.map((definition) => cloneMiddlewareRule(definition.rule));
1980
+ },
1981
+ snapshot() {
1982
+ return createMiddlewareSnapshot(definitions.map((definition) => definition.rule));
1983
+ },
1984
+ registerHook(registration) {
1985
+ if (registeredIds.has(registration.id)) return;
1986
+ registeredIds.add(registration.id);
1987
+ registrations.push(registration);
1988
+ },
1989
+ setDiagnosticSink(sink) {
1990
+ diagnosticSink = sink;
1991
+ }
1992
+ };
1993
+ }
1994
+
1995
+ // src/domains/middleware/extension.ts
1996
+ function createEnvHookBudgetTracker(env = process.env) {
1997
+ return createHookBudgetTracker({ budgets: resolveHookBudgetsFromEnv(env), ...resolveHookBudgetTunablesFromEnv(env) });
1998
+ }
1999
+ function createMiddlewareBundle(options = {}) {
2000
+ const ruleDefinitions = combineRuleDefinitions(listMiddlewareRuleDefinitions(), options.ruleDefinitions ?? []);
2001
+ const registrations = combineRegistrations(ruleDefinitions, options.registrations ?? []);
2002
+ const registeredIds = new Set(registrations.map((registration) => registration.id));
2003
+ let diagnosticSink = options.onDiagnostic;
2004
+ const budgetTracker = options.budgetTracker ?? createEnvHookBudgetTracker();
2005
+ const contract = {
2006
+ runHook(input) {
2007
+ return runMiddlewareRegistrations(input, registrations, {
2008
+ budgetTracker,
2009
+ ...diagnosticSink !== void 0 ? { onDiagnostic: diagnosticSink } : {}
2010
+ });
2011
+ },
2012
+ runAsyncHook(input, priorEffects = []) {
2013
+ return runMiddlewareAsyncRegistrations(input, registrations, priorEffects, {
2014
+ ...diagnosticSink !== void 0 ? { onDiagnostic: diagnosticSink } : {}
2015
+ });
2016
+ },
2017
+ listRules() {
2018
+ return ruleDefinitions.map((definition) => cloneMiddlewareRule(definition.rule));
2019
+ },
2020
+ snapshot() {
2021
+ return createMiddlewareSnapshot(ruleDefinitions.map((definition) => definition.rule));
2022
+ },
2023
+ registerHook(registration) {
2024
+ if (registeredIds.has(registration.id)) return;
2025
+ registeredIds.add(registration.id);
2026
+ registrations.push(registration);
2027
+ },
2028
+ setDiagnosticSink(sink) {
2029
+ diagnosticSink = sink;
2030
+ }
2031
+ };
2032
+ return {
2033
+ extension: {
2034
+ start() {
2035
+ return void 0;
2036
+ }
2037
+ },
2038
+ contract
2039
+ };
2040
+ }
2041
+ function combineRuleDefinitions(builtin, registered) {
2042
+ const seen = /* @__PURE__ */ new Set();
2043
+ const combined = [];
2044
+ for (const definition of [...builtin, ...registered]) {
2045
+ if (seen.has(definition.rule.id)) continue;
2046
+ seen.add(definition.rule.id);
2047
+ combined.push(definition);
2048
+ }
2049
+ return combined;
2050
+ }
2051
+ function combineRegistrations(ruleDefinitions, coded) {
2052
+ const seen = new Set(ruleDefinitions.map((definition) => definition.rule.id));
2053
+ const combined = ruleDefinitions.map(registrationFromRuleDefinition);
2054
+ for (const registration of coded) {
2055
+ if (seen.has(registration.id)) continue;
2056
+ seen.add(registration.id);
2057
+ combined.push(registration);
2058
+ }
2059
+ return combined;
2060
+ }
2061
+
2062
+ // src/domains/middleware/manifest.ts
2063
+ init_esm_shims();
2064
+ var MiddlewareManifest = {
2065
+ name: "middleware",
2066
+ dependsOn: []
2067
+ };
2068
+
2069
+ // src/domains/middleware/index.ts
2070
+ var MiddlewareDomainModule = {
2071
+ manifest: MiddlewareManifest,
2072
+ createExtension: () => createMiddlewareBundle()
2073
+ };
2074
+
2075
+ export {
2076
+ MIDDLEWARE_HOOK_TEXT_MAX_CHARS,
2077
+ shouldRequestStalledTurnContinuation,
2078
+ writeMiddlewareDiagnosticToStderr,
2079
+ createMiddlewareContractFromSnapshot,
2080
+ createReadOnlyExplorationNudgeRegistration,
2081
+ createUnbackedWorkerClaimRegistration,
2082
+ openDetachedBatchViews,
2083
+ createDetachedDispatchNudgeRegistration,
2084
+ createHookReceiptLog,
2085
+ loadUserHooks,
2086
+ readHookSources,
2087
+ installUserHooks,
2088
+ createMemoryInterventionRegistration,
2089
+ createSkillsReminderRegistration,
2090
+ createTaskBoardReminderRegistration,
2091
+ createTaskNudgeRegistration,
2092
+ createMiddlewareToolChoiceControl,
2093
+ MiddlewareDomainModule
2094
+ };
2095
+ //# sourceMappingURL=chunk-WMSVI4G2.js.map