@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,854 @@
1
+ /**
2
+ * Turn context ownership: the session-prompt compile cache, context-snapshot
3
+ * accounting, prompt-cache honesty, and compaction. `runAutoCompact` is the
4
+ * one compaction entry point; the pre-submit trigger, the preflight overflow
5
+ * guard, overflow recovery, `/compact`, and the post-tool continuation guard
6
+ * all flow through it.
7
+ */
8
+
9
+ import {
10
+ BusChannels,
11
+ type ContextActivityStatus,
12
+ type ContextPrunedPayload,
13
+ type ContextWarningPayload,
14
+ } from "../core/bus-events.js";
15
+ import type { ClioSettings } from "../core/config.js";
16
+ import type { SafeEventBus } from "../core/event-bus.js";
17
+ import type { ToolName } from "../core/tool-names.js";
18
+ import type { ObservabilityContract } from "../domains/observability/contract.js";
19
+ import type { CompiledSessionPrompt, SessionPromptInputs } from "../domains/prompts/compiler.js";
20
+ import type { PromptsContract } from "../domains/prompts/contract.js";
21
+ import type { ProvidersContract } from "../domains/providers/index.js";
22
+ import type { LocalModelQuirks } from "../domains/providers/types/local-model-quirks.js";
23
+ import {
24
+ AutoCompactionTrigger,
25
+ DEFAULT_COMPACTION_THRESHOLD,
26
+ shouldCompact,
27
+ } from "../domains/session/compaction/auto.js";
28
+ import type { CompactResult } from "../domains/session/compaction/compact.js";
29
+ import { maskStaleObservations } from "../domains/session/compaction/mask-observations.js";
30
+ import {
31
+ appendContextSnapshot,
32
+ type CaptureContextSnapshotInput,
33
+ type ContextSnapshot,
34
+ type ContextUsageBreakdown,
35
+ type ContextUsageSnapshot,
36
+ captureContextSnapshot,
37
+ ceilChars,
38
+ contentChars,
39
+ contextUsageSnapshot,
40
+ estimateAgentContextBreakdown,
41
+ estimateAgentContextTokens,
42
+ getLatestContextSnapshot,
43
+ reconcileSnapshot,
44
+ snapshotInputTokens,
45
+ } from "../domains/session/context-accounting.js";
46
+ import { buildContextLedger, type ContextLedger, type PromptCacheStats } from "../domains/session/context-ledger.js";
47
+ import type { SessionContract } from "../domains/session/contract.js";
48
+ import type { CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
49
+ import { appendPromptCompileRecord, type SessionPromptCompileRecord } from "../domains/session/prompt-manifest.js";
50
+ import type { AgentMessage, Usage } from "../engine/types.js";
51
+ import type { ToolRegistry } from "../tools/registry.js";
52
+ import {
53
+ type BackendCacheVerdict,
54
+ backendCacheVerdict,
55
+ extractUserText,
56
+ runtimeSupportsTools,
57
+ sumRunUsage,
58
+ toolNamesFromAgentState,
59
+ } from "./chat-loop-messages.js";
60
+ import { buildReplayAgentMessagesFromTurns } from "./chat-renderer.js";
61
+ import { renderCompactionSummaryLine } from "./renderers/compaction-summary.js";
62
+ import type { TurnMiddleware } from "./turn-middleware.js";
63
+ import type { AgentRuntime, ChatTurnState } from "./turn-state.js";
64
+
65
+ export interface TurnContextDeps {
66
+ state: ChatTurnState;
67
+ getSettings: () => Readonly<ClioSettings>;
68
+ providers: ProvidersContract;
69
+ session?: SessionContract | undefined;
70
+ prompts?: PromptsContract | undefined;
71
+ toolRegistry?: ToolRegistry | undefined;
72
+ observability?: ObservabilityContract | undefined;
73
+ bus?: SafeEventBus | undefined;
74
+ readSessionEntries?: (() => ReadonlyArray<SessionEntry>) | undefined;
75
+ autoCompact?: ((instructions?: string, trigger?: CompactionTrigger) => Promise<CompactResult | null>) | undefined;
76
+ getMemorySection?: (() => string) | undefined;
77
+ middleware: TurnMiddleware;
78
+ emitNotice: (text: string) => void;
79
+ }
80
+
81
+ export interface LiveContextEstimate {
82
+ tokens: number;
83
+ contextWindow: number;
84
+ breakdown: ReturnType<typeof estimateAgentContextBreakdown>;
85
+ }
86
+
87
+ export interface TurnContext {
88
+ ensureSessionPrompt(agentRuntime: AgentRuntime): Promise<CompiledSessionPrompt | null>;
89
+ logPromptCompileIfPending(): void;
90
+ invalidateSessionPromptCache(): void;
91
+ addWorkingContextPaths(paths: ReadonlyArray<string>): void;
92
+ captureRuntimeContextSnapshot(
93
+ agentRuntime: AgentRuntime,
94
+ turnId: string,
95
+ compactionThreshold: number | null,
96
+ extra?: Partial<CaptureContextSnapshotInput>,
97
+ ): ContextSnapshot;
98
+ setCurrentSnapshot(snapshot: ContextSnapshot): void;
99
+ persistContextSnapshot(snapshot: ContextSnapshot): void;
100
+ flushReconciledSnapshot(): void;
101
+ /** Reconcile the live snapshot against one API call's provider usage. */
102
+ reconcileUsage(usage: Usage): void;
103
+ /**
104
+ * Prompt-side tokens the current snapshot accounts for. The prompt of an
105
+ * in-flight call is spent whatever the operator does next, so an interrupted
106
+ * turn records this rather than zero. 0 when no snapshot exists yet.
107
+ */
108
+ promptSideTokens(): number;
109
+ liveContextEstimate(agentRuntime: AgentRuntime, pendingUserText?: string): LiveContextEstimate;
110
+ refreshAgentMessagesFromSession(agentRuntime: AgentRuntime): ReadonlyArray<SessionEntry>;
111
+ runAutoCompact(
112
+ agentRuntime: AgentRuntime,
113
+ force: boolean,
114
+ instructions?: string,
115
+ triggerOverride?: CompactionTrigger,
116
+ pendingUserText?: string,
117
+ ): Promise<boolean>;
118
+ postToolContinuationGuard(
119
+ agentRuntime: AgentRuntime,
120
+ signal?: AbortSignal,
121
+ ): Promise<
122
+ | {
123
+ context: { systemPrompt: string; messages: AgentMessage[]; tools: AgentRuntime["agent"]["state"]["tools"] };
124
+ model: AgentRuntime["agent"]["state"]["model"];
125
+ thinkingLevel: AgentRuntime["agent"]["state"]["thinkingLevel"];
126
+ }
127
+ | undefined
128
+ >;
129
+ contextUsage(): ContextUsageSnapshot;
130
+ contextLedger(): ContextLedger;
131
+ emitContextWindowWarningTransition(warning: string | null): void;
132
+ /** Consume disturbances since the last settled run (T3.3 honesty). */
133
+ consumeExpectedColdReasons(runtimeId: string): void;
134
+ /** Prompt-cache record for one persisted assistant call, with cold-reason stamp. */
135
+ promptCachePayloadForAssistant(usage: Usage): Record<string, unknown>;
136
+ /** Record the settled run's cache summary for /context. */
137
+ noteRunCacheSummary(messages: ReadonlyArray<AgentMessage>, runFirstCallVerdict: BackendCacheVerdict | null): void;
138
+ resetForSession(): void;
139
+ dispose(): void;
140
+ }
141
+
142
+ export function createTurnContext(deps: TurnContextDeps): TurnContext {
143
+ const { state, middleware } = deps;
144
+ const compactionTrigger = new AutoCompactionTrigger<CompactResult | null>();
145
+
146
+ let currentContextSnapshot: ContextSnapshot | null = null;
147
+ let lastCompactionEvent: { stage: string; tokensBefore: number; tokensAfter: number; trigger: string } | null = null;
148
+ // Last settled run's provider cache usage plus whether the compiled system
149
+ // prompt was reused. Shown together in /context so "prompt reused" can
150
+ // never imply provider cache reuse the backend did not report.
151
+ let lastPromptCache: PromptCacheStats | null = null;
152
+ let lastSystemPromptReused = false;
153
+ // The session system prompt, compiled once per session. Recompiles happen
154
+ // only on explicit events: the compile key (target, model, safety level,
155
+ // session id) changes, or a config hot-reload invalidates the cache. A
156
+ // recompile that changes the prompt text appends a "promptRecompiled"
157
+ // ledger entry so a cold provider cache is always explainable.
158
+ let sessionPrompt: CompiledSessionPrompt | null = null;
159
+ let sessionPromptKey: string | null = null;
160
+ const sessionWorkingContextPaths = new Set<string>();
161
+ let pendingPromptLogEntry: SessionPromptCompileRecord | null = null;
162
+
163
+ // Cache-disturbance honesty (T3.3). Dispatch traffic and history
164
+ // compaction invalidate a single-slot local backend's prefix cache.
165
+ // Accumulate every disturbance since the last settled run; the next
166
+ // submit consumes the set, stamps `promptCache.expectedColdReasons` on
167
+ // its first assistant entry, and shows one dim notice.
168
+ const pendingColdReasons = new Set<string>();
169
+ let runExpectedColdReasons: string[] = [];
170
+ let stampColdReasonsPending = false;
171
+ const unsubscribeColdReasonSources = [
172
+ ...[BusChannels.DispatchStarted, BusChannels.DispatchCompleted, BusChannels.DispatchFailed].map(
173
+ (channel) =>
174
+ deps.bus?.on(channel, () => {
175
+ pendingColdReasons.add("dispatch");
176
+ }) ?? null,
177
+ ),
178
+ ...[BusChannels.CompactionBegin, BusChannels.CompactionEnd].map(
179
+ (channel) =>
180
+ deps.bus?.on(channel, () => {
181
+ pendingColdReasons.add("compaction");
182
+ }) ?? null,
183
+ ),
184
+ ];
185
+
186
+ /**
187
+ * True when the in-memory snapshot has been reconciled against provider
188
+ * usage since it was last persisted. A tool-calling turn reconciles once
189
+ * per API call; only the final reconciled state is written to the JSONL
190
+ * ledger, when the run settles. Any persist (turn submit, compaction,
191
+ * flush) clears the flag because it writes the current snapshot state.
192
+ */
193
+ let snapshotPersistPending = false;
194
+
195
+ /**
196
+ * Publish the window-resolution warning only on transitions (appeared,
197
+ * changed, cleared). ensureRuntime runs on every submit; re-emitting the
198
+ * same state each turn would spam every ContextWarning subscriber.
199
+ */
200
+ let lastContextWindowWarning: string | null = null;
201
+
202
+ const persistContextSnapshot = (snapshot: ContextSnapshot): void => {
203
+ const currentSession = deps.session?.current();
204
+ if (currentSession) appendContextSnapshot(currentSession, snapshot);
205
+ snapshotPersistPending = false;
206
+ };
207
+
208
+ /**
209
+ * Capture a context snapshot from the runtime's live agent state. All
210
+ * capture sites (turn submit, both compaction paths) flow through this
211
+ * helper so window resolution and category decomposition stay identical.
212
+ */
213
+ const captureRuntimeContextSnapshot = (
214
+ agentRuntime: AgentRuntime,
215
+ turnId: string,
216
+ compactionThreshold: number | null,
217
+ extra: Partial<CaptureContextSnapshotInput> = {},
218
+ ): ContextSnapshot => {
219
+ const details = agentRuntime.runtimeResolution.contextWindowDetails;
220
+ // The snapshot row belongs to the named Clio session whose ledger it is
221
+ // appended to; the engine agent's own sessionId is unset in practice.
222
+ return captureContextSnapshot({
223
+ sessionId: deps.session?.current()?.id ?? agentRuntime.agent.sessionId ?? "unknown",
224
+ turnId,
225
+ providerId: agentRuntime.targetId,
226
+ runtimeId: agentRuntime.runtimeId,
227
+ modelId: agentRuntime.wireModelId,
228
+ systemPrompt: agentRuntime.agent.state.systemPrompt,
229
+ conversationMessages: agentRuntime.agent.state.messages,
230
+ activeToolSchemas: agentRuntime.agent.state.tools,
231
+ desiredContextWindow: details.desiredContextWindow,
232
+ effectiveContextWindow: details.effectiveContextWindow,
233
+ contextWindowSource: details.contextWindowSource,
234
+ compactionThreshold,
235
+ ...extra,
236
+ });
237
+ };
238
+
239
+ /**
240
+ * Output tokens of the in-flight response. While streaming, estimate from
241
+ * the partial assistant tail; once the turn settles, the reconciled
242
+ * snapshot carries the provider-reported value.
243
+ */
244
+ const liveStreamingOutputTokens = (): number => {
245
+ if (!state.runtime) return 0;
246
+ if (state.streaming) {
247
+ const messages = state.runtime.agent.state.messages;
248
+ const lastMsg = messages[messages.length - 1] as { role?: string; payload?: unknown; content?: unknown } | undefined;
249
+ if (lastMsg && lastMsg.role === "assistant") {
250
+ return ceilChars(contentChars(lastMsg.payload ?? lastMsg.content));
251
+ }
252
+ return 0;
253
+ }
254
+ return currentContextSnapshot?.categories.streaming || 0;
255
+ };
256
+
257
+ /**
258
+ * Tokens for the submitted text that the snapshot has not yet counted.
259
+ * The turn snapshot is captured before the user message joins the
260
+ * conversation, so until the provider reconciles (or a fresh capture sees
261
+ * the text in the conversation) the pending input occupies window space
262
+ * that no category covers. Zero once reconciled or once the text landed.
263
+ */
264
+ const pendingUserInputTokens = (): number => {
265
+ const snapshot = currentContextSnapshot;
266
+ if (!snapshot?.pendingUserInput) return 0;
267
+ if (snapshot.sources.total === "reconciled") return 0;
268
+ if (snapshot.turnId !== "pending") {
269
+ const pending = snapshot.pendingUserInput;
270
+ const landed = (snapshot.conversationMessages ?? []).some(
271
+ (message) => extractUserText(message as AgentMessage) === pending,
272
+ );
273
+ if (landed) return 0;
274
+ }
275
+ return ceilChars(snapshot.pendingUserInput.length);
276
+ };
277
+
278
+ const liveContextEstimate = (agentRuntime: AgentRuntime, pendingUserText?: string): LiveContextEstimate => {
279
+ const contextWindow = agentRuntime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
280
+ const estimateInput = {
281
+ systemPrompt: agentRuntime.agent.state.systemPrompt,
282
+ messages: agentRuntime.agent.state.messages,
283
+ tools: agentRuntime.agent.state.tools,
284
+ ...(pendingUserText !== undefined ? { pendingUserText } : {}),
285
+ };
286
+ return {
287
+ tokens: estimateAgentContextTokens(estimateInput),
288
+ contextWindow,
289
+ breakdown: estimateAgentContextBreakdown(estimateInput),
290
+ };
291
+ };
292
+
293
+ const refreshAgentMessagesFromSession = (agentRuntime: AgentRuntime): ReadonlyArray<SessionEntry> => {
294
+ const refreshedEntries = deps.readSessionEntries?.() ?? [];
295
+ agentRuntime.agent.state.messages = buildReplayAgentMessagesFromTurns(refreshedEntries, {
296
+ ...(state.lastTurnId ? { activeLeafTurnId: state.lastTurnId } : {}),
297
+ });
298
+ state.replayedContextMessages = [];
299
+ return refreshedEntries;
300
+ };
301
+
302
+ // Compaction rides the context island as a single-phase "compaction"
303
+ // activity (rendered as "Context Compact"). Each stage brackets its work
304
+ // with a started/completed pair; a throwing summary emits failed. The
305
+ // island already knows this kind and phase, and `deps.bus` is optional.
306
+ const emitCompactionActivity = (status: ContextActivityStatus, message: string): void => {
307
+ deps.bus?.emit(BusChannels.ContextActivity, {
308
+ kind: "compaction",
309
+ phase: "done",
310
+ status,
311
+ message,
312
+ at: Date.now(),
313
+ });
314
+ };
315
+ const compactionFailureMessage = (error: unknown): string =>
316
+ `compaction failed: ${error instanceof Error ? error.message : String(error)}`;
317
+
318
+ const recordCompactionUsage = (agentRuntime: AgentRuntime, result: CompactResult): void => {
319
+ const usage = result.usage;
320
+ if (!usage || !deps.observability) return;
321
+ if (usage.totalTokens <= 0 && usage.cost.total <= 0) return;
322
+ deps.observability.recordTokens(
323
+ agentRuntime.targetId,
324
+ agentRuntime.wireModelId,
325
+ usage.totalTokens,
326
+ usage.cost.total,
327
+ {
328
+ input: usage.input,
329
+ output: usage.output,
330
+ cacheRead: usage.cacheRead,
331
+ cacheWrite: usage.cacheWrite,
332
+ reasoningTokens: usage.reasoning,
333
+ totalTokens: usage.totalTokens,
334
+ apiCalls: Math.max(1, Math.round(usage.apiCalls)),
335
+ },
336
+ agentRuntime.runtimeResolution.costProvenance,
337
+ );
338
+ };
339
+
340
+ /**
341
+ * Two-mechanism context protection. When pressure crosses the single
342
+ * threshold, first mask the bodies of tool observations older than
343
+ * `excludeLastTurns` (cheap, no LLM call). If pressure stays above the
344
+ * threshold, delegate to the pi-style LLM compaction path: append a
345
+ * compaction summary entry, then replay from the session view.
346
+ *
347
+ * `force = true` skips the pressure check and the mask pre-stage and runs
348
+ * the LLM summary directly. Used for `/compact`, CLIO_CODER_FORCE_COMPACT=1,
349
+ * and overflow recovery.
350
+ */
351
+ const runAutoCompact = async (
352
+ agentRuntime: AgentRuntime,
353
+ force: boolean,
354
+ instructions?: string,
355
+ triggerOverride?: CompactionTrigger,
356
+ pendingUserText?: string,
357
+ ): Promise<boolean> => {
358
+ if (!deps.autoCompact || !deps.readSessionEntries) return false;
359
+ const settings = deps.getSettings();
360
+ const cfg = settings.compaction;
361
+ const autoEnabled = cfg?.auto !== false;
362
+ if (!force && !autoEnabled) return false;
363
+
364
+ const compactionThreshold = cfg?.threshold ?? DEFAULT_COMPACTION_THRESHOLD;
365
+ const trigger: CompactionTrigger = triggerOverride ?? (force ? "force" : "auto");
366
+
367
+ if (!force) {
368
+ const estimate = liveContextEstimate(agentRuntime, pendingUserText);
369
+ const verdict = shouldCompact(estimate.tokens, compactionThreshold, estimate.contextWindow);
370
+ if (!verdict.shouldCompact) return false;
371
+
372
+ // Mechanism B pre-stage: mask stale observations before paying for
373
+ // an LLM summary. History rewrites here invalidate the backend
374
+ // prefix cache; the "compaction" expectedColdReasons stamp from the
375
+ // CompactionBegin/End subscription explains the next cold turn.
376
+ if (deps.session?.current()) {
377
+ const beforeSnapshotId = currentContextSnapshot?.snapshotId ?? null;
378
+ let masked: ReturnType<typeof maskStaleObservations>;
379
+ try {
380
+ masked = maskStaleObservations(deps.readSessionEntries() ?? [], cfg?.excludeLastTurns ?? 6);
381
+ } catch (error) {
382
+ middleware.fireCompactionHook("mask_observations", trigger, estimate.tokens);
383
+ deps.bus?.emit(BusChannels.CompactionBegin, { trigger, at: Date.now() });
384
+ emitCompactionActivity("started", "compacting context (mask stage)");
385
+ emitCompactionActivity("failed", compactionFailureMessage(error));
386
+ deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
387
+ throw error;
388
+ }
389
+ if (masked.changed) {
390
+ middleware.fireCompactionHook("mask_observations", trigger, estimate.tokens);
391
+ deps.bus?.emit(BusChannels.CompactionBegin, { trigger, at: Date.now() });
392
+ emitCompactionActivity("started", "compacting context (mask stage)");
393
+ deps.session.replaceEntries(masked.entries);
394
+ refreshAgentMessagesFromSession(agentRuntime);
395
+ deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
396
+
397
+ const postMaskSnapshot = captureRuntimeContextSnapshot(
398
+ agentRuntime,
399
+ state.activeUserTurnId || "compaction",
400
+ compactionThreshold,
401
+ );
402
+ currentContextSnapshot = postMaskSnapshot;
403
+ persistContextSnapshot(postMaskSnapshot);
404
+
405
+ const tokensAfterMask = snapshotInputTokens(postMaskSnapshot);
406
+ lastCompactionEvent = {
407
+ stage: "mask_observations",
408
+ tokensBefore: estimate.tokens,
409
+ tokensAfter: tokensAfterMask,
410
+ trigger,
411
+ };
412
+ deps.bus?.emit(BusChannels.ContextPruned, {
413
+ stage: "mask_observations",
414
+ pressure: verdict.pressure,
415
+ tokensBefore: estimate.tokens,
416
+ tokensAfter: tokensAfterMask,
417
+ maskedObservations: masked.maskedObservations,
418
+ maskedThinkingBlocks: masked.maskedThinkingBlocks,
419
+ maskedThinkingChars: masked.maskedThinkingChars,
420
+ trigger,
421
+ snapshotIdBefore: beforeSnapshotId,
422
+ snapshotIdAfter: postMaskSnapshot.snapshotId,
423
+ at: Date.now(),
424
+ } satisfies ContextPrunedPayload);
425
+ emitCompactionActivity("completed", `${masked.maskedObservations} observations masked`);
426
+ const thinkingNote =
427
+ masked.maskedThinkingBlocks > 0
428
+ ? `, ${masked.maskedThinkingBlocks} thinking blocks dropped (~${masked.maskedThinkingChars} chars)`
429
+ : "";
430
+ deps.emitNotice(
431
+ `[context engine] mask_observations: ${masked.maskedObservations} observations masked${thinkingNote}; ~${estimate.tokens} tokens -> ~${tokensAfterMask} tokens`,
432
+ );
433
+
434
+ const after = liveContextEstimate(agentRuntime, pendingUserText);
435
+ if (!shouldCompact(after.tokens, compactionThreshold, after.contextWindow).shouldCompact) return true;
436
+ }
437
+ }
438
+ }
439
+
440
+ middleware.fireCompactionHook("llm_summary", trigger);
441
+ deps.bus?.emit(BusChannels.CompactionBegin, { trigger, at: Date.now() });
442
+ emitCompactionActivity("started", "compacting context (summary)");
443
+ let result: CompactResult | null = null;
444
+ const beforeSnapshotId = currentContextSnapshot?.snapshotId ?? null;
445
+ try {
446
+ result = await compactionTrigger.fire(() => (deps.autoCompact ?? (async () => null))(instructions, trigger));
447
+ } catch (error) {
448
+ emitCompactionActivity("failed", compactionFailureMessage(error));
449
+ throw error;
450
+ } finally {
451
+ deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
452
+ }
453
+ if (!result || result.summary.length === 0) {
454
+ emitCompactionActivity("completed", "nothing to compact");
455
+ return false;
456
+ }
457
+
458
+ // The summarization call spends tokens on the same target the turn would
459
+ // have. The ledger entry carries its usage for a later reseed; this is the
460
+ // live sink, so `/cost` and the footer move the moment /context compact
461
+ // returns instead of staying byte-identical to before it ran.
462
+ recordCompactionUsage(agentRuntime, result);
463
+
464
+ refreshAgentMessagesFromSession(agentRuntime);
465
+
466
+ const postCompactSnapshot = captureRuntimeContextSnapshot(
467
+ agentRuntime,
468
+ state.activeUserTurnId || "compaction",
469
+ compactionThreshold,
470
+ );
471
+ currentContextSnapshot = postCompactSnapshot;
472
+ persistContextSnapshot(postCompactSnapshot);
473
+
474
+ const tokensAfter = snapshotInputTokens(postCompactSnapshot);
475
+ lastCompactionEvent = {
476
+ stage: "llm_summary",
477
+ tokensBefore: result.tokensBefore,
478
+ tokensAfter,
479
+ trigger,
480
+ };
481
+ deps.bus?.emit(BusChannels.ContextPruned, {
482
+ stage: "llm_summary",
483
+ tokensBefore: result.tokensBefore,
484
+ tokensAfter,
485
+ trigger,
486
+ snapshotIdBefore: beforeSnapshotId,
487
+ snapshotIdAfter: postCompactSnapshot.snapshotId,
488
+ at: Date.now(),
489
+ } satisfies ContextPrunedPayload);
490
+ emitCompactionActivity("completed", `compacted ~${result.tokensBefore} -> ~${tokensAfter} tokens`);
491
+
492
+ deps.emitNotice(
493
+ renderCompactionSummaryLine({
494
+ messagesSummarized: result.messagesSummarized,
495
+ summaryChars: result.summary.length,
496
+ tokensBefore: result.tokensBefore,
497
+ isSplitTurn: result.isSplitTurn,
498
+ }),
499
+ );
500
+ return true;
501
+ };
502
+
503
+ const toolResultTail = (agentRuntime: AgentRuntime): boolean => {
504
+ const messages = agentRuntime.agent.state.messages;
505
+ const tail = messages[messages.length - 1] as AgentMessage | undefined;
506
+ return !!tail && typeof tail === "object" && tail !== null && "role" in tail && tail.role === "toolResult";
507
+ };
508
+
509
+ const continuationContextUpdate = (agentRuntime: AgentRuntime) => ({
510
+ context: {
511
+ systemPrompt: agentRuntime.agent.state.systemPrompt,
512
+ messages: [...agentRuntime.agent.state.messages],
513
+ tools: [...agentRuntime.agent.state.tools],
514
+ },
515
+ model: agentRuntime.agent.state.model,
516
+ thinkingLevel: agentRuntime.agent.state.thinkingLevel,
517
+ });
518
+
519
+ return {
520
+ captureRuntimeContextSnapshot,
521
+ persistContextSnapshot,
522
+ liveContextEstimate,
523
+ refreshAgentMessagesFromSession,
524
+ runAutoCompact,
525
+
526
+ setCurrentSnapshot(snapshot: ContextSnapshot): void {
527
+ currentContextSnapshot = snapshot;
528
+ },
529
+
530
+ flushReconciledSnapshot(): void {
531
+ if (!snapshotPersistPending || !currentContextSnapshot) return;
532
+ persistContextSnapshot(currentContextSnapshot);
533
+ },
534
+
535
+ reconcileUsage(usage: Usage): void {
536
+ if (!currentContextSnapshot) return;
537
+ // Reconcile in memory on every API call so the live meters
538
+ // track usage; persistence waits for the run to settle.
539
+ currentContextSnapshot = reconcileSnapshot(currentContextSnapshot, usage);
540
+ snapshotPersistPending = true;
541
+ },
542
+
543
+ promptSideTokens(): number {
544
+ return currentContextSnapshot ? snapshotInputTokens(currentContextSnapshot) : 0;
545
+ },
546
+
547
+ /**
548
+ * Ensure the session system prompt is compiled and applied to the live
549
+ * agent. Compiles only when the compile key (target, model, safety
550
+ * level, session id) changes or a config hot-reload invalidated the
551
+ * cache; every other submit reuses the cached prompt byte-for-byte. A
552
+ * compile whose text differs from the previous prompt queues a
553
+ * "promptRecompiled" ledger entry (written once the session exists).
554
+ */
555
+ async ensureSessionPrompt(agentRuntime: AgentRuntime): Promise<CompiledSessionPrompt | null> {
556
+ if (!deps.prompts) return null;
557
+ const settings = deps.getSettings();
558
+ const autonomy = settings.autonomy ?? "auto-edit";
559
+ const sessionId = deps.session?.current()?.id ?? "";
560
+ const workingContextKey = [...sessionWorkingContextPaths].sort().join("\0");
561
+ const key = `${agentRuntime.targetId}|${agentRuntime.wireModelId}|${autonomy}|${sessionId}|${workingContextKey}`;
562
+ if (sessionPrompt && sessionPromptKey === key) {
563
+ lastSystemPromptReused = true;
564
+ return sessionPrompt;
565
+ }
566
+ const modelState = agentRuntime.agent.state.model as
567
+ | (typeof agentRuntime.agent.state.model & { clio?: { quirks?: LocalModelQuirks } })
568
+ | undefined;
569
+ const contextWindow = typeof modelState?.contextWindow === "number" ? modelState.contextWindow : null;
570
+ const guidance = modelState?.clio?.quirks?.thinking?.guidance;
571
+ // Per-tool prompt hints come from registry metadata, derived once from
572
+ // the frozen surface per compile. The compiler renders them sorted by
573
+ // tool name, so the compiled text stays byte-stable for a given surface.
574
+ const toolNames = toolNamesFromAgentState(agentRuntime.agent.state.tools);
575
+ const toolPromptHints = toolNames.flatMap((name) => {
576
+ const hint = deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint;
577
+ return hint ? [{ tool: name, hint }] : [];
578
+ });
579
+ const sessionInputs: SessionPromptInputs = {
580
+ provider: agentRuntime.targetId,
581
+ model: agentRuntime.wireModelId,
582
+ contextWindow,
583
+ providerSupportsTools: runtimeSupportsTools(agentRuntime),
584
+ toolNames,
585
+ ...(guidance ? { thinkingGuidance: guidance } : {}),
586
+ ...(toolPromptHints.length > 0 ? { toolPromptHints } : {}),
587
+ };
588
+ if (deps.getMemorySection) {
589
+ try {
590
+ const memorySection = deps.getMemorySection();
591
+ if (memorySection.length > 0) sessionInputs.memorySection = memorySection;
592
+ } catch (err) {
593
+ deps.emitNotice(
594
+ `[Clio Coder] memory load failed; continuing without memory injection: ${err instanceof Error ? err.message : String(err)}`,
595
+ );
596
+ }
597
+ }
598
+ try {
599
+ const result = await deps.prompts.compileSessionPrompt({
600
+ sessionInputs,
601
+ autonomy,
602
+ cwd: process.cwd(),
603
+ workingContextPaths: [...sessionWorkingContextPaths],
604
+ });
605
+ const previousHash = sessionPrompt?.systemPromptHash ?? null;
606
+ const changed = agentRuntime.agent.state.systemPrompt !== result.systemPrompt;
607
+ if (changed) {
608
+ agentRuntime.agent.state.systemPrompt = result.systemPrompt;
609
+ pendingPromptLogEntry = {
610
+ at: new Date().toISOString(),
611
+ previousHash,
612
+ systemPromptHash: result.systemPromptHash,
613
+ tokenEstimate: result.tokenEstimate,
614
+ thinkingLevel: agentRuntime.agent.state.thinkingLevel ?? null,
615
+ projectPreload: result.projectPreload ?? null,
616
+ sections: result.sections.map((s) => ({ id: s.id, tokenEstimate: s.tokenEstimate })),
617
+ fragments: result.fragmentManifest.map((f) => ({
618
+ id: f.id,
619
+ relPath: f.relPath,
620
+ contentHash: f.contentHash,
621
+ dynamic: f.dynamic,
622
+ })),
623
+ };
624
+ }
625
+ lastSystemPromptReused = !changed;
626
+ sessionPrompt = result;
627
+ sessionPromptKey = key;
628
+ return result;
629
+ } catch (err) {
630
+ deps.emitNotice(
631
+ `[Clio Coder] prompt compile failed; using fallback identity: ${err instanceof Error ? err.message : String(err)}`,
632
+ );
633
+ return null;
634
+ }
635
+ },
636
+
637
+ /**
638
+ * Write the queued prompt-compile ledger entry and its full manifest
639
+ * record. Deferred until after the user turn is appended so the session
640
+ * is guaranteed to exist. The current.jsonl entry stays hash-only; the
641
+ * section/fragment breakdown goes to the prompt-manifest.jsonl sibling.
642
+ */
643
+ logPromptCompileIfPending(): void {
644
+ const currentMeta = deps.session?.current();
645
+ if (!pendingPromptLogEntry || !currentMeta) return;
646
+ const entry = pendingPromptLogEntry;
647
+ pendingPromptLogEntry = null;
648
+ try {
649
+ deps.session?.appendEntry({
650
+ kind: "custom",
651
+ customType: "promptRecompiled",
652
+ parentTurnId: state.lastTurnId,
653
+ data: {
654
+ previousHash: entry.previousHash,
655
+ hash: entry.systemPromptHash,
656
+ tokenEstimate: entry.tokenEstimate,
657
+ },
658
+ });
659
+ } catch {
660
+ // Ledger logging is diagnostics, not control flow; never abort a turn.
661
+ }
662
+ appendPromptCompileRecord(currentMeta, entry);
663
+ },
664
+
665
+ invalidateSessionPromptCache(): void {
666
+ sessionPromptKey = null;
667
+ },
668
+
669
+ addWorkingContextPaths(paths: ReadonlyArray<string>): void {
670
+ for (const path of paths) sessionWorkingContextPaths.add(path);
671
+ },
672
+
673
+ async postToolContinuationGuard(agentRuntime: AgentRuntime, signal?: AbortSignal) {
674
+ if (signal?.aborted || !toolResultTail(agentRuntime)) return undefined;
675
+ const before = liveContextEstimate(agentRuntime);
676
+ if (before.contextWindow <= 0 || before.tokens <= 0) return undefined;
677
+
678
+ const settings = deps.getSettings();
679
+ const threshold = settings.compaction?.threshold ?? DEFAULT_COMPACTION_THRESHOLD;
680
+ const verdict = shouldCompact(before.tokens, threshold, before.contextWindow);
681
+ let compacted = false;
682
+ if (verdict.shouldCompact) {
683
+ try {
684
+ compacted = await runAutoCompact(agentRuntime, false, undefined, "auto");
685
+ } catch (err) {
686
+ throw new Error(
687
+ `[Clio Coder] post-tool context guard could not compact before continuation: ${err instanceof Error ? err.message : String(err)}`,
688
+ );
689
+ }
690
+ }
691
+
692
+ const after = liveContextEstimate(agentRuntime);
693
+ if (after.tokens >= after.contextWindow) {
694
+ throw new Error(
695
+ `[Clio Coder] post-tool context guard stopped continuation before provider call: estimated ${after.tokens} tokens exceeds reported context window ${after.contextWindow}. Use /compact, narrower reads, or a follow-up turn with smaller observations.`,
696
+ );
697
+ }
698
+ return compacted ? continuationContextUpdate(agentRuntime) : undefined;
699
+ },
700
+
701
+ contextUsage(): ContextUsageSnapshot {
702
+ if (!state.runtime) return contextUsageSnapshot(null, 0);
703
+ const effectiveWindow = state.runtime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
704
+ if (!currentContextSnapshot) {
705
+ return contextUsageSnapshot(null, effectiveWindow);
706
+ }
707
+
708
+ const pendingTokens = pendingUserInputTokens();
709
+ const totalUsed = snapshotInputTokens(currentContextSnapshot) + pendingTokens + liveStreamingOutputTokens();
710
+ const breakdown: ContextUsageBreakdown = {
711
+ systemPromptTokens: currentContextSnapshot.categories.system,
712
+ messageTokens: currentContextSnapshot.categories.messages,
713
+ pendingUserTokens: pendingTokens,
714
+ toolSchemaTokens: currentContextSnapshot.categories.tools,
715
+ };
716
+ return contextUsageSnapshot(totalUsed > 0 ? totalUsed : null, effectiveWindow, breakdown);
717
+ },
718
+
719
+ contextLedger(): ContextLedger {
720
+ const settings = deps.getSettings();
721
+ const compactionThreshold = settings.compaction?.threshold ?? null;
722
+ const compactionAuto = settings.compaction?.auto !== false;
723
+ if (!state.runtime) {
724
+ return buildContextLedger({
725
+ provider: settings.orchestrator?.target ?? null,
726
+ model: settings.orchestrator?.model ?? null,
727
+ contextWindow: 0,
728
+ compactionThreshold,
729
+ compactionAuto,
730
+ });
731
+ }
732
+ const windowDetails = state.runtime.runtimeResolution.contextWindowDetails;
733
+ const effectiveWindow = windowDetails.effectiveContextWindow;
734
+
735
+ const provider = state.runtime.targetId ?? settings.orchestrator?.target ?? null;
736
+ const model = state.runtime.wireModelId ?? settings.orchestrator?.model ?? null;
737
+
738
+ if (!currentContextSnapshot) {
739
+ return buildContextLedger({
740
+ provider,
741
+ model,
742
+ contextWindow: effectiveWindow,
743
+ contextWindowSource: windowDetails.contextWindowSource,
744
+ toolCount: state.runtime.agent.state.tools.length,
745
+ compactionThreshold,
746
+ compactionAuto,
747
+ promptCache: lastPromptCache,
748
+ });
749
+ }
750
+
751
+ const streamingOutput = liveStreamingOutputTokens();
752
+ const pendingTokens = pendingUserInputTokens();
753
+ const totalUsed = snapshotInputTokens(currentContextSnapshot) + pendingTokens + streamingOutput;
754
+ const measured = currentContextSnapshot.sources.total === "reconciled";
755
+
756
+ return buildContextLedger({
757
+ provider,
758
+ model,
759
+ contextWindow: effectiveWindow,
760
+ contextWindowSource: windowDetails.contextWindowSource,
761
+ compactionThreshold,
762
+ compactionAuto,
763
+ systemPromptTokens: currentContextSnapshot.categories.system,
764
+ toolSchemaTokens: currentContextSnapshot.categories.tools,
765
+ // Persisted snapshots strip the captured schemas; fall back to
766
+ // the live agent state after a session resume.
767
+ toolCount: currentContextSnapshot.activeToolSchemas?.length ?? state.runtime.agent.state.tools.length,
768
+ messageTokens: currentContextSnapshot.categories.messages,
769
+ agentsTokens: currentContextSnapshot.categories.agents,
770
+ skillsTokens: currentContextSnapshot.categories.skills,
771
+ memoryTokens: currentContextSnapshot.categories.memory,
772
+ projectTokens: currentContextSnapshot.categories.project,
773
+ projectPreload: sessionPrompt?.projectPreload?.label ?? null,
774
+ pendingTokens,
775
+ streamingTokens: streamingOutput,
776
+ liveTotalTokens: totalUsed > 0 ? totalUsed : null,
777
+ measured,
778
+ lastCompaction: lastCompactionEvent,
779
+ promptCache: lastPromptCache,
780
+ });
781
+ },
782
+
783
+ emitContextWindowWarningTransition(warning: string | null): void {
784
+ if (warning === lastContextWindowWarning) return;
785
+ lastContextWindowWarning = warning;
786
+ deps.bus?.emit(BusChannels.ContextWarning, { warning } satisfies ContextWarningPayload);
787
+ },
788
+
789
+ consumeExpectedColdReasons(runtimeId: string): void {
790
+ // Cache-disturbance honesty (T3.3): consume disturbances since
791
+ // the last settled run. Only single-slot local backends lose their
792
+ // prefix cache to interleaved work, so only local-native targets
793
+ // stamp reasons and notify; other tiers just clear the set.
794
+ runExpectedColdReasons = [];
795
+ stampColdReasonsPending = false;
796
+ if (pendingColdReasons.size > 0) {
797
+ const reasons = [...pendingColdReasons];
798
+ pendingColdReasons.clear();
799
+ if (deps.providers.getRuntime(runtimeId)?.tier === "local-native") {
800
+ runExpectedColdReasons = reasons;
801
+ stampColdReasonsPending = true;
802
+ deps.emitNotice(`[context engine] backend prefix cache likely cold this turn: ${reasons.join(", ")}`);
803
+ }
804
+ }
805
+ },
806
+
807
+ promptCachePayloadForAssistant(usage: Usage): Record<string, unknown> {
808
+ // Per-call prompt-cache record (T3.2): provider-reported numbers only,
809
+ // classified by backendCacheVerdict in chat-loop-messages.ts. The
810
+ // run's first persisted call also carries any expected-cold reasons.
811
+ const input = typeof usage.input === "number" ? usage.input : 0;
812
+ const cacheRead = typeof usage.cacheRead === "number" ? usage.cacheRead : 0;
813
+ const cacheWrite = typeof usage.cacheWrite === "number" ? usage.cacheWrite : 0;
814
+ const promptCache: Record<string, unknown> = {
815
+ input,
816
+ cacheRead,
817
+ cacheWrite,
818
+ backendVerdict: backendCacheVerdict(input, cacheRead),
819
+ };
820
+ if (stampColdReasonsPending && runExpectedColdReasons.length > 0) {
821
+ promptCache.expectedColdReasons = [...runExpectedColdReasons];
822
+ stampColdReasonsPending = false;
823
+ }
824
+ return promptCache;
825
+ },
826
+
827
+ noteRunCacheSummary(messages, runFirstCallVerdict): void {
828
+ const cacheSummary = sumRunUsage(messages);
829
+ if (cacheSummary.hadUsage) {
830
+ lastPromptCache = {
831
+ shellReused: lastSystemPromptReused,
832
+ cacheReadTokens: cacheSummary.cacheRead > 0 || cacheSummary.cacheWrite > 0 ? cacheSummary.cacheRead : null,
833
+ cacheWriteTokens: cacheSummary.cacheRead > 0 || cacheSummary.cacheWrite > 0 ? cacheSummary.cacheWrite : null,
834
+ uncachedInputTokens: cacheSummary.input,
835
+ backendVerdict: runFirstCallVerdict,
836
+ };
837
+ }
838
+ },
839
+
840
+ resetForSession(): void {
841
+ lastPromptCache = null;
842
+ lastSystemPromptReused = false;
843
+ sessionPromptKey = null;
844
+ sessionWorkingContextPaths.clear();
845
+ pendingPromptLogEntry = null;
846
+ const session = deps.session?.current();
847
+ currentContextSnapshot = session ? getLatestContextSnapshot(session) : null;
848
+ },
849
+
850
+ dispose(): void {
851
+ for (const unsubscribe of unsubscribeColdReasonSources) unsubscribe?.();
852
+ },
853
+ };
854
+ }