@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,802 @@
1
+ /**
2
+ * Turn runtime ownership: orchestrator target resolution, model synthesis,
3
+ * live-agent construction and model hot-swap, thinking-level reconciliation,
4
+ * capability/reasoning probes, and the run-event pipeline that enriches
5
+ * engine events with timing, observability, persistence, and honesty facts.
6
+ */
7
+
8
+ import { performance } from "node:perf_hooks";
9
+ import type { ClioSettings } from "../core/config.js";
10
+ import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
11
+ import type { ObservabilityContract } from "../domains/observability/contract.js";
12
+ import {
13
+ applyModelCapabilityPatch,
14
+ firstRuntimeResolutionError,
15
+ modelResidencyForStatus,
16
+ type ProvidersContract,
17
+ refineRuntimeTargetWithModelHints,
18
+ resolveRuntimeTarget,
19
+ runtimeResolutionWarnings,
20
+ type TargetStatus,
21
+ targetRequiresAuth,
22
+ } from "../domains/providers/index.js";
23
+ import type { RetrySettings } from "../domains/session/retry.js";
24
+ import type { createEngineAgent } from "../engine/agent.js";
25
+ import { cleanupEngineSessionResources } from "../engine/ai.js";
26
+ import { sanitizeLockedSynthesisMessage } from "../engine/loop-guard.js";
27
+ import {
28
+ patchProviderThinkingPayload,
29
+ patchToolChoiceNamedPayload,
30
+ patchToolChoiceNonePayload,
31
+ } from "../engine/provider-payload.js";
32
+ import type { AgentEvent, AgentMessage, EngineModel, Usage } from "../engine/types.js";
33
+ import type { resolveAgentTools, ToolOutcome, ToolTelemetry } from "../tools/agent-tools.js";
34
+ import {
35
+ type AssistantCallTiming,
36
+ type BackendCacheVerdict,
37
+ backendCacheVerdict,
38
+ extractText,
39
+ extractThinking,
40
+ fallbackIdentityPrompt,
41
+ hasStructuredToolCall,
42
+ isEmptyAbortedAssistantMessage,
43
+ sumRunUsage,
44
+ toolNamesFromAgentState,
45
+ toolResultSummary,
46
+ } from "./chat-loop-messages.js";
47
+ import { assessToolProseLoop, runtimeNarratesToolCalls, shouldAssessToolProse } from "./tool-prose-loop.js";
48
+ import type { TurnContext } from "./turn-context.js";
49
+ import type { TurnMiddleware } from "./turn-middleware.js";
50
+ import type { TurnPersistence } from "./turn-persistence.js";
51
+ import type { AgentRuntime, ChatLoopTarget, ChatTurnState } from "./turn-state.js";
52
+
53
+ const LOCAL_API_KEY_FALLBACK = "clio-local-target";
54
+
55
+ /**
56
+ * Say that the first request will pay for a load, before it does.
57
+ *
58
+ * A self-hosted server loads a model on demand, and a 30B at 4-bit takes tens
59
+ * of seconds off disk. Clio sends the request and waits, which from the outside
60
+ * is indistinguishable from a hang: no spinner explains it, no notice names it,
61
+ * and the operator's next move is usually Ctrl-C. The probe already knows the
62
+ * model is not resident, because llama-swap and LM Studio both report per-model
63
+ * load state; nothing was reading it.
64
+ *
65
+ * Notice only, never a block. The server loads it either way, and a state that
66
+ * says `unknown` says nothing worth interrupting for. Residency comes from the
67
+ * same discovery view the planner budgets against, so a model Clio is planning
68
+ * a loaded window for is never announced as absent.
69
+ */
70
+ export function coldModelNotice(
71
+ status: TargetStatus | null | undefined,
72
+ targetId: string,
73
+ wireModelId: string,
74
+ ): { key: string; message: string } | null {
75
+ const residency = modelResidencyForStatus(status, wireModelId);
76
+ if (residency === "loading") {
77
+ return {
78
+ key: `${targetId}|${wireModelId}|loading`,
79
+ message: `[Clio Coder] ${wireModelId} is still loading on ${targetId}; the first reply waits for it.`,
80
+ };
81
+ }
82
+ if (residency !== "absent") return null;
83
+ return {
84
+ key: `${targetId}|${wireModelId}|unloaded`,
85
+ message: `[Clio Coder] ${wireModelId} is not resident on ${targetId}; the first request loads it, which can take a minute.`,
86
+ };
87
+ }
88
+
89
+ export type AssistantDeltaEvent =
90
+ | {
91
+ type: "text_delta";
92
+ contentIndex: number;
93
+ delta: string;
94
+ partialText: string;
95
+ }
96
+ | {
97
+ type: "thinking_delta";
98
+ contentIndex: number;
99
+ delta: string;
100
+ partialThinking: string;
101
+ };
102
+
103
+ export interface TurnRuntimeDeps {
104
+ state: ChatTurnState;
105
+ getSettings: () => Readonly<ClioSettings>;
106
+ providers: ProvidersContract;
107
+ knownTargets: () => ReadonlySet<string>;
108
+ observability?: ObservabilityContract | undefined;
109
+ createAgent: typeof createEngineAgent;
110
+ middlewareToolChoice: MiddlewareToolChoiceControl;
111
+ persistence: TurnPersistence;
112
+ context: TurnContext;
113
+ middleware: TurnMiddleware;
114
+ retrySettings: () => RetrySettings;
115
+ emit: (event: AgentEvent | AssistantDeltaEvent) => void;
116
+ emitNotice: (text: string) => void;
117
+ /** Tool-call id to its `performance.now()` start mark; spans only, never an instant. */
118
+ toolStartTimes: Map<string, number>;
119
+ }
120
+
121
+ export interface TurnRuntime {
122
+ ensureRuntime(): AgentRuntime | null;
123
+ ensureLiveCapabilitiesForSelectedModel(): Promise<void>;
124
+ cleanupSessionResources(sessionId: string | undefined): void;
125
+ /**
126
+ * Install on the session tool surface so admission verdicts reach the panel.
127
+ * The engine's `tool_execution_end` carries only `isError` and result text,
128
+ * which cannot tell a permission block from a command that ran and exited
129
+ * nonzero; this stream carries the registry's actual verdict.
130
+ */
131
+ toolTelemetry: ToolTelemetry;
132
+ }
133
+
134
+ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
135
+ const { state, context, persistence, middleware, middlewareToolChoice } = deps;
136
+
137
+ /**
138
+ * Authoritative admission outcome per call, keyed by the engine's
139
+ * `toolCallId`, recorded as the registry settles and consumed when the
140
+ * matching `tool_execution_end` arrives. Entries are deleted on consumption;
141
+ * a call whose end event never arrives leaves at most one stale entry, which
142
+ * the next run with the same id would overwrite.
143
+ */
144
+ const toolOutcomes = new Map<string, { outcome: ToolOutcome; reason?: string; durationMs: number }>();
145
+ const toolTelemetry: ToolTelemetry = {
146
+ onFinish(event) {
147
+ if (event.toolCallId === undefined) return;
148
+ toolOutcomes.set(event.toolCallId, {
149
+ outcome: event.outcome,
150
+ ...(event.reason === undefined ? {} : { reason: event.reason }),
151
+ durationMs: event.durationMs,
152
+ });
153
+ },
154
+ };
155
+
156
+ /**
157
+ * Resolution warnings the operator has already been shown, keyed by
158
+ * target+model+message. A resolution runs on every turn, so without this the
159
+ * same context-window warning would print on every submit; without any
160
+ * surfacing at all, it printed nowhere. The chat is the only place an
161
+ * interactive operator will see it: dispatch receipts carry the same facts,
162
+ * but nobody reads a receipt for the run they are in the middle of.
163
+ */
164
+ const announcedResolutionWarnings = new Set<string>();
165
+
166
+ const readTarget = (): ChatLoopTarget | null => {
167
+ const settings = deps.getSettings();
168
+ const targetId = settings.orchestrator.target?.trim();
169
+ const wireModelId = settings.orchestrator.model?.trim();
170
+ if (!targetId || !wireModelId) return null;
171
+ const resolved = resolveRuntimeTarget(deps.providers, {
172
+ targetId,
173
+ wireModelId,
174
+ requestedThinkingLevel: settings.orchestrator.thinkingLevel ?? "off",
175
+ use: "orchestrator",
176
+ requireTools: false,
177
+ requireOutputBudget: true,
178
+ });
179
+ if (!resolved.ok) {
180
+ const message = firstRuntimeResolutionError(resolved.diagnostics) ?? resolved.diagnostics[0]?.message;
181
+ throw new Error(`[Clio Coder] ${message ?? "orchestrator target resolution failed"}`);
182
+ }
183
+ for (const message of runtimeResolutionWarnings(resolved.diagnostics)) {
184
+ const key = `${targetId}|${wireModelId}|${message}`;
185
+ if (announcedResolutionWarnings.has(key)) continue;
186
+ announcedResolutionWarnings.add(key);
187
+ deps.emitNotice(`[Clio Coder] ${message}`);
188
+ }
189
+ return {
190
+ target: resolved.target.target,
191
+ runtime: resolved.target.runtime,
192
+ wireModelId: resolved.target.wireModelId,
193
+ runtimeResolution: resolved.target,
194
+ };
195
+ };
196
+
197
+ /**
198
+ * Probe a self-hosted target once per target+model selection, not on
199
+ * every submit (T3.1). The probe re-runs when the selection key changes
200
+ * (which is also when the runtime is rebuilt or hot-swapped) or after a
201
+ * generous TTL. Failures keep the last known target state; the TTL
202
+ * retries later.
203
+ *
204
+ * Every tier but `cloud` is probed. Only a hosted provider's window is
205
+ * knowable without asking: a self-hosted OpenAI-compatible gateway serves
206
+ * whatever context it was launched with, and that number lives on the
207
+ * server. Restricting this to `local-native` meant an `openai-compat`
208
+ * target ran the whole session on an assumed window while the server was
209
+ * one HTTP GET away from reporting the real one.
210
+ */
211
+ const TARGET_PROBE_TTL_MS = 5 * 60 * 1000;
212
+ let lastTargetProbe: { key: string; at: number } | null = null;
213
+ const ensureLiveCapabilitiesForSelectedModel = async (): Promise<void> => {
214
+ const settings = deps.getSettings();
215
+ const targetId = settings.orchestrator.target?.trim();
216
+ const wireModelId = settings.orchestrator.model?.trim();
217
+ if (!targetId || !wireModelId) return;
218
+ const target = deps.providers.getTarget(targetId);
219
+ if (!target) return;
220
+ const runtimeDesc = deps.providers.getRuntime(target.runtime);
221
+ if (!runtimeDesc || runtimeDesc.tier === "cloud") return;
222
+ const key = `${targetId}|${wireModelId}`;
223
+ const now = Date.now();
224
+ if (lastTargetProbe?.key === key && now - lastTargetProbe.at < TARGET_PROBE_TTL_MS) return;
225
+ lastTargetProbe = { key, at: now };
226
+ let status: Awaited<ReturnType<ProvidersContract["probeTarget"]>> = null;
227
+ try {
228
+ status = await deps.providers.probeTarget(targetId);
229
+ } catch {
230
+ // Fall back to the last known target state.
231
+ }
232
+ announceColdModel(status, targetId, wireModelId);
233
+ };
234
+
235
+ /** One notice per target+model+state, so a repeated probe stays quiet. */
236
+ const announcedColdModels = new Set<string>();
237
+ const announceColdModel = (
238
+ status: Awaited<ReturnType<ProvidersContract["probeTarget"]>>,
239
+ targetId: string,
240
+ wireModelId: string,
241
+ ): void => {
242
+ const notice = coldModelNotice(status, targetId, wireModelId);
243
+ if (!notice) return;
244
+ if (announcedColdModels.has(notice.key)) return;
245
+ announcedColdModels.add(notice.key);
246
+ deps.emitNotice(notice.message);
247
+ };
248
+
249
+ const synthesizeModel = (target: ChatLoopTarget): EngineModel => {
250
+ const kbHit = deps.providers.knowledgeBase?.lookup(target.wireModelId) ?? null;
251
+ const synth = target.runtime.synthesizeModel(target.target, target.wireModelId, kbHit);
252
+ target.runtimeResolution = refineRuntimeTargetWithModelHints(
253
+ target.runtimeResolution,
254
+ synth,
255
+ deps.providers.knowledgeBase,
256
+ );
257
+ applyModelCapabilityPatch(synth, target.runtimeResolution.capabilities);
258
+ return synth;
259
+ };
260
+
261
+ const ensureReasoningProbe = (target: ChatLoopTarget): void => {
262
+ if (deps.providers.getDetectedReasoning(target.target.id, target.wireModelId) !== null) return;
263
+ void deps.providers
264
+ .probeReasoningForModel(target.target.id, target.wireModelId)
265
+ .then((reasoning) => {
266
+ if (
267
+ reasoning !== null &&
268
+ state.runtime &&
269
+ state.runtime.targetId === target.target.id &&
270
+ state.runtime.wireModelId === target.wireModelId
271
+ ) {
272
+ const refreshed = resolveRuntimeTarget(deps.providers, {
273
+ targetId: target.target.id,
274
+ wireModelId: target.wireModelId,
275
+ requestedThinkingLevel: deps.getSettings().orchestrator.thinkingLevel ?? "off",
276
+ use: "orchestrator",
277
+ requireTools: false,
278
+ requireOutputBudget: true,
279
+ });
280
+ if (!refreshed.ok) return;
281
+ const liveModel = state.runtime.agent.state.model;
282
+ const runtimeResolution = liveModel
283
+ ? refineRuntimeTargetWithModelHints(refreshed.target, liveModel, deps.providers.knowledgeBase)
284
+ : refreshed.target;
285
+ if (liveModel) applyModelCapabilityPatch(liveModel, runtimeResolution.capabilities);
286
+ state.runtime.agent.state.thinkingLevel = runtimeResolution.effectiveThinkingLevel;
287
+ state.runtime.runtimeResolution = runtimeResolution;
288
+ }
289
+ })
290
+ .catch(() => {
291
+ // Probe failures are non-fatal; the cache stays cold and /thinking
292
+ // keeps showing the runtime defaults until the next probe attempt.
293
+ });
294
+ };
295
+
296
+ const cleanupSessionResources = (sessionId: string | undefined): void => {
297
+ try {
298
+ cleanupEngineSessionResources(sessionId);
299
+ } catch (err) {
300
+ deps.emitNotice(`[Clio Coder] session resource cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
301
+ }
302
+ };
303
+
304
+ /**
305
+ * One visible line when the requested thinking dial cannot apply as-is
306
+ * (reasoning-class-never model, always-on model, on/off coercion). Emitted
307
+ * where the dial takes effect, once per target+model+request change; the
308
+ * same facts stay inspectable in receipts via runtimeResolution.thinking.
309
+ */
310
+ let lastThinkingNoticeKey: string | null = null;
311
+ const emitThinkingClampNotice = (resolution: ChatLoopTarget["runtimeResolution"]): void => {
312
+ const thinking = resolution.modelRuntime.thinking;
313
+ const notice = thinking.notice.trim();
314
+ if (thinking.noticeKind === "applied" || notice.length === 0) return;
315
+ const key = [
316
+ resolution.targetId,
317
+ resolution.wireModelId,
318
+ resolution.requestedThinkingLevel,
319
+ resolution.effectiveThinkingLevel,
320
+ notice,
321
+ ].join("|");
322
+ if (key === lastThinkingNoticeKey) return;
323
+ lastThinkingNoticeKey = key;
324
+ deps.emitNotice(
325
+ `[Clio Coder] thinking ${resolution.requestedThinkingLevel} -> ${thinking.display}: ${notice} (${resolution.wireModelId})`,
326
+ );
327
+ };
328
+
329
+ const ensureRuntime = (): AgentRuntime | null => {
330
+ const target = readTarget();
331
+ if (!target) return null;
332
+ context.emitContextWindowWarningTransition(target.runtimeResolution?.contextWindowDetails?.warning ?? null);
333
+ if (!deps.knownTargets().has(target.target.id)) {
334
+ throw new Error(
335
+ `[Clio Coder] orchestrator target=${target.target.id} unknown. Run \`clio-coder targets\` to see configured targets.`,
336
+ );
337
+ }
338
+ if (
339
+ state.runtime &&
340
+ state.runtime.targetId === target.target.id &&
341
+ state.runtime.runtimeId === target.runtime.id &&
342
+ state.runtime.wireModelId === target.wireModelId
343
+ ) {
344
+ // Same target+runtime+model. Settings may still have moved
345
+ // thinkingLevel since the last call (the user invoked /thinking
346
+ // or Alt+T); reconcile the clamped level so the next prompt
347
+ // dispatches under the current intent without forcing a rebuild.
348
+ ensureReasoningProbe(target);
349
+ const runtimeResolution = refineRuntimeTargetWithModelHints(
350
+ target.runtimeResolution,
351
+ state.runtime.agent.state.model,
352
+ deps.providers.knowledgeBase,
353
+ );
354
+ const desiredLevel = runtimeResolution.effectiveThinkingLevel;
355
+ if (state.runtime.agent.state.thinkingLevel !== desiredLevel) {
356
+ state.runtime.agent.state.thinkingLevel = desiredLevel;
357
+ }
358
+ state.runtime.runtimeResolution = runtimeResolution;
359
+ emitThinkingClampNotice(runtimeResolution);
360
+ return state.runtime;
361
+ }
362
+
363
+ // Same target+runtime, new wireModelId: hot-swap the model in place on
364
+ // the live agent. Mirrors the pi-coding-agent setModel pattern (mutate
365
+ // `agent.state.model`, re-clamp thinking level, persist) so the runtime
366
+ // keeps its conversation, subscribers, and pending tool calls.
367
+ // Server-side residency for the new model is reconciled by the engine
368
+ // adapters at the top of the next stream (engine/apis/residency.ts):
369
+ // co-resident when capacity allows, swapping only when a slot must be
370
+ // freed, never evicting protected models.
371
+ if (
372
+ state.runtime &&
373
+ state.runtime.targetId === target.target.id &&
374
+ state.runtime.runtimeId === target.runtime.id &&
375
+ state.runtime.wireModelId !== target.wireModelId
376
+ ) {
377
+ const nextModel = synthesizeModel(target);
378
+ state.runtime.agent.state.model = nextModel;
379
+ state.runtime.wireModelId = target.wireModelId;
380
+ const effectiveThinkingLevel = target.runtimeResolution.effectiveThinkingLevel;
381
+ state.runtime.agent.state.thinkingLevel = effectiveThinkingLevel;
382
+ state.runtime.runtimeResolution = target.runtimeResolution;
383
+ emitThinkingClampNotice(target.runtimeResolution);
384
+ persistence.appendModelChangeEntry(target);
385
+ ensureReasoningProbe(target);
386
+ return state.runtime;
387
+ }
388
+
389
+ const model = synthesizeModel(target);
390
+ const initialThinkingLevel = target.runtimeResolution.effectiveThinkingLevel;
391
+ const tools: ReturnType<typeof resolveAgentTools> = [];
392
+ // Seed the system prompt with the fallback identity text. The first
393
+ // submit replaces it with the compiled session prompt; the fallback
394
+ // only shows up when the prompts contract is absent (tests, degraded
395
+ // boot).
396
+ const hadPriorRuntime = state.runtime !== null;
397
+ const priorMessages = state.runtime ? [...state.runtime.agent.state.messages] : [...state.replayedContextMessages];
398
+ // Drop any in-flight stream on the prior agent before discarding it.
399
+ if (state.runtime) {
400
+ state.runtime.agent.abort();
401
+ cleanupSessionResources(state.runtime.agent.sessionId);
402
+ }
403
+ const handle = deps.createAgent({
404
+ initialState: {
405
+ systemPrompt: fallbackIdentityPrompt(),
406
+ model,
407
+ thinkingLevel: initialThinkingLevel,
408
+ tools,
409
+ messages: priorMessages,
410
+ },
411
+ maxRetryDelayMs: deps.retrySettings().maxDelayMs,
412
+ onPayload: async (payload, currentModel) => {
413
+ const thinkingPatched = patchProviderThinkingPayload(payload, currentModel, state.currentThinkingLevel);
414
+ const basePayload = thinkingPatched ?? payload;
415
+ if (state.synthesisToolLock) {
416
+ return patchToolChoiceNonePayload(basePayload, currentModel) ?? thinkingPatched;
417
+ }
418
+ const middlewareChoice = middlewareToolChoice.current();
419
+ if (middlewareChoice.kind === "none") {
420
+ return patchToolChoiceNonePayload(basePayload, currentModel) ?? thinkingPatched;
421
+ }
422
+ if (middlewareChoice.kind === "required") {
423
+ return patchToolChoiceNamedPayload(basePayload, currentModel, middlewareChoice.toolName) ?? thinkingPatched;
424
+ }
425
+ return thinkingPatched;
426
+ },
427
+ getApiKey: async () => {
428
+ if (!targetRequiresAuth(target.target, target.runtime)) {
429
+ return LOCAL_API_KEY_FALLBACK;
430
+ }
431
+ const resolved = await deps.providers.auth.resolveForTarget(target.target, target.runtime);
432
+ return resolved.apiKey;
433
+ },
434
+ });
435
+
436
+ // Build the runtime object before subscribing so the callback closes
437
+ // over the same heap object the hot-swap path mutates. Reading
438
+ // `localRuntime.targetId` / `localRuntime.wireModelId` at event time
439
+ // instead of the captured `target` guarantees per-turn observability
440
+ // rows are tagged with whatever model is active right now, not the
441
+ // model this agent was originally built with.
442
+ const localRuntime: AgentRuntime = {
443
+ agent: handle.agent,
444
+ targetId: target.target.id,
445
+ runtimeId: target.runtime.id,
446
+ wireModelId: target.wireModelId,
447
+ runtimeResolution: target.runtimeResolution,
448
+ };
449
+ emitThinkingClampNotice(target.runtimeResolution);
450
+
451
+ // Stall watchdog. `agent_start` arms a timer for `retry.streamStallMs`;
452
+ // every later engine event counts as progress and pushes the deadline
453
+ // out. When the deadline passes with nothing from the stream, the
454
+ // backend is presumed wedged (the server answers /health while its slot
455
+ // is dead) and the run is aborted through the same `agent.abort()` call
456
+ // Esc uses. `state.streamStallReason` is what tells the two aborts apart
457
+ // once the run settles: `turn-recovery.reclassifyStallAbort` reads it and
458
+ // hands the failure to the transient retry ladder, while an operator
459
+ // cancel still ends the turn.
460
+ //
461
+ // Idle is measured on `performance.now()`. Wall time is not a duration:
462
+ // a forward step of one threshold or more (NTP correcting a node that
463
+ // booted without an RTC battery, a laptop resuming from suspend) would
464
+ // otherwise make a healthy stream look silent and abort it through the
465
+ // operator-cancel path.
466
+ //
467
+ // `toolsInFlight` and `stallSuspendDepth` cover the windows where silence
468
+ // is expected and the stream is not the thing we are waiting on: a tool
469
+ // executing (a `npm run ci` that takes ten minutes is not a stalled
470
+ // stream) and the post-tool continuation guard, whose auto-compaction is
471
+ // its own model call. The watchdog re-arms instead of firing while either
472
+ // is above zero. They are counted apart because only the tool half can
473
+ // leak: the guard's depth is a try/finally around one await, while a
474
+ // `tool_execution_end` that never arrives would disable the watchdog for
475
+ // the rest of the run. The engine settles an entire tool batch before it
476
+ // emits `turn_end`, so that event bounds the tool suspension below.
477
+ let lastActivityAt = performance.now();
478
+ let toolsInFlight = 0;
479
+ let stallSuspendDepth = 0;
480
+ let stallTimer: ReturnType<typeof setTimeout> | null = null;
481
+ const clearStallTimer = (): void => {
482
+ if (stallTimer === null) return;
483
+ clearTimeout(stallTimer);
484
+ stallTimer = null;
485
+ };
486
+ const armStallTimer = (delayMs: number): void => {
487
+ stallTimer = setTimeout(
488
+ () => {
489
+ stallTimer = null;
490
+ const stallMs = deps.retrySettings().streamStallMs;
491
+ // Zero disables the escalation; an operator who wants a stream to
492
+ // hang forever keeps that by setting `retry.streamStallMs: 0`.
493
+ if (stallMs <= 0) return;
494
+ if (stallSuspendDepth > 0 || toolsInFlight > 0) {
495
+ armStallTimer(stallMs);
496
+ return;
497
+ }
498
+ const idleMs = performance.now() - lastActivityAt;
499
+ if (idleMs < stallMs) {
500
+ armStallTimer(stallMs - idleMs);
501
+ return;
502
+ }
503
+ state.streamStallReason = `stream stalled: no output from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
504
+ localRuntime.agent.abort();
505
+ },
506
+ Math.max(1, delayMs),
507
+ );
508
+ // The in-flight request already holds the event loop open; this timer
509
+ // must not keep a settled headless run alive on its own.
510
+ stallTimer.unref?.();
511
+ };
512
+
513
+ handle.agent.prepareNextTurn = async (signal?: AbortSignal) => {
514
+ stallSuspendDepth += 1;
515
+ try {
516
+ return await context.postToolContinuationGuard(localRuntime, signal);
517
+ } finally {
518
+ stallSuspendDepth -= 1;
519
+ lastActivityAt = performance.now();
520
+ }
521
+ };
522
+
523
+ let streamStartedAt: number | null = null;
524
+ let firstAssistantDeltaAt: number | null = null;
525
+ // Per-API-call timing (T3.2): one assistant message per provider call,
526
+ // bounded by message_start/message_end; the first delta marks TTFT.
527
+ let apiCallStartedAt: number | null = null;
528
+ let apiCallFirstDeltaAt: number | null = null;
529
+ // First call of the run is the one whose verdict says whether the
530
+ // backend reused the session prefix; later calls in a tool loop are
531
+ // trivially warm.
532
+ let runFirstCallVerdict: BackendCacheVerdict | null = null;
533
+ // artifact plan/review/report set ToolResult.terminate=true so the agent
534
+ // loop skips the follow-up LLM call that would otherwise produce the
535
+ // assistant message carrying the turn's terminal stopReason. Track the
536
+ // most recent terminating tool result here; a real assistant
537
+ // message_end (the follow-up call did happen, e.g. another tool in the
538
+ // same batch did not also set terminate) clears it. If it is still set
539
+ // at agent_end, no terminal ledger row was ever written for this turn,
540
+ // so one is synthesized below.
541
+ let pendingTerminalToolResult: { toolCallId: string; toolName: string } | null = null;
542
+ // state.messages length when this run started; agent state appends every
543
+ // message of the run (prompts, assistant, tool results) via message_end,
544
+ // so the slice from here is the run's real message window.
545
+ let runStartMessageCount = 0;
546
+
547
+ handle.agent.subscribe(async (event) => {
548
+ // Wall anchor for the one field a human reads back (`recordedAt`);
549
+ // every span below is measured on the monotonic frame instead, so an
550
+ // NTP correction mid-turn cannot corrupt a tool duration or a TTFT.
551
+ const eventAt = Date.now();
552
+ const eventClock = performance.now();
553
+ lastActivityAt = eventClock;
554
+ let enrichedEvent = event;
555
+ if (event.type === "tool_execution_start") {
556
+ toolsInFlight += 1;
557
+ middlewareToolChoice.toolStarted(event.toolName);
558
+ deps.toolStartTimes.set(event.toolCallId, eventClock);
559
+ state.turnToolCalls += 1;
560
+ } else if (event.type === "tool_execution_end") {
561
+ toolsInFlight = Math.max(0, toolsInFlight - 1);
562
+ const startedAt = deps.toolStartTimes.get(event.toolCallId);
563
+ deps.toolStartTimes.delete(event.toolCallId);
564
+ // Carry the registry's verdict alongside the engine's result. The
565
+ // panel classifies settlement from `outcome`; without it the only
566
+ // available signal is result text, and grepping that text for
567
+ // "blocked"/"cancelled" labels every failing `node --test` run
568
+ // (which prints `cancelled 0`) a permission block.
569
+ const admission = toolOutcomes.get(event.toolCallId);
570
+ toolOutcomes.delete(event.toolCallId);
571
+ // The registry's own span is the one that means "how long the tool
572
+ // took": the engine's start-to-end frame also covers the operator,
573
+ // because a call awaiting a permission decision is parked between
574
+ // those two events. Approving `wc -l src/*.ts | sort -n` after 25
575
+ // seconds of reading rendered it as a 31-second command.
576
+ const engineSpan = startedAt === undefined ? undefined : Math.round(Math.max(0, eventClock - startedAt));
577
+ const durationMs = admission?.durationMs ?? engineSpan;
578
+ enrichedEvent = {
579
+ ...event,
580
+ ...(durationMs !== undefined ? { durationMs } : {}),
581
+ resultSummary: toolResultSummary(event.result),
582
+ ...(admission === undefined
583
+ ? {}
584
+ : {
585
+ outcome: admission.outcome,
586
+ ...(admission.reason === undefined ? {} : { blockReason: admission.reason }),
587
+ }),
588
+ } as typeof event;
589
+ } else if (event.type === "agent_end") {
590
+ // The engine's failure path (an abort or a thrown provider error)
591
+ // replaces the run's message window with one synthetic zero-usage
592
+ // failure message, which zeroed token usage, tool counts, and cache
593
+ // records for every aborted turn. Rebuild the real window from agent
594
+ // state, which already holds all of this run's messages plus that
595
+ // failure message.
596
+ const runMessages = localRuntime.agent.state.messages.slice(runStartMessageCount);
597
+ if (runMessages.length > event.messages.length) {
598
+ enrichedEvent = { ...event, messages: runMessages } as typeof event;
599
+ }
600
+ } else if (event.type === "message_end" && state.synthesisToolLock) {
601
+ // Synthesis-locked turn: a model that ignores tool_choice none emits
602
+ // its chat template's tool-call syntax as plain text. Sanitize the
603
+ // message in place (pi stores this same object in agent state, so
604
+ // the emitted event, ledger persistence below, and later provider
605
+ // rounds all see the sanitized text) and mark the event so the
606
+ // panel replaces its streamed markup tail instead of appending.
607
+ if (sanitizeLockedSynthesisMessage(event.message)) {
608
+ enrichedEvent = { ...event, lockedSynthesisSanitized: true } as typeof event;
609
+ }
610
+ }
611
+ const publicEvent = enrichedEvent;
612
+ if (publicEvent?.type === "agent_start") {
613
+ runStartMessageCount = localRuntime.agent.state.messages.length;
614
+ streamStartedAt = eventClock;
615
+ firstAssistantDeltaAt = null;
616
+ apiCallStartedAt = null;
617
+ apiCallFirstDeltaAt = null;
618
+ runFirstCallVerdict = null;
619
+ pendingTerminalToolResult = null;
620
+ clearStallTimer();
621
+ toolsInFlight = 0;
622
+ stallSuspendDepth = 0;
623
+ state.streamStallReason = null;
624
+ const stallMs = deps.retrySettings().streamStallMs;
625
+ if (stallMs > 0) armStallTimer(stallMs);
626
+ }
627
+ // The engine runs the whole tool batch to settlement before it emits
628
+ // `turn_end`, so nothing from this turn can still be executing here.
629
+ // A call whose `tool_execution_end` was never emitted (a crashed
630
+ // mediator, a dropped frame) therefore stops suspending the watchdog
631
+ // at the turn that issued it instead of for the rest of the run.
632
+ if (publicEvent?.type === "turn_end") toolsInFlight = 0;
633
+ if (publicEvent?.type === "message_start" && publicEvent.message?.role === "assistant") {
634
+ apiCallStartedAt = eventClock;
635
+ apiCallFirstDeltaAt = null;
636
+ }
637
+ if (publicEvent?.type === "message_update") {
638
+ const assistantEvent = publicEvent.assistantMessageEvent as { type?: string; delta?: unknown };
639
+ const hasDelta =
640
+ assistantEvent.type === "text_delta" ||
641
+ assistantEvent.type === "thinking_delta" ||
642
+ assistantEvent.type === "toolcall_start" ||
643
+ assistantEvent.type === "toolcall_delta";
644
+ if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
645
+ if (hasDelta && apiCallFirstDeltaAt === null) apiCallFirstDeltaAt = eventClock;
646
+ }
647
+ if (publicEvent?.type === "agent_end") {
648
+ context.noteRunCacheSummary(publicEvent.messages, runFirstCallVerdict);
649
+ }
650
+ if (publicEvent?.type === "agent_end" && deps.observability) {
651
+ const summary = sumRunUsage(publicEvent.messages);
652
+ if (summary.hadUsage && (summary.tokens > 0 || summary.costUsd > 0)) {
653
+ deps.observability.recordTokens(
654
+ localRuntime.targetId,
655
+ localRuntime.wireModelId,
656
+ summary.tokens,
657
+ summary.costUsd,
658
+ {
659
+ input: summary.input,
660
+ output: summary.output,
661
+ cacheRead: summary.cacheRead,
662
+ cacheWrite: summary.cacheWrite,
663
+ reasoningTokens: summary.reasoning,
664
+ totalTokens: summary.tokens,
665
+ apiCalls: summary.apiCalls,
666
+ },
667
+ localRuntime.runtimeResolution.costProvenance,
668
+ );
669
+ }
670
+ if (summary.output > 0 && firstAssistantDeltaAt !== null) {
671
+ const durationMs = Math.round(Math.max(1, eventClock - firstAssistantDeltaAt));
672
+ deps.observability.recordTokenThroughput({
673
+ tokensPerSecond: summary.output / (durationMs / 1000),
674
+ outputTokens: summary.output,
675
+ durationMs,
676
+ ...(streamStartedAt !== null ? { ttftMs: Math.round(firstAssistantDeltaAt - streamStartedAt) } : {}),
677
+ providerId: localRuntime.targetId,
678
+ modelId: localRuntime.wireModelId,
679
+ recordedAt: eventAt,
680
+ });
681
+ }
682
+ }
683
+ // While a loop-guard interrupt is active its closing message has
684
+ // already been shown; the aborted follow-up calls the abort leaves
685
+ // behind carry no content and would render as "[aborted] Request was
686
+ // aborted." noise, so drop them from the live transcript the same way
687
+ // persistence does.
688
+ if (
689
+ state.activeInterruptReason !== null &&
690
+ publicEvent?.type === "message_end" &&
691
+ isEmptyAbortedAssistantMessage(publicEvent.message)
692
+ ) {
693
+ return;
694
+ }
695
+ if (publicEvent) deps.emit(publicEvent);
696
+ if (publicEvent?.type === "message_update") {
697
+ const assistantEvent = publicEvent.assistantMessageEvent as {
698
+ type: string;
699
+ contentIndex?: number;
700
+ delta?: string;
701
+ partial?: AgentMessage;
702
+ };
703
+ if (assistantEvent.type === "text_delta") {
704
+ const partialText = extractText(assistantEvent.partial);
705
+ deps.emit({
706
+ type: "text_delta",
707
+ contentIndex: assistantEvent.contentIndex ?? 0,
708
+ delta: assistantEvent.delta ?? "",
709
+ partialText,
710
+ });
711
+ const localToolRuntime = runtimeNarratesToolCalls(localRuntime.runtimeResolution.runtimeTier);
712
+ if (
713
+ localToolRuntime &&
714
+ state.toolProseAbortReason === null &&
715
+ shouldAssessToolProse(partialText.length, state.toolProseAssessedChars)
716
+ ) {
717
+ state.toolProseAssessedChars = partialText.length;
718
+ const activeToolNames = toolNamesFromAgentState(localRuntime.agent.state.tools);
719
+ const assessment = assessToolProseLoop({
720
+ text: partialText,
721
+ activeToolNames,
722
+ hasStructuredToolCall: hasStructuredToolCall(assistantEvent.partial),
723
+ });
724
+ if (assessment.kind === "loop") {
725
+ state.toolProseAbortReason = `[Clio Coder] aborted local model turn: ${assessment.reason}.`;
726
+ localRuntime.agent.abort();
727
+ deps.emitNotice(state.toolProseAbortReason);
728
+ }
729
+ }
730
+ }
731
+ if (assistantEvent.type === "thinking_delta") {
732
+ deps.emit({
733
+ type: "thinking_delta",
734
+ contentIndex: assistantEvent.contentIndex ?? 0,
735
+ delta: assistantEvent.delta ?? "",
736
+ partialThinking: extractThinking(assistantEvent.partial),
737
+ });
738
+ }
739
+ }
740
+ if (enrichedEvent.type === "message_end") {
741
+ persistence.appendQueuedUserTurn(enrichedEvent.message);
742
+ const isAssistant = enrichedEvent.message?.role === "assistant";
743
+ if (isAssistant) pendingTerminalToolResult = null;
744
+ const timing: AssistantCallTiming | null =
745
+ isAssistant && apiCallStartedAt !== null
746
+ ? {
747
+ ttftMs: apiCallFirstDeltaAt !== null ? Math.round(Math.max(0, apiCallFirstDeltaAt - apiCallStartedAt)) : null,
748
+ apiMs: Math.round(Math.max(0, eventClock - apiCallStartedAt)),
749
+ }
750
+ : null;
751
+ persistence.appendAssistantTurn(enrichedEvent.message, timing);
752
+ if (isAssistant) apiCallStartedAt = null;
753
+ const usage = (enrichedEvent.message as { usage?: Usage }).usage;
754
+ if (isAssistant && usage && typeof usage === "object" && runFirstCallVerdict === null) {
755
+ const input = typeof usage.input === "number" ? usage.input : 0;
756
+ const cacheRead = typeof usage.cacheRead === "number" ? usage.cacheRead : 0;
757
+ runFirstCallVerdict = backendCacheVerdict(input, cacheRead);
758
+ }
759
+ if (usage) {
760
+ context.reconcileUsage(usage);
761
+ }
762
+ }
763
+ if (enrichedEvent.type === "tool_execution_start") {
764
+ persistence.appendToolCallTurn(enrichedEvent);
765
+ }
766
+ if (enrichedEvent.type === "tool_execution_end") {
767
+ persistence.appendToolResultTurn(enrichedEvent);
768
+ pendingTerminalToolResult =
769
+ (enrichedEvent.result as { terminate?: boolean } | undefined)?.terminate === true
770
+ ? { toolCallId: enrichedEvent.toolCallId, toolName: enrichedEvent.toolName }
771
+ : null;
772
+ }
773
+ if (enrichedEvent.type === "agent_end") {
774
+ clearStallTimer();
775
+ const terminal = pendingTerminalToolResult;
776
+ pendingTerminalToolResult = null;
777
+ if (terminal) {
778
+ persistence.appendTerminalToolAssistantTurn(terminal);
779
+ }
780
+ context.flushReconciledSnapshot();
781
+ await middleware.fireTurnEnd(localRuntime, enrichedEvent.messages, terminal ?? undefined);
782
+ }
783
+ });
784
+
785
+ state.runtime = localRuntime;
786
+ // Append a modelChange marker only when this rebuild replaces a prior
787
+ // runtime, which is the cross-target swap case (mid-session change of
788
+ // target or runtime id). On the initial build, the session header's
789
+ // `meta.model` (written by `session.create()` in submit()) captures
790
+ // the first model and a marker would be redundant.
791
+ if (hadPriorRuntime) persistence.appendModelChangeEntry(target);
792
+ ensureReasoningProbe(target);
793
+ return state.runtime;
794
+ };
795
+
796
+ return {
797
+ ensureRuntime,
798
+ ensureLiveCapabilitiesForSelectedModel,
799
+ cleanupSessionResources,
800
+ toolTelemetry,
801
+ };
802
+ }