@iowarp/clio-coder 0.3.4 → 0.3.7

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 (376) hide show
  1. package/CHANGELOG.md +65 -2
  2. package/CONTRIBUTING.md +6 -6
  3. package/README.md +16 -5
  4. package/dist/{acp-S5R4RR5B.js → acp-SK4MD6MM.js} +11 -11
  5. package/dist/{agents-P6DMMVZY.js → agents-2FN2K6ME.js} +33 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-2XCZLPKS.js → auth-QIYZWM5I.js} +15 -15
  8. package/dist/{chunk-EKMEHE4H.js → chunk-33YXPOE3.js} +2 -3
  9. package/dist/{chunk-VAWWTKDP.js → chunk-3HAPLH5M.js} +11 -11
  10. package/dist/{chunk-YCWGATWI.js → chunk-465YSENW.js} +3 -3
  11. package/dist/{chunk-4OC57DA6.js → chunk-4DGYLA73.js} +53 -2
  12. package/dist/{chunk-UZHIZC5S.js → chunk-4DWFMQDR.js} +61 -76
  13. package/dist/{chunk-ZWMF7253.js → chunk-5C3AQNDW.js} +328 -9
  14. package/dist/{chunk-22NAGB7X.js → chunk-5C77SEEY.js} +5 -94
  15. package/dist/{chunk-WPQLXFOZ.js → chunk-5FR74PWO.js} +3 -2
  16. package/dist/{chunk-35MKKU5R.js → chunk-5UJ6ECTS.js} +18 -10
  17. package/dist/{chunk-BRXQQJFP.js → chunk-6M7VS3J3.js} +571 -50
  18. package/dist/{chunk-QQK64KLB.js → chunk-6TUKSZVF.js} +141 -23
  19. package/dist/{chunk-N4CZJQRK.js → chunk-AB4XIIVB.js} +8 -6
  20. package/dist/{chunk-KRPY7NTG.js → chunk-BMWK7ZIZ.js} +14 -20
  21. package/dist/{chunk-4BPJXDWC.js → chunk-C4JBQ5SR.js} +30 -14
  22. package/dist/{chunk-ZYKPLLNQ.js → chunk-CEYBNUGC.js} +821 -83
  23. package/dist/{chunk-VEZEGCGW.js → chunk-D4MDIG46.js} +20 -18
  24. package/dist/chunk-DJNLUABN.js +843 -0
  25. package/dist/{chunk-BP4OYD6A.js → chunk-DMD2AGVS.js} +21 -2
  26. package/dist/{chunk-KOHPCX4K.js → chunk-DOOEX22V.js} +2 -2
  27. package/dist/chunk-DQA7QLMD.js +123 -0
  28. package/dist/chunk-DR52UMZW.js +21 -0
  29. package/dist/{chunk-3HZ5RWN2.js → chunk-EBEFWSGL.js} +9 -7
  30. package/dist/{chunk-EDRHSCIE.js → chunk-EELBMBT6.js} +128 -13
  31. package/dist/{chunk-HV5X7OR2.js → chunk-EOOQZZDE.js} +16 -14
  32. package/dist/{chunk-WR67VIZY.js → chunk-FOT2FX5J.js} +63 -5
  33. package/dist/{chunk-BPGS2WCQ.js → chunk-GEYXPTRF.js} +2 -1
  34. package/dist/{chunk-FYYLNIL5.js → chunk-GH5622CP.js} +2 -2
  35. package/dist/{chunk-BEY543CS.js → chunk-GOXNB3AO.js} +5 -2
  36. package/dist/chunk-GWS3VEIW.js +195 -0
  37. package/dist/{chunk-G4BMMOKF.js → chunk-HVDIIIQW.js} +2 -2
  38. package/dist/chunk-HWUFFB6L.js +83 -0
  39. package/dist/{chunk-X6COSD2O.js → chunk-J7PIKKWC.js} +8 -436
  40. package/dist/{chunk-NILBFAPG.js → chunk-JNXPYBB4.js} +2 -2
  41. package/dist/{chunk-4VP4KH3K.js → chunk-JRIO5UD2.js} +4 -4
  42. package/dist/{chunk-K6WL7QZT.js → chunk-JTSEDYVQ.js} +7 -7
  43. package/dist/{chunk-QKMUKYO7.js → chunk-KCMKRQX4.js} +236 -84
  44. package/dist/chunk-KZ2H5X4G.js +1026 -0
  45. package/dist/{chunk-A2GZF7DC.js → chunk-LADCF22A.js} +13 -13
  46. package/dist/chunk-LCGCVYZ4.js +57 -0
  47. package/dist/chunk-M4AKACEO.js +382 -0
  48. package/dist/{chunk-POHLU5DW.js → chunk-M6L6IDJG.js} +3 -3
  49. package/dist/{chunk-4JUF2NNX.js → chunk-MXI6J5JF.js} +7 -7
  50. package/dist/{chunk-X4RCMKVQ.js → chunk-NDINPTJ4.js} +2 -2
  51. package/dist/{chunk-TTNYS3EA.js → chunk-OB5HIGJY.js} +1 -1
  52. package/dist/{chunk-7RXG6QRZ.js → chunk-OBMAI2DP.js} +61 -840
  53. package/dist/{chunk-5M54SPOL.js → chunk-ODFEOB4F.js} +161 -5
  54. package/dist/chunk-PD3MESLB.js +242 -0
  55. package/dist/{chunk-ED4KHGC3.js → chunk-PPAMZ32Z.js} +9 -2
  56. package/dist/{chunk-VMNQ6OZA.js → chunk-QCTRSGHQ.js} +963 -786
  57. package/dist/chunk-RVG5JXAL.js +41 -0
  58. package/dist/{chunk-RD5U66HV.js → chunk-SROCI7ZU.js} +7 -7
  59. package/dist/{chunk-MFFY33HR.js → chunk-THKY7CD7.js} +466 -205
  60. package/dist/{chunk-34475P3I.js → chunk-TSHXZTOQ.js} +5 -4
  61. package/dist/{chunk-PCZJO5TI.js → chunk-UFQ3F4FW.js} +13 -178
  62. package/dist/{chunk-AD2SYQYC.js → chunk-UHXRNZ2J.js} +121 -3
  63. package/dist/chunk-UND3GU2L.js +103 -0
  64. package/dist/{chunk-QQL5RT5M.js → chunk-UUANF5CR.js} +2323 -2114
  65. package/dist/{chunk-VJWL6YS5.js → chunk-UUVG37B4.js} +2 -2
  66. package/dist/chunk-UVDSQ6LW.js +472 -0
  67. package/dist/{chunk-QWU7ZBO7.js → chunk-VQNODYQ4.js} +215 -56
  68. package/dist/chunk-VREKEFLL.js +37 -0
  69. package/dist/{chunk-2TZWSW76.js → chunk-WHGPSPT5.js} +2 -2
  70. package/dist/{chunk-TW3WDMVS.js → chunk-WHJYKASB.js} +2 -2
  71. package/dist/{chunk-MEQ45TQ4.js → chunk-WJHBC77E.js} +21 -7
  72. package/dist/{chunk-HXG4IURW.js → chunk-X2KV5FXT.js} +2 -2
  73. package/dist/{chunk-YHZX5GEU.js → chunk-XAKHZX5N.js} +2 -2
  74. package/dist/{chunk-2LZI5CAG.js → chunk-XEGB6BCN.js} +228 -36
  75. package/dist/{chunk-E25LMLRW.js → chunk-YD734TPH.js} +2 -2
  76. package/dist/{verifiers-4UUM6TEE.js → chunk-YTYFXUI3.js} +121 -372
  77. package/dist/{chunk-3JLKSKD7.js → chunk-ZGH7FGS5.js} +17 -7
  78. package/dist/{chunk-VSNATDE6.js → chunk-ZZMN5OM4.js} +2 -2
  79. package/dist/cli/index.js +34 -32
  80. package/dist/{clio-J5JIOIDS.js → clio-WBVQEBKO.js} +7 -7
  81. package/dist/{code-nav-AXCXSBHX.js → code-nav-FGGFIE7L.js} +7 -7
  82. package/dist/codewiki/build-worker.js +4 -4
  83. package/dist/{components-KELWS457.js → components-F7OEATSO.js} +5 -5
  84. package/dist/{config-OEBMIN2U.js → config-TRBL3RCF.js} +48 -41
  85. package/dist/{configure-PUQOSIXQ.js → configure-OLCVPHNM.js} +17 -17
  86. package/dist/{context-URSXPBCK.js → context-MJIJ6GOX.js} +12 -12
  87. package/dist/{context-EKDCKUUZ.js → context-WFPKQSM6.js} +26 -9
  88. package/dist/{context-MGSE4Z2T.js → context-XEWE3MOJ.js} +44 -37
  89. package/dist/{context-clear-KDAJRNUK.js → context-clear-KNOS2JPB.js} +44 -37
  90. package/dist/{context-index-BZ4UYMTC.js → context-index-SSR5ECNE.js} +3 -3
  91. package/dist/{context-working-set-SBKMPPI2.js → context-working-set-EUXAZI6N.js} +14 -13
  92. package/dist/{dispatch-runner-MSWN72NK.js → dispatch-runner-B7MTOVKL.js} +321 -60
  93. package/dist/{docs-2C2LTVT2.js → docs-FLJTIDSE.js} +5 -5
  94. package/dist/{doctor-7BSE27PJ.js → doctor-RN4YKO2X.js} +15 -15
  95. package/dist/{eval-IZGDOO4H.js → eval-RUBJVSNQ.js} +52 -236
  96. package/dist/{evidence-SR7WXB5B.js → evidence-JZNBUOQZ.js} +39 -33
  97. package/dist/{evolve-K7VE2CBX.js → evolve-FJVC4KKI.js} +39 -33
  98. package/dist/{extensions-QVDOHDGJ.js → extensions-IQL36S7K.js} +5 -5
  99. package/dist/{fleet-7XMJNQNF.js → fleet-BDKYJFCP.js} +243 -370
  100. package/dist/fleet-commands-ZFIWZSB3.js +70 -0
  101. package/dist/fleet-graph-Y6HPXIVF.js +125 -0
  102. package/dist/fleet-new-RDVJLHHH.js +48 -0
  103. package/dist/{fleet-preflight-AQNAH644.js → fleet-preflight-BHSNPBMH.js} +2 -2
  104. package/dist/fleet-validate-BIYREGIK.js +79 -0
  105. package/dist/{init-JGNPAYXT.js → init-LQUB5COQ.js} +57 -48
  106. package/dist/library-NJAHIGG4.js +217 -0
  107. package/dist/memory-OG6HOYKM.js +472 -0
  108. package/dist/{models-ZMMLFJNN.js → models-5ZG5XY7J.js} +23 -22
  109. package/dist/{monitor-2F3T5KHP.js → monitor-TJ7AMTGB.js} +69 -35
  110. package/dist/{orchestrator-ORHT43JB.js → orchestrator-WZYB54DM.js} +4868 -1189
  111. package/dist/{paths-UXLN5YYZ.js → paths-XUC7GS6E.js} +5 -5
  112. package/dist/{reset-NXGTYNUO.js → reset-PXQT45IY.js} +8 -8
  113. package/dist/{run-RF4WJGMT.js → run-FQ74YF62.js} +82 -62
  114. package/dist/{share-UT3W6E4M.js → share-FW7SVCL3.js} +34 -10
  115. package/dist/{skills-PSACKC5Q.js → skills-7E7IRB3R.js} +25 -9
  116. package/dist/{skills-eval-WJSI55RZ.js → skills-eval-LI75W6OK.js} +43 -35
  117. package/dist/{targets-PIIRAOYS.js → targets-4CIFKCTW.js} +27 -24
  118. package/dist/{terminal-lease-ULWXWNVY.js → terminal-lease-WUZY7ZV5.js} +5 -4
  119. package/dist/{uninstall-FZCQCDKC.js → uninstall-7FV7IP4E.js} +5 -5
  120. package/dist/{upgrade-346TZ6AV.js → upgrade-K2HVIVMQ.js} +21 -20
  121. package/dist/{usage-6KKXR32N.js → usage-GTZELZQX.js} +159 -59
  122. package/dist/verifiers-RLAHT27O.js +336 -0
  123. package/dist/{verify-X5HDROLA.js → verify-BX3BRKH5.js} +7 -6
  124. package/dist/{wiki-generate-7STOCIFZ.js → wiki-generate-ASIFASCN.js} +58 -48
  125. package/dist/worker/entry.js +98 -84
  126. package/dist/{workspace-G4ZWUIPR.js → workspace-ZJ6BFM3Q.js} +4 -4
  127. package/docs/README.md +4 -3
  128. package/docs/acp.md +1 -1
  129. package/docs/alcf-provider.md +1 -1
  130. package/docs/architecture.md +2 -2
  131. package/docs/artifact-placement.md +1 -2
  132. package/docs/artifact-versions.md +10 -6
  133. package/docs/built-in-agents.md +26 -2
  134. package/docs/capacity-and-scheduling.md +1 -1
  135. package/docs/commands-and-modes.md +90 -8
  136. package/docs/configuration-and-targets.md +90 -2
  137. package/docs/context-engine.md +4 -2
  138. package/docs/context-working-set.md +4 -4
  139. package/docs/development-pipeline.md +1 -1
  140. package/docs/dispatch-architecture-rationale.md +1 -1
  141. package/docs/documentation-coverage.md +4 -4
  142. package/docs/documentation-guide.md +4 -4
  143. package/docs/eval-runner.md +1 -1
  144. package/docs/evals-internal.md +4 -45
  145. package/docs/evidence-and-memory.md +70 -10
  146. package/docs/evolution.md +1 -1
  147. package/docs/exit-codes-and-output.md +4 -1
  148. package/docs/extensions-and-sharing.md +6 -2
  149. package/docs/fleet-demo-runbook.md +2 -2
  150. package/docs/fleet-dispatch.md +224 -11
  151. package/docs/git-commit-provenance.md +2 -2
  152. package/docs/glossary.md +1 -1
  153. package/docs/installation-and-lifecycle.md +2 -2
  154. package/docs/middleware-and-components.md +20 -2
  155. package/docs/model-catalog.md +1 -1
  156. package/docs/observability.md +55 -8
  157. package/docs/proactive-memory.md +26 -16
  158. package/docs/prompt-envelope-and-tools.md +4 -2
  159. package/docs/provider-adapter-cookbook.md +1 -1
  160. package/docs/release-cut-checklist.md +83 -65
  161. package/docs/resource-library.md +59 -0
  162. package/docs/safety-model.md +29 -7
  163. package/docs/scientific-validation.md +3 -3
  164. package/docs/session-lifecycle.md +37 -1
  165. package/docs/skills-marketplace.md +16 -3
  166. package/docs/tool-usage.md +14 -7
  167. package/docs/trace-store.md +1 -1
  168. package/docs/troubleshooting.md +1 -1
  169. package/docs/tui-design.md +38 -4
  170. package/docs/worker-dispatch-mechanics.md +3 -3
  171. package/package.json +7 -4
  172. package/src/cli/agents.ts +2 -3
  173. package/src/cli/argv.ts +14 -1
  174. package/src/cli/fleet-commands.ts +37 -0
  175. package/src/cli/fleet-graph.ts +102 -0
  176. package/src/cli/fleet-new.ts +36 -0
  177. package/src/cli/fleet-preflight.ts +121 -0
  178. package/src/cli/fleet-validate.ts +30 -0
  179. package/src/cli/fleet.ts +188 -335
  180. package/src/cli/index.ts +4 -2
  181. package/src/cli/library.ts +190 -0
  182. package/src/cli/memory.ts +272 -10
  183. package/src/cli/modes/json-stream.ts +2 -2
  184. package/src/cli/modes/print.ts +12 -1
  185. package/src/cli/run.ts +22 -2
  186. package/src/cli/share.ts +13 -1
  187. package/src/cli/targets.ts +12 -3
  188. package/src/cli/usage.ts +160 -20
  189. package/src/core/bus-events.ts +7 -0
  190. package/src/core/commit-attribution.ts +4 -4
  191. package/src/core/config.ts +130 -0
  192. package/src/core/defaults.ts +81 -0
  193. package/src/core/response-model-id.ts +134 -0
  194. package/src/core/toml.ts +62 -0
  195. package/src/core/workspace-files.ts +0 -1
  196. package/src/domains/agents/builtins/architect.md +2 -1
  197. package/src/domains/agents/builtins/oracle.md +33 -0
  198. package/src/domains/agents/catalog.ts +18 -5
  199. package/src/domains/agents/fleet-contract.ts +278 -16
  200. package/src/domains/agents/index.ts +14 -0
  201. package/src/domains/agents/recipe.ts +54 -14
  202. package/src/domains/agents/result-contract.ts +242 -5
  203. package/src/domains/config/classify.ts +4 -0
  204. package/src/domains/context/bootstrap.ts +36 -27
  205. package/src/domains/context/project-metadata.ts +19 -63
  206. package/src/domains/context/prompt-context.ts +8 -0
  207. package/src/domains/context/working-set/policies/index.ts +3 -4
  208. package/src/domains/dispatch/active-route-planner.ts +14 -0
  209. package/src/domains/dispatch/backoff.ts +2 -1
  210. package/src/domains/dispatch/budget-envelope.ts +396 -0
  211. package/src/domains/dispatch/capability-match.ts +1 -0
  212. package/src/domains/dispatch/checkout-writer-lease.ts +175 -0
  213. package/src/domains/dispatch/contract.ts +36 -0
  214. package/src/domains/dispatch/delegation-plan.ts +167 -0
  215. package/src/domains/dispatch/execution-plan.ts +76 -5
  216. package/src/domains/dispatch/execution-role.ts +3 -1
  217. package/src/domains/dispatch/execution-scheduler.ts +183 -67
  218. package/src/domains/dispatch/extension.ts +339 -36
  219. package/src/domains/dispatch/fleet-gate.ts +14 -0
  220. package/src/domains/dispatch/fleet-plan.ts +63 -3
  221. package/src/domains/dispatch/fleet-run.ts +737 -0
  222. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  223. package/src/domains/dispatch/host-verification.ts +178 -0
  224. package/src/domains/dispatch/index.ts +38 -0
  225. package/src/domains/dispatch/intent.ts +159 -0
  226. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  227. package/src/domains/dispatch/receipt-integrity.ts +12 -4
  228. package/src/domains/dispatch/state.ts +37 -3
  229. package/src/domains/dispatch/types.ts +61 -9
  230. package/src/domains/dispatch/validation.ts +80 -6
  231. package/src/domains/dispatch/worker-spawn.ts +14 -3
  232. package/src/domains/eval/metrics/evidence.ts +0 -116
  233. package/src/domains/eval/metrics/invariants.ts +1 -1
  234. package/src/domains/eval/runners/clio-run.ts +1 -10
  235. package/src/domains/eval/runners/external-command.ts +2 -29
  236. package/src/domains/eval/schema/suite.ts +0 -7
  237. package/src/domains/eval/suites/run.ts +1 -7
  238. package/src/domains/evidence/trust-status.ts +10 -1
  239. package/src/domains/memory/index.ts +22 -0
  240. package/src/domains/memory/operations.ts +58 -1
  241. package/src/domains/memory/promotion.ts +281 -0
  242. package/src/domains/memory/prompt-section.ts +25 -5
  243. package/src/domains/memory/proposal.ts +51 -7
  244. package/src/domains/memory/task-bank.ts +3 -2
  245. package/src/domains/memory/task-memory-handoff.ts +181 -24
  246. package/src/domains/memory/task-memory-policy.ts +3 -1
  247. package/src/domains/memory/types.ts +37 -0
  248. package/src/domains/memory/validate.ts +178 -0
  249. package/src/domains/middleware/index.ts +15 -0
  250. package/src/domains/middleware/memory-intervention.ts +35 -25
  251. package/src/domains/middleware/runtime.ts +6 -0
  252. package/src/domains/middleware/skills-reminder.ts +19 -4
  253. package/src/domains/middleware/stalled-turn.ts +43 -1
  254. package/src/domains/middleware/types.ts +10 -0
  255. package/src/domains/middleware/watchdog.ts +281 -0
  256. package/src/domains/observability/contract.ts +9 -2
  257. package/src/domains/observability/cost.ts +31 -4
  258. package/src/domains/observability/extension.ts +2 -2
  259. package/src/domains/observability/index.ts +10 -0
  260. package/src/domains/observability/out-of-turn-usage.ts +223 -0
  261. package/src/domains/providers/index.ts +3 -0
  262. package/src/domains/providers/model-discovery.ts +9 -0
  263. package/src/domains/providers/runtime-resolution.ts +38 -1
  264. package/src/domains/providers/runtimes/common/probe-helpers.ts +97 -16
  265. package/src/domains/providers/types/context-window-slots.ts +18 -0
  266. package/src/domains/providers/types/runtime-descriptor.ts +3 -1
  267. package/src/domains/resources/index.ts +20 -0
  268. package/src/domains/resources/library.ts +326 -0
  269. package/src/domains/resources/skills/marketplace.ts +37 -12
  270. package/src/domains/safety/call-target.ts +211 -14
  271. package/src/domains/safety/decision-presentation.ts +268 -0
  272. package/src/domains/safety/redaction.ts +73 -0
  273. package/src/domains/session/context-ledger.ts +10 -1
  274. package/src/domains/session/decision-board.ts +4 -0
  275. package/src/domains/session/entries.ts +3 -0
  276. package/src/domains/session/handoff.ts +629 -0
  277. package/src/domains/session/history.ts +68 -19
  278. package/src/domains/session/usage.ts +24 -7
  279. package/src/domains/share/archive.ts +67 -2
  280. package/src/engine/acp/event-mapper.ts +7 -0
  281. package/src/engine/acp/server.ts +29 -2
  282. package/src/engine/apis/lmstudio.ts +25 -4
  283. package/src/engine/apis/openai-completions.ts +147 -22
  284. package/src/engine/claude/sdk-runtime.ts +8 -2
  285. package/src/engine/claude/tool-safety.ts +13 -0
  286. package/src/engine/loop-guard.ts +27 -3
  287. package/src/engine/worker-events.ts +4 -3
  288. package/src/engine/worker-runtime.ts +59 -54
  289. package/src/entry/orchestrator.ts +55 -1
  290. package/src/interactive/bus-notices.ts +26 -0
  291. package/src/interactive/chat-loop-messages.ts +22 -0
  292. package/src/interactive/chat-loop.ts +248 -1
  293. package/src/interactive/chat-renderer.ts +41 -3
  294. package/src/interactive/clio-editor.ts +44 -7
  295. package/src/interactive/context-overlay.ts +43 -5
  296. package/src/interactive/cost-overlay.ts +70 -11
  297. package/src/interactive/council-dispatch.ts +30 -0
  298. package/src/interactive/council-grid.ts +213 -0
  299. package/src/interactive/council.ts +99 -0
  300. package/src/interactive/dispatch-board.ts +471 -50
  301. package/src/interactive/fleet-run-preview.ts +307 -0
  302. package/src/interactive/footer/notifications.ts +219 -0
  303. package/src/interactive/footer/widgets.ts +13 -0
  304. package/src/interactive/handoff-round.ts +56 -0
  305. package/src/interactive/interactive-application.ts +49 -2
  306. package/src/interactive/interactive-event-projection.ts +9 -1
  307. package/src/interactive/interactive-input-runtime.ts +11 -1
  308. package/src/interactive/interactive-presentation.ts +11 -1
  309. package/src/interactive/interactive-slash-runtime.ts +52 -2
  310. package/src/interactive/interactive-subscriptions.ts +14 -2
  311. package/src/interactive/memory-overlay.ts +89 -4
  312. package/src/interactive/oracle.ts +179 -0
  313. package/src/interactive/overlay-ask-user-lifecycle.ts +7 -1
  314. package/src/interactive/overlay-frame.ts +5 -2
  315. package/src/interactive/overlay-general-openers.ts +230 -2
  316. package/src/interactive/overlay-key-routing.ts +58 -2
  317. package/src/interactive/overlay-lifecycle.ts +52 -5
  318. package/src/interactive/overlay-permission-lifecycle.ts +33 -8
  319. package/src/interactive/overlay-resource-openers.ts +11 -3
  320. package/src/interactive/overlay-session-lifecycle.ts +234 -2
  321. package/src/interactive/overlay-transitions.ts +11 -0
  322. package/src/interactive/overlays/ask-user.ts +74 -30
  323. package/src/interactive/overlays/decisions.ts +3 -1
  324. package/src/interactive/overlays/fleet-run-approval.ts +208 -0
  325. package/src/interactive/overlays/handoff-review.ts +185 -0
  326. package/src/interactive/overlays/library-install-confirm.ts +151 -0
  327. package/src/interactive/overlays/list-overlay.ts +168 -2
  328. package/src/interactive/overlays/settings.ts +101 -4
  329. package/src/interactive/overlays/side-question.ts +139 -0
  330. package/src/interactive/overlays/skills-hub.ts +401 -15
  331. package/src/interactive/permission-hint.ts +35 -0
  332. package/src/interactive/permission-overlay.ts +95 -45
  333. package/src/interactive/renderers/tool-execution.ts +19 -49
  334. package/src/interactive/session-last-turn.ts +8 -1
  335. package/src/interactive/session-usage-reseed.ts +36 -10
  336. package/src/interactive/side-question.ts +171 -0
  337. package/src/interactive/slash-commands.ts +434 -7
  338. package/src/interactive/slash-spec.ts +19 -6
  339. package/src/interactive/status/summary.ts +5 -0
  340. package/src/interactive/status/types.ts +5 -0
  341. package/src/interactive/terminal-lease.ts +1 -0
  342. package/src/interactive/theme/tokens.ts +30 -0
  343. package/src/interactive/turn-context.ts +96 -23
  344. package/src/interactive/turn-middleware.ts +16 -1
  345. package/src/interactive/turn-runtime.ts +37 -8
  346. package/src/interactive/turn-state.ts +3 -0
  347. package/src/interactive/watchdog-run.ts +75 -0
  348. package/src/interactive/worker-progress.ts +440 -0
  349. package/src/interactive/worker-share.ts +56 -1
  350. package/src/interactive/worker-stream.ts +58 -110
  351. package/src/tools/agent-tools.ts +28 -3
  352. package/src/tools/ask-user.ts +21 -1
  353. package/src/tools/bootstrap.ts +3 -0
  354. package/src/tools/compete-worktrees.ts +13 -79
  355. package/src/tools/context/index.ts +2 -2
  356. package/src/tools/dispatch-admission.ts +242 -8
  357. package/src/tools/dispatch-arguments.ts +65 -1
  358. package/src/tools/dispatch-event-text.ts +19 -0
  359. package/src/tools/dispatch-plan.ts +136 -6
  360. package/src/tools/dispatch-runner.ts +319 -13
  361. package/src/tools/dispatch-types.ts +20 -1
  362. package/src/tools/dispatch.ts +96 -3
  363. package/src/tools/monitor.ts +31 -0
  364. package/src/tools/profiles.ts +18 -4
  365. package/src/tools/registry.ts +15 -5
  366. package/src/tools/result-disposition.ts +156 -0
  367. package/src/tools/result-shaping.ts +59 -1
  368. package/src/tools/task-worktree.ts +238 -0
  369. package/src/tools/verify/authoring.ts +116 -55
  370. package/src/tools/verify/scripts.ts +62 -0
  371. package/src/tools/worker-evidence.ts +21 -1
  372. package/src/worker/spec-contract.ts +44 -3
  373. package/dist/chunk-EFADSJET.js +0 -18
  374. package/dist/chunk-HC4CLZ2Y.js +0 -68
  375. package/dist/memory-4ALKDJ4Q.js +0 -246
  376. package/src/domains/eval/metrics/chaos-stream.ts +0 -93
@@ -3,12 +3,6 @@ import {
3
3
  createSentinelStripper,
4
4
  stripTokenizerSentinels
5
5
  } from "./chunk-CFGTUFWB.js";
6
- import {
7
- readSettings
8
- } from "./chunk-AD2SYQYC.js";
9
- import {
10
- THINKING_LEVELS
11
- } from "./chunk-4OC57DA6.js";
12
6
  import {
13
7
  authNotRequiredStatus,
14
8
  openAuthStorage,
@@ -16,18 +10,24 @@ import {
16
10
  resolveAuthTarget,
17
11
  resolveRuntimeAuthTarget,
18
12
  targetRequiresAuth
19
- } from "./chunk-4VP4KH3K.js";
13
+ } from "./chunk-JRIO5UD2.js";
14
+ import {
15
+ ceilChars,
16
+ estimateAgentMessageTokens,
17
+ toolSchemaChars
18
+ } from "./chunk-GEYXPTRF.js";
19
+ import {
20
+ readSettings
21
+ } from "./chunk-UHXRNZ2J.js";
22
+ import {
23
+ THINKING_LEVELS
24
+ } from "./chunk-4DGYLA73.js";
20
25
  import {
21
26
  sleep
22
27
  } from "./chunk-FQ4SKYE4.js";
23
28
  import {
24
29
  withStateFileLock
25
30
  } from "./chunk-IKCO5N3L.js";
26
- import {
27
- ceilChars,
28
- estimateAgentMessageTokens,
29
- toolSchemaChars
30
- } from "./chunk-BPGS2WCQ.js";
31
31
  import {
32
32
  activateExternalPluginApiBridge,
33
33
  calculateEngineCost,
@@ -49,7 +49,7 @@ import {
49
49
  } from "./chunk-ZGVHUX3M.js";
50
50
  import {
51
51
  BusChannels
52
- } from "./chunk-TTNYS3EA.js";
52
+ } from "./chunk-OB5HIGJY.js";
53
53
  import {
54
54
  __toESM,
55
55
  init_esm_shims
@@ -2339,6 +2339,15 @@ async function probeOpenAICompatReasoning(opts) {
2339
2339
 
2340
2340
  // src/domains/providers/runtimes/common/probe-helpers.ts
2341
2341
  init_esm_shims();
2342
+
2343
+ // src/domains/providers/types/context-window-slots.ts
2344
+ init_esm_shims();
2345
+ function formatContextWindowSlots(contextWindow, slots) {
2346
+ const format = (n) => Math.round(n).toLocaleString("en-US");
2347
+ return `${format(contextWindow)} (${format(slots.totalContextSize)} / ${slots.slots} slots)`;
2348
+ }
2349
+
2350
+ // src/domains/providers/runtimes/common/probe-helpers.ts
2342
2351
  async function probeUrl(url2, ctx, method = "GET") {
2343
2352
  const base = { url: url2, timeoutMs: ctx.httpTimeoutMs, method };
2344
2353
  return ctx.signal ? probeHttp({ ...base, signal: ctx.signal }) : probeHttp(base);
@@ -2383,7 +2392,11 @@ async function probeOpenAIModelCatalog(base, ctx, modelsPath = "/v1/models") {
2383
2392
  const state = modelStateFromOpenAIModelEntry(row) ?? (detailRow ? modelStateFromOpenAIModelEntry(detailRow) : void 0) ?? // A reported loaded context is itself the residency answer: nothing
2384
2393
  // serves a window for a model it has not loaded.
2385
2394
  (loadedContext !== void 0 ? { state: "loaded" } : void 0);
2386
- if (state) modelStates[row.id] = loadedContext === void 0 ? state : { ...state, contextLength: loadedContext };
2395
+ const contextSlots = contextSlotsFromEntry(row) ?? (detailRow ? contextSlotsFromEntry(detailRow) : void 0);
2396
+ const withSlots = contextSlots ? { ...state ?? { state: "unknown" }, contextSlots } : state;
2397
+ if (withSlots) {
2398
+ modelStates[row.id] = loadedContext === void 0 ? withSlots : { ...withSlots, contextLength: loadedContext };
2399
+ }
2387
2400
  }
2388
2401
  return { models, modelCapabilities, modelStates };
2389
2402
  }
@@ -2437,7 +2450,9 @@ function normalizeModelState(raw) {
2437
2450
  if (!value) return void 0;
2438
2451
  if (value === "loaded" || value === "ready" || value === "running" || value === "active") return "loaded";
2439
2452
  if (value === "loading" || value === "pending" || value === "queued" || value === "starting") return "loading";
2440
- if (value === "unloaded" || value === "not-loaded" || value === "idle" || value === "stopped") return "unloaded";
2453
+ if (value === "unloaded" || value === "not-loaded" || value === "idle" || value === "sleeping" || value === "stopped") {
2454
+ return "unloaded";
2455
+ }
2441
2456
  if (value === "failed" || value === "error" || value === "errored") return "failed";
2442
2457
  if (value === "unknown") return "unknown";
2443
2458
  return void 0;
@@ -2468,11 +2483,14 @@ function statusArgsFromEntry(row) {
2468
2483
  const status = nestedRecord(row, "status");
2469
2484
  return argsFromStatus(status);
2470
2485
  }
2486
+ function contextSlotsFromEntry(row) {
2487
+ return llamaCppRequestContextWindow(parseLlamaCppServerFlags(statusArgsFromEntry(row)))?.slots;
2488
+ }
2471
2489
  function capabilitiesFromOpenAIModelEntry(row) {
2472
2490
  const caps = {};
2473
2491
  const meta = nestedRecord(row, "meta");
2474
2492
  const flags = parseLlamaCppServerFlags(statusArgsFromEntry(row));
2475
- const contextWindow = positiveNumber2(flags.contextSize) ?? firstPositiveNumber(row, [
2493
+ const contextWindow = llamaCppRequestContextWindow(flags)?.contextWindow ?? firstPositiveNumber(row, [
2476
2494
  // What is actually loaded outranks what the model could support: a
2477
2495
  // model served at 8k out of a possible 262k has an 8k window today,
2478
2496
  // and the run has to be planned against the real one.
@@ -2525,6 +2543,17 @@ async function probeOpenAIModelEntries(base, ctx) {
2525
2543
  if (!result.ok) return [];
2526
2544
  return modelEntries(result.data);
2527
2545
  }
2546
+ function llamaCppRequestContextWindow(flags) {
2547
+ const total = positiveNumber2(flags.contextSize);
2548
+ if (total === void 0) return void 0;
2549
+ const parallel = positiveNumber2(flags.parallel);
2550
+ if (parallel === void 0 || parallel <= 1 || flags.kvUnified === true) return { contextWindow: Math.floor(total) };
2551
+ const slots = Math.floor(parallel);
2552
+ return {
2553
+ contextWindow: Math.floor(total / slots),
2554
+ slots: { totalContextSize: Math.floor(total), slots }
2555
+ };
2556
+ }
2528
2557
  function argsFromStatus(status) {
2529
2558
  if (!isRecord3(status)) return [];
2530
2559
  const args = status.args;
@@ -2532,20 +2561,27 @@ function argsFromStatus(status) {
2532
2561
  if (typeof args === "string") return args.trim().split(/\s+/).filter(Boolean);
2533
2562
  return [];
2534
2563
  }
2535
- function valueAfter(args, flag) {
2536
- const index = args.indexOf(flag);
2537
- if (index < 0) return void 0;
2538
- const value = args[index + 1];
2539
- return value && !value.startsWith("--") ? value : void 0;
2564
+ function looksLikeFlag(token) {
2565
+ return token.startsWith("-") && Number.isNaN(Number(token));
2540
2566
  }
2541
- function numberFlag(args, flag) {
2542
- const value = valueAfter(args, flag);
2567
+ function valueAfter(args, ...flags) {
2568
+ for (const flag of flags) {
2569
+ const index = args.indexOf(flag);
2570
+ if (index < 0) continue;
2571
+ const value = args[index + 1];
2572
+ return value && !looksLikeFlag(value) ? value : void 0;
2573
+ }
2574
+ return void 0;
2575
+ }
2576
+ function numberFlag(args, ...flags) {
2577
+ const value = valueAfter(args, ...flags);
2543
2578
  if (value === void 0) return void 0;
2544
2579
  const parsed = Number(value);
2545
2580
  return Number.isFinite(parsed) ? parsed : void 0;
2546
2581
  }
2547
- function booleanFlag(args, flag) {
2548
- if (!args.includes(flag)) return void 0;
2582
+ function booleanFlag(args, ...flags) {
2583
+ const flag = flags.find((candidate) => args.includes(candidate));
2584
+ if (flag === void 0) return void 0;
2549
2585
  const value = valueAfter(args, flag);
2550
2586
  if (value === void 0) return true;
2551
2587
  const normalized = value.toLowerCase();
@@ -2555,7 +2591,7 @@ function booleanFlag(args, flag) {
2555
2591
  }
2556
2592
  function parseLlamaCppServerFlags(args) {
2557
2593
  const flags = {};
2558
- const ctxSize = numberFlag(args, "--ctx-size");
2594
+ const ctxSize = numberFlag(args, "--ctx-size", "-c");
2559
2595
  if (ctxSize !== void 0) flags.contextSize = ctxSize;
2560
2596
  const maxTokens = numberFlag(args, "--n-predict");
2561
2597
  if (maxTokens !== void 0) flags.maxTokens = maxTokens;
@@ -2575,8 +2611,12 @@ function parseLlamaCppServerFlags(args) {
2575
2611
  if (topK !== void 0) flags.topK = topK;
2576
2612
  const nGpuLayers = numberFlag(args, "--n-gpu-layers");
2577
2613
  if (nGpuLayers !== void 0) flags.nGpuLayers = nGpuLayers;
2578
- const parallel = numberFlag(args, "--parallel");
2614
+ const parallel = numberFlag(args, "--parallel", "-np");
2579
2615
  if (parallel !== void 0) flags.parallel = parallel;
2616
+ const kvUnifiedAt = Math.max(args.lastIndexOf("--kv-unified"), args.lastIndexOf("-kvu"));
2617
+ const noKvUnifiedAt = args.lastIndexOf("--no-kv-unified");
2618
+ if (noKvUnifiedAt > kvUnifiedAt) flags.kvUnified = false;
2619
+ else if (kvUnifiedAt >= 0) flags.kvUnified = booleanFlag(args, "--kv-unified", "-kvu") ?? true;
2580
2620
  const cacheTypeK = valueAfter(args, "--cache-type-k");
2581
2621
  if (cacheTypeK) flags.cacheTypeK = cacheTypeK;
2582
2622
  const cacheTypeV = valueAfter(args, "--cache-type-v");
@@ -2608,7 +2648,8 @@ async function probeLlamaCppModelStatus(base, target, ctx) {
2608
2648
  if (args.length === 0) return { notes: statusNotes(selected.id, selected.status) };
2609
2649
  const flags = parseLlamaCppServerFlags(args);
2610
2650
  const caps = {};
2611
- if (flags.contextSize !== void 0 && flags.contextSize > 0) caps.contextWindow = flags.contextSize;
2651
+ const window = llamaCppRequestContextWindow(flags);
2652
+ if (window !== void 0) caps.contextWindow = window.contextWindow;
2612
2653
  if (flags.maxTokens !== void 0 && flags.maxTokens > 0) caps.maxTokens = flags.maxTokens;
2613
2654
  if (flags.reasoning === true || flags.reasoningBudget !== void 0) caps.reasoning = true;
2614
2655
  if (flags.mmproj) caps.vision = true;
@@ -2616,6 +2657,11 @@ async function probeLlamaCppModelStatus(base, target, ctx) {
2616
2657
  const enrichment = { modelId: selected.id, serverFlags: flags };
2617
2658
  if (Object.keys(caps).length > 0) enrichment.discoveredCapabilities = caps;
2618
2659
  const notes = statusNotes(selected.id, selected.status);
2660
+ if (window?.slots) {
2661
+ notes.push(
2662
+ `${selected.id} context window ${formatContextWindowSlots(window.contextWindow, window.slots)}: --ctx-size is split across --parallel slots without --kv-unified`
2663
+ );
2664
+ }
2619
2665
  if (notes.length > 0) enrichment.notes = notes;
2620
2666
  return enrichment;
2621
2667
  }
@@ -4573,6 +4619,9 @@ function loadedContextWindowForModel(status, modelId) {
4573
4619
  const reported = status?.discoveredModelStates?.[modelId]?.contextLength;
4574
4620
  return typeof reported === "number" && Number.isFinite(reported) && reported > 0 ? reported : null;
4575
4621
  }
4622
+ function contextSlotsForModel(status, modelId) {
4623
+ return status?.discoveredModelStates?.[modelId]?.contextSlots ?? null;
4624
+ }
4576
4625
  function modelResidencyForStatus(status, modelId) {
4577
4626
  if (loadedContextWindowForModel(status, modelId) !== null) return "resident";
4578
4627
  switch (status?.discoveredModelStates?.[modelId]?.state) {
@@ -4839,7 +4888,9 @@ function resolveRuntimeTarget(providers, input) {
4839
4888
  wireModelId,
4840
4889
  providers.knowledgeBase,
4841
4890
  probedContextWindow,
4842
- loadedContextWindow
4891
+ loadedContextWindow,
4892
+ void 0,
4893
+ contextSlotsForModel(status, wireModelId)
4843
4894
  );
4844
4895
  capabilities2.contextWindow = contextWindowDetails.effectiveContextWindow;
4845
4896
  if (contextWindowDetails.warning) {
@@ -4920,7 +4971,8 @@ function refineRuntimeTargetWithModelHints(target, model, knowledgeBase) {
4920
4971
  // one the backend has open. Re-resolving without the loaded number would
4921
4972
  // hand the planner the declared window back on the first refinement.
4922
4973
  target.contextWindowDetails.loadedContextWindow,
4923
- modelHintContextWindow
4974
+ modelHintContextWindow,
4975
+ target.contextWindowDetails.contextWindowSlots
4924
4976
  );
4925
4977
  capabilities2.contextWindow = contextWindowDetails.effectiveContextWindow;
4926
4978
  const modelRuntime = resolveModelRuntimeCapabilities({
@@ -4979,12 +5031,16 @@ function firstRuntimeResolutionError(diagnostics) {
4979
5031
  function runtimeResolutionWarnings(diagnostics) {
4980
5032
  return diagnostics.filter((entry) => entry.severity === "warning").map((entry) => entry.message);
4981
5033
  }
5034
+ function runtimeResolutionWarningsBesideThinkingNotice(diagnostics, thinkingNotice) {
5035
+ if (thinkingNotice.trim().length === 0) return runtimeResolutionWarnings(diagnostics);
5036
+ return runtimeResolutionWarnings(diagnostics.filter((entry) => !entry.code.startsWith("thinking-")));
5037
+ }
4982
5038
  var DESIRED_CONTEXT_WINDOW = CLIO_MIN_CONTEXT_WINDOW;
4983
5039
  var FALLBACK_CONTEXT_WINDOW = CLIO_MIN_CONTEXT_WINDOW;
4984
5040
  function positiveWindow(value) {
4985
5041
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
4986
5042
  }
4987
- function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase, probedContextWindow, loadedContextWindow = null, modelHintContextWindow) {
5043
+ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase, probedContextWindow, loadedContextWindow = null, modelHintContextWindow, probedContextSlots = null) {
4988
5044
  const catalogModel = getCatalogModelForRuntime(runtime.id, wireModelId);
4989
5045
  const kbHit = knowledgeBase?.lookup(wireModelId) ?? null;
4990
5046
  let modelDeclared;
@@ -5039,6 +5095,7 @@ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase
5039
5095
  if (source === "descriptor-default" || source === "unknown") {
5040
5096
  provenanceNotice = `Context window ${effective} is Clio's assumed minimum, not a figure this target reported. Run 'clio-coder targets --probe' to read the real one.`;
5041
5097
  }
5098
+ const contextWindowSlots = source === "probe" && probedContextSlots !== null && Math.floor(probedContextSlots.totalContextSize / probedContextSlots.slots) === effective ? probedContextSlots : null;
5042
5099
  return {
5043
5100
  declaredContextWindow,
5044
5101
  probedContextWindow,
@@ -5046,6 +5103,7 @@ function resolveContextWindowDetails(target, runtime, wireModelId, knowledgeBase
5046
5103
  desiredContextWindow: desired,
5047
5104
  effectiveContextWindow: effective,
5048
5105
  contextWindowSource: source,
5106
+ contextWindowSlots,
5049
5107
  warning,
5050
5108
  provenanceNotice
5051
5109
  };
@@ -5708,6 +5766,7 @@ var ollamaNativeApiProvider = {
5708
5766
 
5709
5767
  // src/engine/apis/openai-completions.ts
5710
5768
  init_esm_shims();
5769
+ import { TextDecoder as TextDecoder2 } from "node:util";
5711
5770
  import {
5712
5771
  createAssistantMessageEventStream as createAssistantMessageEventStream3
5713
5772
  } from "@earendil-works/pi-ai";
@@ -6095,6 +6154,12 @@ async function loadOwnedInstance(target, targetKey, body, apiKey, signal) {
6095
6154
  if (instanceId) ownedInstances(targetKey).add(instanceId);
6096
6155
  return instanceId;
6097
6156
  }
6157
+ var announcedResidencyFacts = /* @__PURE__ */ new Set();
6158
+ function emitResidencyNoticeOnce(key, notice) {
6159
+ if (announcedResidencyFacts.has(key)) return;
6160
+ announcedResidencyFacts.add(key);
6161
+ emitResidencyNotice(notice);
6162
+ }
6098
6163
  async function ensureLmStudioResidency(model, options = {}) {
6099
6164
  const target = targetForModel(model);
6100
6165
  if (!target) return model.id;
@@ -6117,7 +6182,7 @@ async function ensureLmStudioResidency(model, options = {}) {
6117
6182
  );
6118
6183
  }
6119
6184
  if (resolution.wireModelId !== model.id) {
6120
- emitResidencyNotice({
6185
+ emitResidencyNoticeOnce(`resolved|${info.targetId}|${model.id}|${resolution.wireModelId}`, {
6121
6186
  kind: "co-resident",
6122
6187
  level: "info",
6123
6188
  targetId: info.targetId,
@@ -6128,14 +6193,16 @@ async function ensureLmStudioResidency(model, options = {}) {
6128
6193
  });
6129
6194
  }
6130
6195
  if (resolution.peerTargets.length > 0) {
6131
- emitResidencyNotice({
6196
+ const peers = resolution.peerTargets.join(", ");
6197
+ const requested = resolution.wireModelId === model.id ? "" : ` (requested '${model.id}')`;
6198
+ emitResidencyNoticeOnce(`peer|${info.targetId}|${model.id}|${resolution.wireModelId}|${peers}`, {
6132
6199
  kind: "co-resident",
6133
6200
  level: "warning",
6134
6201
  targetId: info.targetId,
6135
6202
  runtimeId: "lmstudio",
6136
6203
  model: resolution.wireModelId,
6137
- message: `LM Studio instance '${resolution.wireModelId}' is also loaded on ${resolution.peerTargets.join(", ")}; this request may be served by that LM Link peer.`,
6138
- detail: { peerTargets: resolution.peerTargets.join(", ") }
6204
+ message: `LM Studio instance '${resolution.wireModelId}'${requested} is also loaded on ${peers}; a request may be served by that LM Link peer, and the footer and usage ledger name the id that answered when it differs.`,
6205
+ detail: { requestedModel: model.id, wireModel: resolution.wireModelId, peerTargets: peers }
6139
6206
  });
6140
6207
  }
6141
6208
  if (!load || Object.keys(load).length === 0 || resolution.instance) return resolution.wireModelId;
@@ -6221,6 +6288,98 @@ function pickSamplingProfile2(quirks, thinkingActive) {
6221
6288
  function isPlainRecord(value) {
6222
6289
  return value !== null && typeof value === "object" && !Array.isArray(value);
6223
6290
  }
6291
+ function observeResponseModelIdLine(line, capture) {
6292
+ if (capture.done) return;
6293
+ const normalized = line.endsWith("\r") ? line.slice(0, -1) : line;
6294
+ if (!normalized.startsWith("data:")) return;
6295
+ const data = normalized.slice("data:".length).trimStart();
6296
+ if (data.length === 0 || data === "[DONE]") return;
6297
+ try {
6298
+ const payload = JSON.parse(data);
6299
+ if (!isPlainRecord(payload)) return;
6300
+ const model = payload.model;
6301
+ if (typeof model === "string" && model.trim().length > 0) {
6302
+ capture.reportedModelId = model.trim();
6303
+ capture.done = true;
6304
+ }
6305
+ } catch {
6306
+ }
6307
+ }
6308
+ function observeResponseModelIdBytes(chunk, capture, flush = false) {
6309
+ if (capture.done || !capture.decoder) return;
6310
+ capture.buffer += chunk ? capture.decoder.decode(chunk, { stream: !flush }) : capture.decoder.decode();
6311
+ let newline = capture.buffer.indexOf("\n");
6312
+ while (newline >= 0) {
6313
+ const line = capture.buffer.slice(0, newline);
6314
+ capture.buffer = capture.buffer.slice(newline + 1);
6315
+ observeResponseModelIdLine(line, capture);
6316
+ if (capture.done) {
6317
+ capture.buffer = "";
6318
+ capture.decoder = null;
6319
+ return;
6320
+ }
6321
+ newline = capture.buffer.indexOf("\n");
6322
+ }
6323
+ if (flush && capture.buffer.length > 0) {
6324
+ observeResponseModelIdLine(capture.buffer, capture);
6325
+ capture.buffer = "";
6326
+ }
6327
+ if (capture.done || flush) capture.decoder = null;
6328
+ }
6329
+ function captureResponseModelId(response, capture) {
6330
+ if (!response.body || !response.headers.get("content-type")?.toLowerCase().includes("text/event-stream")) {
6331
+ return response;
6332
+ }
6333
+ const body = response.body.pipeThrough(
6334
+ new TransformStream({
6335
+ transform(chunk, controller) {
6336
+ capture.observed = true;
6337
+ if (!capture.done) observeResponseModelIdBytes(chunk, capture);
6338
+ controller.enqueue(chunk);
6339
+ },
6340
+ flush() {
6341
+ capture.observed = true;
6342
+ if (!capture.done) observeResponseModelIdBytes(void 0, capture, true);
6343
+ }
6344
+ })
6345
+ );
6346
+ return new Response(body, {
6347
+ status: response.status,
6348
+ statusText: response.statusText,
6349
+ headers: response.headers
6350
+ });
6351
+ }
6352
+ function withResponseModelIdCapture(options, sourceFactory) {
6353
+ const capture = {
6354
+ reportedModelId: null,
6355
+ observed: false,
6356
+ done: false,
6357
+ buffer: "",
6358
+ decoder: new TextDecoder2()
6359
+ };
6360
+ const fetchImpl = options.fetch ?? ((input, init) => globalThis.fetch(input, init));
6361
+ const capturedOptions = {
6362
+ ...options,
6363
+ fetch: async (input, init) => captureResponseModelId(await fetchImpl(input, init), capture)
6364
+ };
6365
+ const source = sourceFactory(capturedOptions);
6366
+ const annotated = createAssistantMessageEventStream3();
6367
+ (async () => {
6368
+ try {
6369
+ for await (const event of source) {
6370
+ const observation = capture.observed ? capture.reportedModelId === null ? { state: "not-reported" } : { state: "reported", reportedModelId: capture.reportedModelId } : { state: "not-observed" };
6371
+ if (event.type === "done") event.message.responseModelIdObservation = observation;
6372
+ else if (event.type === "error") event.error.responseModelIdObservation = observation;
6373
+ annotated.push(event);
6374
+ }
6375
+ annotated.end();
6376
+ } catch (err) {
6377
+ const message = err instanceof Error ? err.message : String(err);
6378
+ throw new Error(message);
6379
+ }
6380
+ })();
6381
+ return annotated;
6382
+ }
6224
6383
  function samplingParamsFromProfile(profile) {
6225
6384
  return {
6226
6385
  ...profile.topP !== void 0 ? { top_p: profile.topP } : {},
@@ -6704,16 +6863,15 @@ var openAICompletionsApiProvider = {
6704
6863
  stripSentinelsFromStream(
6705
6864
  stripNeverReasoningFromStream(
6706
6865
  filterGemmaChannelStream(
6707
- withLocalResidency(
6708
- model,
6709
- {
6710
- ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
6711
- ...options?.signal !== void 0 ? { signal: options.signal } : {}
6712
- },
6713
- (requestModel) => piOpenAICompletions.stream(
6714
- requestModel,
6715
- effectiveContext,
6716
- withRemainingContextBudget(model, effectiveContext, withSamplers)
6866
+ withResponseModelIdCapture(
6867
+ withRemainingContextBudget(model, effectiveContext, withSamplers),
6868
+ (capturedOptions) => withLocalResidency(
6869
+ model,
6870
+ {
6871
+ ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
6872
+ ...options?.signal !== void 0 ? { signal: options.signal } : {}
6873
+ },
6874
+ (requestModel) => piOpenAICompletions.stream(requestModel, effectiveContext, capturedOptions)
6717
6875
  )
6718
6876
  ),
6719
6877
  resolved.family === "gemma-4"
@@ -6736,16 +6894,15 @@ var openAICompletionsApiProvider = {
6736
6894
  stripSentinelsFromStream(
6737
6895
  stripNeverReasoningFromStream(
6738
6896
  filterGemmaChannelStream(
6739
- withLocalResidency(
6740
- model,
6741
- {
6742
- ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
6743
- ...options?.signal !== void 0 ? { signal: options.signal } : {}
6744
- },
6745
- (requestModel) => piOpenAICompletions.streamSimple(
6746
- requestModel,
6747
- effectiveContext,
6748
- withRemainingContextBudget(model, effectiveContext, withSamplers)
6897
+ withResponseModelIdCapture(
6898
+ withRemainingContextBudget(model, effectiveContext, withSamplers),
6899
+ (capturedOptions) => withLocalResidency(
6900
+ model,
6901
+ {
6902
+ ...options?.apiKey !== void 0 ? { apiKey: options.apiKey } : {},
6903
+ ...options?.signal !== void 0 ? { signal: options.signal } : {}
6904
+ },
6905
+ (requestModel) => piOpenAICompletions.streamSimple(requestModel, effectiveContext, capturedOptions)
6749
6906
  )
6750
6907
  ),
6751
6908
  resolved.family === "gemma-4"
@@ -7557,6 +7714,7 @@ export {
7557
7714
  registerClioApiProviders,
7558
7715
  resolveProviderKnowledgeBaseRoots,
7559
7716
  loadPluginRuntimes,
7717
+ formatContextWindowSlots,
7560
7718
  registerBuiltinRuntimes,
7561
7719
  FileKnowledgeBase,
7562
7720
  isOrchestratorEligibleRuntime,
@@ -7578,7 +7736,8 @@ export {
7578
7736
  runtimeTargetSnapshot,
7579
7737
  firstRuntimeResolutionError,
7580
7738
  runtimeResolutionWarnings,
7739
+ runtimeResolutionWarningsBesideThinkingNotice,
7581
7740
  normalizeCostProvenance,
7582
7741
  ProvidersDomainModule
7583
7742
  };
7584
- //# sourceMappingURL=chunk-QWU7ZBO7.js.map
7743
+ //# sourceMappingURL=chunk-VQNODYQ4.js.map
@@ -0,0 +1,37 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ durableAssistantTextFromEvent
4
+ } from "./chunk-UUANF5CR.js";
5
+ import {
6
+ responseModelIdObservationFromRecord
7
+ } from "./chunk-6TUKSZVF.js";
8
+ import {
9
+ init_esm_shims
10
+ } from "./chunk-3R73A4XB.js";
11
+
12
+ // src/tools/dispatch-event-text.ts
13
+ init_esm_shims();
14
+ function assistantTextFromEvent(event) {
15
+ return durableAssistantTextFromEvent(event).trim();
16
+ }
17
+ function receiptResponseModelIdObservationLabel(receipt) {
18
+ const responses = receipt.upstreamResponses ?? [];
19
+ if (responses.length === 0) return null;
20
+ const labels = responses.map((response) => {
21
+ const observation = responseModelIdObservationFromRecord(
22
+ response,
23
+ "legacy-difference-only"
24
+ );
25
+ if (observation.state === "reported") return `reported:${observation.reportedModelId}`;
26
+ if (observation.state === "not-reported") return "not-reported";
27
+ if (observation.state === "not-observed") return "not-observed";
28
+ return `legacy-difference-only:${observation.differingModelId ?? "none"}`;
29
+ });
30
+ return `response_model_id_observation=${labels.join(",")}`;
31
+ }
32
+
33
+ export {
34
+ assistantTextFromEvent,
35
+ receiptResponseModelIdObservationLabel
36
+ };
37
+ //# sourceMappingURL=chunk-VREKEFLL.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
3
  ceilChars
4
- } from "./chunk-BPGS2WCQ.js";
4
+ } from "./chunk-GEYXPTRF.js";
5
5
  import {
6
6
  clioStateDir
7
7
  } from "./chunk-BNAZZHFG.js";
@@ -616,4 +616,4 @@ export {
616
616
  createTaskMemoryTelemetrySink,
617
617
  taskMemoryBankDelta
618
618
  };
619
- //# sourceMappingURL=chunk-2TZWSW76.js.map
619
+ //# sourceMappingURL=chunk-WHGPSPT5.js.map
@@ -25,7 +25,7 @@ import {
25
25
  ceilChars,
26
26
  contentChars,
27
27
  estimateAgentMessageTokens
28
- } from "./chunk-BPGS2WCQ.js";
28
+ } from "./chunk-GEYXPTRF.js";
29
29
  import {
30
30
  init_esm_shims
31
31
  } from "./chunk-3R73A4XB.js";
@@ -674,4 +674,4 @@ export {
674
674
  compactionCut,
675
675
  selectVisibleEntries
676
676
  };
677
- //# sourceMappingURL=chunk-TW3WDMVS.js.map
677
+ //# sourceMappingURL=chunk-WHJYKASB.js.map
@@ -2,17 +2,22 @@ import { createRequire as __clioCreateRequire } from "node:module"; const requir
2
2
  import {
3
3
  canonicalJson,
4
4
  sha256
5
- } from "./chunk-QQL5RT5M.js";
5
+ } from "./chunk-UUANF5CR.js";
6
+ import {
7
+ addResponseModelIdObservationCount,
8
+ emptyResponseModelIdObservationCounts,
9
+ responseModelIdObservationFromRecord
10
+ } from "./chunk-6TUKSZVF.js";
6
11
  import {
7
12
  ToolNames
8
13
  } from "./chunk-CGKSTWHD.js";
9
- import {
10
- settingsPath
11
- } from "./chunk-AD2SYQYC.js";
12
14
  import {
13
15
  ceilChars,
14
16
  extractReasoningTokens
15
- } from "./chunk-BPGS2WCQ.js";
17
+ } from "./chunk-GEYXPTRF.js";
18
+ import {
19
+ settingsPath
20
+ } from "./chunk-UHXRNZ2J.js";
16
21
  import {
17
22
  expandConfigPath
18
23
  } from "./chunk-SST6Z5JA.js";
@@ -304,6 +309,7 @@ function createAskUserToolPolicy(activeTools) {
304
309
  status: "idle",
305
310
  startedAt: now,
306
311
  updatedAt: now,
312
+ exposure: "local",
307
313
  rounds: [],
308
314
  decisions: [],
309
315
  inFlight: false,
@@ -325,14 +331,21 @@ function sumRunUsage(messages) {
325
331
  reasoning: 0,
326
332
  apiCalls: 0,
327
333
  hadReasoning: false,
328
- hadUsage: false
334
+ hadUsage: false,
335
+ responseModelIdObservationCounts: emptyResponseModelIdObservationCounts(),
336
+ lastResponseModelIdObservation: { state: "not-observed" },
337
+ lastDifferingResponseModelId: null
329
338
  };
330
339
  for (const raw of messages) {
331
340
  const message = raw;
332
341
  if (!message || typeof message !== "object") continue;
333
342
  if (message.role !== "assistant") continue;
343
+ const record = message;
334
344
  const usage = message.usage;
335
345
  if (!usage || typeof usage !== "object") continue;
346
+ summary.lastResponseModelIdObservation = responseModelIdObservationFromRecord(record, "not-observed");
347
+ addResponseModelIdObservationCount(summary.responseModelIdObservationCounts, summary.lastResponseModelIdObservation);
348
+ summary.lastDifferingResponseModelId = typeof record.responseModel === "string" && record.responseModel.trim().length > 0 ? record.responseModel.trim() : null;
336
349
  summary.hadUsage = true;
337
350
  summary.apiCalls += 1;
338
351
  const input = typeof usage.input === "number" ? usage.input : 0;
@@ -369,6 +382,7 @@ function assistantSessionPayload(message, failure) {
369
382
  const raw = message;
370
383
  if (Array.isArray(raw.content)) payload.content = raw.content;
371
384
  if (thinking.length > 0) payload.thinking = thinking;
385
+ payload.responseModelIdObservation = responseModelIdObservationFromRecord(raw, "not-observed");
372
386
  for (const key of ["usage", "api", "provider", "model", "responseModel", "responseId", "diagnostics"]) {
373
387
  if (raw[key] !== void 0) payload[key] = raw[key];
374
388
  }
@@ -1080,4 +1094,4 @@ export {
1080
1094
  readFileArgsAsync,
1081
1095
  expandInlineFileReferencesAsync
1082
1096
  };
1083
- //# sourceMappingURL=chunk-MEQ45TQ4.js.map
1097
+ //# sourceMappingURL=chunk-WJHBC77E.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-ZGVHUX3M.js";
5
5
  import {
6
6
  BusChannels
7
- } from "./chunk-TTNYS3EA.js";
7
+ } from "./chunk-OB5HIGJY.js";
8
8
  import {
9
9
  init_esm_shims
10
10
  } from "./chunk-3R73A4XB.js";
@@ -226,4 +226,4 @@ export {
226
226
  runWithBudget,
227
227
  getTerminationCoordinator
228
228
  };
229
- //# sourceMappingURL=chunk-HXG4IURW.js.map
229
+ //# sourceMappingURL=chunk-X2KV5FXT.js.map
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
3
  enumerateWorkspaceFiles
4
- } from "./chunk-EKMEHE4H.js";
4
+ } from "./chunk-33YXPOE3.js";
5
5
  import {
6
6
  classifyCHeaderLanguage
7
7
  } from "./chunk-7CR24IG7.js";
@@ -190,4 +190,4 @@ export {
190
190
  detectProjectProfile,
191
191
  detectProjectType
192
192
  };
193
- //# sourceMappingURL=chunk-YHZX5GEU.js.map
193
+ //# sourceMappingURL=chunk-XAKHZX5N.js.map