@iowarp/clio-coder 0.3.0 → 0.3.1

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 (988) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +50 -53
  3. package/dist/acp-FPR54DGL.js +138 -0
  4. package/dist/{agents-Q4MYPMUW.js → agents-OGPIHPJH.js} +33 -25
  5. package/dist/assets/codewiki.json +1 -0
  6. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
  7. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
  8. package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
  9. package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
  10. package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
  11. package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
  12. package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
  13. package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
  14. package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
  15. package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
  16. package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
  17. package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
  18. package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
  19. package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
  20. package/dist/assets/grammars/tree-sitter.wasm +0 -0
  21. package/dist/{auth-O6HYIJ6J.js → auth-IC3K6NIZ.js} +22 -15
  22. package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
  23. package/dist/chunk-3I7MS7N2.js +40 -0
  24. package/dist/chunk-3R73A4XB.js +69 -0
  25. package/dist/{chunk-26BZQOAD.js → chunk-474KN5II.js} +86 -115
  26. package/dist/{chunk-NI4DEJMC.js → chunk-4QKXUHSR.js} +26 -3
  27. package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
  28. package/dist/{chunk-TFSSEXL6.js → chunk-673JJUWJ.js} +14 -4
  29. package/dist/{chunk-GNGDQYDU.js → chunk-7SS2CTV2.js} +27922 -1249
  30. package/dist/{chunk-7RBKDI66.js → chunk-ASND7OZK.js} +104 -12
  31. package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
  32. package/dist/{chunk-RQDWMVRB.js → chunk-BSU2YIWB.js} +9 -3
  33. package/dist/{chunk-CLJ5HLUD.js → chunk-C4PTHK7P.js} +24 -5
  34. package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
  35. package/dist/{chunk-BYEU76JP.js → chunk-DKGKUHFA.js} +34 -9
  36. package/dist/chunk-EYOKLTMF.js +170 -0
  37. package/dist/{chunk-PS4PFJQP.js → chunk-FCIH3BIZ.js} +15258 -14130
  38. package/dist/{chunk-2J63S4SF.js → chunk-FST4FYJB.js} +82 -14
  39. package/dist/{chunk-3DANZDGR.js → chunk-G34LV2PF.js} +34 -9
  40. package/dist/{chunk-BBUH4VAA.js → chunk-GAEBEQVI.js} +34 -21
  41. package/dist/chunk-GB6QRBXN.js +8543 -0
  42. package/dist/chunk-GEP36Y4X.js +12796 -0
  43. package/dist/{chunk-TKHQ4DGZ.js → chunk-H6F6BYOH.js} +496 -121
  44. package/dist/{chunk-UGYAX5YI.js → chunk-HQQID6OA.js} +10 -5
  45. package/dist/chunk-IHXBNWMM.js +137 -0
  46. package/dist/{chunk-ME6DNWIU.js → chunk-IS3ONKU3.js} +7 -1
  47. package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
  48. package/dist/chunk-K2ITRMHZ.js +642 -0
  49. package/dist/{chunk-KBR4MZZR.js → chunk-K5XEMXTI.js} +7 -1
  50. package/dist/{chunk-AMFR5YA3.js → chunk-KKNLWXI6.js} +24 -10
  51. package/dist/{chunk-JWHCJDCI.js → chunk-KY56HMHH.js} +145 -61
  52. package/dist/{chunk-E3NYWENM.js → chunk-LU4TK2PR.js} +52 -7
  53. package/dist/{chunk-UWIJNAOB.js → chunk-M5T5VO65.js} +109 -42
  54. package/dist/{chunk-JPOWPFCU.js → chunk-MAR7Y6HW.js} +38 -16
  55. package/dist/chunk-N6F52NLF.js +6951 -0
  56. package/dist/{chunk-UHTSULZS.js → chunk-NMOX6HFD.js} +20 -7
  57. package/dist/{chunk-WD6AJM35.js → chunk-OLBBMFRD.js} +30 -13
  58. package/dist/{chunk-VOO7NYPP.js → chunk-PFEFKVGL.js} +22 -6
  59. package/dist/{chunk-6CWDTGUC.js → chunk-PIUMUEMV.js} +7 -1
  60. package/dist/chunk-PV4JUBVJ.js +462 -0
  61. package/dist/{chunk-527KG6XR.js → chunk-Q3RUPKEJ.js} +22 -4
  62. package/dist/{chunk-D5YD55AR.js → chunk-Q5WJOSJ7.js} +11 -1
  63. package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
  64. package/dist/{chunk-4UQA7NCT.js → chunk-R5KLMSBV.js} +7 -2
  65. package/dist/{chunk-PIDUD6M2.js → chunk-RDLVBZEO.js} +11 -6
  66. package/dist/{chunk-O4EJEDHO.js → chunk-RPTR2H26.js} +40 -31
  67. package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
  68. package/dist/{chunk-XNISANGE.js → chunk-TEKV33Q5.js} +122 -57
  69. package/dist/chunk-TXOTCRLG.js +15 -0
  70. package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
  71. package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
  72. package/dist/{chunk-UU3R62TT.js → chunk-XYWBQRDM.js} +13 -4
  73. package/dist/{chunk-7BHLZB3A.js → chunk-ZPY3JZ5E.js} +32 -10
  74. package/dist/cli/index.js +39 -33
  75. package/dist/clio-BZVGEUFJ.js +58 -0
  76. package/dist/{components-JVHMUBEB.js → components-DMAOEKFB.js} +26 -9
  77. package/dist/{config-ZFCDBMDC.js → config-IRUQ7SE4.js} +42 -31
  78. package/dist/configure-S7S6F6CL.js +32 -0
  79. package/dist/{context-CDXTP2MP.js → context-3KWFLHJG.js} +17 -11
  80. package/dist/{context-E3KIFVXI.js → context-5RADCKTR.js} +33 -28
  81. package/dist/{context-clear-3F4PLXOS.js → context-clear-7TSNPAAI.js} +36 -28
  82. package/dist/{context-index-Q7YSYTR3.js → context-index-W4RLWOQH.js} +10 -4
  83. package/dist/{docs-YIETIWZI.js → docs-5AWSPS37.js} +16 -10
  84. package/dist/doctor-UC5NAJYQ.js +77 -0
  85. package/dist/{eval-B3KZZESM.js → eval-U6TJHRLX.js} +77 -24
  86. package/dist/{evidence-V67CHM35.js → evidence-YEGUW4L3.js} +34 -26
  87. package/dist/{evolve-YDZSUQYA.js → evolve-TXARCTPG.js} +39 -26
  88. package/dist/{extensions-SRG7XCAH.js → extensions-OZFJ3A3G.js} +13 -7
  89. package/dist/{fleet-CA2CRTVG.js → fleet-6G3DHNYE.js} +45 -37
  90. package/dist/fleet-preflight-DSNT37JK.js +23 -0
  91. package/dist/{init-2OZDJE2D.js → init-KZ5QTF6M.js} +42 -34
  92. package/dist/{memory-3PIQQAKX.js → memory-73ESV5YC.js} +35 -27
  93. package/dist/{models-DY35XI7Y.js → models-A4PVNWJK.js} +34 -23
  94. package/dist/{paths-5OMXW7Z4.js → paths-C4H6IV77.js} +12 -6
  95. package/dist/preload-6WVMHX3A.js +13 -0
  96. package/dist/{reset-PIFYNOS3.js → reset-BGW6OGMV.js} +17 -11
  97. package/dist/{run-3VSPP24F.js → run-YTPEYQOH.js} +60 -48
  98. package/dist/{share-D36RQCXM.js → share-YIFFV4NQ.js} +16 -10
  99. package/dist/{skills-F2MRLELY.js → skills-2V6RA3OQ.js} +18 -11
  100. package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-S2TVJO4F.js} +45 -36
  101. package/dist/{targets-DZMEZAH4.js → targets-TYXLPB23.js} +61 -59
  102. package/dist/{trace-7NYCUI2J.js → trace-GGOJ6Q6Z.js} +9 -3
  103. package/dist/{uninstall-AD3JWHBB.js → uninstall-LLLT4F4W.js} +14 -8
  104. package/dist/{upgrade-WYYBKGDY.js → upgrade-33G2LMM5.js} +45 -23
  105. package/dist/{usage-ULIDAGFF.js → usage-ZAFSXKKG.js} +35 -27
  106. package/dist/version-KGEG7EPO.js +21 -0
  107. package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-NUQCVOQ3.js} +55 -45
  108. package/dist/worker/entry.js +101 -43
  109. package/docs/README.md +12 -9
  110. package/docs/acp.md +28 -5
  111. package/docs/alcf-provider.md +1 -1
  112. package/docs/architecture.md +23 -2
  113. package/docs/artifact-placement.md +101 -0
  114. package/docs/artifact-versions.md +1 -1
  115. package/docs/built-in-agents.md +4 -2
  116. package/docs/capacity-and-scheduling.md +1 -1
  117. package/docs/commands-and-modes.md +125 -41
  118. package/docs/configuration-and-targets.md +88 -18
  119. package/docs/context-engine.md +6 -2
  120. package/docs/development-pipeline.md +77 -0
  121. package/docs/documentation-coverage.md +4 -4
  122. package/docs/documentation-guide.md +3 -3
  123. package/docs/environment-variables.md +2 -1
  124. package/docs/eval-runner.md +3 -3
  125. package/docs/evals-internal.md +2 -2
  126. package/docs/evidence-and-memory.md +6 -2
  127. package/docs/evolution.md +1 -1
  128. package/docs/exit-codes-and-output.md +1 -1
  129. package/docs/extensions-and-sharing.md +18 -11
  130. package/docs/fleet-demo-runbook.md +22 -23
  131. package/docs/fleet-dispatch.md +111 -12
  132. package/docs/glossary.md +107 -15
  133. package/docs/html/agents_blueprint.html +3 -3
  134. package/docs/html/alcf_blueprint.html +3 -3
  135. package/docs/html/architecture_blueprint.html +3 -3
  136. package/docs/html/commands_blueprint.html +187 -42
  137. package/docs/html/configuration_blueprint.html +7 -7
  138. package/docs/html/context_blueprint.html +3 -3
  139. package/docs/html/documentation_blueprint.html +1 -1
  140. package/docs/html/environment_blueprint.html +3 -3
  141. package/docs/html/eval_blueprint.html +4 -4
  142. package/docs/html/evals_internal_blueprint.html +3 -3
  143. package/docs/html/evolution_blueprint.html +3 -3
  144. package/docs/html/extensions_blueprint.html +3 -3
  145. package/docs/html/fleet_dispatch_blueprint.html +8 -8
  146. package/docs/html/index.html +5 -5
  147. package/docs/html/lifecycle_blueprint.html +4 -4
  148. package/docs/html/memory_blueprint.html +3 -3
  149. package/docs/html/middleware_blueprint.html +3 -3
  150. package/docs/html/models_blueprint.html +2 -2
  151. package/docs/html/observability_blueprint.html +2 -2
  152. package/docs/html/provider_adapter_blueprint.html +3 -3
  153. package/docs/html/safety_blueprint.html +3 -3
  154. package/docs/html/skills_blueprint.html +2 -2
  155. package/docs/html/soak_blueprint.html +3 -3
  156. package/docs/html/tool_usage_blueprint.html +4 -4
  157. package/docs/html/tools_blueprint.html +2 -2
  158. package/docs/html/trace_blueprint.html +3 -3
  159. package/docs/html/tui_design_blueprint.html +100 -40
  160. package/docs/html/validation_blueprint.html +1 -1
  161. package/docs/html/worker_dispatch_blueprint.html +3 -3
  162. package/docs/installation-and-lifecycle.md +62 -11
  163. package/docs/middleware-and-components.md +1 -1
  164. package/docs/model-catalog.md +2 -2
  165. package/docs/observability.md +3 -3
  166. package/docs/proactive-memory.md +12 -12
  167. package/docs/prompt-envelope-and-tools.md +2 -2
  168. package/docs/provider-adapter-cookbook.md +1 -1
  169. package/docs/release-cut-checklist.md +4 -0
  170. package/docs/safety-model.md +21 -5
  171. package/docs/scientific-validation.md +3 -3
  172. package/docs/session-lifecycle.md +2 -2
  173. package/docs/skills-marketplace.md +1 -1
  174. package/docs/time-conventions.md +101 -0
  175. package/docs/tool-usage.md +5 -4
  176. package/docs/trace-store.md +1 -1
  177. package/docs/troubleshooting.md +1 -1
  178. package/docs/tui-design.md +83 -27
  179. package/docs/worker-dispatch-mechanics.md +3 -3
  180. package/package.json +16 -16
  181. package/skills/README.md +5 -6
  182. package/skills/git/file-ticket/SKILL.md +107 -0
  183. package/skills/git/file-ticket/evals.md +54 -0
  184. package/skills/git/fix-issue/SKILL.md +106 -0
  185. package/skills/git/fix-issue/evals.md +71 -0
  186. package/skills/git/ship/SKILL.md +92 -0
  187. package/skills/git/ship/evals.md +72 -0
  188. package/skills/skill-marketplace.json +12 -20
  189. package/src/cli/acp.ts +88 -0
  190. package/src/cli/agents.ts +60 -0
  191. package/src/cli/args.ts +280 -0
  192. package/src/cli/argv.ts +170 -0
  193. package/src/cli/ask.ts +34 -0
  194. package/src/cli/auth.ts +468 -0
  195. package/src/cli/bootstrap-generate.ts +498 -0
  196. package/src/cli/clio.ts +34 -0
  197. package/src/cli/components.ts +195 -0
  198. package/src/cli/config-inspect.ts +330 -0
  199. package/src/cli/config.ts +72 -0
  200. package/src/cli/configure-interop.ts +67 -0
  201. package/src/cli/configure-layout.ts +172 -0
  202. package/src/cli/configure.ts +1487 -0
  203. package/src/cli/context-clear.ts +76 -0
  204. package/src/cli/context-index.ts +102 -0
  205. package/src/cli/context.ts +316 -0
  206. package/src/cli/default-target.ts +63 -0
  207. package/src/cli/docs.ts +340 -0
  208. package/src/cli/doctor.ts +54 -0
  209. package/src/cli/eval.ts +315 -0
  210. package/src/cli/evidence.ts +222 -0
  211. package/src/cli/evolve.ts +219 -0
  212. package/src/cli/extensions.ts +205 -0
  213. package/src/cli/fleet.ts +827 -0
  214. package/src/cli/index.ts +309 -0
  215. package/src/cli/init.ts +219 -0
  216. package/src/cli/initial-message.ts +47 -0
  217. package/src/cli/internal-dispatch.ts +55 -0
  218. package/src/cli/memory.ts +180 -0
  219. package/src/cli/models.ts +257 -0
  220. package/src/cli/modes/json-stream.ts +85 -0
  221. package/src/cli/modes/jsonl.ts +9 -0
  222. package/src/cli/modes/print.ts +589 -0
  223. package/src/cli/oauth-manual-input.ts +72 -0
  224. package/src/cli/oauth-select.ts +36 -0
  225. package/src/cli/output-guard.ts +48 -0
  226. package/src/cli/paths.ts +44 -0
  227. package/src/cli/provider-target.ts +113 -0
  228. package/src/cli/removal.ts +72 -0
  229. package/src/cli/reset.ts +253 -0
  230. package/src/cli/run.ts +497 -0
  231. package/src/cli/share.ts +243 -0
  232. package/src/cli/shared.ts +60 -0
  233. package/src/cli/skills-eval.ts +1225 -0
  234. package/src/cli/skills.ts +470 -0
  235. package/src/cli/steer-channel.ts +86 -0
  236. package/src/cli/targets.ts +1150 -0
  237. package/src/cli/text-layout.ts +102 -0
  238. package/src/cli/trace.ts +274 -0
  239. package/src/cli/uninstall.ts +405 -0
  240. package/src/cli/upgrade.ts +270 -0
  241. package/src/cli/usage.ts +869 -0
  242. package/src/cli/validate-model.ts +28 -0
  243. package/src/cli/version.ts +7 -0
  244. package/src/cli/wiki-generate.ts +509 -0
  245. package/src/core/artifact-paths.ts +43 -0
  246. package/src/core/bash-exec.ts +242 -0
  247. package/src/core/boot-trace.ts +37 -0
  248. package/src/core/bus-events.ts +728 -0
  249. package/src/core/bus-trace.ts +53 -0
  250. package/src/core/c-header-language.ts +265 -0
  251. package/src/core/clio-repo.ts +78 -0
  252. package/src/core/config.ts +1593 -0
  253. package/src/core/context-floor.ts +33 -0
  254. package/src/core/defaults.ts +625 -0
  255. package/src/core/domain-loader.ts +170 -0
  256. package/src/core/event-bus.ts +94 -0
  257. package/src/core/file-references.ts +282 -0
  258. package/src/core/guardrails.ts +185 -0
  259. package/src/core/headless-permission.ts +21 -0
  260. package/src/core/init.ts +223 -0
  261. package/src/core/json-payload.ts +58 -0
  262. package/src/core/package-root.ts +54 -0
  263. package/src/core/path-canonical.ts +37 -0
  264. package/src/core/process-identity.ts +41 -0
  265. package/src/core/recent-models.ts +91 -0
  266. package/src/core/release.ts +2 -0
  267. package/src/core/residency-protection.ts +56 -0
  268. package/src/core/resolve-config-value.ts +88 -0
  269. package/src/core/response-schema.ts +279 -0
  270. package/src/core/run-overrides.ts +77 -0
  271. package/src/core/safe-exec.ts +193 -0
  272. package/src/core/safe-id.ts +37 -0
  273. package/src/core/safe-resource-write.ts +162 -0
  274. package/src/core/session-routing.ts +339 -0
  275. package/src/core/settings-layers.ts +220 -0
  276. package/src/core/shared-bus.ts +8 -0
  277. package/src/core/shell-quote.ts +26 -0
  278. package/src/core/skill-activation.ts +190 -0
  279. package/src/core/startup-timer.ts +37 -0
  280. package/src/core/state-file-lock.ts +207 -0
  281. package/src/core/termination.ts +202 -0
  282. package/src/core/timers.ts +38 -0
  283. package/src/core/tool-names.ts +65 -0
  284. package/src/core/verification-scripts.ts +13 -0
  285. package/src/core/workspace-files.ts +492 -0
  286. package/src/core/xdg.ts +177 -0
  287. package/src/domains/agents/builtins/architect.md +4 -4
  288. package/src/domains/agents/builtins/coder.md +3 -2
  289. package/src/domains/agents/builtins/debugger.md +1 -1
  290. package/src/domains/agents/builtins/documenter.md +1 -1
  291. package/src/domains/agents/builtins/git-master.md +3 -3
  292. package/src/domains/agents/builtins/provenance.md +1 -1
  293. package/src/domains/agents/builtins/researcher.md +1 -1
  294. package/src/domains/agents/builtins/scout.md +1 -1
  295. package/src/domains/agents/builtins/tester.md +1 -1
  296. package/src/domains/agents/builtins/verifier.md +1 -1
  297. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  298. package/src/domains/agents/catalog.ts +172 -0
  299. package/src/domains/agents/contract.ts +16 -0
  300. package/src/domains/agents/extension.ts +110 -0
  301. package/src/domains/agents/fleet-commands.ts +154 -0
  302. package/src/domains/agents/fleet-contract.ts +797 -0
  303. package/src/domains/agents/frontmatter.ts +40 -0
  304. package/src/domains/agents/index.ts +102 -0
  305. package/src/domains/agents/manifest.ts +6 -0
  306. package/src/domains/agents/recipe-schema.ts +202 -0
  307. package/src/domains/agents/recipe.ts +125 -0
  308. package/src/domains/agents/registry.ts +111 -0
  309. package/src/domains/agents/result-contract.ts +1265 -0
  310. package/src/domains/agents/spec.ts +371 -0
  311. package/src/domains/agents/write-boundary.ts +109 -0
  312. package/src/domains/components/diff.ts +99 -0
  313. package/src/domains/components/hash.ts +21 -0
  314. package/src/domains/components/index.ts +3 -0
  315. package/src/domains/components/scan.ts +304 -0
  316. package/src/domains/components/snapshot.ts +108 -0
  317. package/src/domains/components/types.ts +82 -0
  318. package/src/domains/config/agent-namespace.ts +13 -0
  319. package/src/domains/config/classify.ts +94 -0
  320. package/src/domains/config/contract.ts +22 -0
  321. package/src/domains/config/extension.ts +136 -0
  322. package/src/domains/config/index.ts +13 -0
  323. package/src/domains/config/keybindings.ts +164 -0
  324. package/src/domains/config/manifest.ts +6 -0
  325. package/src/domains/config/watcher.ts +41 -0
  326. package/src/domains/context/adoption.ts +880 -0
  327. package/src/domains/context/bootstrap-prompt.ts +273 -0
  328. package/src/domains/context/bootstrap.ts +1409 -0
  329. package/src/domains/context/clear.ts +86 -0
  330. package/src/domains/context/clio-md.ts +327 -0
  331. package/src/domains/context/codewiki/cmake.ts +356 -0
  332. package/src/domains/context/codewiki/cooperative.ts +46 -0
  333. package/src/domains/context/codewiki/digest.ts +135 -0
  334. package/src/domains/context/codewiki/grammar-assets.ts +33 -0
  335. package/src/domains/context/codewiki/indexer.ts +1614 -0
  336. package/src/domains/context/codewiki/tree-sitter.ts +771 -0
  337. package/src/domains/context/contract.ts +62 -0
  338. package/src/domains/context/excluded-dirs.ts +1 -0
  339. package/src/domains/context/extension.ts +407 -0
  340. package/src/domains/context/fingerprint.ts +196 -0
  341. package/src/domains/context/index.ts +164 -0
  342. package/src/domains/context/init-options.ts +69 -0
  343. package/src/domains/context/manifest.ts +6 -0
  344. package/src/domains/context/operator-profile.ts +157 -0
  345. package/src/domains/context/project-metadata.ts +510 -0
  346. package/src/domains/context/project-rules.ts +227 -0
  347. package/src/domains/context/prompt-context.ts +62 -0
  348. package/src/domains/context/refresh.ts +170 -0
  349. package/src/domains/context/sibling-files.ts +10 -0
  350. package/src/domains/context/state.ts +237 -0
  351. package/src/domains/context/wiki/assemble.ts +303 -0
  352. package/src/domains/context/wiki/frontmatter.ts +210 -0
  353. package/src/domains/context/wiki/generate.ts +590 -0
  354. package/src/domains/context/wiki/layout.ts +111 -0
  355. package/src/domains/context/wiki/meta.ts +221 -0
  356. package/src/domains/context/wiki/plan-store.ts +217 -0
  357. package/src/domains/context/wiki/plan.ts +250 -0
  358. package/src/domains/context/wiki/prompts.ts +270 -0
  359. package/src/domains/context/wiki/staleness.ts +198 -0
  360. package/src/domains/dispatch/active-route-planner.ts +168 -0
  361. package/src/domains/dispatch/admission-queue.ts +150 -0
  362. package/src/domains/dispatch/admission.ts +334 -0
  363. package/src/domains/dispatch/agent-candidates.ts +307 -0
  364. package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
  365. package/src/domains/dispatch/agent-ledger-store.ts +257 -0
  366. package/src/domains/dispatch/agent-ledger.ts +212 -0
  367. package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
  368. package/src/domains/dispatch/assignment-events.ts +132 -0
  369. package/src/domains/dispatch/assignment-reconcile.ts +76 -0
  370. package/src/domains/dispatch/assignment-store.ts +162 -0
  371. package/src/domains/dispatch/assignment.ts +278 -0
  372. package/src/domains/dispatch/backoff.ts +59 -0
  373. package/src/domains/dispatch/batch-store.ts +134 -0
  374. package/src/domains/dispatch/batch-tracker.ts +66 -0
  375. package/src/domains/dispatch/capability-match.ts +155 -0
  376. package/src/domains/dispatch/capacity-lease.ts +413 -0
  377. package/src/domains/dispatch/code-step-store.ts +52 -0
  378. package/src/domains/dispatch/code-step.ts +368 -0
  379. package/src/domains/dispatch/contract.ts +278 -0
  380. package/src/domains/dispatch/dedup.ts +133 -0
  381. package/src/domains/dispatch/event-pump.ts +251 -0
  382. package/src/domains/dispatch/execution-handoff.ts +29 -0
  383. package/src/domains/dispatch/execution-plan.ts +328 -0
  384. package/src/domains/dispatch/execution-role.ts +277 -0
  385. package/src/domains/dispatch/execution-scheduler.ts +583 -0
  386. package/src/domains/dispatch/extension.ts +5869 -0
  387. package/src/domains/dispatch/failure-classification.ts +141 -0
  388. package/src/domains/dispatch/fleet-plan.ts +225 -0
  389. package/src/domains/dispatch/fleet-preflight.ts +394 -0
  390. package/src/domains/dispatch/gate-decisions.ts +1040 -0
  391. package/src/domains/dispatch/gate-role-prompts.ts +58 -0
  392. package/src/domains/dispatch/heartbeat.ts +27 -0
  393. package/src/domains/dispatch/index.ts +137 -0
  394. package/src/domains/dispatch/joint-route-adapter.ts +114 -0
  395. package/src/domains/dispatch/joint-route-resolver.ts +283 -0
  396. package/src/domains/dispatch/manifest.ts +6 -0
  397. package/src/domains/dispatch/orphan-recovery.ts +224 -0
  398. package/src/domains/dispatch/outcome.ts +109 -0
  399. package/src/domains/dispatch/phase-timing.ts +47 -0
  400. package/src/domains/dispatch/placement.ts +202 -0
  401. package/src/domains/dispatch/receipt-findings.ts +255 -0
  402. package/src/domains/dispatch/receipt-integrity.ts +378 -0
  403. package/src/domains/dispatch/recovery-candidates.ts +74 -0
  404. package/src/domains/dispatch/reproducibility.ts +48 -0
  405. package/src/domains/dispatch/reservation-store.ts +501 -0
  406. package/src/domains/dispatch/route-approval.ts +177 -0
  407. package/src/domains/dispatch/route-candidates.ts +57 -0
  408. package/src/domains/dispatch/route-decision.ts +1079 -0
  409. package/src/domains/dispatch/route-facts.ts +187 -0
  410. package/src/domains/dispatch/route-history.ts +238 -0
  411. package/src/domains/dispatch/route-observer.ts +488 -0
  412. package/src/domains/dispatch/route-policy.ts +327 -0
  413. package/src/domains/dispatch/route-quality.ts +256 -0
  414. package/src/domains/dispatch/route-readiness.ts +120 -0
  415. package/src/domains/dispatch/routing-intent.ts +287 -0
  416. package/src/domains/dispatch/run-identity.ts +56 -0
  417. package/src/domains/dispatch/scout-transition.ts +130 -0
  418. package/src/domains/dispatch/state.ts +277 -0
  419. package/src/domains/dispatch/tool-stats.ts +132 -0
  420. package/src/domains/dispatch/transport.ts +209 -0
  421. package/src/domains/dispatch/types.ts +785 -0
  422. package/src/domains/dispatch/validation-grounding.ts +154 -0
  423. package/src/domains/dispatch/validation.ts +721 -0
  424. package/src/domains/dispatch/worker-protocol.ts +275 -0
  425. package/src/domains/dispatch/worker-spawn.ts +566 -0
  426. package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
  427. package/src/domains/dispatch/write-boundary.ts +426 -0
  428. package/src/domains/eval/artifacts/redact.ts +42 -0
  429. package/src/domains/eval/artifacts/store.ts +173 -0
  430. package/src/domains/eval/compare/compare.ts +33 -0
  431. package/src/domains/eval/compare/gates.ts +66 -0
  432. package/src/domains/eval/compare/thresholds.ts +92 -0
  433. package/src/domains/eval/harness-metrics.ts +62 -0
  434. package/src/domains/eval/index.ts +66 -0
  435. package/src/domains/eval/metrics/chaos-stream.ts +93 -0
  436. package/src/domains/eval/metrics/context.ts +34 -0
  437. package/src/domains/eval/metrics/coverage.ts +21 -0
  438. package/src/domains/eval/metrics/evidence.ts +182 -0
  439. package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
  440. package/src/domains/eval/metrics/invariants.ts +736 -0
  441. package/src/domains/eval/metrics/latency.ts +4 -0
  442. package/src/domains/eval/metrics/token-stream.ts +139 -0
  443. package/src/domains/eval/metrics/tokens.ts +51 -0
  444. package/src/domains/eval/metrics/tool-calls.ts +7 -0
  445. package/src/domains/eval/proactive-memory.ts +279 -0
  446. package/src/domains/eval/provenance.ts +35 -0
  447. package/src/domains/eval/report.ts +234 -0
  448. package/src/domains/eval/reports/json.ts +5 -0
  449. package/src/domains/eval/reports/junit.ts +23 -0
  450. package/src/domains/eval/reports/markdown.ts +20 -0
  451. package/src/domains/eval/reports/swe-jsonl.ts +16 -0
  452. package/src/domains/eval/reports/text.ts +25 -0
  453. package/src/domains/eval/run-compare.ts +274 -0
  454. package/src/domains/eval/runner.ts +244 -0
  455. package/src/domains/eval/runners/clio-run.ts +148 -0
  456. package/src/domains/eval/runners/context-index.ts +56 -0
  457. package/src/domains/eval/runners/context-init.ts +203 -0
  458. package/src/domains/eval/runners/external-command.ts +350 -0
  459. package/src/domains/eval/runtime-paths.ts +171 -0
  460. package/src/domains/eval/schema/artifact.ts +75 -0
  461. package/src/domains/eval/schema/suite.ts +235 -0
  462. package/src/domains/eval/schema/validate.ts +339 -0
  463. package/src/domains/eval/store.ts +392 -0
  464. package/src/domains/eval/suites/load.ts +74 -0
  465. package/src/domains/eval/suites/matrix.ts +19 -0
  466. package/src/domains/eval/suites/resolve.ts +44 -0
  467. package/src/domains/eval/suites/run.ts +325 -0
  468. package/src/domains/eval/task-file.ts +186 -0
  469. package/src/domains/eval/types.ts +141 -0
  470. package/src/domains/eval/verifiers/command.ts +27 -0
  471. package/src/domains/eval/verifiers/file-exists.ts +6 -0
  472. package/src/domains/eval/verifiers/patch.ts +22 -0
  473. package/src/domains/eval/workspaces/git.ts +41 -0
  474. package/src/domains/eval/workspaces/local.ts +17 -0
  475. package/src/domains/eval/workspaces/temp-copy.ts +29 -0
  476. package/src/domains/evidence/build.ts +1714 -0
  477. package/src/domains/evidence/eval.ts +605 -0
  478. package/src/domains/evidence/failure-attribution.ts +54 -0
  479. package/src/domains/evidence/finish-contract-map.ts +42 -0
  480. package/src/domains/evidence/index.ts +55 -0
  481. package/src/domains/evidence/provenance.ts +200 -0
  482. package/src/domains/evidence/redact.ts +81 -0
  483. package/src/domains/evidence/store.ts +291 -0
  484. package/src/domains/evidence/types.ts +325 -0
  485. package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
  486. package/src/domains/evolution/index.ts +26 -0
  487. package/src/domains/evolution/manifest.ts +154 -0
  488. package/src/domains/evolution/validate.ts +304 -0
  489. package/src/domains/extensions/contract.ts +22 -0
  490. package/src/domains/extensions/discovery.ts +193 -0
  491. package/src/domains/extensions/extension.ts +46 -0
  492. package/src/domains/extensions/index.ts +34 -0
  493. package/src/domains/extensions/manager.ts +30 -0
  494. package/src/domains/extensions/manifest.ts +6 -0
  495. package/src/domains/extensions/resources.ts +38 -0
  496. package/src/domains/extensions/state.ts +224 -0
  497. package/src/domains/extensions/types.ts +83 -0
  498. package/src/domains/interop/consent.ts +185 -0
  499. package/src/domains/interop/contract.ts +29 -0
  500. package/src/domains/interop/detect.ts +173 -0
  501. package/src/domains/interop/extension.ts +59 -0
  502. package/src/domains/interop/index.ts +34 -0
  503. package/src/domains/interop/manifest.ts +6 -0
  504. package/src/domains/interop/registry.ts +139 -0
  505. package/src/domains/interop/state.ts +92 -0
  506. package/src/domains/interop/types.ts +109 -0
  507. package/src/domains/lifecycle/contract.ts +11 -0
  508. package/src/domains/lifecycle/doctor.ts +536 -0
  509. package/src/domains/lifecycle/extension.ts +23 -0
  510. package/src/domains/lifecycle/index.ts +21 -0
  511. package/src/domains/lifecycle/install-method.ts +51 -0
  512. package/src/domains/lifecycle/manifest.ts +6 -0
  513. package/src/domains/lifecycle/migrations/index.ts +94 -0
  514. package/src/domains/lifecycle/state.ts +93 -0
  515. package/src/domains/lifecycle/upgrade-notice.ts +35 -0
  516. package/src/domains/lifecycle/version.ts +35 -0
  517. package/src/domains/memory/index.ts +128 -0
  518. package/src/domains/memory/operations.ts +143 -0
  519. package/src/domains/memory/prompt-section.ts +86 -0
  520. package/src/domains/memory/proposal.ts +180 -0
  521. package/src/domains/memory/store.ts +163 -0
  522. package/src/domains/memory/task-bank.ts +229 -0
  523. package/src/domains/memory/task-memory-handoff.ts +222 -0
  524. package/src/domains/memory/task-memory-policy.ts +602 -0
  525. package/src/domains/memory/task-memory-status.ts +58 -0
  526. package/src/domains/memory/task-memory-telemetry.ts +346 -0
  527. package/src/domains/memory/task-memory-trace.ts +89 -0
  528. package/src/domains/memory/types.ts +74 -0
  529. package/src/domains/memory/validate.ts +297 -0
  530. package/src/domains/middleware/budget.ts +216 -0
  531. package/src/domains/middleware/contract.ts +35 -0
  532. package/src/domains/middleware/dispatch-nudge.ts +469 -0
  533. package/src/domains/middleware/extension.ts +129 -0
  534. package/src/domains/middleware/hook-receipts.ts +70 -0
  535. package/src/domains/middleware/hooks-io.ts +174 -0
  536. package/src/domains/middleware/hooks.ts +432 -0
  537. package/src/domains/middleware/index.ts +154 -0
  538. package/src/domains/middleware/manifest.ts +6 -0
  539. package/src/domains/middleware/memory-intervention.ts +701 -0
  540. package/src/domains/middleware/rules.ts +42 -0
  541. package/src/domains/middleware/runtime.ts +333 -0
  542. package/src/domains/middleware/skills-reminder.ts +187 -0
  543. package/src/domains/middleware/snapshot.ts +71 -0
  544. package/src/domains/middleware/stalled-turn.ts +71 -0
  545. package/src/domains/middleware/task-board-reminder.ts +87 -0
  546. package/src/domains/middleware/task-nudge.ts +77 -0
  547. package/src/domains/middleware/tool-choice-control.ts +42 -0
  548. package/src/domains/middleware/types.ts +131 -0
  549. package/src/domains/middleware/validate.ts +329 -0
  550. package/src/domains/observability/accountability.ts +67 -0
  551. package/src/domains/observability/contract.ts +168 -0
  552. package/src/domains/observability/cost.ts +206 -0
  553. package/src/domains/observability/evidence-index.ts +123 -0
  554. package/src/domains/observability/extension.ts +281 -0
  555. package/src/domains/observability/index.ts +78 -0
  556. package/src/domains/observability/manifest.ts +10 -0
  557. package/src/domains/observability/metrics.ts +37 -0
  558. package/src/domains/observability/projection.ts +477 -0
  559. package/src/domains/observability/telemetry.ts +89 -0
  560. package/src/domains/observability/trace-store.ts +1454 -0
  561. package/src/domains/prompts/compiler.ts +556 -0
  562. package/src/domains/prompts/contract.ts +30 -0
  563. package/src/domains/prompts/extension.ts +304 -0
  564. package/src/domains/prompts/fragment-loader.ts +139 -0
  565. package/src/domains/prompts/fragments/identity/clio.md +3 -2
  566. package/src/domains/prompts/fragments/identity/self-awareness.md +63 -0
  567. package/src/domains/prompts/fragments/operating/contract.md +10 -1
  568. package/src/domains/prompts/hash.ts +73 -0
  569. package/src/domains/prompts/index.ts +32 -0
  570. package/src/domains/prompts/manifest.ts +8 -0
  571. package/src/domains/prompts/memory-intervention.ts +57 -0
  572. package/src/domains/prompts/preload.ts +82 -0
  573. package/src/domains/providers/auth/api-key.ts +47 -0
  574. package/src/domains/providers/auth/backend-file.ts +69 -0
  575. package/src/domains/providers/auth/backend-memory.ts +17 -0
  576. package/src/domains/providers/auth/index.ts +37 -0
  577. package/src/domains/providers/auth/oauth.ts +36 -0
  578. package/src/domains/providers/auth/storage.ts +667 -0
  579. package/src/domains/providers/capabilities.ts +50 -0
  580. package/src/domains/providers/catalog.ts +162 -0
  581. package/src/domains/providers/contract.ts +151 -0
  582. package/src/domains/providers/credentials.ts +20 -0
  583. package/src/domains/providers/eligibility.ts +24 -0
  584. package/src/domains/providers/errors.ts +64 -0
  585. package/src/domains/providers/extension.ts +536 -0
  586. package/src/domains/providers/index.ts +142 -0
  587. package/src/domains/providers/knowledge-base-path.ts +102 -0
  588. package/src/domains/providers/manifest.ts +6 -0
  589. package/src/domains/providers/model-capabilities.ts +136 -0
  590. package/src/domains/providers/model-discovery.ts +144 -0
  591. package/src/domains/providers/model-family.ts +32 -0
  592. package/src/domains/providers/model-runtime-capabilities.ts +712 -0
  593. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +2 -2
  594. package/src/domains/providers/plugins.ts +59 -0
  595. package/src/domains/providers/probe/fingerprint.ts +44 -0
  596. package/src/domains/providers/probe/http.ts +114 -0
  597. package/src/domains/providers/probe/reasoning.ts +111 -0
  598. package/src/domains/providers/registry.ts +166 -0
  599. package/src/domains/providers/resolver.ts +156 -0
  600. package/src/domains/providers/runtime-resolution.ts +720 -0
  601. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
  602. package/src/domains/providers/runtimes/builtins.ts +78 -0
  603. package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
  604. package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
  605. package/src/domains/providers/runtimes/claude/common.ts +55 -0
  606. package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
  607. package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
  608. package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
  609. package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
  610. package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
  611. package/src/domains/providers/runtimes/cloud/google.ts +41 -0
  612. package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
  613. package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
  614. package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
  615. package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
  616. package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
  617. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +32 -0
  618. package/src/domains/providers/runtimes/common/local-synth.ts +165 -0
  619. package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
  620. package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
  621. package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
  622. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
  623. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
  624. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
  625. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
  626. package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
  627. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +491 -0
  628. package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
  629. package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
  630. package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
  631. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
  632. package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
  633. package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
  634. package/src/domains/providers/runtimes/protocol/google.ts +27 -0
  635. package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
  636. package/src/domains/providers/support.ts +238 -0
  637. package/src/domains/providers/thinking-control-policy.ts +85 -0
  638. package/src/domains/providers/types/capability-flags.ts +114 -0
  639. package/src/domains/providers/types/cost-provenance.ts +7 -0
  640. package/src/domains/providers/types/inference.ts +41 -0
  641. package/src/domains/providers/types/knowledge-base.ts +156 -0
  642. package/src/domains/providers/types/local-model-quirks.ts +218 -0
  643. package/src/domains/providers/types/runtime-descriptor.ts +170 -0
  644. package/src/domains/providers/types/target-descriptor.ts +38 -0
  645. package/src/domains/resources/collision.ts +92 -0
  646. package/src/domains/resources/common-loader.ts +140 -0
  647. package/src/domains/resources/contract.ts +25 -0
  648. package/src/domains/resources/extension.ts +61 -0
  649. package/src/domains/resources/index.ts +74 -0
  650. package/src/domains/resources/loader.ts +86 -0
  651. package/src/domains/resources/manifest.ts +6 -0
  652. package/src/domains/resources/prompts/loader.ts +232 -0
  653. package/src/domains/resources/prompts/substitute.ts +65 -0
  654. package/src/domains/resources/skills/content-hash.ts +105 -0
  655. package/src/domains/resources/skills/evals.ts +175 -0
  656. package/src/domains/resources/skills/install.ts +410 -0
  657. package/src/domains/resources/skills/loader.ts +978 -0
  658. package/src/domains/resources/skills/marketplace.ts +255 -0
  659. package/src/domains/resources/skills/provenance-pin.ts +115 -0
  660. package/src/domains/safety/action-classifier.ts +268 -0
  661. package/src/domains/safety/approval-axis.ts +23 -0
  662. package/src/domains/safety/audit.ts +487 -0
  663. package/src/domains/safety/autonomy.ts +174 -0
  664. package/src/domains/safety/call-target.ts +59 -0
  665. package/src/domains/safety/contract.ts +65 -0
  666. package/src/domains/safety/damage-control.ts +44 -0
  667. package/src/domains/safety/default-path-policy.ts +117 -0
  668. package/src/domains/safety/extension.ts +383 -0
  669. package/src/domains/safety/finish-contract-registration.ts +128 -0
  670. package/src/domains/safety/finish-contract.ts +554 -0
  671. package/src/domains/safety/index.ts +44 -0
  672. package/src/domains/safety/loop-detector.ts +143 -0
  673. package/src/domains/safety/manifest.ts +6 -0
  674. package/src/domains/safety/path-policy.ts +164 -0
  675. package/src/domains/safety/policy-engine.ts +994 -0
  676. package/src/domains/safety/project-policy.ts +391 -0
  677. package/src/domains/safety/protected-artifacts-registration.ts +189 -0
  678. package/src/domains/safety/protected-artifacts.ts +993 -0
  679. package/src/domains/safety/rejection-feedback.ts +102 -0
  680. package/src/domains/safety/rigor.ts +72 -0
  681. package/src/domains/safety/rule-compiler.ts +48 -0
  682. package/src/domains/safety/rule-pack-loader.ts +92 -0
  683. package/src/domains/safety/run-effects.ts +197 -0
  684. package/src/domains/safety/scope.ts +61 -0
  685. package/src/domains/scheduling/budget.ts +35 -0
  686. package/src/domains/scheduling/cluster.ts +175 -0
  687. package/src/domains/scheduling/contract.ts +30 -0
  688. package/src/domains/scheduling/extension.ts +91 -0
  689. package/src/domains/scheduling/index.ts +12 -0
  690. package/src/domains/scheduling/manifest.ts +6 -0
  691. package/src/domains/session/archive-readers.ts +208 -0
  692. package/src/domains/session/checkpoint.ts +38 -0
  693. package/src/domains/session/compaction/auto.ts +89 -0
  694. package/src/domains/session/compaction/branch-summary.ts +186 -0
  695. package/src/domains/session/compaction/compact.ts +493 -0
  696. package/src/domains/session/compaction/cut-point.ts +171 -0
  697. package/src/domains/session/compaction/defaults.ts +34 -0
  698. package/src/domains/session/compaction/mask-observations.ts +265 -0
  699. package/src/domains/session/compaction/session-entries.ts +18 -0
  700. package/src/domains/session/compaction/tokens.ts +147 -0
  701. package/src/domains/session/context-accounting.ts +583 -0
  702. package/src/domains/session/context-ledger.ts +348 -0
  703. package/src/domains/session/contract.ts +144 -0
  704. package/src/domains/session/cwd-fallback.ts +65 -0
  705. package/src/domains/session/entries.ts +509 -0
  706. package/src/domains/session/extension.ts +322 -0
  707. package/src/domains/session/history.ts +172 -0
  708. package/src/domains/session/index.ts +84 -0
  709. package/src/domains/session/manager.ts +128 -0
  710. package/src/domains/session/manifest.ts +6 -0
  711. package/src/domains/session/migrations/index.ts +27 -0
  712. package/src/domains/session/prompt-manifest.ts +173 -0
  713. package/src/domains/session/protected-artifact-journal.ts +241 -0
  714. package/src/domains/session/protected-artifacts.ts +90 -0
  715. package/src/domains/session/retry.ts +238 -0
  716. package/src/domains/session/task-board.ts +375 -0
  717. package/src/domains/session/tree/active-path.ts +98 -0
  718. package/src/domains/session/tree/fork.ts +160 -0
  719. package/src/domains/session/tree/manager.ts +128 -0
  720. package/src/domains/session/tree/navigator.ts +177 -0
  721. package/src/domains/session/tree/preview.ts +259 -0
  722. package/src/domains/session/usage.ts +148 -0
  723. package/src/domains/session/workspace/git-probe.ts +161 -0
  724. package/src/domains/session/workspace/index.ts +4 -0
  725. package/src/domains/session/workspace/project-type.ts +217 -0
  726. package/src/domains/session/workspace/snapshot.ts +74 -0
  727. package/src/domains/share/archive.ts +684 -0
  728. package/src/domains/share/contract.ts +9 -0
  729. package/src/domains/share/extension.ts +26 -0
  730. package/src/domains/share/index.ts +28 -0
  731. package/src/domains/share/manifest.ts +6 -0
  732. package/src/engine/acp/adapter.ts +397 -0
  733. package/src/engine/acp/errors.ts +32 -0
  734. package/src/engine/acp/event-mapper.ts +154 -0
  735. package/src/engine/acp/server.ts +656 -0
  736. package/src/engine/acp/tool-mediator.ts +686 -0
  737. package/src/engine/acp/transport.ts +654 -0
  738. package/src/engine/acp/types.ts +170 -0
  739. package/src/engine/agent.ts +29 -0
  740. package/src/engine/ai.ts +202 -0
  741. package/src/engine/alcf-oauth.ts +198 -0
  742. package/src/engine/antigravity/subprocess-runtime.ts +205 -0
  743. package/src/engine/apis/degraded-inference.ts +95 -0
  744. package/src/engine/apis/index.ts +20 -0
  745. package/src/engine/apis/llamacpp-residency.ts +252 -0
  746. package/src/engine/apis/lmstudio-native.ts +1438 -0
  747. package/src/engine/apis/lmstudio-residency.ts +92 -0
  748. package/src/engine/apis/ollama-native.ts +507 -0
  749. package/src/engine/apis/openai-completions.ts +716 -0
  750. package/src/engine/apis/output-budget.ts +99 -0
  751. package/src/engine/apis/residency-lock.ts +29 -0
  752. package/src/engine/apis/residency.ts +640 -0
  753. package/src/engine/apis/resident-models.ts +42 -0
  754. package/src/engine/apis/sampling-overrides.ts +38 -0
  755. package/src/engine/apis/thinking-replay.ts +11 -0
  756. package/src/engine/claude/sdk-runtime.ts +685 -0
  757. package/src/engine/claude/session-id.ts +5 -0
  758. package/src/engine/claude/subprocess-runtime.ts +316 -0
  759. package/src/engine/claude/tool-safety.ts +400 -0
  760. package/src/engine/external-subprocess.ts +23 -0
  761. package/src/engine/harmony-response.ts +165 -0
  762. package/src/engine/loop-guard.ts +1127 -0
  763. package/src/engine/oauth.ts +192 -0
  764. package/src/engine/pi-mono-names.ts +13 -0
  765. package/src/engine/provider-payload.ts +315 -0
  766. package/src/engine/select-list.ts +53 -0
  767. package/src/engine/session.ts +834 -0
  768. package/src/engine/strip-tokenizer-sentinels.ts +125 -0
  769. package/src/engine/tui.ts +103 -0
  770. package/src/engine/types.ts +66 -0
  771. package/src/engine/worker-events.ts +100 -0
  772. package/src/engine/worker-runtime.ts +1022 -0
  773. package/src/engine/worker-tools.ts +203 -0
  774. package/src/entry/orchestrator.ts +1873 -0
  775. package/src/interactive/application-controller.ts +346 -0
  776. package/src/interactive/bus-notices.ts +265 -0
  777. package/src/interactive/chat-loop-messages.ts +626 -0
  778. package/src/interactive/chat-loop-policy.ts +18 -0
  779. package/src/interactive/chat-loop.ts +865 -0
  780. package/src/interactive/chat-panel.ts +1694 -0
  781. package/src/interactive/chat-renderer.ts +1038 -0
  782. package/src/interactive/clio-editor.ts +166 -0
  783. package/src/interactive/command-fallbacks.ts +23 -0
  784. package/src/interactive/command-output.ts +85 -0
  785. package/src/interactive/context-activity.ts +203 -0
  786. package/src/interactive/context-meter.ts +223 -0
  787. package/src/interactive/context-overlay.ts +220 -0
  788. package/src/interactive/cost-overlay.ts +279 -0
  789. package/src/interactive/dispatch-board.ts +1319 -0
  790. package/src/interactive/dispatch-steering.ts +86 -0
  791. package/src/interactive/editor-bash.ts +46 -0
  792. package/src/interactive/editor-steer.ts +51 -0
  793. package/src/interactive/editor-submit.ts +303 -0
  794. package/src/interactive/external-editor.ts +67 -0
  795. package/src/interactive/follow-up-queue-panel.ts +75 -0
  796. package/src/interactive/footer/dashboard.ts +534 -0
  797. package/src/interactive/footer/notifications.ts +275 -0
  798. package/src/interactive/footer/widgets.ts +1246 -0
  799. package/src/interactive/footer-panel.ts +187 -0
  800. package/src/interactive/format-time.ts +85 -0
  801. package/src/interactive/index.ts +11 -0
  802. package/src/interactive/interactive-application.ts +755 -0
  803. package/src/interactive/interactive-event-projection.ts +380 -0
  804. package/src/interactive/interactive-input-runtime.ts +261 -0
  805. package/src/interactive/interactive-presentation.ts +452 -0
  806. package/src/interactive/interactive-shell.ts +134 -0
  807. package/src/interactive/interactive-slash-runtime.ts +492 -0
  808. package/src/interactive/interactive-subscriptions.ts +111 -0
  809. package/src/interactive/interactive-tickers.ts +152 -0
  810. package/src/interactive/keybinding-manager.ts +496 -0
  811. package/src/interactive/layout.ts +20 -0
  812. package/src/interactive/leader-key.ts +143 -0
  813. package/src/interactive/loop-guard-interrupt.ts +101 -0
  814. package/src/interactive/memory-overlay.ts +280 -0
  815. package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
  816. package/src/interactive/overlay-auth-lifecycle.ts +308 -0
  817. package/src/interactive/overlay-frame.ts +502 -0
  818. package/src/interactive/overlay-general-openers.ts +217 -0
  819. package/src/interactive/overlay-key-routing.ts +213 -0
  820. package/src/interactive/overlay-lifecycle.ts +413 -0
  821. package/src/interactive/overlay-model-selectors.ts +127 -0
  822. package/src/interactive/overlay-permission-lifecycle.ts +344 -0
  823. package/src/interactive/overlay-resource-openers.ts +112 -0
  824. package/src/interactive/overlay-session-lifecycle.ts +270 -0
  825. package/src/interactive/overlay-transitions.ts +57 -0
  826. package/src/interactive/overlays/agents.ts +69 -0
  827. package/src/interactive/overlays/ask-user.ts +921 -0
  828. package/src/interactive/overlays/auth-dialog.ts +221 -0
  829. package/src/interactive/overlays/context-reset.ts +108 -0
  830. package/src/interactive/overlays/cwd-fallback.ts +141 -0
  831. package/src/interactive/overlays/extensions.ts +54 -0
  832. package/src/interactive/overlays/help-reference.ts +140 -0
  833. package/src/interactive/overlays/interop.ts +139 -0
  834. package/src/interactive/overlays/keybinding-detail.ts +90 -0
  835. package/src/interactive/overlays/list-overlay.ts +606 -0
  836. package/src/interactive/overlays/message-picker.ts +155 -0
  837. package/src/interactive/overlays/model-selector.ts +1091 -0
  838. package/src/interactive/overlays/prompts.ts +72 -0
  839. package/src/interactive/overlays/session-selector-search.ts +31 -0
  840. package/src/interactive/overlays/session-selector.ts +266 -0
  841. package/src/interactive/overlays/settings.ts +3363 -0
  842. package/src/interactive/overlays/skills-hub.ts +237 -0
  843. package/src/interactive/overlays/tree-selector.ts +387 -0
  844. package/src/interactive/permission-overlay.ts +170 -0
  845. package/src/interactive/render-trace.ts +125 -0
  846. package/src/interactive/renderers/branch-summary.ts +86 -0
  847. package/src/interactive/renderers/code-ink.ts +420 -0
  848. package/src/interactive/renderers/compaction-summary.ts +112 -0
  849. package/src/interactive/renderers/diff.ts +126 -0
  850. package/src/interactive/renderers/notice.ts +28 -0
  851. package/src/interactive/renderers/retry-status.ts +31 -0
  852. package/src/interactive/renderers/structured.ts +89 -0
  853. package/src/interactive/renderers/tool-execution.ts +1104 -0
  854. package/src/interactive/renderers/worker-entry.ts +264 -0
  855. package/src/interactive/session-last-turn.ts +186 -0
  856. package/src/interactive/session-transcript.ts +105 -0
  857. package/src/interactive/session-usage-reseed.ts +74 -0
  858. package/src/interactive/slash-autocomplete.ts +364 -0
  859. package/src/interactive/slash-commands.ts +1319 -0
  860. package/src/interactive/slash-spec.ts +453 -0
  861. package/src/interactive/status/controller.ts +256 -0
  862. package/src/interactive/status/index.ts +23 -0
  863. package/src/interactive/status/state-machine.ts +530 -0
  864. package/src/interactive/status/summary.ts +170 -0
  865. package/src/interactive/status/types.ts +121 -0
  866. package/src/interactive/status/verbs.ts +163 -0
  867. package/src/interactive/status/watchdog.ts +24 -0
  868. package/src/interactive/tasks-overlay.ts +186 -0
  869. package/src/interactive/theme/components.ts +55 -0
  870. package/src/interactive/theme/glyphs.ts +70 -0
  871. package/src/interactive/theme/index.ts +15 -0
  872. package/src/interactive/theme/labels.ts +88 -0
  873. package/src/interactive/theme/rules.ts +138 -0
  874. package/src/interactive/theme/segments.ts +88 -0
  875. package/src/interactive/theme/tokens.ts +121 -0
  876. package/src/interactive/thinking-level-policy.ts +6 -0
  877. package/src/interactive/tool-prose-loop.ts +122 -0
  878. package/src/interactive/tool-prose-registration.ts +48 -0
  879. package/src/interactive/turn-context.ts +854 -0
  880. package/src/interactive/turn-middleware.ts +283 -0
  881. package/src/interactive/turn-persistence.ts +441 -0
  882. package/src/interactive/turn-queues.ts +169 -0
  883. package/src/interactive/turn-recovery.ts +306 -0
  884. package/src/interactive/turn-runtime.ts +802 -0
  885. package/src/interactive/turn-state.ts +123 -0
  886. package/src/interactive/view/artifacts.ts +1342 -0
  887. package/src/interactive/view/view-overlay.ts +732 -0
  888. package/src/interactive/welcome-dashboard.ts +536 -0
  889. package/src/interactive/worker-receipts.ts +94 -0
  890. package/src/interactive/worker-replay.ts +111 -0
  891. package/src/interactive/worker-share.ts +100 -0
  892. package/src/interactive/worker-stream.ts +442 -0
  893. package/src/interactive/workspace-facts.ts +141 -0
  894. package/src/tools/agent-tools.ts +382 -0
  895. package/src/tools/artifact.ts +103 -0
  896. package/src/tools/ask-user.ts +656 -0
  897. package/src/tools/bash.ts +176 -0
  898. package/src/tools/bootstrap.ts +474 -0
  899. package/src/tools/codewiki/code-nav.ts +563 -0
  900. package/src/tools/codewiki/shared.ts +115 -0
  901. package/src/tools/compete-worktrees.ts +898 -0
  902. package/src/tools/context/docs-engine.ts +619 -0
  903. package/src/tools/context/index.ts +435 -0
  904. package/src/tools/credential-present.ts +151 -0
  905. package/src/tools/dispatch-arguments.ts +228 -0
  906. package/src/tools/dispatch-plan.ts +741 -0
  907. package/src/tools/dispatch-scout.ts +461 -0
  908. package/src/tools/dispatch.ts +3338 -0
  909. package/src/tools/edit-diff.ts +534 -0
  910. package/src/tools/edit.ts +128 -0
  911. package/src/tools/executables.ts +22 -0
  912. package/src/tools/file-mutation-queue.ts +35 -0
  913. package/src/tools/find.ts +292 -0
  914. package/src/tools/grep.ts +495 -0
  915. package/src/tools/ignore-policy.ts +169 -0
  916. package/src/tools/ledger.ts +206 -0
  917. package/src/tools/ls.ts +110 -0
  918. package/src/tools/monitor.ts +797 -0
  919. package/src/tools/network-policy.ts +29 -0
  920. package/src/tools/observation.ts +421 -0
  921. package/src/tools/observers.ts +99 -0
  922. package/src/tools/path-utils.ts +79 -0
  923. package/src/tools/policy.ts +154 -0
  924. package/src/tools/profiles.ts +108 -0
  925. package/src/tools/read.ts +173 -0
  926. package/src/tools/registry.ts +1157 -0
  927. package/src/tools/result-shaping.ts +204 -0
  928. package/src/tools/safe-exec.ts +128 -0
  929. package/src/tools/spawn-hygiene.ts +182 -0
  930. package/src/tools/steer.ts +88 -0
  931. package/src/tools/string-enum.ts +15 -0
  932. package/src/tools/tasks.ts +168 -0
  933. package/src/tools/truncate-utf8.ts +17 -0
  934. package/src/tools/truncate.ts +202 -0
  935. package/src/tools/verify/frontend.ts +685 -0
  936. package/src/tools/verify/index.ts +66 -0
  937. package/src/tools/verify/scripts.ts +108 -0
  938. package/src/tools/web-fetch.ts +777 -0
  939. package/src/tools/worker-evidence.ts +215 -0
  940. package/src/tools/write.ts +52 -0
  941. package/src/utils/exif-orientation.ts +192 -0
  942. package/src/utils/git.ts +24 -0
  943. package/src/utils/image-resize.ts +148 -0
  944. package/src/utils/photon.ts +103 -0
  945. package/src/worker/control-lane.ts +22 -0
  946. package/src/worker/entry.ts +257 -0
  947. package/src/worker/event-projection.ts +56 -0
  948. package/src/worker/heartbeat.ts +24 -0
  949. package/src/worker/ledger-mirror.ts +95 -0
  950. package/src/worker/ndjson.ts +40 -0
  951. package/src/worker/protocol.ts +529 -0
  952. package/src/worker/resource-facts.ts +79 -0
  953. package/src/worker/runtime-registry.ts +12 -0
  954. package/src/worker/spec-contract.ts +654 -0
  955. package/src/worker/stdin-demux.ts +316 -0
  956. package/dist/acp-UMLFVA3F.js +0 -92
  957. package/dist/chunk-262G75JS.js +0 -35
  958. package/dist/chunk-5LDRNKX2.js +0 -1063
  959. package/dist/chunk-67MTHP2E.js +0 -135
  960. package/dist/chunk-GOTUR54M.js +0 -9
  961. package/dist/chunk-TPOCL34A.js +0 -2876
  962. package/dist/chunk-XV4ZJ6ZM.js +0 -3177
  963. package/dist/clio-KIQ5SNDS.js +0 -53
  964. package/dist/configure-G4E3A2PG.js +0 -27
  965. package/dist/doctor-M5HJJZOL.js +0 -61
  966. package/dist/domains/agents/builtins/architect.md +0 -33
  967. package/dist/domains/agents/builtins/coder.md +0 -31
  968. package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
  969. package/dist/domains/agents/builtins/debugger.md +0 -30
  970. package/dist/domains/agents/builtins/documenter.md +0 -31
  971. package/dist/domains/agents/builtins/git-master.md +0 -30
  972. package/dist/domains/agents/builtins/provenance.md +0 -30
  973. package/dist/domains/agents/builtins/researcher.md +0 -71
  974. package/dist/domains/agents/builtins/scout.md +0 -42
  975. package/dist/domains/agents/builtins/tester.md +0 -31
  976. package/dist/domains/agents/builtins/verifier.md +0 -30
  977. package/dist/domains/agents/builtins/wiki-writer.md +0 -41
  978. package/dist/fleet-preflight-CLIAX7YR.js +0 -21
  979. package/dist/preload-KZVHET2B.js +0 -11
  980. package/dist/version-ROZ6CZKH.js +0 -16
  981. package/skills/git/commit-crafting/SKILL.md +0 -79
  982. package/skills/git/commit-crafting/evals.md +0 -92
  983. package/skills/git/create-pr/SKILL.md +0 -116
  984. package/skills/git/create-pr/evals.md +0 -114
  985. package/skills/git/investigate-issue/SKILL.md +0 -139
  986. package/skills/git/investigate-issue/evals.md +0 -94
  987. package/skills/git/review-changes/SKILL.md +0 -103
  988. package/skills/git/review-changes/evals.md +0 -85
@@ -0,0 +1,701 @@
1
+ import { createHash } from "node:crypto";
2
+ import { TASK_MEMORY_DEFAULT_PROCEDURAL_CAP, type TaskMemoryBank } from "../memory/task-bank.js";
3
+ import {
4
+ runTaskMemoryPolicy,
5
+ TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
6
+ type TaskMemoryEnvelope,
7
+ type TaskMemoryModelClient,
8
+ type TaskMemoryPolicyReason,
9
+ type TaskMemoryPolicyResult,
10
+ type TaskMemoryTrajectoryStep,
11
+ } from "../memory/task-memory-policy.js";
12
+ import type { TaskMemoryActivityEvent } from "../memory/task-memory-status.js";
13
+ import {
14
+ type TaskMemoryBankDelta,
15
+ type TaskMemoryTelemetryDecision,
16
+ type TaskMemoryTelemetrySink,
17
+ type TaskMemoryTelemetryTier,
18
+ type TaskMemoryTelemetryTrigger,
19
+ taskMemoryBankDelta,
20
+ } from "../memory/task-memory-telemetry.js";
21
+ import { hashToolCall } from "../safety/loop-detector.js";
22
+ import { ceilChars } from "../session/context-accounting.js";
23
+ import type { MiddlewareHookEvaluationContext, MiddlewareHookRegistration } from "./runtime.js";
24
+ import type { MiddlewareEffect, MiddlewareHookInput } from "./types.js";
25
+
26
+ export const MEMORY_INTERVENTION_REGISTRATION_ID = "observer.memory-intervention";
27
+ export const MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS = 8;
28
+ export const MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS = 400;
29
+ export const MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS = 10;
30
+
31
+ export const MEMORY_INTERVENTION_ACTIVITY_LIMIT = 20;
32
+
33
+ export type MemoryInterventionTriggerReason = "interval" | "tool_error_streak" | "loop_signal";
34
+
35
+ export interface MemoryInterventionSettings {
36
+ enabled: boolean;
37
+ everyNTools: number;
38
+ windowSteps: number;
39
+ maxTokens: number;
40
+ timeoutMs: number;
41
+ }
42
+
43
+ const RESULT_DIGEST_MAX_CHARS = 240;
44
+ const CALL_DESCRIPTION_MAX_CHARS = 180;
45
+ const NO_EFFECTS: ReadonlyArray<MiddlewareEffect> = [];
46
+
47
+ type ToolOutcome = "ok" | "error";
48
+
49
+ interface PendingToolStep {
50
+ toolName: string;
51
+ fingerprint: string;
52
+ callDescription: string;
53
+ }
54
+
55
+ type TrajectoryStep = TaskMemoryTrajectoryStep;
56
+
57
+ interface FailedAttempt {
58
+ entryId: string;
59
+ attempts: number;
60
+ firstStep: number;
61
+ callDescription: string;
62
+ errorDigest: string;
63
+ }
64
+
65
+ export interface MemoryInterventionDeps {
66
+ bank: TaskMemoryBank;
67
+ enabled?: boolean;
68
+ windowSteps?: number;
69
+ maxTokens?: number;
70
+ timeoutMs?: number;
71
+ everyNTools?: number;
72
+ /** Lazily resolves the explicitly configured background role. Null means rules-only. */
73
+ getModelClient?: () => TaskMemoryModelClient | null;
74
+ /** Live next-turn settings view; individual fields above remain test-friendly fallbacks. */
75
+ getSettings?: () => Readonly<MemoryInterventionSettings>;
76
+ /** Best-effort content-free telemetry; sink failures never affect intervention. */
77
+ telemetry?: TaskMemoryTelemetrySink;
78
+ /**
79
+ * Opt-in raw-envelope observer. Content-bearing, so the composition root only
80
+ * supplies it when the operator named a trace file.
81
+ */
82
+ onEnvelope?: (envelope: TaskMemoryEnvelope) => void;
83
+ /**
84
+ * Delivery channel for a reminder produced after its turn boundary already
85
+ * closed. The composition root buffers it into the next submitted turn, which
86
+ * is where a synchronous turn_end reminder would have landed anyway.
87
+ */
88
+ onDeferredReminder?: (message: string) => void;
89
+ /**
90
+ * False when no further turn will be submitted in this process. A background
91
+ * step is detached from the boundary that triggered it and a local route
92
+ * measures in tens of seconds, so a headless run exits long before the step
93
+ * lands: its reminder has no turn to ride into and its bank is discarded with
94
+ * the process. Starting one only spends a model call to throw the result away.
95
+ */
96
+ deliversDeferredReminders?: boolean;
97
+ }
98
+
99
+ export interface MemoryPromptedStepInput {
100
+ deterministicTrigger: boolean;
101
+ /** Overrides the most recent turn-start task text when supplied. */
102
+ task?: string;
103
+ /** Keep phase-one writes but yield the visible channel to a synchronous reminder. */
104
+ suppressIntervention?: boolean;
105
+ /** Internal/eval attribution; direct callers default to `manual`. */
106
+ triggerReasons?: ReadonlyArray<TaskMemoryTelemetryTrigger>;
107
+ }
108
+
109
+ export interface MemoryPromptedStepResult extends TaskMemoryPolicyResult {
110
+ effects: ReadonlyArray<MiddlewareEffect>;
111
+ }
112
+
113
+ export interface MemoryInterventionRegistration extends MiddlewareHookRegistration {
114
+ evaluateAsync(
115
+ input: MiddlewareHookInput,
116
+ context?: MiddlewareHookEvaluationContext,
117
+ ): Promise<ReadonlyArray<MiddlewareEffect>>;
118
+ /** Serialized model step; the composition root decides which awaited boundary invokes it. */
119
+ runPromptedStep(input: MemoryPromptedStepInput): Promise<MemoryPromptedStepResult>;
120
+ /** Consume the orchestrator loop guard's already-computed verdict. */
121
+ signalLoop(): void;
122
+ /** Most recent completed memory-policy outcome for read-only operator surfaces. */
123
+ lastDecision(): TaskMemoryPolicyResult["decision"] | null;
124
+ /** Bounded newest-first memory-step history for read-only operator surfaces. */
125
+ recentActivity(): ReadonlyArray<TaskMemoryActivityEvent>;
126
+ /** True while a detached background memory step is still running. */
127
+ stepInFlight(): boolean;
128
+ /**
129
+ * Resolves once no detached memory step is outstanding. Teardown does not
130
+ * await it: a step runs tens of seconds on a local route and shutdown cannot
131
+ * wait that long, which is why a surface with no next turn declines to start
132
+ * one at all rather than starting one it will abandon.
133
+ */
134
+ whenIdle(): Promise<void>;
135
+ }
136
+
137
+ /**
138
+ * Rules-only proactive-memory policy. It observes bounded tool history and
139
+ * emits only cited, advisory reminders through the existing visible channel.
140
+ */
141
+ export function createMemoryInterventionRegistration(deps: MemoryInterventionDeps): MemoryInterventionRegistration {
142
+ const pending = new Map<string, PendingToolStep>();
143
+ const trajectory: TrajectoryStep[] = [];
144
+ const failures = new Map<string, FailedAttempt>();
145
+ let toolStep = 0;
146
+ let lastTurnEndStep = 0;
147
+ let reactivateAfterCompaction = false;
148
+ let lastInjectedFingerprint: string | null = null;
149
+ let currentTask = "(current task unavailable)";
150
+ let toolsSinceMemoryStep = 0;
151
+ let consecutiveErrors = 0;
152
+ let lastPromptedBoundary: string | null = null;
153
+ let lastInjectedMessage: string | null = null;
154
+ let lastDecision: TaskMemoryPolicyResult["decision"] | null = null;
155
+ const pendingTriggers = new Set<MemoryInterventionTriggerReason>();
156
+ const activity: TaskMemoryActivityEvent[] = [];
157
+ const annotatedThisTurn = new Set<string>();
158
+ let telemetryBankSnapshot = deps.bank.snapshot();
159
+ let promptedStepInFlight = false;
160
+ // The tier of the step currently holding the single in-flight slot, so a
161
+ // dropped boundary can name what it was starved by.
162
+ let promptedStepTier: TaskMemoryTelemetryTier = "rules";
163
+ let outstandingStep: Promise<void> = Promise.resolve();
164
+ let rulesInjectedSincePromptedStep = false;
165
+ let annotatedSinceTurnEnd = false;
166
+
167
+ return {
168
+ id: MEMORY_INTERVENTION_REGISTRATION_ID,
169
+ description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
170
+ hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
171
+ evaluate(input): ReadonlyArray<MiddlewareEffect> {
172
+ if (!settings().enabled) return NO_EFFECTS;
173
+ try {
174
+ switch (input.hook) {
175
+ case "before_tool":
176
+ observeBeforeTool(input);
177
+ return NO_EFFECTS;
178
+ case "after_tool":
179
+ return observeAfterTool(input);
180
+ case "turn_end": {
181
+ // Middleware continuations can evaluate turn_end again without any
182
+ // completed tools. They are not new memory boundaries and must not
183
+ // replace the prior operator-visible outcome or emit telemetry.
184
+ if (toolStep <= lastTurnEndStep) return NO_EFFECTS;
185
+ // A mid-turn annotation already reported this boundary's rules-tier
186
+ // outcome. Reporting silence again would double-count one decision.
187
+ const alreadyReported = annotatedSinceTurnEnd;
188
+ annotatedSinceTurnEnd = false;
189
+ const started = process.hrtime.bigint();
190
+ const effects = decideRepeatedFailure();
191
+ if (alreadyReported && effects.length === 0) return effects;
192
+ emitTelemetry(
193
+ [effects.length > 0 ? "repeated_failure" : "turn_end"],
194
+ "rules",
195
+ effects.length > 0 ? "injected" : "silent",
196
+ effects.length > 0 ? "intervened" : "no_repeated_failure",
197
+ citedEntryCount(effects[0]?.kind === "inject_reminder" ? effects[0].message : null),
198
+ 0,
199
+ 0,
200
+ started,
201
+ );
202
+ return effects;
203
+ }
204
+ case "on_compaction":
205
+ reactivateAfterCompaction = true;
206
+ return NO_EFFECTS;
207
+ case "turn_start": {
208
+ if (input.text?.trim()) currentTask = shortText(input.text, 2_000);
209
+ // Mid-turn annotations are spent per turn, not per session: the same
210
+ // command failing again in a later turn is news again.
211
+ annotatedThisTurn.clear();
212
+ const shouldReactivate = reactivateAfterCompaction;
213
+ const started = process.hrtime.bigint();
214
+ const effects = reactivateKnowledge();
215
+ if (shouldReactivate) {
216
+ emitTelemetry(
217
+ ["post_compaction"],
218
+ "rules",
219
+ effects.length > 0 ? "injected" : "silent",
220
+ effects.length > 0 ? "intervened" : "bank_empty",
221
+ citedEntryCount(effects[0]?.kind === "inject_reminder" ? effects[0].message : null),
222
+ 0,
223
+ 0,
224
+ started,
225
+ );
226
+ }
227
+ return effects;
228
+ }
229
+ }
230
+ } catch {
231
+ return NO_EFFECTS;
232
+ }
233
+ },
234
+ /**
235
+ * Kicks off the background memory step and returns immediately. The pi
236
+ * agent does not go idle until every `agent_end` listener settles, so
237
+ * awaiting a local memory model here would stall the visible turn for its
238
+ * full latency. Small local models measure in tens of seconds, which is far
239
+ * past any tolerable end-of-turn pause and past the policy timeout itself.
240
+ * The reminder is delivered through `onDeferredReminder` instead, landing
241
+ * in the next submitted turn, which is where an awaited turn_end reminder
242
+ * would have been buffered anyway.
243
+ */
244
+ async evaluateAsync(input, context): Promise<ReadonlyArray<MiddlewareEffect>> {
245
+ if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
246
+ const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
247
+ if (boundary === lastPromptedBoundary) return NO_EFFECTS;
248
+ // One row rather than none, so a headless operator reading the log sees
249
+ // why the tier never ran instead of finding nothing and guessing.
250
+ if (deps.deliversDeferredReminders === false) {
251
+ emitTelemetry([...pendingTriggers], "rules", "silent", "no_consumer", 0, 0, 0, process.hrtime.bigint());
252
+ pendingTriggers.clear();
253
+ return NO_EFFECTS;
254
+ }
255
+ // A step slower than the turns that trigger it must not queue: dropping
256
+ // this boundary keeps at most one background call alive per session. The
257
+ // drop is recorded, because a starved cadence and a quiet one are
258
+ // otherwise indistinguishable in the telemetry log. Triggers stay pending
259
+ // so the next free boundary still runs for them.
260
+ if (promptedStepInFlight) {
261
+ emitTelemetry(
262
+ [...pendingTriggers],
263
+ promptedStepTier,
264
+ "dropped",
265
+ "step_in_flight",
266
+ 0,
267
+ 0,
268
+ 0,
269
+ process.hrtime.bigint(),
270
+ );
271
+ return NO_EFFECTS;
272
+ }
273
+ lastPromptedBoundary = boundary;
274
+ const triggers = [...pendingTriggers];
275
+ pendingTriggers.clear();
276
+ toolsSinceMemoryStep = 0;
277
+ consecutiveErrors = 0;
278
+ // The rules tier may already have spoken for this boundary, either as a
279
+ // turn_end reminder in prior effects or as a mid-turn tool annotation.
280
+ const rulesAlreadySpoke =
281
+ rulesInjectedSincePromptedStep ||
282
+ (context?.priorEffects.some(
283
+ (effect) => effect.kind === "inject_reminder" && effect.message.startsWith("Memory:"),
284
+ ) ??
285
+ false);
286
+ rulesInjectedSincePromptedStep = false;
287
+ promptedStepInFlight = true;
288
+ outstandingStep = runPromptedStep({
289
+ deterministicTrigger: triggers.some((trigger) => trigger !== "interval"),
290
+ suppressIntervention: rulesAlreadySpoke,
291
+ triggerReasons: triggers,
292
+ })
293
+ .then((result) => {
294
+ // A rules-only reminder can win the visible boundary while the optional
295
+ // background route resolves to null. Preserve the operator-visible
296
+ // injected outcome instead of overwriting it with that no-client silence.
297
+ if (rulesAlreadySpoke && result.decision === "silent") lastDecision = "injected";
298
+ if (result.reminder === null) return;
299
+ lastInjectedMessage = result.reminder;
300
+ deps.onDeferredReminder?.(result.reminder);
301
+ })
302
+ .catch(() => {
303
+ // runPromptedStep already resolves failures to silence; this only
304
+ // covers a throwing delivery sink, which must not surface anywhere.
305
+ })
306
+ .finally(() => {
307
+ promptedStepInFlight = false;
308
+ });
309
+ return NO_EFFECTS;
310
+ },
311
+ runPromptedStep,
312
+ signalLoop(): void {
313
+ if (settings().enabled) pendingTriggers.add("loop_signal");
314
+ },
315
+ lastDecision: () => lastDecision,
316
+ recentActivity: () => [...activity],
317
+ stepInFlight: () => promptedStepInFlight,
318
+ whenIdle: () => outstandingStep,
319
+ };
320
+
321
+ function settings(): MemoryInterventionSettings {
322
+ const live = deps.getSettings?.();
323
+ return {
324
+ enabled: live?.enabled ?? deps.enabled ?? true,
325
+ everyNTools: Math.max(
326
+ 2,
327
+ positiveInteger(live?.everyNTools ?? deps.everyNTools, MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS),
328
+ ),
329
+ windowSteps: positiveInteger(live?.windowSteps ?? deps.windowSteps, MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS),
330
+ maxTokens: positiveInteger(live?.maxTokens ?? deps.maxTokens, MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS),
331
+ timeoutMs: positiveInteger(live?.timeoutMs ?? deps.timeoutMs, TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS),
332
+ };
333
+ }
334
+
335
+ async function runPromptedStep(input: MemoryPromptedStepInput): Promise<MemoryPromptedStepResult> {
336
+ const silent = (reason: TaskMemoryPolicyReason): MemoryPromptedStepResult => ({
337
+ decision: "silent",
338
+ reason,
339
+ bankOperations: 0,
340
+ droppedOperations: 0,
341
+ reminder: null,
342
+ inputTokens: 0,
343
+ outputTokens: 0,
344
+ effects: NO_EFFECTS,
345
+ });
346
+ const live = settings();
347
+ if (!live.enabled) {
348
+ const result = silent("no_client");
349
+ lastDecision = result.decision;
350
+ return result;
351
+ }
352
+ const started = process.hrtime.bigint();
353
+ const triggers = input.triggerReasons?.length ? input.triggerReasons : ["manual" as const];
354
+ let tier: TaskMemoryTelemetryTier = "rules";
355
+ promptedStepTier = tier;
356
+ let promptedResult: TaskMemoryPolicyResult;
357
+ try {
358
+ const client = deps.getModelClient?.() ?? null;
359
+ if (client === null) {
360
+ promptedResult = silent("no_client");
361
+ } else {
362
+ tier = "llm";
363
+ promptedStepTier = tier;
364
+ promptedResult = await runTaskMemoryPolicy(deps.bank, client, {
365
+ task: input.task?.trim() || currentTask,
366
+ trajectory: [...trajectory],
367
+ deterministicTrigger: input.deterministicTrigger,
368
+ maxTokens: live.maxTokens,
369
+ ...(input.suppressIntervention === undefined ? {} : { suppressIntervention: input.suppressIntervention }),
370
+ previousReminder: lastInjectedMessage,
371
+ timeoutMs: live.timeoutMs,
372
+ ...(deps.onEnvelope === undefined ? {} : { onEnvelope: deps.onEnvelope }),
373
+ });
374
+ }
375
+ } catch (error) {
376
+ // runTaskMemoryPolicy resolves its own failures, so reaching here means
377
+ // resolving the client itself threw. That is still a broken route.
378
+ promptedResult = silent("client_error");
379
+ deps.onEnvelope?.({
380
+ systemPrompt: "",
381
+ userPrompt: "",
382
+ response: "",
383
+ decision: "silent",
384
+ reason: "client_error",
385
+ bankOperations: 0,
386
+ droppedOperations: 0,
387
+ reminder: null,
388
+ error: error instanceof Error ? error.message : "resolving the background model client failed",
389
+ });
390
+ }
391
+ lastDecision = promptedResult.decision;
392
+ emitTelemetry(
393
+ triggers,
394
+ tier,
395
+ promptedResult.decision,
396
+ promptedResult.reason,
397
+ citedEntryCount(promptedResult.reminder),
398
+ promptedResult.inputTokens,
399
+ promptedResult.outputTokens,
400
+ started,
401
+ { bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations },
402
+ );
403
+ return {
404
+ ...promptedResult,
405
+ effects:
406
+ promptedResult.reminder === null
407
+ ? NO_EFFECTS
408
+ : [{ kind: "inject_reminder", message: promptedResult.reminder, severity: "advisory" }],
409
+ };
410
+ }
411
+
412
+ function emitTelemetry(
413
+ triggerReasons: ReadonlyArray<TaskMemoryTelemetryTrigger>,
414
+ tier: TaskMemoryTelemetryTier,
415
+ decision: TaskMemoryTelemetryDecision,
416
+ reason: TaskMemoryPolicyReason,
417
+ citedEntries: number,
418
+ inputTokens: number,
419
+ outputTokens: number,
420
+ started: bigint,
421
+ operations: { bankOperations: number; droppedOperations: number } = { bankOperations: 0, droppedOperations: 0 },
422
+ ): void {
423
+ const next = deps.bank.snapshot();
424
+ const bankDelta = taskMemoryBankDelta(telemetryBankSnapshot, next);
425
+ telemetryBankSnapshot = next;
426
+ const latencyMs = Number(process.hrtime.bigint() - started) / 1_000_000;
427
+ try {
428
+ deps.telemetry?.record({
429
+ triggerReasons,
430
+ tier,
431
+ bankDelta,
432
+ decision,
433
+ reason,
434
+ bankOperations: operations.bankOperations,
435
+ droppedOperations: operations.droppedOperations,
436
+ citedEntries,
437
+ inputTokens,
438
+ outputTokens,
439
+ latencyMs,
440
+ });
441
+ } catch {
442
+ // Observability must never steer or block the memory policy.
443
+ }
444
+ const event: TaskMemoryActivityEvent = {
445
+ at: new Date().toISOString(),
446
+ triggerReasons: [...new Set(triggerReasons)],
447
+ tier,
448
+ decision,
449
+ reason,
450
+ citedEntries,
451
+ bankWrites: countBankWrites(bankDelta),
452
+ latencyMs,
453
+ };
454
+ activity.unshift(event);
455
+ if (activity.length > MEMORY_INTERVENTION_ACTIVITY_LIMIT) activity.length = MEMORY_INTERVENTION_ACTIVITY_LIMIT;
456
+ }
457
+
458
+ function citedEntryCount(message: string | null): number {
459
+ if (message === null) return 0;
460
+ const snapshot = deps.bank.snapshot();
461
+ return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`)).length;
462
+ }
463
+
464
+ function observeBeforeTool(input: MiddlewareHookInput): void {
465
+ const prepared = prepareToolStep(input);
466
+ if (prepared === null) return;
467
+ setBounded(pending, pendingKey(input, prepared.fingerprint), prepared, settings().windowSteps);
468
+ }
469
+
470
+ function observeAfterTool(input: MiddlewareHookInput): ReadonlyArray<MiddlewareEffect> {
471
+ const fallback = prepareToolStep(input);
472
+ if (fallback === null) return NO_EFFECTS;
473
+ const key = pendingKey(input, fallback.fingerprint);
474
+ const prepared = pending.get(key) ?? fallback;
475
+ pending.delete(key);
476
+ const outcome = input.metadata?.resultKind === "error" ? "error" : "ok";
477
+ toolStep += 1;
478
+ toolsSinceMemoryStep += 1;
479
+ const live = settings();
480
+ if (toolsSinceMemoryStep >= live.everyNTools) pendingTriggers.add("interval");
481
+ if (outcome === "error") {
482
+ consecutiveErrors += 1;
483
+ if (consecutiveErrors >= 2) pendingTriggers.add("tool_error_streak");
484
+ } else {
485
+ consecutiveErrors = 0;
486
+ }
487
+ const step: TrajectoryStep = {
488
+ ...prepared,
489
+ step: toolStep,
490
+ outcome,
491
+ resultDigest: resultDigest(input, outcome),
492
+ };
493
+ trajectory.push(step);
494
+ if (trajectory.length > live.windowSteps) trajectory.splice(0, trajectory.length - live.windowSteps);
495
+ if (outcome !== "error") return NO_EFFECTS;
496
+ rememberFailure(step);
497
+ return annotateRepeatedFailure(step);
498
+ }
499
+
500
+ /**
501
+ * The turn-end reminder channel cannot reach a model that is still mid-turn,
502
+ * and a long agentic turn is exactly where a repeated failure burns its
503
+ * budget. A second identical failure therefore rides back on the tool result
504
+ * itself, which the model reads on its very next round.
505
+ */
506
+ function annotateRepeatedFailure(step: TrajectoryStep): ReadonlyArray<MiddlewareEffect> {
507
+ if (annotatedThisTurn.has(step.fingerprint)) return NO_EFFECTS;
508
+ const occurrences = trajectory.filter(
509
+ (candidate) => candidate.outcome === "error" && candidate.fingerprint === step.fingerprint,
510
+ ).length;
511
+ const failure = failures.get(step.fingerprint);
512
+ if (occurrences < 2 || failure === undefined) return NO_EFFECTS;
513
+ const message = boundedReminder(
514
+ `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.`,
515
+ settings().maxTokens,
516
+ );
517
+ if (message.length === 0) return NO_EFFECTS;
518
+ annotatedThisTurn.add(step.fingerprint);
519
+ // Claim the turn-end channel too, so one repeated failure is surfaced once.
520
+ lastInjectedFingerprint = step.fingerprint;
521
+ lastDecision = "injected";
522
+ rulesInjectedSincePromptedStep = true;
523
+ annotatedSinceTurnEnd = true;
524
+ deps.bank.recordInjection([failure.entryId]);
525
+ emitTelemetry(["repeated_failure"], "rules", "injected", "intervened", 1, 0, 0, process.hrtime.bigint());
526
+ return [{ kind: "annotate_tool_result", message, severity: "warn" }];
527
+ }
528
+
529
+ function rememberFailure(step: TrajectoryStep): void {
530
+ const previous = failures.get(step.fingerprint);
531
+ const attempts = (previous?.attempts ?? 0) + 1;
532
+ const firstStep = previous?.firstStep ?? step.step;
533
+ const content = proceduralContent(step.callDescription, attempts, firstStep, step.resultDigest);
534
+ let entryId: string;
535
+ if (previous === undefined) {
536
+ entryId = deps.bank.saveProcedural(content).id;
537
+ } else {
538
+ try {
539
+ entryId = deps.bank.saveProcedural(content, { id: previous.entryId }).id;
540
+ } catch {
541
+ entryId = deps.bank.saveProcedural(content).id;
542
+ }
543
+ }
544
+ setBounded(
545
+ failures,
546
+ step.fingerprint,
547
+ {
548
+ entryId,
549
+ attempts,
550
+ firstStep,
551
+ callDescription: step.callDescription,
552
+ errorDigest: step.resultDigest,
553
+ },
554
+ TASK_MEMORY_DEFAULT_PROCEDURAL_CAP,
555
+ );
556
+ }
557
+
558
+ function decideRepeatedFailure(): ReadonlyArray<MiddlewareEffect> {
559
+ try {
560
+ for (let index = trajectory.length - 1; index >= 0; index -= 1) {
561
+ const step = trajectory[index];
562
+ if (
563
+ step === undefined ||
564
+ step.outcome !== "error" ||
565
+ step.step <= lastTurnEndStep ||
566
+ step.fingerprint === lastInjectedFingerprint
567
+ ) {
568
+ continue;
569
+ }
570
+ const occurrences = trajectory.filter(
571
+ (candidate) => candidate.outcome === "error" && candidate.fingerprint === step.fingerprint,
572
+ ).length;
573
+ const failure = failures.get(step.fingerprint);
574
+ if (occurrences < 2 || failure === undefined) continue;
575
+ const message = boundedReminder(
576
+ `Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}.`,
577
+ settings().maxTokens,
578
+ );
579
+ if (message.length === 0) return NO_EFFECTS;
580
+ lastInjectedFingerprint = step.fingerprint;
581
+ lastInjectedMessage = message;
582
+ lastDecision = "injected";
583
+ rulesInjectedSincePromptedStep = true;
584
+ deps.bank.recordInjection([failure.entryId]);
585
+ return [{ kind: "inject_reminder", message, severity: "advisory" }];
586
+ }
587
+ lastDecision = "silent";
588
+ return NO_EFFECTS;
589
+ } finally {
590
+ lastTurnEndStep = toolStep;
591
+ }
592
+ }
593
+
594
+ function reactivateKnowledge(): ReadonlyArray<MiddlewareEffect> {
595
+ if (!reactivateAfterCompaction) return NO_EFFECTS;
596
+ reactivateAfterCompaction = false;
597
+ const prefix = "Memory: execution state restored after compaction:\n";
598
+ const maxTokens = settings().maxTokens;
599
+ const prefixTokens = ceilChars(prefix.length);
600
+ const rendered = deps.bank.renderRestoredState(Math.max(0, maxTokens - prefixTokens));
601
+ if (rendered.length === 0) {
602
+ lastDecision = "silent";
603
+ return NO_EFFECTS;
604
+ }
605
+ const message = boundedReminder(`${prefix}${rendered}`, maxTokens);
606
+ if (message.length === 0) {
607
+ lastDecision = "silent";
608
+ return NO_EFFECTS;
609
+ }
610
+ const citedIds = [...message.matchAll(/\[([^\]]+)\]/gu)].map((match) => match[1]).filter((id) => id !== undefined);
611
+ deps.bank.recordInjection(citedIds);
612
+ lastInjectedMessage = message;
613
+ lastDecision = "injected";
614
+ return [{ kind: "inject_reminder", message, severity: "advisory" }];
615
+ }
616
+ }
617
+
618
+ function prepareToolStep(input: MiddlewareHookInput): PendingToolStep | null {
619
+ const toolName = input.toolName?.trim();
620
+ if (!toolName) return null;
621
+ const canonical = hashToolCall(toolName, input.toolArgs ?? {});
622
+ return {
623
+ toolName,
624
+ fingerprint: createHash("sha256").update(canonical).digest("hex").slice(0, 16),
625
+ callDescription: shortText(canonical, CALL_DESCRIPTION_MAX_CHARS),
626
+ };
627
+ }
628
+
629
+ function pendingKey(input: MiddlewareHookInput, fingerprint: string): string {
630
+ return input.toolCallId ?? `anonymous:${fingerprint}`;
631
+ }
632
+
633
+ function resultDigest(input: MiddlewareHookInput, outcome: ToolOutcome): string {
634
+ if (outcome === "error") {
635
+ const metadataMessage = input.metadata?.errorMessage;
636
+ if (typeof metadataMessage === "string" && metadataMessage.trim().length > 0) {
637
+ return shortText(diagnosticLine(metadataMessage), RESULT_DIGEST_MAX_CHARS);
638
+ }
639
+ for (const key of ["error", "message"] as const) {
640
+ const value = input.toolResultDetails?.[key];
641
+ if (typeof value === "string" && value.trim().length > 0) {
642
+ return shortText(diagnosticLine(value), RESULT_DIGEST_MAX_CHARS);
643
+ }
644
+ }
645
+ return "an unknown tool error";
646
+ }
647
+ const resultFingerprint = input.metadata?.resultFingerprint;
648
+ return typeof resultFingerprint === "string" ? `ok result ${resultFingerprint.slice(0, 16)}` : "ok";
649
+ }
650
+
651
+ const DIAGNOSTIC_HINT =
652
+ /\b(error|failed|failure|cannot|unable|expected|refused|denied|missing|not found|timed out|timeout|fatal)\b/iu;
653
+
654
+ /**
655
+ * A runtime opens its output with its own frame pointer, not with the diagnosis,
656
+ * and closes it with paths that repeat the command. The bounded digest is the
657
+ * whole advisory a model reads, so it spends that budget on the first line that
658
+ * names a problem and falls back to the first line when none does.
659
+ */
660
+ function diagnosticLine(value: string): string {
661
+ const lines = value
662
+ .split(/\r?\n/u)
663
+ .map((line) => line.trim())
664
+ .filter((line) => line.length > 0);
665
+ return lines.find((line) => DIAGNOSTIC_HINT.test(line)) ?? lines[0] ?? "";
666
+ }
667
+
668
+ function proceduralContent(call: string, attempts: number, firstStep: number, error: string): string {
669
+ return `${call} failed ${attempts} time${attempts === 1 ? "" : "s"}; first observed at step ${firstStep}: ${error}.`;
670
+ }
671
+
672
+ function boundedReminder(message: string, maxTokens: number): string {
673
+ const maxChars = maxTokens * 4;
674
+ if (maxChars <= 0) return "";
675
+ const normalized = message.replace(/[^\S\n]+/gu, " ").trim();
676
+ return normalized.length <= maxChars ? normalized : normalized.slice(0, maxChars).trimEnd();
677
+ }
678
+
679
+ function shortText(value: string, maxChars: number): string {
680
+ const normalized = value.replace(/\s+/gu, " ").trim();
681
+ return normalized.length <= maxChars ? normalized : `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;
682
+ }
683
+
684
+ function positiveInteger(value: number | undefined, fallback: number): number {
685
+ return value !== undefined && Number.isInteger(value) && value > 0 ? value : fallback;
686
+ }
687
+
688
+ function countBankWrites(delta: TaskMemoryBankDelta): number {
689
+ return [delta.status, delta.knowledge, delta.procedural].reduce(
690
+ (total, entry) => total + entry.added + entry.updated + entry.deleted,
691
+ 0,
692
+ );
693
+ }
694
+
695
+ function setBounded<K, V>(map: Map<K, V>, key: K, value: V, capacity: number): void {
696
+ if (!map.has(key) && map.size >= capacity) {
697
+ const oldest = map.keys().next().value;
698
+ if (oldest !== undefined) map.delete(oldest);
699
+ }
700
+ map.set(key, value);
701
+ }