@iowarp/clio-coder 0.3.8 → 0.3.9

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 (333) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +7 -3
  3. package/dist/{acp-U67UHUK2.js → acp-7LOELQFP.js} +6 -6
  4. package/dist/{agents-YU6SGALZ.js → agents-FIBG2SHA.js} +27 -25
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-5ZPJOIVG.js → auth-OI4LIH2I.js} +11 -12
  7. package/dist/{builtins-C6JMZVV6.js → builtins-AD25UL3C.js} +5 -5
  8. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  9. package/dist/chunk-3DPEIQKN.js +113 -0
  10. package/dist/{chunk-4SPRNWDE.js → chunk-3DUR4WUA.js} +15 -15
  11. package/dist/{chunk-VHN4MY6O.js → chunk-3MRC2YSQ.js} +2 -2
  12. package/dist/{chunk-5DHKRSMQ.js → chunk-3UUY7R3Z.js} +11 -7
  13. package/dist/{chunk-IGWKHNIQ.js → chunk-3V5AYSEQ.js} +8 -8
  14. package/dist/{chunk-FHJEP5SW.js → chunk-465CC7FK.js} +8 -5
  15. package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
  16. package/dist/{chunk-A3WNZD3P.js → chunk-4H6ULJ3H.js} +67 -21
  17. package/dist/{chunk-TB5666IT.js → chunk-4LJX2PUC.js} +3 -3
  18. package/dist/{chunk-XWSF374K.js → chunk-56KB5IJP.js} +2 -2
  19. package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
  20. package/dist/{chunk-2HEJ2F35.js → chunk-5HFBWUMU.js} +20 -8
  21. package/dist/{chunk-WNIJTQQK.js → chunk-5PVQ4SRS.js} +78 -6
  22. package/dist/{chunk-DYIM5TJT.js → chunk-5QKCQQ3E.js} +262 -6
  23. package/dist/{chunk-TYPGUK6W.js → chunk-5T7RBWN2.js} +111 -5
  24. package/dist/{chunk-IIZWH4XA.js → chunk-774ILSRL.js} +2 -2
  25. package/dist/chunk-7C6RYZGQ.js +391 -0
  26. package/dist/{chunk-TANS5ZJS.js → chunk-AD7Y7STJ.js} +3 -3
  27. package/dist/{chunk-RWSI4YD7.js → chunk-AEYBF3TB.js} +33 -12
  28. package/dist/{chunk-DGSYXYMX.js → chunk-AMKHQW3C.js} +2 -2
  29. package/dist/{chunk-VWZOAB7K.js → chunk-B5XRQOLB.js} +7 -7
  30. package/dist/{chunk-WXY7KU3G.js → chunk-BVDVID7E.js} +2 -2
  31. package/dist/{chunk-PMDBGQSJ.js → chunk-CA42X6KT.js} +2 -2
  32. package/dist/{chunk-HLE42MG7.js → chunk-D73KXYPF.js} +3 -3
  33. package/dist/{chunk-5Q2VVUKB.js → chunk-DG4M6ZUE.js} +3 -3
  34. package/dist/{chunk-ME6CCNFO.js → chunk-EBOC7MT3.js} +6 -6
  35. package/dist/{chunk-MXKJU4JB.js → chunk-ECUO3KDP.js} +48 -7
  36. package/dist/{chunk-26LEYJZH.js → chunk-FALJGAWU.js} +2 -2
  37. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  38. package/dist/{chunk-7RGZWPB6.js → chunk-GAYUJ7LE.js} +67 -13
  39. package/dist/{chunk-VCBR6CU7.js → chunk-HAY4ZE2P.js} +2 -2
  40. package/dist/{chunk-FBVTI2TJ.js → chunk-HCBCAYZU.js} +11 -130
  41. package/dist/{chunk-WSB3FPX7.js → chunk-HJB5IUKP.js} +32 -136
  42. package/dist/{chunk-J3YUBZWY.js → chunk-HKO36JWF.js} +33 -5
  43. package/dist/{chunk-E77JEWSD.js → chunk-HPCTNZM2.js} +6 -36
  44. package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
  45. package/dist/{chunk-NMPKI6XL.js → chunk-JEQQR47K.js} +37 -18
  46. package/dist/{chunk-3BINW3FP.js → chunk-KV2AOLDF.js} +24 -4
  47. package/dist/{chunk-YS5VLNH5.js → chunk-LXPJXFM5.js} +7 -7
  48. package/dist/{chunk-7RFXX52T.js → chunk-MIX5N5AC.js} +271 -41
  49. package/dist/{chunk-K4XHGFR5.js → chunk-MLOK6ZOS.js} +1297 -218
  50. package/dist/{chunk-ZNLWCMVZ.js → chunk-MV2VUEJC.js} +2 -2
  51. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  52. package/dist/{chunk-5H3GB5BO.js → chunk-N3PBVRTZ.js} +4 -382
  53. package/dist/{chunk-2HFZQUHL.js → chunk-N5XKWMDW.js} +17 -7
  54. package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
  55. package/dist/{chunk-GU2UIAFZ.js → chunk-NQ6UCCOD.js} +3 -3
  56. package/dist/{chunk-N22QMJKY.js → chunk-NZU6YDNV.js} +4 -4
  57. package/dist/{chunk-ZVJ5BLO2.js → chunk-O6I4CIEU.js} +151 -13
  58. package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
  59. package/dist/{chunk-VAWNZU7Z.js → chunk-P3JGPQFL.js} +2 -2
  60. package/dist/{chunk-IJ7RPIYJ.js → chunk-PNY46YEY.js} +20 -3
  61. package/dist/{chunk-U6MBIEMB.js → chunk-PZ4I4JE2.js} +56 -35
  62. package/dist/{chunk-GPIEI3LY.js → chunk-QQ7EKM72.js} +2 -2
  63. package/dist/{chunk-WLFILSD5.js → chunk-R7LNVMCS.js} +66 -28
  64. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  65. package/dist/chunk-RKKLTLYB.js +45 -0
  66. package/dist/{chunk-TT36MB5S.js → chunk-RKRLDWD3.js} +3 -1
  67. package/dist/{chunk-TTHACPOM.js → chunk-S4COXYBG.js} +456 -18
  68. package/dist/{chunk-WWCZ5F23.js → chunk-T3Z6VAAF.js} +69 -10
  69. package/dist/{chunk-GN57SG4G.js → chunk-TD7UE2L5.js} +9 -7
  70. package/dist/{chunk-TLQJPP24.js → chunk-TEO2TLVN.js} +523 -322
  71. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  72. package/dist/{chunk-KTYTFRMB.js → chunk-VKBMFOYV.js} +17 -15
  73. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  74. package/dist/{chunk-P43ETTHK.js → chunk-VPTUJU4P.js} +2 -2
  75. package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
  76. package/dist/{chunk-EMYUUSFG.js → chunk-WXCJ7VME.js} +5 -5
  77. package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
  78. package/dist/{chunk-JOZYP4GM.js → chunk-YKOFT37S.js} +5 -5
  79. package/dist/chunk-YSEHGPCT.js +127 -0
  80. package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
  81. package/dist/cli/index.js +27 -27
  82. package/dist/{clio-QVTYJ57A.js → clio-LT5V7SSZ.js} +6 -6
  83. package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +4 -4
  84. package/dist/{config-LW5IJFQN.js → config-RXS5T3JT.js} +71 -43
  85. package/dist/{configure-7XIZCOU4.js → configure-2WYWSCSD.js} +14 -15
  86. package/dist/{context-Y6Y7QPR6.js → context-I3BTOTCS.js} +12 -12
  87. package/dist/{context-L3WL3X7K.js → context-MVOORGMF.js} +34 -33
  88. package/dist/{context-N52ZA626.js → context-PALKKQYL.js} +20 -20
  89. package/dist/{context-clear-MBQRLSDQ.js → context-clear-N2WOYZ2K.js} +34 -33
  90. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  91. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-MIEVECVZ.js} +10 -11
  92. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-VVA4SRRH.js} +34 -33
  93. package/dist/doctor-TWBWFK5V.js +165 -0
  94. package/dist/{eval-BEC2WHDA.js → eval-IJ5VEZDJ.js} +2016 -142
  95. package/dist/{evidence-REJUMSKM.js → evidence-L5APPXNV.js} +29 -28
  96. package/dist/{evolve-PY5ZBA5K.js → evolve-RGNKFJ52.js} +29 -28
  97. package/dist/{extensions-HVKU65YU.js → extensions-7WYWUX5A.js} +9 -3
  98. package/dist/{fleet-7WZEWRFA.js → fleet-6CNVBZZP.js} +87 -55
  99. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-L2SXSYEI.js} +6 -6
  100. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-2J3OOIPO.js} +14 -12
  101. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-CZRJ4JP5.js} +3 -4
  102. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-C5RI6DP7.js} +16 -15
  103. package/dist/{init-OG3TPGQG.js → init-VBN2ACVA.js} +50 -48
  104. package/dist/{library-CNTMPLRF.js → library-JHGUMLY2.js} +13 -11
  105. package/dist/{memory-6IS7F275.js → memory-K4OQIYWG.js} +31 -30
  106. package/dist/{models-ENRJDA5W.js → models-2NCZUWDD.js} +23 -22
  107. package/dist/{monitor-XLDVO7TN.js → monitor-MMVTJABD.js} +35 -34
  108. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-ZKBPCHW6.js} +1627 -294
  109. package/dist/{reset-RZ4ER727.js → reset-DD5JGOY3.js} +3 -3
  110. package/dist/{run-Y2CNK5RU.js → run-QEGNX7FL.js} +56 -55
  111. package/dist/{share-A55GYP6Z.js → share-JKD3BQMW.js} +13 -11
  112. package/dist/{skills-ALC5J6AT.js → skills-LMQIKDOZ.js} +14 -12
  113. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-I7X2774U.js} +34 -32
  114. package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
  115. package/dist/{support-MIETYA5E.js → support-I7LOJLIF.js} +4 -4
  116. package/dist/{targets-VGNXIR3S.js → targets-RUSR6B5Z.js} +58 -32
  117. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-QYVORFR4.js} +6 -4
  118. package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
  119. package/dist/{upgrade-FUSUAGHR.js → upgrade-XANW3FXB.js} +17 -16
  120. package/dist/{usage-N4MKVHKD.js → usage-4H7ZRXQT.js} +88 -44
  121. package/dist/{verifiers-YAWOJ3H2.js → verifiers-UZXNBZEB.js} +6 -6
  122. package/dist/{verify-LTDHYBGY.js → verify-BVKWTNDL.js} +5 -5
  123. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-MY7WV2QI.js} +49 -47
  124. package/dist/worker/entry.js +29 -33
  125. package/docs/alcf-provider.md +1 -1
  126. package/docs/architecture.md +1 -1
  127. package/docs/artifact-versions.md +6 -1
  128. package/docs/built-in-agents.md +1 -1
  129. package/docs/capacity-and-scheduling.md +23 -2
  130. package/docs/commands-and-modes.md +1 -1
  131. package/docs/configuration-and-targets.md +30 -3
  132. package/docs/context-engine.md +63 -4
  133. package/docs/documentation-coverage.md +3 -3
  134. package/docs/documentation-guide.md +1 -1
  135. package/docs/environment-variables.md +2 -0
  136. package/docs/eval-runner.md +262 -11
  137. package/docs/evals-internal.md +72 -2
  138. package/docs/evidence-and-memory.md +11 -10
  139. package/docs/evolution.md +1 -1
  140. package/docs/extensions-and-sharing.md +3 -1
  141. package/docs/fleet-dispatch.md +4 -4
  142. package/docs/installation-and-lifecycle.md +1 -1
  143. package/docs/middleware-and-components.md +1 -1
  144. package/docs/model-catalog.md +1 -1
  145. package/docs/observability.md +53 -2
  146. package/docs/proactive-memory.md +127 -14
  147. package/docs/prompt-envelope-and-tools.md +19 -1
  148. package/docs/provider-adapter-cookbook.md +1 -1
  149. package/docs/release-cut-checklist.md +19 -3
  150. package/docs/safety-model.md +1 -1
  151. package/docs/scientific-validation.md +1 -1
  152. package/docs/skills-marketplace.md +1 -1
  153. package/docs/tool-usage.md +1 -1
  154. package/docs/trace-store.md +1 -1
  155. package/docs/troubleshooting.md +87 -0
  156. package/docs/tui-design.md +1 -1
  157. package/docs/worker-dispatch-mechanics.md +1 -1
  158. package/package.json +2 -1
  159. package/src/cli/agents.ts +1 -1
  160. package/src/cli/config-inspect.ts +33 -6
  161. package/src/cli/config.ts +1 -1
  162. package/src/cli/doctor-state-size.ts +82 -0
  163. package/src/cli/doctor.ts +3 -1
  164. package/src/cli/eval.ts +80 -16
  165. package/src/cli/extensions.ts +5 -1
  166. package/src/cli/fleet.ts +32 -3
  167. package/src/cli/targets.ts +44 -13
  168. package/src/cli/trace.ts +63 -4
  169. package/src/cli/usage.ts +63 -14
  170. package/src/core/bus-events.ts +29 -1
  171. package/src/core/cache-telemetry.ts +42 -0
  172. package/src/core/config.ts +18 -0
  173. package/src/core/defaults.ts +36 -6
  174. package/src/core/endpoint-key.ts +27 -0
  175. package/src/core/residency-target-key.ts +25 -0
  176. package/src/core/response-schema.ts +36 -2
  177. package/src/domains/config/classify.ts +3 -0
  178. package/src/domains/context/codewiki/coordinator.ts +12 -4
  179. package/src/domains/dispatch/admission.ts +40 -3
  180. package/src/domains/dispatch/capacity-lease.ts +98 -9
  181. package/src/domains/dispatch/contract.ts +11 -0
  182. package/src/domains/dispatch/execution-plan.ts +44 -4
  183. package/src/domains/dispatch/extension.ts +166 -42
  184. package/src/domains/dispatch/fleet-run.ts +23 -3
  185. package/src/domains/dispatch/heartbeat.ts +32 -8
  186. package/src/domains/dispatch/index.ts +3 -0
  187. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  188. package/src/domains/dispatch/reservation-store.ts +116 -8
  189. package/src/domains/dispatch/state.ts +4 -0
  190. package/src/domains/dispatch/worker-spawn.ts +25 -11
  191. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  192. package/src/domains/dispatch/write-boundary.ts +62 -1
  193. package/src/domains/eval/artifacts/store.ts +62 -0
  194. package/src/domains/eval/compare/behavioral.ts +224 -0
  195. package/src/domains/eval/compare/compare.ts +355 -2
  196. package/src/domains/eval/compare/envelope.ts +128 -0
  197. package/src/domains/eval/compare/gates.ts +24 -6
  198. package/src/domains/eval/compare/thresholds.ts +30 -3
  199. package/src/domains/eval/execution-provenance.ts +240 -0
  200. package/src/domains/eval/metrics/aggregate.ts +136 -0
  201. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  202. package/src/domains/eval/metrics/tracked.ts +413 -0
  203. package/src/domains/eval/provenance.ts +117 -0
  204. package/src/domains/eval/reports/comparison.ts +128 -0
  205. package/src/domains/eval/reports/junit.ts +17 -3
  206. package/src/domains/eval/reports/markdown.ts +3 -3
  207. package/src/domains/eval/reports/text.ts +14 -0
  208. package/src/domains/eval/run-compare.ts +20 -0
  209. package/src/domains/eval/runners/clio-run.ts +127 -0
  210. package/src/domains/eval/runners/external-command.ts +28 -3
  211. package/src/domains/eval/schema/adapter.ts +111 -0
  212. package/src/domains/eval/schema/artifact.ts +20 -0
  213. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  214. package/src/domains/eval/schema/behavioral.ts +520 -0
  215. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  216. package/src/domains/eval/schema/serving.ts +74 -0
  217. package/src/domains/eval/schema/suite.ts +38 -8
  218. package/src/domains/eval/schema/validate.ts +58 -3
  219. package/src/domains/eval/schema/verdict.ts +237 -0
  220. package/src/domains/eval/suites/resolve.ts +2 -0
  221. package/src/domains/eval/suites/run.ts +264 -33
  222. package/src/domains/eval/verifiers/command.ts +2 -1
  223. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  224. package/src/domains/evidence/build.ts +2 -13
  225. package/src/domains/evidence/eval.ts +2 -12
  226. package/src/domains/evidence/findings-markdown.ts +33 -0
  227. package/src/domains/evidence/run-trust.ts +7 -113
  228. package/src/domains/evidence/trust-projection.ts +2 -2
  229. package/src/domains/extensions/compatibility.ts +285 -0
  230. package/src/domains/extensions/discovery.ts +38 -3
  231. package/src/domains/extensions/resources.ts +1 -1
  232. package/src/domains/extensions/state.ts +12 -3
  233. package/src/domains/extensions/types.ts +2 -0
  234. package/src/domains/lifecycle/doctor.ts +69 -1
  235. package/src/domains/memory/index.ts +14 -0
  236. package/src/domains/memory/task-bank-promotion.ts +64 -0
  237. package/src/domains/memory/task-memory-policy.ts +77 -8
  238. package/src/domains/memory/task-memory-spend.ts +131 -0
  239. package/src/domains/memory/task-memory-status.ts +7 -0
  240. package/src/domains/memory/task-memory-telemetry.ts +2 -0
  241. package/src/domains/middleware/index.ts +1 -0
  242. package/src/domains/middleware/memory-intervention.ts +69 -5
  243. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  244. package/src/domains/observability/background-memory-usage.ts +140 -0
  245. package/src/domains/observability/cost.ts +1 -1
  246. package/src/domains/observability/index.ts +7 -0
  247. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  248. package/src/domains/observability/trace-store.ts +192 -2
  249. package/src/domains/prompts/compiler.ts +100 -13
  250. package/src/domains/providers/endpoint-capacity.ts +96 -0
  251. package/src/domains/providers/index.ts +10 -0
  252. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  253. package/src/domains/providers/runtime-resolution.ts +8 -1
  254. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  255. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  256. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  257. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  258. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  259. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  260. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  261. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  262. package/src/domains/providers/types/capability-flags.ts +2 -0
  263. package/src/domains/providers/types/target-descriptor.ts +2 -0
  264. package/src/domains/resources/prompts/loader.ts +95 -33
  265. package/src/domains/safety/call-target.ts +52 -0
  266. package/src/domains/safety/run-effects.ts +35 -4
  267. package/src/domains/session/context-accounting.ts +52 -1
  268. package/src/domains/session/context-ledger.ts +37 -13
  269. package/src/domains/session/index.ts +6 -0
  270. package/src/domains/session/prompt-cache.ts +140 -0
  271. package/src/domains/session/prompt-manifest.ts +42 -0
  272. package/src/engine/acp/adapter.ts +18 -3
  273. package/src/engine/ai.ts +35 -0
  274. package/src/engine/apis/llamacpp-residency.ts +55 -3
  275. package/src/engine/apis/lmstudio.ts +25 -5
  276. package/src/engine/apis/ollama-native.ts +2 -1
  277. package/src/engine/apis/openai-completions.ts +80 -17
  278. package/src/engine/apis/residency-lock.ts +3 -1
  279. package/src/engine/apis/residency.ts +34 -1
  280. package/src/engine/provider-payload.ts +29 -1
  281. package/src/entry/orchestrator.ts +176 -30
  282. package/src/interactive/chat-loop-messages.ts +26 -7
  283. package/src/interactive/chat-loop.ts +318 -41
  284. package/src/interactive/chat-panel.ts +62 -8
  285. package/src/interactive/clio-editor.ts +45 -8
  286. package/src/interactive/context-activity.ts +5 -1
  287. package/src/interactive/context-meter.ts +1 -1
  288. package/src/interactive/context-overlay.ts +40 -10
  289. package/src/interactive/cost-overlay.ts +64 -6
  290. package/src/interactive/dispatch-board.ts +84 -12
  291. package/src/interactive/fleet-run-preview.ts +41 -15
  292. package/src/interactive/handoff-round.ts +41 -2
  293. package/src/interactive/interactive-application.ts +24 -1
  294. package/src/interactive/interactive-input-runtime.ts +8 -0
  295. package/src/interactive/interactive-presentation.ts +4 -0
  296. package/src/interactive/interactive-shell.ts +20 -17
  297. package/src/interactive/interactive-slash-runtime.ts +27 -4
  298. package/src/interactive/memory-overlay.ts +8 -0
  299. package/src/interactive/mutation-preview.ts +295 -0
  300. package/src/interactive/overlay-general-openers.ts +16 -0
  301. package/src/interactive/overlay-key-routing.ts +38 -0
  302. package/src/interactive/overlay-lifecycle.ts +38 -5
  303. package/src/interactive/overlay-permission-lifecycle.ts +22 -2
  304. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  305. package/src/interactive/overlays/ask-user.ts +91 -19
  306. package/src/interactive/overlays/help-reference.ts +4 -0
  307. package/src/interactive/overlays/prompts.ts +11 -1
  308. package/src/interactive/overlays/settings.ts +35 -1
  309. package/src/interactive/permission-hint.ts +34 -2
  310. package/src/interactive/permission-overlay.ts +159 -9
  311. package/src/interactive/prewarm.ts +197 -0
  312. package/src/interactive/render-trace.ts +162 -15
  313. package/src/interactive/renderers/tool-execution.ts +4 -0
  314. package/src/interactive/side-question.ts +58 -1
  315. package/src/interactive/status/controller.ts +11 -0
  316. package/src/interactive/status/state-machine.ts +54 -2
  317. package/src/interactive/status/types.ts +7 -0
  318. package/src/interactive/terminal-lease.ts +2 -0
  319. package/src/interactive/turn-context.ts +299 -31
  320. package/src/interactive/turn-persistence.ts +14 -4
  321. package/src/interactive/turn-prewarm.ts +364 -0
  322. package/src/interactive/turn-queues.ts +7 -4
  323. package/src/interactive/turn-runtime.ts +8 -1
  324. package/src/interactive/turn-state.ts +23 -0
  325. package/src/interactive/view/view-overlay.ts +28 -3
  326. package/src/tools/ask-user.ts +43 -2
  327. package/src/tools/dispatch-plan.ts +17 -9
  328. package/src/tools/dispatch-scout.ts +1 -1
  329. package/src/tools/registry.ts +16 -0
  330. package/dist/chunk-AOCYTWAV.js +0 -449
  331. package/dist/chunk-HWUFFB6L.js +0 -83
  332. package/dist/chunk-R346GLFC.js +0 -31
  333. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -5,19 +5,19 @@ import {
5
5
  import {
6
6
  probeWorkspace
7
7
  } from "./chunk-HVDIIIQW.js";
8
- import {
9
- isSessionEntry,
10
- isSessionHeader
11
- } from "./chunk-GOXNB3AO.js";
12
8
  import {
13
9
  protectArtifact
14
10
  } from "./chunk-MV3K5QF2.js";
11
+ import {
12
+ isSessionEntry,
13
+ isSessionHeader
14
+ } from "./chunk-RAPCMZL4.js";
15
15
  import {
16
16
  stripTokenizerSentinels
17
17
  } from "./chunk-CFGTUFWB.js";
18
18
  import {
19
19
  BusChannels
20
- } from "./chunk-TT36MB5S.js";
20
+ } from "./chunk-RKRLDWD3.js";
21
21
  import {
22
22
  CURRENT_SESSION_FORMAT_VERSION,
23
23
  appendSessionFileEntry,
@@ -29,7 +29,7 @@ import {
29
29
  readSessionMeta,
30
30
  resumeSession,
31
31
  sessionPaths
32
- } from "./chunk-3BINW3FP.js";
32
+ } from "./chunk-KV2AOLDF.js";
33
33
  import {
34
34
  clioStateDir,
35
35
  stateRootRemoved
@@ -1475,4 +1475,4 @@ export {
1475
1475
  ledgerUsageCalls,
1476
1476
  SessionDomainModule
1477
1477
  };
1478
- //# sourceMappingURL=chunk-YS5VLNH5.js.map
1478
+ //# sourceMappingURL=chunk-LXPJXFM5.js.map
@@ -10,10 +10,10 @@ import {
10
10
  ceilChars,
11
11
  estimateAgentMessageTokens,
12
12
  toolSchemaChars
13
- } from "./chunk-RWSI4YD7.js";
13
+ } from "./chunk-AEYBF3TB.js";
14
14
  import {
15
15
  readSettings
16
- } from "./chunk-IJ7RPIYJ.js";
16
+ } from "./chunk-PNY46YEY.js";
17
17
  import {
18
18
  sleep
19
19
  } from "./chunk-FQ4SKYE4.js";
@@ -22,7 +22,7 @@ import {
22
22
  } from "./chunk-ZGVHUX3M.js";
23
23
  import {
24
24
  BusChannels
25
- } from "./chunk-TT36MB5S.js";
25
+ } from "./chunk-RKRLDWD3.js";
26
26
  import {
27
27
  CLIO_CONTEXT_WINDOW_WARN_BELOW,
28
28
  CLIO_MIN_CONTEXT_WINDOW,
@@ -34,10 +34,10 @@ import {
34
34
  registerBuiltinRuntimes,
35
35
  requestLmStudioJson,
36
36
  resolveLmStudioInstance
37
- } from "./chunk-NMPKI6XL.js";
37
+ } from "./chunk-JEQQR47K.js";
38
38
  import {
39
39
  listKnownModelsForRuntime
40
- } from "./chunk-IIZWH4XA.js";
40
+ } from "./chunk-774ILSRL.js";
41
41
  import {
42
42
  authNotRequiredStatus,
43
43
  openAuthStorage,
@@ -65,18 +65,100 @@ import {
65
65
  getCatalogModelForRuntime,
66
66
  mergeCapabilities,
67
67
  resolveCostProvenance
68
- } from "./chunk-PT7HYKEM.js";
68
+ } from "./chunk-VO2LKSTM.js";
69
69
  import {
70
70
  activateExternalPluginApiBridge,
71
71
  calculateEngineCost,
72
72
  ensurePiAiRegistered,
73
73
  registerEngineApiProvider
74
- } from "./chunk-FCSXB6T2.js";
74
+ } from "./chunk-UOSL25KY.js";
75
75
  import {
76
76
  __toESM,
77
77
  init_esm_shims
78
78
  } from "./chunk-3R73A4XB.js";
79
79
 
80
+ // src/domains/providers/endpoint-capacity.ts
81
+ init_esm_shims();
82
+
83
+ // src/core/endpoint-key.ts
84
+ init_esm_shims();
85
+ function canonicalEndpointUrl(raw) {
86
+ if (!raw?.trim()) return null;
87
+ try {
88
+ const url = new URL(raw.trim().replace(/^ws:/u, "http:").replace(/^wss:/u, "https:"));
89
+ url.protocol = url.protocol.toLowerCase();
90
+ if (url.protocol !== "http:" && url.protocol !== "https:") return null;
91
+ url.hostname = url.hostname.toLowerCase();
92
+ url.username = "";
93
+ url.password = "";
94
+ url.hash = "";
95
+ url.search = "";
96
+ let path = url.pathname.replace(/\/{2,}/gu, "/").replace(/\/$/u, "");
97
+ if (path.endsWith("/v1")) path = path.slice(0, -3);
98
+ url.pathname = path || "/";
99
+ return url.toString().replace(/\/$/u, "");
100
+ } catch {
101
+ return null;
102
+ }
103
+ }
104
+
105
+ // src/domains/providers/endpoint-capacity.ts
106
+ var UNBOUNDED_LOCAL_NATIVE_RUNTIMES = /* @__PURE__ */ new Set(["vllm", "sglang"]);
107
+ function canonicalEndpointKey(value) {
108
+ return canonicalEndpointUrl(typeof value === "string" ? value : value.url);
109
+ }
110
+ function endpointLabel(endpointKey) {
111
+ try {
112
+ const url = new URL(endpointKey);
113
+ return `${url.host}${url.pathname === "/" ? "" : url.pathname}`;
114
+ } catch {
115
+ return endpointKey;
116
+ }
117
+ }
118
+ function positiveInteger(value) {
119
+ return typeof value === "number" && Number.isInteger(value) && value > 0 ? value : void 0;
120
+ }
121
+ function endpointCapacityForStatus(status) {
122
+ const key = canonicalEndpointKey(status.target);
123
+ if (key === null) return null;
124
+ const override = positiveInteger(status.target.maxConcurrentRequests);
125
+ if (override !== void 0) return { key, label: endpointLabel(key), limit: override, source: "override" };
126
+ const discovered = positiveInteger(status.probeCapabilities?.parallelSlots);
127
+ if (discovered !== void 0) return { key, label: endpointLabel(key), limit: discovered, source: "discovered" };
128
+ if (status.runtime?.tier !== "local-native" || UNBOUNDED_LOCAL_NATIVE_RUNTIMES.has(status.runtime.id)) return null;
129
+ return { key, label: endpointLabel(key), limit: 1, source: "local-native-default" };
130
+ }
131
+ function sourceRank(source) {
132
+ return source === "override" ? 2 : source === "discovered" ? 1 : 0;
133
+ }
134
+ function endpointCapacitiesForStatuses(statuses) {
135
+ const capacities = {};
136
+ for (const status of statuses) {
137
+ const candidate = endpointCapacityForStatus(status);
138
+ if (candidate === null) continue;
139
+ const current = capacities[candidate.key];
140
+ if (current === void 0 || sourceRank(candidate.source) > sourceRank(current.source) || sourceRank(candidate.source) === sourceRank(current.source) && candidate.limit < current.limit) {
141
+ capacities[candidate.key] = candidate;
142
+ }
143
+ }
144
+ return capacities;
145
+ }
146
+ var foregroundStreams = /* @__PURE__ */ new Map();
147
+ function registerForegroundStream(endpointKey) {
148
+ foregroundStreams.set(endpointKey, (foregroundStreams.get(endpointKey) ?? 0) + 1);
149
+ let held = true;
150
+ return () => {
151
+ if (!held) return;
152
+ held = false;
153
+ const next = (foregroundStreams.get(endpointKey) ?? 1) - 1;
154
+ if (next <= 0) foregroundStreams.delete(endpointKey);
155
+ else foregroundStreams.set(endpointKey, next);
156
+ };
157
+ }
158
+ function foregroundStreamUsage() {
159
+ return Object.fromEntries(foregroundStreams);
160
+ }
161
+
80
162
  // src/engine/apis/residency.ts
81
163
  init_esm_shims();
82
164
 
@@ -85,7 +167,8 @@ init_esm_shims();
85
167
  import { join } from "node:path";
86
168
  var LOCK_WAIT_MS = 12e4;
87
169
  function lockTargetFor(targetKey) {
88
- return join(clioStatePath(), "residency-locks", targetKey.replace(/[^a-zA-Z0-9._-]+/g, "_"));
170
+ const key = canonicalEndpointKey(targetKey) ?? targetKey;
171
+ return join(clioStatePath(), "residency-locks", key.replace(/[^a-zA-Z0-9._-]+/g, "_"));
89
172
  }
90
173
  async function withResidencyLock(targetKey, fn) {
91
174
  return withStateFileLock(lockTargetFor(targetKey), fn, {
@@ -114,6 +197,9 @@ function emitResidencyNotice(notice) {
114
197
  } catch {
115
198
  }
116
199
  }
200
+ function emitResidencyMutation(mutation) {
201
+ getSharedBus().emit(BusChannels.ResidencyMutation, { ...mutation, at: Date.now() });
202
+ }
117
203
  var protectedModelsProvider = null;
118
204
  function setProtectedModelsProvider(provider) {
119
205
  protectedModelsProvider = provider;
@@ -344,6 +430,13 @@ async function restoreEvictedModels(adapter, evicted, loadError) {
344
430
  try {
345
431
  await adapter.reloadEvicted(entry.modelId);
346
432
  restored.push(entry.modelId);
433
+ emitResidencyMutation({
434
+ targetKey: adapter.targetKey,
435
+ targetId: adapter.targetId,
436
+ runtimeId: adapter.runtimeId,
437
+ model: entry.modelId,
438
+ operation: "load"
439
+ });
347
440
  } catch {
348
441
  failed.push(entry.modelId);
349
442
  }
@@ -460,12 +553,28 @@ async function reconcileResidency(adapter) {
460
553
  await adapter.unload(entry.modelId);
461
554
  forgetClioLoaded(adapter.targetKey, entry.modelId);
462
555
  evicted.push(entry);
556
+ emitResidencyMutation({
557
+ targetKey: adapter.targetKey,
558
+ targetId: adapter.targetId,
559
+ runtimeId: adapter.runtimeId,
560
+ model: entry.modelId,
561
+ operation: "evict"
562
+ });
463
563
  } catch {
464
564
  }
465
565
  }
466
566
  if (!adapter.load) return;
467
567
  try {
468
568
  await adapter.load(adapter.keepModelId);
569
+ if (!plan.keepResident) {
570
+ emitResidencyMutation({
571
+ targetKey: adapter.targetKey,
572
+ targetId: adapter.targetId,
573
+ runtimeId: adapter.runtimeId,
574
+ model: adapter.keepModelId,
575
+ operation: "load"
576
+ });
577
+ }
469
578
  } catch (error) {
470
579
  await restoreEvictedModels(adapter, evicted, error);
471
580
  throw error;
@@ -1477,7 +1586,7 @@ function resolveRuntimeTarget(providers, input) {
1477
1586
  const capabilityResolution = modelCapabilitiesFor(providers, status, wireModelId);
1478
1587
  const capabilities = { ...capabilityResolution.capabilities };
1479
1588
  const probedContextWindow = probeCapabilitiesForModel(status, wireModelId)?.contextWindow ?? null;
1480
- const loadedContextWindow = loadedContextWindowForModel(status, wireModelId);
1589
+ const loadedContextWindow = loadedContextWindowForModel(status, wireModelId) ?? input.knownLoadedContextWindow ?? null;
1481
1590
  const contextWindowDetails = resolveContextWindowDetails(
1482
1591
  target,
1483
1592
  runtime,
@@ -1705,6 +1814,12 @@ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase
1705
1814
  };
1706
1815
  }
1707
1816
 
1817
+ // src/domains/providers/types/cost-provenance.ts
1818
+ init_esm_shims();
1819
+ function normalizeCostProvenance(value) {
1820
+ return value ?? "unknown";
1821
+ }
1822
+
1708
1823
  // src/domains/providers/index.ts
1709
1824
  init_esm_shims();
1710
1825
 
@@ -1722,6 +1837,18 @@ import {
1722
1837
  Ollama
1723
1838
  } from "ollama";
1724
1839
 
1840
+ // src/core/residency-target-key.ts
1841
+ init_esm_shims();
1842
+ var RESIDENCY_RUNTIME_IDS = /* @__PURE__ */ new Set([
1843
+ "llamacpp",
1844
+ "lmstudio",
1845
+ "ollama-native"
1846
+ ]);
1847
+ function residencyTargetKey(runtimeId, baseUrl) {
1848
+ if (!RESIDENCY_RUNTIME_IDS.has(runtimeId) || typeof baseUrl !== "string") return null;
1849
+ return canonicalEndpointUrl(baseUrl) ?? baseUrl;
1850
+ }
1851
+
1725
1852
  // src/engine/gemma-channel-filter.ts
1726
1853
  init_esm_shims();
1727
1854
  import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
@@ -1991,7 +2118,7 @@ async function reconcileOllamaResidency(model, headers) {
1991
2118
  if (!baseUrl) return;
1992
2119
  const metadata2 = model.clio;
1993
2120
  const adapter = {
1994
- targetKey: `ollama-native|${baseUrl}`,
2121
+ targetKey: residencyTargetKey("ollama-native", baseUrl),
1995
2122
  targetId: ollamaTargetId(model),
1996
2123
  runtimeId: "ollama-native",
1997
2124
  keepModelId: model.id,
@@ -2559,6 +2686,26 @@ async function fetchRouterModels(input, fetchImpl) {
2559
2686
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
2560
2687
  return parseRouterModels(await response.json());
2561
2688
  }
2689
+ var RouterModelPostError = class extends Error {
2690
+ constructor(url, status, responseBody) {
2691
+ super(`llama.cpp router rejected ${url}: HTTP ${status}; response: ${responseBody}`);
2692
+ this.url = url;
2693
+ this.status = status;
2694
+ this.responseBody = responseBody;
2695
+ this.name = "RouterModelPostError";
2696
+ }
2697
+ url;
2698
+ status;
2699
+ responseBody;
2700
+ };
2701
+ async function routerErrorBody(response) {
2702
+ try {
2703
+ const body = (await response.text()).trim();
2704
+ return body.length > 0 ? body : "<empty body>";
2705
+ } catch (error) {
2706
+ return `<unreadable body: ${error instanceof Error ? error.message : String(error)}>`;
2707
+ }
2708
+ }
2562
2709
  async function postRouterModel(fetchImpl, url, modelId) {
2563
2710
  const response = await fetchImpl(url, {
2564
2711
  method: "POST",
@@ -2567,7 +2714,27 @@ async function postRouterModel(fetchImpl, url, modelId) {
2567
2714
  signal: AbortSignal.timeout(LOAD_TIMEOUT_MS)
2568
2715
  });
2569
2716
  if (response.ok) return;
2570
- throw new Error(`llama.cpp router rejected ${url}: HTTP ${response.status}`);
2717
+ throw new RouterModelPostError(url, response.status, await routerErrorBody(response));
2718
+ }
2719
+ function alreadyRunningResponse(body) {
2720
+ return body.toLowerCase().includes("already running");
2721
+ }
2722
+ async function postRouterLoad(input, fetchImpl, modelId) {
2723
+ try {
2724
+ await postRouterModel(fetchImpl, loadUrl(input.baseUrl), modelId);
2725
+ } catch (error) {
2726
+ if (!(error instanceof RouterModelPostError)) throw error;
2727
+ let model;
2728
+ try {
2729
+ model = (await fetchRouterModels(input, fetchImpl)).find((entry) => entry.id === modelId);
2730
+ } catch {
2731
+ if (alreadyRunningResponse(error.responseBody)) return;
2732
+ throw error;
2733
+ }
2734
+ if (alreadyRunningResponse(error.responseBody)) return;
2735
+ if (model !== void 0 && model.state !== "unloaded" && model.state !== "failed") return;
2736
+ throw error;
2737
+ }
2571
2738
  }
2572
2739
  async function waitForLoaded(input, fetchImpl, modelId) {
2573
2740
  const started = performance.now();
@@ -2582,7 +2749,7 @@ async function waitForLoaded(input, fetchImpl, modelId) {
2582
2749
  }
2583
2750
  async function ensureModelLoaded(input, fetchImpl, modelId, knownState) {
2584
2751
  if (knownState === "loaded" || knownState === "sleeping") return;
2585
- if (knownState !== "loading") await postRouterModel(fetchImpl, loadUrl(input.baseUrl), modelId);
2752
+ if (knownState !== "loading") await postRouterLoad(input, fetchImpl, modelId);
2586
2753
  await waitForLoaded(input, fetchImpl, modelId);
2587
2754
  }
2588
2755
  async function restoreDisplacedPinned(input, fetchImpl, before) {
@@ -2609,7 +2776,7 @@ async function ensureLlamaCppResidency(input) {
2609
2776
  const fetchImpl = input.fetchImpl ?? fetch;
2610
2777
  let snapshot = [];
2611
2778
  const adapter = {
2612
- targetKey: `llamacpp|${input.baseUrl}`,
2779
+ targetKey: residencyTargetKey("llamacpp", input.baseUrl),
2613
2780
  targetId: input.targetId,
2614
2781
  runtimeId: input.runtimeId,
2615
2782
  keepModelId: input.keepModelId,
@@ -2809,7 +2976,7 @@ async function ensureLmStudioResidency(model, options = {}) {
2809
2976
  (entry) => entry.loadedInstances.map((instance) => ({ modelKey: entry.key, identifier: instance.id, instance }))
2810
2977
  );
2811
2978
  const managed = residencyManagedFor(info.lifecycle);
2812
- const targetKey = `lmstudio|${lmStudioRootUrl(target.url ?? model.baseUrl)}`;
2979
+ const targetKey = residencyTargetKey("lmstudio", target.url ?? model.baseUrl);
2813
2980
  const contextLength = target.lmstudio?.load?.contextLength;
2814
2981
  const plan = await reconcileResidency({
2815
2982
  targetKey,
@@ -2852,17 +3019,36 @@ async function ensureLmStudioResidency(model, options = {}) {
2852
3019
  });
2853
3020
  }
2854
3021
  }
3022
+ const loadAndReport = async () => {
3023
+ const instanceId = await loadOwnedInstance(target, targetKey, body, options.apiKey, options.signal);
3024
+ emitResidencyMutation({
3025
+ targetKey,
3026
+ targetId: info.targetId,
3027
+ runtimeId: "lmstudio",
3028
+ model: modelKey,
3029
+ operation: "load"
3030
+ });
3031
+ return instanceId ?? model.id;
3032
+ };
2855
3033
  try {
2856
- return await loadOwnedInstance(target, targetKey, body, options.apiKey, options.signal) ?? model.id;
3034
+ return await loadAndReport();
2857
3035
  } catch (error) {
2858
3036
  if (plan.decision === "observe" || plan.fallbackEvict.length === 0) throw error;
2859
3037
  return withResidencyLock(targetKey, async () => {
2860
3038
  for (const candidate of plan.fallbackEvict) {
2861
3039
  for (const entry of instances.filter((resident) => resident.modelKey === candidate.modelId)) {
2862
- await unloadOwnedInstance(target, targetKey, entry.identifier, options.apiKey, options.signal);
3040
+ if (await unloadOwnedInstance(target, targetKey, entry.identifier, options.apiKey, options.signal)) {
3041
+ emitResidencyMutation({
3042
+ targetKey,
3043
+ targetId: info.targetId,
3044
+ runtimeId: "lmstudio",
3045
+ model: candidate.modelId,
3046
+ operation: "evict"
3047
+ });
3048
+ }
2863
3049
  }
2864
3050
  }
2865
- return await loadOwnedInstance(target, targetKey, body, options.apiKey, options.signal) ?? model.id;
3051
+ return loadAndReport();
2866
3052
  });
2867
3053
  }
2868
3054
  }
@@ -2884,8 +3070,36 @@ function pickSamplingProfile2(quirks, thinkingActive) {
2884
3070
  function isPlainRecord(value) {
2885
3071
  return value !== null && typeof value === "object" && !Array.isArray(value);
2886
3072
  }
2887
- function observeResponseModelIdLine(line, capture) {
2888
- if (capture.done) return;
3073
+ function nonnegativeFiniteNumber(value) {
3074
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
3075
+ }
3076
+ function backendCompletionTimings(value, source) {
3077
+ if (!isPlainRecord(value)) return null;
3078
+ const promptN = nonnegativeFiniteNumber(value.prompt_n);
3079
+ const predictedN = nonnegativeFiniteNumber(value.predicted_n);
3080
+ const promptMs = nonnegativeFiniteNumber(value.prompt_ms);
3081
+ const predictedMs = nonnegativeFiniteNumber(value.predicted_ms);
3082
+ if (promptN === null || predictedN === null || promptMs === null || predictedMs === null) return null;
3083
+ const cacheN = nonnegativeFiniteNumber(value.cache_n);
3084
+ return {
3085
+ promptTokens: promptN + (cacheN ?? 0),
3086
+ cachedTokens: cacheN,
3087
+ predictedTokens: predictedN,
3088
+ promptMs,
3089
+ predictedMs,
3090
+ source
3091
+ };
3092
+ }
3093
+ function backendTimingsSourceForModel(model) {
3094
+ const metadata2 = model.clio;
3095
+ if (model.provider === "llamacpp" && metadata2?.runtimeId === "llamacpp") return "llamacpp-timings";
3096
+ if (model.provider === "lmstudio" && metadata2?.runtimeId === "lmstudio") return "lmstudio-timings";
3097
+ return null;
3098
+ }
3099
+ function captureCanStopEarly(capture) {
3100
+ return capture.modelIdDone && capture.backendTimingsSource === null;
3101
+ }
3102
+ function observeResponseMetadataLine(line, capture) {
2889
3103
  const normalized = line.endsWith("\r") ? line.slice(0, -1) : line;
2890
3104
  if (!normalized.startsWith("data:")) return;
2891
3105
  const data = normalized.slice("data:".length).trimStart();
@@ -2893,23 +3107,29 @@ function observeResponseModelIdLine(line, capture) {
2893
3107
  try {
2894
3108
  const payload = JSON.parse(data);
2895
3109
  if (!isPlainRecord(payload)) return;
2896
- const model = payload.model;
2897
- if (typeof model === "string" && model.trim().length > 0) {
2898
- capture.reportedModelId = model.trim();
2899
- capture.done = true;
3110
+ if (!capture.modelIdDone) {
3111
+ const model = payload.model;
3112
+ if (typeof model === "string" && model.trim().length > 0) {
3113
+ capture.reportedModelId = model.trim();
3114
+ capture.modelIdDone = true;
3115
+ }
3116
+ }
3117
+ if (capture.backendTimingsSource !== null) {
3118
+ const timings = backendCompletionTimings(payload.timings, capture.backendTimingsSource);
3119
+ if (timings !== null) capture.backendTimings = timings;
2900
3120
  }
2901
3121
  } catch {
2902
3122
  }
2903
3123
  }
2904
3124
  function observeResponseModelIdBytes(chunk, capture, flush = false) {
2905
- if (capture.done || !capture.decoder) return;
3125
+ if (!capture.decoder) return;
2906
3126
  capture.buffer += chunk ? capture.decoder.decode(chunk, { stream: !flush }) : capture.decoder.decode();
2907
3127
  let newline = capture.buffer.indexOf("\n");
2908
3128
  while (newline >= 0) {
2909
3129
  const line = capture.buffer.slice(0, newline);
2910
3130
  capture.buffer = capture.buffer.slice(newline + 1);
2911
- observeResponseModelIdLine(line, capture);
2912
- if (capture.done) {
3131
+ observeResponseMetadataLine(line, capture);
3132
+ if (captureCanStopEarly(capture)) {
2913
3133
  capture.buffer = "";
2914
3134
  capture.decoder = null;
2915
3135
  return;
@@ -2917,10 +3137,10 @@ function observeResponseModelIdBytes(chunk, capture, flush = false) {
2917
3137
  newline = capture.buffer.indexOf("\n");
2918
3138
  }
2919
3139
  if (flush && capture.buffer.length > 0) {
2920
- observeResponseModelIdLine(capture.buffer, capture);
3140
+ observeResponseMetadataLine(capture.buffer, capture);
2921
3141
  capture.buffer = "";
2922
3142
  }
2923
- if (capture.done || flush) capture.decoder = null;
3143
+ if (captureCanStopEarly(capture) || flush) capture.decoder = null;
2924
3144
  }
2925
3145
  function captureResponseModelId(response, capture) {
2926
3146
  if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
@@ -2930,12 +3150,12 @@ function captureResponseModelId(response, capture) {
2930
3150
  new TransformStream({
2931
3151
  transform(chunk, controller) {
2932
3152
  capture.observed = true;
2933
- if (!capture.done) observeResponseModelIdBytes(chunk, capture);
3153
+ observeResponseModelIdBytes(chunk, capture);
2934
3154
  controller.enqueue(chunk);
2935
3155
  },
2936
3156
  flush() {
2937
3157
  capture.observed = true;
2938
- if (!capture.done) observeResponseModelIdBytes(void 0, capture, true);
3158
+ observeResponseModelIdBytes(void 0, capture, true);
2939
3159
  }
2940
3160
  })
2941
3161
  );
@@ -2945,11 +3165,13 @@ function captureResponseModelId(response, capture) {
2945
3165
  headers: response.headers
2946
3166
  });
2947
3167
  }
2948
- function withResponseModelIdCapture(options, sourceFactory) {
3168
+ function withResponseModelIdCapture(model, options, sourceFactory) {
2949
3169
  const capture = {
2950
3170
  reportedModelId: null,
2951
3171
  observed: false,
2952
- done: false,
3172
+ modelIdDone: false,
3173
+ backendTimings: null,
3174
+ backendTimingsSource: backendTimingsSourceForModel(model),
2953
3175
  buffer: "",
2954
3176
  decoder: new TextDecoder()
2955
3177
  };
@@ -2964,8 +3186,13 @@ function withResponseModelIdCapture(options, sourceFactory) {
2964
3186
  try {
2965
3187
  for await (const event of source) {
2966
3188
  const observation = capture.observed ? capture.reportedModelId === null ? { state: "not-reported" } : { state: "reported", reportedModelId: capture.reportedModelId } : { state: "not-observed" };
2967
- if (event.type === "done") event.message.responseModelIdObservation = observation;
2968
- else if (event.type === "error") event.error.responseModelIdObservation = observation;
3189
+ if (event.type === "done") {
3190
+ event.message.responseModelIdObservation = observation;
3191
+ if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
3192
+ } else if (event.type === "error") {
3193
+ event.error.responseModelIdObservation = observation;
3194
+ if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
3195
+ }
2969
3196
  annotated.push(event);
2970
3197
  }
2971
3198
  annotated.end();
@@ -3460,6 +3687,7 @@ var openAICompletionsApiProvider = {
3460
3687
  stripNeverReasoningFromStream(
3461
3688
  filterGemmaChannelStream(
3462
3689
  withResponseModelIdCapture(
3690
+ model,
3463
3691
  withRemainingContextBudget(model, effectiveContext, withSamplers),
3464
3692
  (capturedOptions) => withLocalResidency(
3465
3693
  model,
@@ -3491,6 +3719,7 @@ var openAICompletionsApiProvider = {
3491
3719
  stripNeverReasoningFromStream(
3492
3720
  filterGemmaChannelStream(
3493
3721
  withResponseModelIdCapture(
3722
+ model,
3494
3723
  withRemainingContextBudget(model, effectiveContext, withSamplers),
3495
3724
  (capturedOptions) => withLocalResidency(
3496
3725
  model,
@@ -4283,12 +4512,6 @@ function resolveModelReference(rawPattern, providers) {
4283
4512
  return buildResult(base, pickFirst(partial), thinkingLevel);
4284
4513
  }
4285
4514
 
4286
- // src/domains/providers/types/cost-provenance.ts
4287
- init_esm_shims();
4288
- function normalizeCostProvenance(value) {
4289
- return value ?? "unknown";
4290
- }
4291
-
4292
4515
  // src/domains/providers/index.ts
4293
4516
  var ProvidersDomainModule = {
4294
4517
  manifest: ProvidersManifest,
@@ -4296,8 +4519,15 @@ var ProvidersDomainModule = {
4296
4519
  };
4297
4520
 
4298
4521
  export {
4522
+ residencyTargetKey,
4299
4523
  setGlobalDefaultMaxOutputTokens,
4300
4524
  resolveReservedOutputTokens,
4525
+ canonicalEndpointKey,
4526
+ endpointLabel,
4527
+ endpointCapacityForStatus,
4528
+ endpointCapacitiesForStatuses,
4529
+ registerForegroundStream,
4530
+ foregroundStreamUsage,
4301
4531
  setResidencyNoticeSink,
4302
4532
  setProtectedModelsProvider,
4303
4533
  withRunOverrides,
@@ -4330,4 +4560,4 @@ export {
4330
4560
  normalizeCostProvenance,
4331
4561
  ProvidersDomainModule
4332
4562
  };
4333
- //# sourceMappingURL=chunk-7RFXX52T.js.map
4563
+ //# sourceMappingURL=chunk-MIX5N5AC.js.map