@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
@@ -1,30 +1,38 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
1
2
  import {
2
3
  BusChannels,
3
4
  getSharedBus
4
- } from "./chunk-D5YD55AR.js";
5
+ } from "./chunk-Q5WJOSJ7.js";
5
6
  import {
6
7
  readSettings,
7
8
  sleep
8
- } from "./chunk-JWHCJDCI.js";
9
+ } from "./chunk-KY56HMHH.js";
9
10
  import {
10
11
  authNotRequiredStatus,
11
12
  openAuthStorage,
12
13
  registerClioOAuthProviders,
14
+ require_dist,
13
15
  resolveAuthTarget,
14
16
  resolveRuntimeAuthTarget,
15
- targetRequiresAuth
16
- } from "./chunk-5LDRNKX2.js";
17
+ targetRequiresAuth,
18
+ withStateFileLock
19
+ } from "./chunk-GB6QRBXN.js";
17
20
  import {
18
21
  cwdHash,
19
22
  sessionPaths
20
- } from "./chunk-UGYAX5YI.js";
23
+ } from "./chunk-HQQID6OA.js";
21
24
  import {
22
25
  clioConfigDir,
23
26
  clioStatePath,
24
27
  resolveClioDirs
25
- } from "./chunk-X3NE4WVW.js";
28
+ } from "./chunk-BNAZZHFG.js";
29
+ import {
30
+ __toESM,
31
+ init_esm_shims
32
+ } from "./chunk-3R73A4XB.js";
26
33
 
27
34
  // src/core/run-overrides.ts
35
+ init_esm_shims();
28
36
  var RUN_OVERRIDES_ENV = "CLIO_CODER_RUN_OVERRIDES";
29
37
  function runOverrides(env = process.env) {
30
38
  const raw = env[RUN_OVERRIDES_ENV]?.trim();
@@ -68,7 +76,11 @@ async function withRunOverrides(overrides, fn) {
68
76
  }
69
77
  }
70
78
 
79
+ // src/domains/providers/catalog.ts
80
+ init_esm_shims();
81
+
71
82
  // src/engine/ai.ts
83
+ init_esm_shims();
72
84
  import {
73
85
  fauxAssistantMessage,
74
86
  fauxToolCall,
@@ -192,6 +204,7 @@ function registerFauxFromEnv() {
192
204
  }
193
205
 
194
206
  // src/domains/providers/capabilities.ts
207
+ init_esm_shims();
195
208
  function mergeCapabilities(base, kb, probe, userOverride) {
196
209
  const merged = { ...base };
197
210
  applyLayer(merged, probe);
@@ -325,7 +338,11 @@ function synthesizeCatalogBackedModel(input) {
325
338
  return model;
326
339
  }
327
340
 
341
+ // src/domains/providers/types/capability-flags.ts
342
+ init_esm_shims();
343
+
328
344
  // src/domains/providers/model-family.ts
345
+ init_esm_shims();
329
346
  function normalizeModelIdForFamily(modelId) {
330
347
  return (modelId ?? "").trim().toLowerCase().replace(/_/g, "-");
331
348
  }
@@ -412,7 +429,11 @@ function availableThinkingLevels(caps, options) {
412
429
  return THINKING_LEVELS_WITHOUT_XHIGH;
413
430
  }
414
431
 
432
+ // src/domains/providers/model-capabilities.ts
433
+ init_esm_shims();
434
+
415
435
  // src/domains/providers/types/local-model-quirks.ts
436
+ init_esm_shims();
416
437
  var KV_CACHE_QUANTS = ["f32", "f16", "q8_0", "q4_0", "q4_1", "iq4_nl", "q5_0", "q5_1"];
417
438
  function isRecord(value) {
418
439
  return value !== null && typeof value === "object" && !Array.isArray(value);
@@ -597,61 +618,25 @@ function resolveModelCapabilities(status, wireModelId, knowledgeBase, options) {
597
618
  );
598
619
  }
599
620
 
621
+ // src/engine/apis/residency.ts
622
+ init_esm_shims();
623
+
600
624
  // src/engine/apis/residency-lock.ts
601
- import { mkdirSync, rmSync, statSync, writeFileSync } from "node:fs";
625
+ init_esm_shims();
602
626
  import { join } from "node:path";
603
- var LOCK_STALE_MS = 13e4;
604
627
  var LOCK_WAIT_MS = 12e4;
605
- var LOCK_POLL_MS = 200;
606
- function lockPathFor(targetKey) {
607
- const name = targetKey.replace(/[^a-zA-Z0-9._-]+/g, "_");
608
- return join(clioStatePath(), "residency-locks", `${name}.lock`);
609
- }
610
- function tryAcquire(lockPath) {
611
- try {
612
- writeFileSync(lockPath, `${JSON.stringify({ pid: process.pid, at: (/* @__PURE__ */ new Date()).toISOString() })}
613
- `, {
614
- encoding: "utf8",
615
- flag: "wx",
616
- mode: 420
617
- });
618
- return true;
619
- } catch (err) {
620
- if (err.code !== "EEXIST") throw err;
621
- }
622
- try {
623
- if (Date.now() - statSync(lockPath).mtimeMs > LOCK_STALE_MS) rmSync(lockPath, { force: true });
624
- } catch {
625
- }
626
- return false;
628
+ function lockTargetFor(targetKey) {
629
+ return join(clioStatePath(), "residency-locks", targetKey.replace(/[^a-zA-Z0-9._-]+/g, "_"));
627
630
  }
628
631
  async function withResidencyLock(targetKey, fn) {
629
- const lockPath = lockPathFor(targetKey);
630
- let held = false;
631
- try {
632
- mkdirSync(join(clioStatePath(), "residency-locks"), { recursive: true });
633
- const deadline = Date.now() + LOCK_WAIT_MS;
634
- held = tryAcquire(lockPath);
635
- while (!held && Date.now() < deadline) {
636
- await sleep(LOCK_POLL_MS);
637
- held = tryAcquire(lockPath);
638
- }
639
- } catch {
640
- held = false;
641
- }
642
- try {
643
- return await fn();
644
- } finally {
645
- if (held) {
646
- try {
647
- rmSync(lockPath, { force: true });
648
- } catch {
649
- }
650
- }
651
- }
632
+ return withStateFileLock(lockTargetFor(targetKey), fn, {
633
+ timeoutMs: LOCK_WAIT_MS,
634
+ onAcquireFailure: "run-unlocked"
635
+ });
652
636
  }
653
637
 
654
638
  // src/engine/apis/resident-models.ts
639
+ init_esm_shims();
655
640
  function residentMatchesKeep(entry, keepModelId) {
656
641
  return entry.modelId === keepModelId || (entry.aliasIds?.includes(keepModelId) ?? false);
657
642
  }
@@ -674,13 +659,19 @@ var protectedModelsProvider = null;
674
659
  function setProtectedModelsProvider(provider) {
675
660
  protectedModelsProvider = provider;
676
661
  }
677
- function configProtectedIds() {
662
+ function configProtectedRoles() {
663
+ const roles = /* @__PURE__ */ new Map();
678
664
  try {
679
- const ids = protectedModelsProvider?.() ?? [];
680
- return new Set(ids.map((id) => id.trim()).filter((id) => id.length > 0));
665
+ for (const entry of protectedModelsProvider?.() ?? []) {
666
+ const modelId = (typeof entry === "string" ? entry : entry.modelId).trim();
667
+ if (modelId.length === 0) continue;
668
+ const role = typeof entry === "string" ? void 0 : entry.role;
669
+ if (!roles.has(modelId) || roles.get(modelId) === void 0) roles.set(modelId, role);
670
+ }
681
671
  } catch {
682
- return /* @__PURE__ */ new Set();
672
+ return /* @__PURE__ */ new Map();
683
673
  }
674
+ return roles;
684
675
  }
685
676
  function residentTagProtected(tags) {
686
677
  if (!tags) return false;
@@ -724,14 +715,21 @@ function makeNotice(facts, kind, level, message, detail) {
724
715
  function clioLoadedFirst(entries) {
725
716
  return [...entries.filter((entry) => entry.loadedByClio), ...entries.filter((entry) => !entry.loadedByClio)];
726
717
  }
718
+ function describeRole(role) {
719
+ if (role === "chat") return "the chat model";
720
+ if (role === "memory") return "the memory model";
721
+ if (role === "worker") return "a worker model";
722
+ if (role === "target-default") return "a target default model";
723
+ return "a configured model";
724
+ }
727
725
  function evictionNotice(facts, entry) {
728
726
  if (entry.protection === "config") {
729
727
  return makeNotice(
730
728
  facts,
731
729
  "swap",
732
730
  "warning",
733
- `evicting '${entry.modelId}' from '${facts.targetId}' to make room for '${facts.keepModelId}' even though settings still reference it: every slot is taken and no unprotected resident is left. Another profile pointed at it will reload it.`,
734
- { swappedOut: entry.modelId, configProtected: true }
731
+ `evicting '${entry.modelId}' from '${facts.targetId}' to make room for '${facts.keepModelId}' even though settings still reference it as ${describeRole(entry.role)}: every slot is taken and no unprotected resident is left. Another profile pointed at it will reload it.`,
732
+ { swappedOut: entry.modelId, configProtected: true, ...entry.role ? { role: entry.role } : {} }
735
733
  );
736
734
  }
737
735
  if (entry.loadedByClio) {
@@ -787,7 +785,7 @@ function decideResidency(facts) {
787
785
  }
788
786
  if (keepResident) {
789
787
  if (others.length > 0) {
790
- const names = others.map((entry) => entry.modelId).join(", ");
788
+ const names = others.map((entry) => entry.role ? `${entry.modelId} (${entry.role})` : entry.modelId).join(", ");
791
789
  if (facts.capacity !== void 0 && facts.resident.length > facts.capacity) {
792
790
  notices.push(
793
791
  makeNotice(
@@ -814,10 +812,11 @@ function decideResidency(facts) {
814
812
  }
815
813
  const tierUnprotected = clioLoadedFirst(others.filter((entry) => entry.protection === void 0));
816
814
  const tierConfig = clioLoadedFirst(others.filter((entry) => entry.protection === "config"));
815
+ const configEvictable = facts.keepTagProtected !== true;
817
816
  let evict = [];
818
817
  let fallbackEvict = [];
819
818
  if (facts.strategy === "jit") {
820
- fallbackEvict = [...tierUnprotected, ...tierConfig];
819
+ fallbackEvict = configEvictable ? [...tierUnprotected, ...tierConfig] : tierUnprotected;
821
820
  } else if (facts.strategy === "scheduler") {
822
821
  evict = tierUnprotected.filter((entry) => entry.loadedByClio);
823
822
  } else if (facts.capacity === void 0) {
@@ -825,7 +824,26 @@ function decideResidency(facts) {
825
824
  } else {
826
825
  const slotsNeeded = facts.resident.length + 1 - facts.capacity;
827
826
  if (slotsNeeded > 0) {
828
- const candidates = [...tierUnprotected, ...tierConfig];
827
+ const candidates = configEvictable ? [...tierUnprotected, ...tierConfig] : tierUnprotected;
828
+ if (candidates.length < slotsNeeded && !configEvictable && tierUnprotected.length + tierConfig.length >= slotsNeeded) {
829
+ const blocked = tierConfig.slice(0, slotsNeeded - tierUnprotected.length);
830
+ const names = blocked.map((entry) => `'${entry.modelId}' (${describeRole(entry.role)})`).join(", ");
831
+ notices.push(
832
+ makeNotice(
833
+ facts,
834
+ "will-not-fit",
835
+ "error",
836
+ `cannot load pinned '${facts.keepModelId}' on '${facts.targetId}': it would evict ${names} that settings still reference, and a pinned model is never evicted, so the configured model could not return. Unload one manually, unpin '${facts.keepModelId}' on the server, or raise the server's max instances.`,
837
+ {
838
+ residentCount: facts.resident.length,
839
+ maxInstances: facts.capacity,
840
+ configProtected: true,
841
+ ...blocked[0]?.role ? { role: blocked[0].role } : {}
842
+ }
843
+ )
844
+ );
845
+ return { decision: "decline", evict: [], fallbackEvict: [], keepResident, notices };
846
+ }
829
847
  if (candidates.length < slotsNeeded) {
830
848
  notices.push(
831
849
  makeNotice(
@@ -881,14 +899,24 @@ async function reconcileResidency(adapter) {
881
899
  capacity = void 0;
882
900
  }
883
901
  }
884
- const protectedIds = configProtectedIds();
902
+ let keepTagProtected = false;
903
+ if (adapter.keepModelTags) {
904
+ try {
905
+ keepTagProtected = residentTagProtected(await adapter.keepModelTags());
906
+ } catch {
907
+ keepTagProtected = false;
908
+ }
909
+ }
910
+ const protectedRoles = configProtectedRoles();
885
911
  const classified = resident.map((entry) => {
886
- const configProtected = protectedIds.has(entry.modelId) || (entry.aliasIds ?? []).some((id) => protectedIds.has(id));
887
- const protection = residentTagProtected(entry.tags) ? "tag" : configProtected ? "config" : void 0;
912
+ const configId = [entry.modelId, ...entry.aliasIds ?? []].find((id) => protectedRoles.has(id));
913
+ const protection = residentTagProtected(entry.tags) ? "tag" : configId !== void 0 ? "config" : void 0;
914
+ const role = configId === void 0 ? void 0 : protectedRoles.get(configId);
888
915
  return {
889
916
  ...entry,
890
917
  loadedByClio: isClioLoaded(adapter.targetKey, entry),
891
- ...protection ? { protection } : {}
918
+ ...protection ? { protection } : {},
919
+ ...role ? { role } : {}
892
920
  };
893
921
  });
894
922
  const facts = {
@@ -899,6 +927,7 @@ async function reconcileResidency(adapter) {
899
927
  managed: adapter.managed,
900
928
  strategy: adapter.strategy,
901
929
  ...capacity !== void 0 ? { capacity } : {},
930
+ ...keepTagProtected ? { keepTagProtected } : {},
902
931
  ...adapter.contextLength !== void 0 ? { contextLength: adapter.contextLength } : {},
903
932
  ...adapter.modelMaxContext !== void 0 ? { modelMaxContext: adapter.modelMaxContext } : {}
904
933
  };
@@ -941,13 +970,18 @@ function residencyManagedFor(lifecycle, env = process.env) {
941
970
  }
942
971
 
943
972
  // src/engine/apis/lmstudio-native.ts
973
+ init_esm_shims();
944
974
  import { randomUUID } from "node:crypto";
945
975
  import { createAssistantMessageEventStream as createAssistantMessageEventStream2 } from "@earendil-works/pi-ai";
946
976
  import {
947
977
  LMStudioClient
948
978
  } from "@lmstudio/sdk";
949
979
 
980
+ // src/domains/providers/model-runtime-capabilities.ts
981
+ init_esm_shims();
982
+
950
983
  // src/domains/providers/thinking-control-policy.ts
984
+ init_esm_shims();
951
985
  var ANTHROPIC_MIN_THINKING_BUDGET = 1024;
952
986
  var ANTHROPIC_VISIBLE_OUTPUT_RESERVE = 1024;
953
987
  var ANTHROPIC_DEFAULT_THINKING_BUDGETS = {
@@ -1426,6 +1460,7 @@ function resolveTargetRuntimeCapabilities(target, runtime, wireModelId, capabili
1426
1460
  }
1427
1461
 
1428
1462
  // src/domains/providers/runtimes/common/lmstudio-logger.ts
1463
+ init_esm_shims();
1429
1464
  function formatMessage(message) {
1430
1465
  if (message instanceof Error) return message.stack ?? message.message;
1431
1466
  if (typeof message === "string") return message;
@@ -1448,10 +1483,12 @@ var lmStudioQuietLogger = {
1448
1483
  };
1449
1484
 
1450
1485
  // src/domains/session/context-accounting.ts
1486
+ init_esm_shims();
1451
1487
  import { appendFileSync, existsSync, readFileSync } from "node:fs";
1452
1488
  import { dirname, join as join2 } from "node:path";
1453
1489
 
1454
1490
  // src/domains/session/compaction/auto.ts
1491
+ init_esm_shims();
1455
1492
  var DEFAULT_COMPACTION_THRESHOLD = 0.8;
1456
1493
  function shouldCompact(contextTokens, threshold, contextWindow) {
1457
1494
  const base = {
@@ -1496,6 +1533,7 @@ var AutoCompactionTrigger = class {
1496
1533
  };
1497
1534
 
1498
1535
  // src/domains/session/context-ledger.ts
1536
+ init_esm_shims();
1499
1537
  var SEGMENT_CATEGORY = {
1500
1538
  identity: "system",
1501
1539
  "operating-contract": "system",
@@ -1625,6 +1663,7 @@ function buildContextLedger(input) {
1625
1663
  provider: input.provider ?? null,
1626
1664
  model: input.model ?? null,
1627
1665
  contextWindow: window,
1666
+ contextWindowSource: input.contextWindowSource ?? null,
1628
1667
  usedTokens,
1629
1668
  reserveTokens,
1630
1669
  freeTokens,
@@ -2023,6 +2062,7 @@ function reconcileSnapshot(snapshot, usage) {
2023
2062
  }
2024
2063
 
2025
2064
  // src/engine/harmony-response.ts
2065
+ init_esm_shims();
2026
2066
  var START = "<|start|>";
2027
2067
  var CHANNEL = "<|channel|>";
2028
2068
  var CONSTRAIN = "<|constrain|>";
@@ -2141,6 +2181,7 @@ function harmonyPrefixTailLength(value) {
2141
2181
  }
2142
2182
 
2143
2183
  // src/engine/strip-tokenizer-sentinels.ts
2184
+ init_esm_shims();
2144
2185
  var KNOWN_SENTINELS = [
2145
2186
  "<|endoftext|>",
2146
2187
  "<|im_start|>",
@@ -2196,13 +2237,85 @@ function createSentinelStripper() {
2196
2237
  };
2197
2238
  }
2198
2239
 
2240
+ // src/engine/apis/degraded-inference.ts
2241
+ init_esm_shims();
2242
+ var DEGRADED_GRACE_MS = 3e4;
2243
+ var DEGRADED_FLOOR_TOKENS_PER_SECOND = 2;
2244
+ function defaultTimer(fn, ms) {
2245
+ const handle = setInterval(fn, ms);
2246
+ handle.unref?.();
2247
+ return { cancel: () => clearInterval(handle) };
2248
+ }
2249
+ function startDegradedInferenceWatchdog(options) {
2250
+ const now = options.now ?? Date.now;
2251
+ const graceMs = options.graceMs ?? DEGRADED_GRACE_MS;
2252
+ const floor = options.floorTokensPerSecond ?? DEGRADED_FLOOR_TOKENS_PER_SECOND;
2253
+ const pollMs = options.pollMs ?? 5e3;
2254
+ const startedAt = now();
2255
+ let tokens = 0;
2256
+ let reported = false;
2257
+ let stopped = false;
2258
+ const check = () => {
2259
+ if (reported || stopped) return;
2260
+ const elapsedMs = now() - startedAt;
2261
+ if (elapsedMs < graceMs) return;
2262
+ const tokensPerSecond = tokens / (elapsedMs / 1e3);
2263
+ if (tokensPerSecond >= floor) return;
2264
+ reported = true;
2265
+ timer.cancel();
2266
+ try {
2267
+ options.onDegraded({ elapsedMs, tokens, tokensPerSecond });
2268
+ } catch {
2269
+ }
2270
+ };
2271
+ const timer = (options.setTimer ?? defaultTimer)(check, pollMs);
2272
+ return {
2273
+ addTokens: (count) => {
2274
+ if (Number.isFinite(count) && count > 0) tokens += count;
2275
+ },
2276
+ check,
2277
+ stop: () => {
2278
+ if (stopped) return;
2279
+ stopped = true;
2280
+ timer.cancel();
2281
+ }
2282
+ };
2283
+ }
2284
+
2285
+ // src/engine/apis/lmstudio-residency.ts
2286
+ init_esm_shims();
2287
+ var CO_RESIDENT_CONTEXT_CEILING = 131072;
2288
+ function coResidentContextCeiling(env = process.env) {
2289
+ const raw = (env.CLIO_CODER_LMSTUDIO_CORESIDENT_CONTEXT ?? "").trim().toLowerCase();
2290
+ if (raw.length === 0) return CO_RESIDENT_CONTEXT_CEILING;
2291
+ if (raw === "off" || raw === "0" || raw === "false") return void 0;
2292
+ const parsed = Number.parseInt(raw, 10);
2293
+ if (!Number.isFinite(parsed) || parsed <= 0) return CO_RESIDENT_CONTEXT_CEILING;
2294
+ return parsed;
2295
+ }
2296
+ function fitLoadContextLength(input) {
2297
+ const neighbours = [...new Set(input.resident.filter((e) => e.modelKey !== input.keepModelId).map((e) => e.modelKey))];
2298
+ const ceiling = input.ceiling;
2299
+ if (neighbours.length === 0 || ceiling === void 0 || input.requested <= ceiling) {
2300
+ return { contextLength: input.requested, neighbours };
2301
+ }
2302
+ return { contextLength: ceiling, clampedFrom: input.requested, neighbours };
2303
+ }
2304
+ function duplicateInstances(resident, keepModelId) {
2305
+ const instances = resident.filter((entry) => entry.modelKey === keepModelId);
2306
+ return instances.slice(1);
2307
+ }
2308
+
2199
2309
  // src/engine/apis/openai-completions.ts
2310
+ init_esm_shims();
2200
2311
  import {
2201
2312
  createAssistantMessageEventStream
2202
2313
  } from "@earendil-works/pi-ai";
2203
2314
  import { streamOpenAICompletions, streamSimpleOpenAICompletions } from "@earendil-works/pi-ai/compat";
2204
2315
 
2205
2316
  // src/engine/apis/llamacpp-residency.ts
2317
+ init_esm_shims();
2318
+ import { performance } from "node:perf_hooks";
2206
2319
  var LOAD_TIMEOUT_MS = 12e4;
2207
2320
  var POLL_INTERVAL_MS = 500;
2208
2321
  function isRecord3(value) {
@@ -2278,8 +2391,8 @@ async function postRouterModel(fetchImpl, url2, modelId) {
2278
2391
  throw new Error(`llama.cpp router rejected ${url2}: HTTP ${response.status}`);
2279
2392
  }
2280
2393
  async function waitForLoaded(input, fetchImpl, modelId) {
2281
- const started = Date.now();
2282
- while (Date.now() - started < LOAD_TIMEOUT_MS) {
2394
+ const started = performance.now();
2395
+ while (performance.now() - started < LOAD_TIMEOUT_MS) {
2283
2396
  const models = await fetchRouterModels(input, fetchImpl);
2284
2397
  const model = models.find((entry) => entry.id === modelId);
2285
2398
  if (model?.state === "loaded") return;
@@ -2330,6 +2443,7 @@ async function ensureLlamaCppResidency(input) {
2330
2443
  return models.filter(residentModel).map((entry) => ({ modelId: entry.id, tags: entry.tags }));
2331
2444
  },
2332
2445
  capacity: async () => (await fetchRouterProps(input, fetchImpl)).maxInstances,
2446
+ keepModelTags: async () => snapshot.find((entry) => entry.id === input.keepModelId)?.tags,
2333
2447
  unload: (modelId) => postRouterModel(fetchImpl, unloadUrl(input.baseUrl), modelId),
2334
2448
  load: async (modelId) => {
2335
2449
  const state = snapshot.find((entry) => entry.id === modelId)?.state;
@@ -2344,7 +2458,11 @@ async function ensureLlamaCppResidency(input) {
2344
2458
  await reconcileResidency(adapter);
2345
2459
  }
2346
2460
 
2461
+ // src/engine/apis/output-budget.ts
2462
+ init_esm_shims();
2463
+
2347
2464
  // src/core/context-floor.ts
2465
+ init_esm_shims();
2348
2466
  var CLIO_MIN_CONTEXT_WINDOW = 131072;
2349
2467
  var CLIO_MIN_MAX_OUTPUT_TOKENS = 32768;
2350
2468
  var CLIO_CONTEXT_WINDOW_WARN_BELOW = 128e3;
@@ -2382,6 +2500,7 @@ function remainingContextMaxTokens(model, context, options, limits) {
2382
2500
  }
2383
2501
 
2384
2502
  // src/engine/apis/sampling-overrides.ts
2503
+ init_esm_shims();
2385
2504
  function numberField(record, key) {
2386
2505
  const value = record[key];
2387
2506
  return typeof value === "number" && Number.isFinite(value) ? value : void 0;
@@ -2907,6 +3026,7 @@ var openAICompletionsApiProvider = {
2907
3026
  };
2908
3027
 
2909
3028
  // src/engine/apis/thinking-replay.ts
3029
+ init_esm_shims();
2910
3030
  function formatThinkingForReplay(thinking, opts) {
2911
3031
  if (opts.harmony) {
2912
3032
  return `<think>
@@ -2934,6 +3054,17 @@ function normalizeHttpBaseUrl(url2) {
2934
3054
  if (trimmed.startsWith("wss://")) return `https://${trimmed.slice("wss://".length)}`;
2935
3055
  return `http://${trimmed}`;
2936
3056
  }
3057
+ function residentModelInfos(entries) {
3058
+ const byKey = /* @__PURE__ */ new Map();
3059
+ for (const entry of entries) {
3060
+ if (byKey.has(entry.modelKey)) continue;
3061
+ byKey.set(entry.modelKey, {
3062
+ modelId: entry.modelKey,
3063
+ ...entry.sizeBytes !== void 0 ? { sizeBytes: entry.sizeBytes } : {}
3064
+ });
3065
+ }
3066
+ return [...byKey.values()];
3067
+ }
2937
3068
  function toolToLmStudio(tool) {
2938
3069
  const fn = {
2939
3070
  name: tool.name,
@@ -3117,9 +3248,9 @@ function thinkingLevelFromHintOrModel(hints, model) {
3117
3248
  return model.reasoning === true ? "medium" : "off";
3118
3249
  }
3119
3250
  var VALID_ENV_KV_CACHE_QUANTS = new Set(KV_CACHE_QUANTS);
3120
- function loadModelConfig(model) {
3251
+ function loadModelConfig(model, overrides) {
3121
3252
  const config = {
3122
- contextLength: automaticLoadContextLength(model),
3253
+ contextLength: overrides?.contextLength ?? automaticLoadContextLength(model),
3123
3254
  flashAttention: true,
3124
3255
  gpu: { ratio: "max" },
3125
3256
  gpuStrictVramCap: true,
@@ -3227,9 +3358,23 @@ function runtimeMetadata2(model) {
3227
3358
  gateway: metadata?.gateway ?? false
3228
3359
  };
3229
3360
  }
3361
+ var CONNECT_FAILURE_RE = /\b(ENETUNREACH|EHOSTUNREACH|ECONNREFUSED|ETIMEDOUT|ENOTFOUND|ECONNRESET|EAI_AGAIN)\b/;
3362
+ function isConnectFailure(err, cause) {
3363
+ const code = typeof err === "object" && err !== null ? err.code : void 0;
3364
+ if (typeof code === "string" && CONNECT_FAILURE_RE.test(code)) return true;
3365
+ return CONNECT_FAILURE_RE.test(cause);
3366
+ }
3230
3367
  function describeLoadFailure(baseUrl, model, loadConfig, requestedMaxTokens, err) {
3231
3368
  const metadata = runtimeMetadata2(model);
3232
3369
  const cause = err instanceof Error ? err.message : String(err);
3370
+ if (isConnectFailure(err, cause)) {
3371
+ return [
3372
+ `LM Studio at ${baseUrl} did not answer for target '${metadata.targetId}' model '${model.id}'.`,
3373
+ "The connection failed before a load was attempted, so this is reachability rather than model sizing.",
3374
+ "Check that the server is running and that this host can reach it, then retry.",
3375
+ `SDK error: ${cause}`
3376
+ ].join(" ");
3377
+ }
3233
3378
  const context = loadConfig?.contextLength ?? model.contextWindow;
3234
3379
  const output = requestedMaxTokens === false || requestedMaxTokens === void 0 ? model.maxTokens : requestedMaxTokens;
3235
3380
  return [
@@ -3263,7 +3408,7 @@ function toOpenAICompletionsModel(model) {
3263
3408
  };
3264
3409
  return projected;
3265
3410
  }
3266
- async function pumpOpenAICompletions(stream2, model, context, options, hints, maxTokens) {
3411
+ async function pumpOpenAICompletions(stream2, model, context, options, hints, maxTokens, onGeneratedChars) {
3267
3412
  const simple = {
3268
3413
  ...options ?? {},
3269
3414
  maxTokens,
@@ -3278,6 +3423,9 @@ async function pumpOpenAICompletions(stream2, model, context, options, hints, ma
3278
3423
  context,
3279
3424
  simple
3280
3425
  )) {
3426
+ if (onGeneratedChars && (event.type === "text_delta" || event.type === "thinking_delta")) {
3427
+ onGeneratedChars(event.delta.length);
3428
+ }
3281
3429
  stream2.push(event);
3282
3430
  }
3283
3431
  stream2.end();
@@ -3290,10 +3438,16 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3290
3438
  api: model.api,
3291
3439
  provider: model.provider,
3292
3440
  model: model.id,
3441
+ // `cacheRead` is deliberately absent. LM Studio reports no cached-token
3442
+ // stat on either surface: the SDK's PredictionStats has no such field and
3443
+ // its OpenAI-compat `usage` carries no `prompt_tokens_details`. Reporting 0
3444
+ // reads as "measured no reuse" when the truth is "not measured", which is
3445
+ // how #55 mistook a working prompt cache for a broken one. Undefined until
3446
+ // a response actually carries the stat; consumers already treat it as
3447
+ // optional.
3293
3448
  usage: {
3294
3449
  input: 0,
3295
3450
  output: 0,
3296
- cacheRead: 0,
3297
3451
  cacheWrite: 0,
3298
3452
  totalTokens: 0,
3299
3453
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
@@ -3318,6 +3472,7 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3318
3472
  };
3319
3473
  if (signal && !signal.aborted) signal.addEventListener("abort", onAbort, { once: true });
3320
3474
  else if (aborted) abortControllerOnce();
3475
+ let degradedWatchdog = null;
3321
3476
  (async () => {
3322
3477
  try {
3323
3478
  if (aborted) throw new Error("Request was aborted");
@@ -3331,11 +3486,11 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3331
3486
  const loadedContextWindow = await deps.discoverLoadedContext(baseUrl, model.id, controller.signal);
3332
3487
  const budgetLimits = loadedContextWindow !== void 0 ? { contextWindow: loadedContextWindow } : void 0;
3333
3488
  const requestedMaxTokens = remainingContextMaxTokens(model, context, options, budgetLimits);
3334
- const loadConfig = loadModelConfig(model);
3335
- const requestedLoadContext = loadConfig.contextLength ?? model.contextWindow;
3489
+ const requestedLoadContext = loadModelConfig(model).contextLength ?? model.contextWindow;
3490
+ const targetKey = `lmstudio-native|${baseUrl}`;
3336
3491
  let loadedEntries = [];
3337
3492
  const plan = await deps.reconcile({
3338
- targetKey: `lmstudio-native|${baseUrl}`,
3493
+ targetKey,
3339
3494
  targetId: metadata.targetId,
3340
3495
  runtimeId: "lmstudio-native",
3341
3496
  keepModelId: model.id,
@@ -3345,17 +3500,69 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3345
3500
  ...model.contextWindow > 0 ? { modelMaxContext: model.contextWindow } : {},
3346
3501
  listResident: async () => {
3347
3502
  loadedEntries = await client.llm.listLoaded();
3348
- return loadedEntries.map((entry) => ({ modelId: entry.modelKey }));
3503
+ return residentModelInfos(loadedEntries);
3349
3504
  },
3350
3505
  unload: async (id) => {
3351
- await loadedEntries.find((entry) => entry.modelKey === id)?.unload();
3506
+ for (const entry of loadedEntries.filter((handle) => handle.modelKey === id)) await entry.unload();
3352
3507
  }
3353
3508
  });
3354
3509
  const observeOnly = plan.decision === "observe";
3355
- const residentModelLoaded = plan.keepResident;
3356
- const loadedUnknownContext = residentModelLoaded && loadedContextWindow === void 0;
3357
- const loadedWithEnoughContext = loadedContextWindow !== void 0 && loadedContextWindow >= requestedLoadContext;
3358
- const modelOpenConfig = observeOnly || loadedUnknownContext || loadedWithEnoughContext ? void 0 : loadConfig;
3510
+ const residencyLock = deps.lock ?? withResidencyLock;
3511
+ const duplicates = observeOnly ? [] : duplicateInstances(loadedEntries, model.id);
3512
+ if (duplicates.length > 0) {
3513
+ emitResidencyNotice({
3514
+ kind: "co-resident",
3515
+ level: "warning",
3516
+ targetId: metadata.targetId,
3517
+ runtimeId: "lmstudio-native",
3518
+ model: model.id,
3519
+ message: `'${metadata.targetId}' holds ${duplicates.length + 1} instances of '${model.id}'; releasing ${duplicates.length} duplicate instance(s) so one copy serves every request.`,
3520
+ detail: { duplicateInstances: duplicates.length }
3521
+ });
3522
+ await residencyLock(targetKey, async () => {
3523
+ for (const duplicate of duplicates) {
3524
+ try {
3525
+ await duplicate.unload();
3526
+ } catch {
3527
+ }
3528
+ }
3529
+ });
3530
+ loadedEntries = loadedEntries.filter((entry) => !duplicates.includes(entry));
3531
+ }
3532
+ const fit = fitLoadContextLength({
3533
+ requested: requestedLoadContext,
3534
+ resident: loadedEntries,
3535
+ keepModelId: model.id,
3536
+ ceiling: coResidentContextCeiling()
3537
+ });
3538
+ if (!observeOnly && !plan.keepResident && fit.clampedFrom !== void 0) {
3539
+ emitResidencyNotice({
3540
+ kind: "stress",
3541
+ level: "warning",
3542
+ targetId: metadata.targetId,
3543
+ runtimeId: "lmstudio-native",
3544
+ model: model.id,
3545
+ message: `loading '${model.id}' on '${metadata.targetId}' alongside ${fit.neighbours.join(", ")}: context clamped ${fit.clampedFrom} -> ${fit.contextLength} tokens to keep the KV cache in GPU memory. Unload the co-resident model or raise CLIO_CODER_LMSTUDIO_CORESIDENT_CONTEXT for the full window.`,
3546
+ detail: {
3547
+ requestedContext: fit.clampedFrom,
3548
+ loadContext: fit.contextLength,
3549
+ residentCount: fit.neighbours.length + 1
3550
+ }
3551
+ });
3552
+ }
3553
+ const loadConfig = loadModelConfig(model, { contextLength: fit.contextLength });
3554
+ const modelOpenConfig = observeOnly || plan.keepResident ? void 0 : loadConfig;
3555
+ if (plan.keepResident && loadedEntries.length > 0 && loadedContextWindow !== void 0 && loadedContextWindow < requestedLoadContext) {
3556
+ emitResidencyNotice({
3557
+ kind: "co-resident",
3558
+ level: "info",
3559
+ targetId: metadata.targetId,
3560
+ runtimeId: "lmstudio-native",
3561
+ model: model.id,
3562
+ message: `'${model.id}' is resident on '${metadata.targetId}' with a ${loadedContextWindow}-token window, below the ${requestedLoadContext} Clio would load; reusing the loaded instance and budgeting against ${loadedContextWindow}. Unload it in LM Studio to have Clio reload it larger.`,
3563
+ detail: { loadedContext: loadedContextWindow, requestedContext: requestedLoadContext }
3564
+ });
3565
+ }
3359
3566
  const modelOpenOpts = {
3360
3567
  signal: controller.signal,
3361
3568
  verbose
@@ -3378,9 +3585,8 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3378
3585
  llm = await client.llm.model(model.id, modelOpenOpts);
3379
3586
  } catch (err) {
3380
3587
  if (observeOnly || plan.fallbackEvict.length === 0) failWillNotFit(err);
3381
- const lock = deps.lock ?? withResidencyLock;
3382
3588
  try {
3383
- llm = await lock(`lmstudio-native|${baseUrl}`, async () => {
3589
+ llm = await residencyLock(targetKey, async () => {
3384
3590
  for (const entry of plan.fallbackEvict) {
3385
3591
  emitResidencyNotice({
3386
3592
  kind: "swap",
@@ -3392,7 +3598,9 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3392
3598
  detail: { swappedOut: entry.modelId }
3393
3599
  });
3394
3600
  try {
3395
- await loadedEntries.find((handle) => handle.modelKey === entry.modelId)?.unload();
3601
+ for (const handle of loadedEntries.filter((held) => held.modelKey === entry.modelId)) {
3602
+ await handle.unload();
3603
+ }
3396
3604
  } catch {
3397
3605
  }
3398
3606
  }
@@ -3402,9 +3610,36 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3402
3610
  failWillNotFit(retryErr);
3403
3611
  }
3404
3612
  }
3613
+ const residentList = [.../* @__PURE__ */ new Set([model.id, ...loadedEntries.map((entry) => entry.modelKey)])].join(", ");
3614
+ degradedWatchdog = startDegradedInferenceWatchdog({
3615
+ onDegraded: (report) => {
3616
+ emitResidencyNotice({
3617
+ kind: "degraded",
3618
+ level: "warning",
3619
+ targetId: metadata.targetId,
3620
+ runtimeId: "lmstudio-native",
3621
+ model: model.id,
3622
+ message: `'${model.id}' on '${metadata.targetId}' has generated ${report.tokens} tokens in ${Math.round(report.elapsedMs / 1e3)}s (${report.tokensPerSecond.toFixed(2)} tok/s); inference is running far below GPU speed, which is what a spill to CPU looks like. Resident there: ${residentList}. Unload a co-resident model or lower the context window.`,
3623
+ detail: {
3624
+ tokens: report.tokens,
3625
+ elapsedMs: report.elapsedMs,
3626
+ tokensPerSecond: Number(report.tokensPerSecond.toFixed(2)),
3627
+ residents: residentList
3628
+ }
3629
+ });
3630
+ }
3631
+ });
3405
3632
  if (!sdkPredictionEnabled()) {
3406
3633
  predictionDone = true;
3407
- await pumpOpenAICompletions(stream2, model, context, options, hints, requestedMaxTokens);
3634
+ await pumpOpenAICompletions(
3635
+ stream2,
3636
+ model,
3637
+ context,
3638
+ options,
3639
+ hints,
3640
+ requestedMaxTokens,
3641
+ (chars) => degradedWatchdog?.addTokens(ceilChars(chars))
3642
+ );
3408
3643
  return;
3409
3644
  }
3410
3645
  stream2.push({ type: "start", partial: output });
@@ -3585,6 +3820,7 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3585
3820
  signal: controller.signal,
3586
3821
  onPredictionFragment: (fragment) => {
3587
3822
  if (!fragment.content) return;
3823
+ degradedWatchdog?.addTokens(fragment.tokensCount ?? ceilChars(fragment.content.length));
3588
3824
  if (fragment.reasoningType === "reasoningStartTag" || fragment.reasoningType === "reasoningEndTag") {
3589
3825
  reasoningTokensAccum += fragment.tokensCount ?? 0;
3590
3826
  return;
@@ -3678,13 +3914,16 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3678
3914
  flushNonReasoningPending();
3679
3915
  closeActiveText();
3680
3916
  closeActiveThinking();
3681
- output.usage.input = result.stats.promptTokensCount ?? 0;
3917
+ const reportedCache = asRecord(result.stats).cachedTokensCount;
3918
+ const cacheRead = typeof reportedCache === "number" && reportedCache >= 0 ? reportedCache : void 0;
3919
+ output.usage.input = Math.max(0, (result.stats.promptTokensCount ?? 0) - (cacheRead ?? 0));
3682
3920
  output.usage.output = result.stats.predictedTokensCount ?? 0;
3921
+ output.usage.cacheRead = cacheRead;
3683
3922
  output.usage.totalTokens = result.stats.totalTokensCount ?? output.usage.input + output.usage.output;
3684
3923
  if (reasoningTokensAccum > 0) {
3685
3924
  output.usage.reasoningTokens = reasoningTokensAccum;
3686
3925
  }
3687
- calculateEngineCost(model, output.usage);
3926
+ output.usage.cost = calculateEngineCost(model, { ...output.usage, cacheRead: cacheRead ?? 0 });
3688
3927
  if (aborted) throw new Error("Request was aborted");
3689
3928
  if (toolExtractionError) throw toolExtractionError;
3690
3929
  const hadToolCall = output.content.some((block) => block.type === "toolCall");
@@ -3702,6 +3941,7 @@ function runStream(model, context, options, deps = defaultRunDeps, hints = {}) {
3702
3941
  stream2.push({ type: "error", reason: output.stopReason, error: output });
3703
3942
  stream2.end();
3704
3943
  } finally {
3944
+ degradedWatchdog?.stop();
3705
3945
  if (signal) signal.removeEventListener("abort", onAbort);
3706
3946
  }
3707
3947
  })();
@@ -3745,7 +3985,8 @@ var lmstudioNativeApiProvider = {
3745
3985
  };
3746
3986
 
3747
3987
  // src/domains/providers/registry.ts
3748
- import { readdirSync, statSync as statSync2 } from "node:fs";
3988
+ init_esm_shims();
3989
+ import { readdirSync, statSync } from "node:fs";
3749
3990
  import { join as join3 } from "node:path";
3750
3991
  import { pathToFileURL } from "node:url";
3751
3992
  var RUNTIME_KINDS = ["http", "sdk", "subprocess"];
@@ -3766,7 +4007,7 @@ function createRuntimeRegistry() {
3766
4007
  const loadFromDir = async (dir) => {
3767
4008
  let entries;
3768
4009
  try {
3769
- const stat = statSync2(dir);
4010
+ const stat = statSync(dir);
3770
4011
  if (!stat.isDirectory()) return [];
3771
4012
  entries = readdirSync(dir);
3772
4013
  } catch {
@@ -3889,6 +4130,7 @@ function describeError(err) {
3889
4130
  }
3890
4131
 
3891
4132
  // src/domains/providers/credentials.ts
4133
+ init_esm_shims();
3892
4134
  function credentialsPresent() {
3893
4135
  const present = /* @__PURE__ */ new Set();
3894
4136
  const registry = getRuntimeRegistry();
@@ -3905,7 +4147,11 @@ function credentialsPresent() {
3905
4147
  return present;
3906
4148
  }
3907
4149
 
4150
+ // src/domains/providers/runtimes/builtins.ts
4151
+ init_esm_shims();
4152
+
3908
4153
  // src/domains/providers/runtimes/antigravity/antigravity-code.ts
4154
+ init_esm_shims();
3909
4155
  var ANTIGRAVITY_AUTH_NOTICE = "Uses your existing Antigravity (`agy`) login. Clio stores no Antigravity credentials. agy runs its own agent harness as a subprocess; Clio maps autonomy levels onto its CLI flags but cannot mediate individual agy tool calls.";
3910
4156
  var ANTIGRAVITY_MODELS = [
3911
4157
  "Gemini 3.5 Flash (High)",
@@ -3962,7 +4208,11 @@ var antigravityCodeRuntime = {
3962
4208
  };
3963
4209
  var antigravity_code_default = antigravityCodeRuntime;
3964
4210
 
4211
+ // src/domains/providers/runtimes/claude/claude-code.ts
4212
+ init_esm_shims();
4213
+
3965
4214
  // src/domains/providers/runtimes/claude/common.ts
4215
+ init_esm_shims();
3966
4216
  var CLAUDE_CODE_AUTH_NOTICE = "Uses your existing Claude Code login from the installed `claude` command. Clio stores no Claude Code credentials.";
3967
4217
  var CLAUDE_CODE_MODELS = [
3968
4218
  "sonnet",
@@ -4028,6 +4278,7 @@ var claudeCodeRuntime = {
4028
4278
  var claude_code_default = claudeCodeRuntime;
4029
4279
 
4030
4280
  // src/domains/providers/runtimes/claude/claude-sdk.ts
4281
+ init_esm_shims();
4031
4282
  var claudeSdkRuntime = {
4032
4283
  id: "claude-sdk",
4033
4284
  displayName: "Claude Agent SDK",
@@ -4054,8 +4305,12 @@ var claudeSdkRuntime = {
4054
4305
  };
4055
4306
  var claude_sdk_default = claudeSdkRuntime;
4056
4307
 
4308
+ // src/domains/providers/runtimes/cloud/alcf.ts
4309
+ init_esm_shims();
4310
+
4057
4311
  // src/domains/providers/probe/http.ts
4058
- import { performance } from "node:perf_hooks";
4312
+ init_esm_shims();
4313
+ import { performance as performance2 } from "node:perf_hooks";
4059
4314
  async function probeHttp(opts) {
4060
4315
  const { response, latencyMs, error } = await runFetch(opts);
4061
4316
  if (response === null) return { ok: false, error: error ?? "unknown transport error", latencyMs };
@@ -4105,12 +4360,12 @@ async function runFetch(opts) {
4105
4360
  };
4106
4361
  if (opts.headers) init.headers = opts.headers;
4107
4362
  if (opts.body !== void 0) init.body = opts.body;
4108
- const started = performance.now();
4363
+ const started = performance2.now();
4109
4364
  try {
4110
4365
  const response = await fetch(opts.url, init);
4111
- return { response, latencyMs: Math.round(performance.now() - started) };
4366
+ return { response, latencyMs: Math.round(performance2.now() - started) };
4112
4367
  } catch (err) {
4113
- const latencyMs = Math.round(performance.now() - started);
4368
+ const latencyMs = Math.round(performance2.now() - started);
4114
4369
  if (timedOut) {
4115
4370
  return { response: null, latencyMs, error: `timeout after ${opts.timeoutMs}ms` };
4116
4371
  }
@@ -4134,6 +4389,7 @@ function describeError2(err) {
4134
4389
  }
4135
4390
 
4136
4391
  // src/domains/providers/runtimes/common/local-synth.ts
4392
+ init_esm_shims();
4137
4393
  function targetLifecycle(target) {
4138
4394
  return target.lifecycle;
4139
4395
  }
@@ -4227,8 +4483,12 @@ function targetRootUrl(target) {
4227
4483
  return target.url ? stripRedundantV1(stripTrailingSlash(target.url)) : null;
4228
4484
  }
4229
4485
 
4486
+ // src/domains/providers/runtimes/protocol/openai-compat.ts
4487
+ init_esm_shims();
4488
+
4230
4489
  // src/domains/providers/probe/reasoning.ts
4231
- import { performance as performance2 } from "node:perf_hooks";
4490
+ init_esm_shims();
4491
+ import { performance as performance3 } from "node:perf_hooks";
4232
4492
  var PROMPT = "What is 2+2? Think briefly, then answer.";
4233
4493
  function nonEmptyString(value) {
4234
4494
  return typeof value === "string" && value.trim().length > 0;
@@ -4267,7 +4527,7 @@ async function probeOpenAICompatReasoning(opts) {
4267
4527
  reasoning_effort: "low"
4268
4528
  });
4269
4529
  const url2 = `${trimTrailingSlash(opts.baseUrl)}/v1/chat/completions`;
4270
- const started = performance2.now();
4530
+ const started = performance3.now();
4271
4531
  try {
4272
4532
  const response = await fetch(url2, {
4273
4533
  method: "POST",
@@ -4275,7 +4535,7 @@ async function probeOpenAICompatReasoning(opts) {
4275
4535
  body,
4276
4536
  signal: controller.signal
4277
4537
  });
4278
- const latencyMs = Math.round(performance2.now() - started);
4538
+ const latencyMs = Math.round(performance3.now() - started);
4279
4539
  if (!response.ok) {
4280
4540
  return { reasoning: false, latencyMs, error: `HTTP ${response.status}: ${response.statusText}` };
4281
4541
  }
@@ -4284,7 +4544,7 @@ async function probeOpenAICompatReasoning(opts) {
4284
4544
  if (field) return { reasoning: true, field, latencyMs };
4285
4545
  return { reasoning: false, latencyMs };
4286
4546
  } catch (err) {
4287
- const latencyMs = Math.round(performance2.now() - started);
4547
+ const latencyMs = Math.round(performance3.now() - started);
4288
4548
  if (timedOut) return { reasoning: false, latencyMs, error: `timeout after ${opts.timeoutMs}ms` };
4289
4549
  if (opts.signal?.aborted) return { reasoning: false, latencyMs, error: "aborted by caller" };
4290
4550
  return { reasoning: false, latencyMs, error: err instanceof Error ? err.message : String(err) };
@@ -4295,6 +4555,7 @@ async function probeOpenAICompatReasoning(opts) {
4295
4555
  }
4296
4556
 
4297
4557
  // src/domains/providers/runtimes/common/probe-helpers.ts
4558
+ init_esm_shims();
4298
4559
  async function probeUrl(url2, ctx, method = "GET") {
4299
4560
  const base = { url: url2, timeoutMs: ctx.httpTimeoutMs, method };
4300
4561
  return ctx.signal ? probeHttp({ ...base, signal: ctx.signal }) : probeHttp(base);
@@ -4335,8 +4596,11 @@ async function probeOpenAIModelCatalog(base, ctx, modelsPath = "/v1/models") {
4335
4596
  ...capabilitiesFromOpenAIModelEntry(row)
4336
4597
  };
4337
4598
  if (Object.keys(caps).length > 0) modelCapabilities[row.id] = caps;
4338
- const state = modelStateFromOpenAIModelEntry(row) ?? (detailRow ? modelStateFromOpenAIModelEntry(detailRow) : void 0);
4339
- if (state) modelStates[row.id] = state;
4599
+ const loadedContext = loadedContextFromEntry(row) ?? (detailRow ? loadedContextFromEntry(detailRow) : void 0);
4600
+ const state = modelStateFromOpenAIModelEntry(row) ?? (detailRow ? modelStateFromOpenAIModelEntry(detailRow) : void 0) ?? // A reported loaded context is itself the residency answer: nothing
4601
+ // serves a window for a model it has not loaded.
4602
+ (loadedContext !== void 0 ? { state: "loaded" } : void 0);
4603
+ if (state) modelStates[row.id] = loadedContext === void 0 ? state : { ...state, contextLength: loadedContext };
4340
4604
  }
4341
4605
  return { models, modelCapabilities, modelStates };
4342
4606
  }
@@ -4413,6 +4677,10 @@ function modelStateFromOpenAIModelEntry(row) {
4413
4677
  if (loaded === false) return { state: "unloaded" };
4414
4678
  return void 0;
4415
4679
  }
4680
+ function loadedContextFromEntry(row) {
4681
+ const reported = firstPositiveNumber(row, ["loaded_context_length", "loadedContextLength"]);
4682
+ return reported === void 0 ? void 0 : Math.floor(reported);
4683
+ }
4416
4684
  function statusArgsFromEntry(row) {
4417
4685
  const status = nestedRecord(row, "status");
4418
4686
  return argsFromStatus(status);
@@ -4835,7 +5103,11 @@ var alcfRuntime = {
4835
5103
  };
4836
5104
  var alcf_default = alcfRuntime;
4837
5105
 
5106
+ // src/domains/providers/runtimes/cloud/anthropic.ts
5107
+ init_esm_shims();
5108
+
4838
5109
  // src/domains/providers/runtimes/protocol/anthropic-messages.ts
5110
+ init_esm_shims();
4839
5111
  function synthesizeAnthropicMessagesModel(input) {
4840
5112
  return synthesizeCatalogBackedModel({
4841
5113
  target: input.target,
@@ -4887,6 +5159,7 @@ var anthropicRuntime = {
4887
5159
  var anthropic_default = anthropicRuntime;
4888
5160
 
4889
5161
  // src/domains/providers/runtimes/cloud/anthropic-max.ts
5162
+ init_esm_shims();
4890
5163
  var defaultCapabilities4 = {
4891
5164
  chat: true,
4892
5165
  tools: true,
@@ -4929,7 +5202,11 @@ var anthropicMaxRuntime = {
4929
5202
  };
4930
5203
  var anthropic_max_default = anthropicMaxRuntime;
4931
5204
 
5205
+ // src/domains/providers/runtimes/cloud/bedrock.ts
5206
+ init_esm_shims();
5207
+
4932
5208
  // src/domains/providers/runtimes/protocol/bedrock.ts
5209
+ init_esm_shims();
4933
5210
  function synthesizeBedrockModel(input) {
4934
5211
  return synthesizeCatalogBackedModel({
4935
5212
  target: input.target,
@@ -4973,6 +5250,7 @@ var bedrockRuntime = {
4973
5250
  var bedrock_default = bedrockRuntime;
4974
5251
 
4975
5252
  // src/domains/providers/runtimes/cloud/deepseek.ts
5253
+ init_esm_shims();
4976
5254
  var defaultCapabilities6 = {
4977
5255
  chat: true,
4978
5256
  tools: true,
@@ -5014,7 +5292,11 @@ var deepseekRuntime = {
5014
5292
  };
5015
5293
  var deepseek_default = deepseekRuntime;
5016
5294
 
5295
+ // src/domains/providers/runtimes/cloud/google.ts
5296
+ init_esm_shims();
5297
+
5017
5298
  // src/domains/providers/runtimes/protocol/google.ts
5299
+ init_esm_shims();
5018
5300
  function synthesizeGoogleModel(input) {
5019
5301
  return synthesizeCatalogBackedModel({
5020
5302
  target: input.target,
@@ -5064,6 +5346,7 @@ var googleRuntime = {
5064
5346
  var google_default = googleRuntime;
5065
5347
 
5066
5348
  // src/domains/providers/runtimes/cloud/groq.ts
5349
+ init_esm_shims();
5067
5350
  var defaultCapabilities8 = {
5068
5351
  chat: true,
5069
5352
  tools: true,
@@ -5102,6 +5385,7 @@ var groqRuntime = {
5102
5385
  var groq_default = groqRuntime;
5103
5386
 
5104
5387
  // src/domains/providers/runtimes/cloud/mistral.ts
5388
+ init_esm_shims();
5105
5389
  var defaultCapabilities9 = {
5106
5390
  chat: true,
5107
5391
  tools: true,
@@ -5140,6 +5424,7 @@ var mistralRuntime = {
5140
5424
  var mistral_default = mistralRuntime;
5141
5425
 
5142
5426
  // src/domains/providers/runtimes/cloud/openai.ts
5427
+ init_esm_shims();
5143
5428
  var defaultCapabilities10 = {
5144
5429
  chat: true,
5145
5430
  tools: true,
@@ -5178,6 +5463,7 @@ var openaiRuntime = {
5178
5463
  var openai_default = openaiRuntime;
5179
5464
 
5180
5465
  // src/domains/providers/runtimes/cloud/openai-codex.ts
5466
+ init_esm_shims();
5181
5467
  var defaultCapabilities11 = {
5182
5468
  chat: true,
5183
5469
  tools: true,
@@ -5219,6 +5505,7 @@ var openaiCodexRuntime = {
5219
5505
  var openai_codex_default = openaiCodexRuntime;
5220
5506
 
5221
5507
  // src/domains/providers/runtimes/cloud/openrouter.ts
5508
+ init_esm_shims();
5222
5509
  var OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
5223
5510
  var OPENROUTER_HEADERS = {
5224
5511
  "HTTP-Referer": "https://github.com/iowarp/clio-coder",
@@ -5306,7 +5593,11 @@ var openrouterRuntime = {
5306
5593
  };
5307
5594
  var openrouter_default = openrouterRuntime;
5308
5595
 
5596
+ // src/domains/providers/runtimes/local-native/lemonade-anthropic.ts
5597
+ init_esm_shims();
5598
+
5309
5599
  // src/domains/providers/runtimes/protocol/anthropic-compat.ts
5600
+ init_esm_shims();
5310
5601
  function synthesizeAnthropicCompatModel(input) {
5311
5602
  return synthLocalModel({
5312
5603
  target: input.target,
@@ -5398,6 +5689,7 @@ var lemonade_anthropic_default = makeAnthropicCompatRuntime({
5398
5689
  });
5399
5690
 
5400
5691
  // src/domains/providers/runtimes/local-native/lemonade-openai.ts
5692
+ init_esm_shims();
5401
5693
  var defaultCapabilities15 = {
5402
5694
  chat: true,
5403
5695
  tools: true,
@@ -5421,6 +5713,7 @@ var lemonade_openai_default = makeOpenAICompatRuntime({
5421
5713
  });
5422
5714
 
5423
5715
  // src/domains/providers/runtimes/local-native/llamacpp.ts
5716
+ init_esm_shims();
5424
5717
  var defaultCapabilities16 = {
5425
5718
  chat: true,
5426
5719
  tools: true,
@@ -5494,6 +5787,7 @@ var llamacppRuntime = {
5494
5787
  var llamacpp_default = llamacppRuntime;
5495
5788
 
5496
5789
  // src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts
5790
+ init_esm_shims();
5497
5791
  var defaultCapabilities17 = {
5498
5792
  chat: true,
5499
5793
  tools: true,
@@ -5563,6 +5857,7 @@ var llamacppAnthropicRuntime = {
5563
5857
  var llamacpp_anthropic_default = llamacppAnthropicRuntime;
5564
5858
 
5565
5859
  // src/domains/providers/runtimes/local-native/llamacpp-completion.ts
5860
+ init_esm_shims();
5566
5861
  var defaultCapabilities18 = {
5567
5862
  chat: false,
5568
5863
  tools: false,
@@ -5732,6 +6027,7 @@ var llamacppCompletionRuntime = {
5732
6027
  var llamacpp_completion_default = llamacppCompletionRuntime;
5733
6028
 
5734
6029
  // src/domains/providers/runtimes/local-native/llamacpp-embed.ts
6030
+ init_esm_shims();
5735
6031
  var defaultCapabilities19 = {
5736
6032
  chat: false,
5737
6033
  tools: false,
@@ -5880,6 +6176,7 @@ var llamacppEmbedRuntime = {
5880
6176
  var llamacpp_embed_default = llamacppEmbedRuntime;
5881
6177
 
5882
6178
  // src/domains/providers/runtimes/local-native/llamacpp-rerank.ts
6179
+ init_esm_shims();
5883
6180
  var defaultCapabilities20 = {
5884
6181
  chat: false,
5885
6182
  tools: false,
@@ -5978,6 +6275,8 @@ var llamacppRerankRuntime = {
5978
6275
  var llamacpp_rerank_default = llamacppRerankRuntime;
5979
6276
 
5980
6277
  // src/domains/providers/runtimes/local-native/lmstudio-native.ts
6278
+ init_esm_shims();
6279
+ import { performance as performance4 } from "node:perf_hooks";
5981
6280
  import { LMStudioClient as LMStudioClient2 } from "@lmstudio/sdk";
5982
6281
  var defaultCapabilities21 = {
5983
6282
  ...EMPTY_CAPABILITIES,
@@ -6125,6 +6424,31 @@ function summaryFromV0(entry) {
6125
6424
  }
6126
6425
  return summary;
6127
6426
  }
6427
+ function foldDuplicateSummaries(entries) {
6428
+ const byId = /* @__PURE__ */ new Map();
6429
+ for (const entry of entries) {
6430
+ const previous = byId.get(entry.id);
6431
+ byId.set(entry.id, previous ? mergeSummaries(previous, entry) : entry);
6432
+ }
6433
+ return [...byId.values()];
6434
+ }
6435
+ function mergeSummaries(first, second) {
6436
+ const [primary, secondary] = second.loaded === true && first.loaded !== true ? [second, first] : [first, second];
6437
+ const merged = { id: primary.id };
6438
+ const loaded = primary.loaded ?? secondary.loaded;
6439
+ if (loaded !== void 0) merged.loaded = loaded;
6440
+ const loadedContextLength = primary.loadedContextLength ?? secondary.loadedContextLength;
6441
+ if (loadedContextLength !== void 0) merged.loadedContextLength = loadedContextLength;
6442
+ const maxContextLength = primary.maxContextLength ?? secondary.maxContextLength;
6443
+ if (maxContextLength !== void 0) merged.maxContextLength = maxContextLength;
6444
+ const vision = primary.vision ?? secondary.vision;
6445
+ if (vision !== void 0) merged.vision = vision;
6446
+ const tools = primary.tools ?? secondary.tools;
6447
+ if (tools !== void 0) merged.tools = tools;
6448
+ const reasoning = primary.reasoning ?? secondary.reasoning;
6449
+ if (reasoning !== void 0) merged.reasoning = reasoning;
6450
+ return merged;
6451
+ }
6128
6452
  function selectCapabilityEntry(entries, target) {
6129
6453
  const configured = target.defaultModel?.trim();
6130
6454
  if (configured) {
@@ -6155,7 +6479,9 @@ function modelStatesFromSummaries(entries) {
6155
6479
  const out = {};
6156
6480
  for (const entry of entries) {
6157
6481
  if (entry.loaded === void 0) continue;
6158
- out[entry.id] = { state: entry.loaded ? "loaded" : "unloaded" };
6482
+ const status = { state: entry.loaded ? "loaded" : "unloaded" };
6483
+ if (entry.loaded && entry.loadedContextLength !== void 0) status.contextLength = entry.loadedContextLength;
6484
+ out[entry.id] = status;
6159
6485
  }
6160
6486
  return Object.keys(out).length > 0 ? out : void 0;
6161
6487
  }
@@ -6184,8 +6510,11 @@ async function probeApiV1Models(target, ctx, headers) {
6184
6510
  if (headers) opts.headers = headers;
6185
6511
  const result = await (ctx.signal ? probeJson({ ...opts, signal: ctx.signal }) : probeJson(opts));
6186
6512
  if (!result.ok) return result;
6187
- const entries = v1ModelEntries(result.data).map(summaryFromV1).filter((entry) => entry !== null);
6188
- return probeResultFromSummaries(entries, target, result.latencyMs);
6513
+ return probeResultFromV1Models(result.data, target, result.latencyMs);
6514
+ }
6515
+ function probeResultFromV1Models(data, target, latencyMs) {
6516
+ const entries = v1ModelEntries(data).map(summaryFromV1).filter((entry) => entry !== null);
6517
+ return probeResultFromSummaries(entries, target, latencyMs);
6189
6518
  }
6190
6519
  async function probeApiV0Models(target, ctx, headers) {
6191
6520
  const opts = {
@@ -6198,7 +6527,8 @@ async function probeApiV0Models(target, ctx, headers) {
6198
6527
  const entries = v0ModelEntries(result.data).map(summaryFromV0).filter((entry) => entry !== null);
6199
6528
  return probeResultFromSummaries(entries, target, result.latencyMs);
6200
6529
  }
6201
- function probeResultFromSummaries(entries, target, latencyMs) {
6530
+ function probeResultFromSummaries(rows, target, latencyMs) {
6531
+ const entries = foldDuplicateSummaries(rows);
6202
6532
  const models = entries.map((entry) => entry.id);
6203
6533
  const capabilityEntry = selectCapabilityEntry(entries, target);
6204
6534
  const discoveredCapabilities = capabilitiesFromModelEntry(capabilityEntry);
@@ -6226,13 +6556,13 @@ var lmstudioNativeRuntime = {
6226
6556
  const built = buildClient(target, ctx);
6227
6557
  if ("error" in built) return { ok: false, error: built.error };
6228
6558
  const client = built;
6229
- const started = Date.now();
6559
+ const started = performance4.now();
6230
6560
  try {
6231
6561
  const [version, apiModels] = await Promise.all([
6232
6562
  withTimeout(client.system.getLMStudioVersion(), ctx.httpTimeoutMs, ctx.signal),
6233
6563
  probeApiModels(target, ctx)
6234
6564
  ]);
6235
- const latencyMs = Date.now() - started;
6565
+ const latencyMs = Math.round(performance4.now() - started);
6236
6566
  const result = { ok: true, latencyMs, serverVersion: version.version };
6237
6567
  if (apiModels.ok) {
6238
6568
  if (apiModels.models) result.models = apiModels.models;
@@ -6245,7 +6575,7 @@ var lmstudioNativeRuntime = {
6245
6575
  } catch (err) {
6246
6576
  return {
6247
6577
  ok: false,
6248
- latencyMs: Date.now() - started,
6578
+ latencyMs: Math.round(performance4.now() - started),
6249
6579
  error: err instanceof Error ? err.message : String(err)
6250
6580
  };
6251
6581
  }
@@ -6311,6 +6641,7 @@ var lmstudioNativeRuntime = {
6311
6641
  var lmstudio_native_default = lmstudioNativeRuntime;
6312
6642
 
6313
6643
  // src/domains/providers/runtimes/local-native/ollama-native.ts
6644
+ init_esm_shims();
6314
6645
  var defaultCapabilities22 = {
6315
6646
  chat: true,
6316
6647
  tools: true,
@@ -6392,6 +6723,7 @@ var ollamaNativeRuntime = {
6392
6723
  var ollama_native_default = ollamaNativeRuntime;
6393
6724
 
6394
6725
  // src/domains/providers/runtimes/local-native/sglang.ts
6726
+ init_esm_shims();
6395
6727
  var defaultCapabilities23 = {
6396
6728
  chat: true,
6397
6729
  tools: true,
@@ -6415,6 +6747,7 @@ var sglang_default = makeOpenAICompatRuntime({
6415
6747
  });
6416
6748
 
6417
6749
  // src/domains/providers/runtimes/local-native/vllm.ts
6750
+ init_esm_shims();
6418
6751
  var defaultCapabilities24 = {
6419
6752
  chat: true,
6420
6753
  tools: true,
@@ -6476,6 +6809,7 @@ function registerBuiltinRuntimes(registry) {
6476
6809
  }
6477
6810
 
6478
6811
  // src/domains/providers/eligibility.ts
6812
+ init_esm_shims();
6479
6813
  function isTargetEligibleRuntime(runtime) {
6480
6814
  return runtime.kind === "http" || runtime.id === "claude-sdk" || runtime.id === "claude-code" || runtime.id === "antigravity-code";
6481
6815
  }
@@ -6487,6 +6821,7 @@ function isDispatchEligibleRuntime(runtime) {
6487
6821
  }
6488
6822
 
6489
6823
  // src/domains/providers/support.ts
6824
+ init_esm_shims();
6490
6825
  var SUMMARY_BY_RUNTIME_ID = {
6491
6826
  alcf: "ALCF inference gateway (Sophia/Metis) via Globus",
6492
6827
  anthropic: "Anthropic API",
@@ -6617,6 +6952,7 @@ function resolveProviderReference(input, settings, getRuntime) {
6617
6952
  }
6618
6953
 
6619
6954
  // src/domains/providers/model-discovery.ts
6955
+ init_esm_shims();
6620
6956
  function uniqueModels(ids) {
6621
6957
  const seen = /* @__PURE__ */ new Set();
6622
6958
  const out = [];
@@ -6628,8 +6964,22 @@ function uniqueModels(ids) {
6628
6964
  }
6629
6965
  return out;
6630
6966
  }
6631
- function modelLoadStateLabel(status, modelId) {
6632
- return status.discoveredModelStates?.[modelId]?.state ?? "-";
6967
+ function loadedContextWindowForModel(status, modelId) {
6968
+ const reported = status?.discoveredModelStates?.[modelId]?.contextLength;
6969
+ return typeof reported === "number" && Number.isFinite(reported) && reported > 0 ? reported : null;
6970
+ }
6971
+ function modelResidencyForStatus(status, modelId) {
6972
+ if (loadedContextWindowForModel(status, modelId) !== null) return "resident";
6973
+ switch (status?.discoveredModelStates?.[modelId]?.state) {
6974
+ case "loaded":
6975
+ return "resident";
6976
+ case "loading":
6977
+ return "loading";
6978
+ case "unloaded":
6979
+ return "absent";
6980
+ default:
6981
+ return "unknown";
6982
+ }
6633
6983
  }
6634
6984
  function hasLiveModelCatalog(status) {
6635
6985
  if (status.discoveredModelsSource === "probe" || status.discoveredModelsSource === "cache") return true;
@@ -6691,10 +7041,18 @@ function canonicalizeWireModelId(status, requested) {
6691
7041
  return matches.length === 1 ? matches[0] ?? requested : requested;
6692
7042
  }
6693
7043
 
7044
+ // src/domains/providers/index.ts
7045
+ init_esm_shims();
7046
+
7047
+ // src/domains/providers/extension.ts
7048
+ init_esm_shims();
7049
+
6694
7050
  // src/engine/apis/index.ts
7051
+ init_esm_shims();
6695
7052
  import { registerApiProvider } from "@earendil-works/pi-ai/compat";
6696
7053
 
6697
7054
  // src/engine/apis/ollama-native.ts
7055
+ init_esm_shims();
6698
7056
  import { randomUUID as randomUUID2 } from "node:crypto";
6699
7057
  import { createAssistantMessageEventStream as createAssistantMessageEventStream3 } from "@earendil-works/pi-ai";
6700
7058
  import {
@@ -7072,14 +7430,15 @@ function registerClioApiProviders() {
7072
7430
  }
7073
7431
 
7074
7432
  // src/domains/providers/knowledge-base-path.ts
7075
- import { existsSync as existsSync2, statSync as statSync3 } from "node:fs";
7433
+ init_esm_shims();
7434
+ import { existsSync as existsSync2, statSync as statSync2 } from "node:fs";
7076
7435
  import { delimiter, dirname as dirname2, join as join4 } from "node:path";
7077
7436
  import { fileURLToPath } from "node:url";
7078
7437
  var MODEL_CATALOG_OVERLAY_DIR = "model-catalog.d";
7079
7438
  var MODEL_CATALOG_DIRS_ENV = "CLIO_CODER_MODEL_CATALOG_DIRS";
7080
7439
  function isDirectory(path) {
7081
7440
  try {
7082
- return statSync3(path).isDirectory();
7441
+ return statSync2(path).isDirectory();
7083
7442
  } catch {
7084
7443
  return false;
7085
7444
  }
@@ -7148,6 +7507,7 @@ function resolveProviderKnowledgeBaseRoots(importMetaUrl, options = {}) {
7148
7507
  }
7149
7508
 
7150
7509
  // src/domains/providers/plugins.ts
7510
+ init_esm_shims();
7151
7511
  import { join as join5 } from "node:path";
7152
7512
  function extractPluginPackages(settings) {
7153
7513
  if (!settings || typeof settings !== "object") return [];
@@ -7182,9 +7542,10 @@ async function loadPluginRuntimes(registry, settings) {
7182
7542
  }
7183
7543
 
7184
7544
  // src/domains/providers/types/knowledge-base.ts
7185
- import { readdirSync as readdirSync2, readFileSync as readFileSync2, statSync as statSync4 } from "node:fs";
7545
+ init_esm_shims();
7546
+ var import_yaml = __toESM(require_dist(), 1);
7547
+ import { readdirSync as readdirSync2, readFileSync as readFileSync2, statSync as statSync3 } from "node:fs";
7186
7548
  import { join as join6 } from "node:path";
7187
- import { parse as parseYaml } from "yaml";
7188
7549
  var FileKnowledgeBase = class {
7189
7550
  roots;
7190
7551
  loaded = [];
@@ -7199,7 +7560,7 @@ var FileKnowledgeBase = class {
7199
7560
  for (const file of files) {
7200
7561
  const name = root.label ? `${root.label}:${file.name}` : file.name;
7201
7562
  const raw = readFileSync2(file.path, "utf8");
7202
- const parsed = parseYaml(raw);
7563
+ const parsed = (0, import_yaml.parse)(raw);
7203
7564
  if (!Array.isArray(parsed)) {
7204
7565
  throw new Error(`knowledge base file ${name} must be a YAML list of KnowledgeBaseEntry`);
7205
7566
  }
@@ -7238,7 +7599,7 @@ function normalizeRoots(root) {
7238
7599
  if (dir.length === 0 || seen.has(dir)) continue;
7239
7600
  let isRootDir = false;
7240
7601
  try {
7241
- isRootDir = statSync4(dir).isDirectory();
7602
+ isRootDir = statSync3(dir).isDirectory();
7242
7603
  } catch (err) {
7243
7604
  if (raw.optional === true) continue;
7244
7605
  throw err;
@@ -7705,12 +8066,14 @@ function createProvidersBundle(context) {
7705
8066
  }
7706
8067
 
7707
8068
  // src/domains/providers/manifest.ts
8069
+ init_esm_shims();
7708
8070
  var ProvidersManifest = {
7709
8071
  name: "providers",
7710
8072
  dependsOn: ["config"]
7711
8073
  };
7712
8074
 
7713
8075
  // src/domains/providers/resolver.ts
8076
+ init_esm_shims();
7714
8077
  var GLOB_CHARS = /[*?[]/;
7715
8078
  function isThinkingLevel(token) {
7716
8079
  return VALID_THINKING_LEVELS.includes(token);
@@ -7809,6 +8172,7 @@ function resolveModelReference(rawPattern, providers) {
7809
8172
  }
7810
8173
 
7811
8174
  // src/domains/providers/runtime-resolution.ts
8175
+ init_esm_shims();
7812
8176
  function diagnostic(severity, code, message) {
7813
8177
  return { severity, code, message };
7814
8178
  }
@@ -7993,12 +8357,14 @@ function resolveRuntimeTarget(providers, input) {
7993
8357
  const capabilityResolution = modelCapabilitiesFor(providers, status, wireModelId);
7994
8358
  const capabilities = { ...capabilityResolution.capabilities };
7995
8359
  const probedContextWindow = probeCapabilitiesForModel(status, wireModelId)?.contextWindow ?? null;
8360
+ const loadedContextWindow = loadedContextWindowForModel(status, wireModelId);
7996
8361
  const contextWindowDetails = resolveContextWindowDetails(
7997
8362
  target,
7998
8363
  runtime,
7999
8364
  wireModelId,
8000
8365
  providers.knowledgeBase,
8001
- probedContextWindow
8366
+ probedContextWindow,
8367
+ loadedContextWindow
8002
8368
  );
8003
8369
  capabilities.contextWindow = contextWindowDetails.effectiveContextWindow;
8004
8370
  if (contextWindowDetails.warning) {
@@ -8075,6 +8441,10 @@ function refineRuntimeTargetWithModelHints(target, model, knowledgeBase) {
8075
8441
  target.wireModelId,
8076
8442
  knowledgeBase ?? null,
8077
8443
  target.contextWindowDetails.probedContextWindow,
8444
+ // A synthesized model hint carries the model's declared window, never the
8445
+ // one the backend has open. Re-resolving without the loaded number would
8446
+ // hand the planner the declared window back on the first refinement.
8447
+ target.contextWindowDetails.loadedContextWindow,
8078
8448
  modelHintContextWindow
8079
8449
  );
8080
8450
  capabilities.contextWindow = contextWindowDetails.effectiveContextWindow;
@@ -8139,7 +8509,7 @@ var FALLBACK_CONTEXT_WINDOW = CLIO_MIN_CONTEXT_WINDOW;
8139
8509
  function positiveWindow2(value) {
8140
8510
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
8141
8511
  }
8142
- function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase, probedContextWindow, modelHintContextWindow) {
8512
+ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase, probedContextWindow, loadedContextWindow = null, modelHintContextWindow) {
8143
8513
  const catalogModel = getCatalogModelForRuntime(runtime.id, wireModelId);
8144
8514
  const kbHit = knowledgeBase?.lookup(wireModelId) ?? null;
8145
8515
  let modelDeclared;
@@ -8160,13 +8530,17 @@ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase
8160
8530
  const runtimeDefault = positiveWindow2(runtime.defaultCapabilities?.contextWindow);
8161
8531
  const declaredContextWindow = modelDeclared ?? runtimeDefault ?? FALLBACK_CONTEXT_WINDOW;
8162
8532
  const desired = Math.max(declaredContextWindow, DESIRED_CONTEXT_WINDOW);
8533
+ const loadedWindow = positiveWindow2(loadedContextWindow);
8163
8534
  const probeWindow = positiveWindow2(probedContextWindow);
8164
8535
  const overrideWindow = positiveWindow2(target.capabilities?.contextWindow);
8165
8536
  let effective;
8166
8537
  let source;
8167
- if (probeWindow !== void 0) {
8538
+ if (loadedWindow !== void 0) {
8539
+ effective = loadedWindow;
8540
+ source = "loaded";
8541
+ } else if (probeWindow !== void 0) {
8168
8542
  effective = probeWindow;
8169
- source = runtime.id === "lmstudio-native" ? "loaded" : "probe";
8543
+ source = "probe";
8170
8544
  } else if (overrideWindow !== void 0) {
8171
8545
  effective = overrideWindow;
8172
8546
  source = "target-override";
@@ -8193,7 +8567,7 @@ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase
8193
8567
  return {
8194
8568
  declaredContextWindow,
8195
8569
  probedContextWindow,
8196
- loadedContextWindow: runtime.id === "lmstudio-native" ? probedContextWindow : null,
8570
+ loadedContextWindow: loadedWindow ?? null,
8197
8571
  desiredContextWindow: desired,
8198
8572
  effectiveContextWindow: effective,
8199
8573
  contextWindowSource: source,
@@ -8203,6 +8577,7 @@ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase
8203
8577
  }
8204
8578
 
8205
8579
  // src/domains/providers/types/cost-provenance.ts
8580
+ init_esm_shims();
8206
8581
  function normalizeCostProvenance(value) {
8207
8582
  return value ?? "unknown";
8208
8583
  }
@@ -8274,7 +8649,7 @@ export {
8274
8649
  listProviderSupportEntries,
8275
8650
  configuredTargetsForRuntime,
8276
8651
  resolveProviderReference,
8277
- modelLoadStateLabel,
8652
+ modelResidencyForStatus,
8278
8653
  modelCandidatesForStatus,
8279
8654
  modelIdsForStatus,
8280
8655
  canonicalizeWireModelId,
@@ -8287,4 +8662,4 @@ export {
8287
8662
  normalizeCostProvenance,
8288
8663
  ProvidersDomainModule
8289
8664
  };
8290
- //# sourceMappingURL=chunk-TKHQ4DGZ.js.map
8665
+ //# sourceMappingURL=chunk-H6F6BYOH.js.map