@iowarp/clio-coder 0.3.7 → 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 (400) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +13 -4
  3. package/dist/{acp-SK4MD6MM.js → acp-7LOELQFP.js} +13 -13
  4. package/dist/{agents-2FN2K6ME.js → agents-FIBG2SHA.js} +41 -37
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-QIYZWM5I.js → auth-OI4LIH2I.js} +31 -24
  7. package/dist/builtins-AD25UL3C.js +17 -0
  8. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  9. package/dist/chunk-3DPEIQKN.js +113 -0
  10. package/dist/{chunk-EOOQZZDE.js → chunk-3DUR4WUA.js} +19 -19
  11. package/dist/{chunk-WHJYKASB.js → chunk-3MRC2YSQ.js} +2 -2
  12. package/dist/{chunk-EBEFWSGL.js → chunk-3UUY7R3Z.js} +14 -10
  13. package/dist/{chunk-LADCF22A.js → chunk-3V5AYSEQ.js} +113 -54
  14. package/dist/{chunk-BMWK7ZIZ.js → chunk-465CC7FK.js} +16 -13
  15. package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
  16. package/dist/{chunk-CEYBNUGC.js → chunk-4H6ULJ3H.js} +378 -36
  17. package/dist/{chunk-YTYFXUI3.js → chunk-4LJX2PUC.js} +9 -9
  18. package/dist/{chunk-DOOEX22V.js → chunk-56KB5IJP.js} +5 -5
  19. package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
  20. package/dist/{chunk-TSHXZTOQ.js → chunk-5HFBWUMU.js} +23 -11
  21. package/dist/{chunk-5UJ6ECTS.js → chunk-5PVQ4SRS.js} +80 -8
  22. package/dist/{chunk-ZWLZP4ZT.js → chunk-5QKCQQ3E.js} +359 -17
  23. package/dist/{chunk-6M7VS3J3.js → chunk-5T7RBWN2.js} +111 -5
  24. package/dist/chunk-774ILSRL.js +172 -0
  25. package/dist/chunk-7C6RYZGQ.js +391 -0
  26. package/dist/{chunk-GH5622CP.js → chunk-A2NJGIB3.js} +2 -2
  27. package/dist/{chunk-C4JBQ5SR.js → chunk-AD7Y7STJ.js} +6 -6
  28. package/dist/{chunk-GEYXPTRF.js → chunk-AEYBF3TB.js} +33 -12
  29. package/dist/{chunk-2SFS6XQE.js → chunk-AMKHQW3C.js} +3 -2
  30. package/dist/{chunk-D4MDIG46.js → chunk-B5CSFE7B.js} +7 -7
  31. package/dist/{chunk-MXI6J5JF.js → chunk-B5XRQOLB.js} +10 -10
  32. package/dist/{chunk-X2KV5FXT.js → chunk-BVDVID7E.js} +2 -2
  33. package/dist/{chunk-JNXPYBB4.js → chunk-CA42X6KT.js} +3 -3
  34. package/dist/{chunk-VREKEFLL.js → chunk-D73KXYPF.js} +3 -3
  35. package/dist/{chunk-JTSEDYVQ.js → chunk-DG4M6ZUE.js} +7 -7
  36. package/dist/{chunk-DQA7QLMD.js → chunk-EBOC7MT3.js} +10 -25
  37. package/dist/{chunk-KZ2H5X4G.js → chunk-ECUO3KDP.js} +129 -14
  38. package/dist/{chunk-JRIO5UD2.js → chunk-EQ63NRB7.js} +5 -5
  39. package/dist/{chunk-YD734TPH.js → chunk-FALJGAWU.js} +2 -2
  40. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  41. package/dist/{chunk-XEGB6BCN.js → chunk-GAYUJ7LE.js} +68 -14
  42. package/dist/{chunk-UND3GU2L.js → chunk-H7IXIC72.js} +2 -2
  43. package/dist/{chunk-IR4CFBFN.js → chunk-HAY4ZE2P.js} +12 -12
  44. package/dist/{chunk-UVDSQ6LW.js → chunk-HCBCAYZU.js} +74 -147
  45. package/dist/{chunk-4DWFMQDR.js → chunk-HJB5IUKP.js} +89 -145
  46. package/dist/{chunk-M4AKACEO.js → chunk-HKO36JWF.js} +33 -5
  47. package/dist/{chunk-KCMKRQX4.js → chunk-HPCTNZM2.js} +45 -82
  48. package/dist/{chunk-465YSENW.js → chunk-IFBNV6H6.js} +3 -3
  49. package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
  50. package/dist/chunk-JEQQR47K.js +3025 -0
  51. package/dist/{chunk-FO5ZOVUY.js → chunk-KV2AOLDF.js} +27 -7
  52. package/dist/chunk-LU7P4LHA.js +33 -0
  53. package/dist/{chunk-6TUKSZVF.js → chunk-LXPJXFM5.js} +11 -11
  54. package/dist/{chunk-VQNODYQ4.js → chunk-MIX5N5AC.js} +488 -3668
  55. package/dist/chunk-MLOK6ZOS.js +2888 -0
  56. package/dist/{chunk-ZZMN5OM4.js → chunk-MV2VUEJC.js} +2 -2
  57. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  58. package/dist/{chunk-OBMAI2DP.js → chunk-N3PBVRTZ.js} +12 -388
  59. package/dist/{chunk-WJHBC77E.js → chunk-N5XKWMDW.js} +17 -7
  60. package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
  61. package/dist/{chunk-UFQ3F4FW.js → chunk-NQ6UCCOD.js} +4 -4
  62. package/dist/chunk-NUGM5KR6.js +165 -0
  63. package/dist/{chunk-DMD2AGVS.js → chunk-NZU6YDNV.js} +20 -18
  64. package/dist/{chunk-WHGPSPT5.js → chunk-O6I4CIEU.js} +151 -13
  65. package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
  66. package/dist/{chunk-PD3MESLB.js → chunk-P3JGPQFL.js} +4 -4
  67. package/dist/{chunk-UHXRNZ2J.js → chunk-PNY46YEY.js} +23 -6
  68. package/dist/{chunk-THKY7CD7.js → chunk-PZ4I4JE2.js} +134 -29
  69. package/dist/{chunk-SROCI7ZU.js → chunk-QQ7EKM72.js} +5 -5
  70. package/dist/{chunk-QCTRSGHQ.js → chunk-R7LNVMCS.js} +91 -53
  71. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  72. package/dist/chunk-RKKLTLYB.js +45 -0
  73. package/dist/{chunk-OB5HIGJY.js → chunk-RKRLDWD3.js} +4 -1
  74. package/dist/{chunk-DJNLUABN.js → chunk-S4COXYBG.js} +588 -32
  75. package/dist/{chunk-3HAPLH5M.js → chunk-T3Z6VAAF.js} +172 -11
  76. package/dist/{chunk-FOT2FX5J.js → chunk-TD7UE2L5.js} +12 -10
  77. package/dist/{chunk-UUANF5CR.js → chunk-TEO2TLVN.js} +856 -967
  78. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  79. package/dist/{chunk-EELBMBT6.js → chunk-VKBMFOYV.js} +74 -15
  80. package/dist/chunk-VO2LKSTM.js +165 -0
  81. package/dist/{chunk-5C77SEEY.js → chunk-VPTUJU4P.js} +3 -3
  82. package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
  83. package/dist/{chunk-J7PIKKWC.js → chunk-WXCJ7VME.js} +8 -8
  84. package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
  85. package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
  86. package/dist/{chunk-AB4XIIVB.js → chunk-YKOFT37S.js} +6 -6
  87. package/dist/chunk-YSEHGPCT.js +127 -0
  88. package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
  89. package/dist/cli/index.js +32 -32
  90. package/dist/{clio-WBVQEBKO.js → clio-LT5V7SSZ.js} +9 -9
  91. package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +5 -5
  92. package/dist/codewiki/build-worker.js +4 -4
  93. package/dist/{components-F7OEATSO.js → components-ZFA3SAER.js} +8 -8
  94. package/dist/{config-TRBL3RCF.js → config-RXS5T3JT.js} +98 -65
  95. package/dist/{configure-OLCVPHNM.js → configure-2WYWSCSD.js} +26 -22
  96. package/dist/{context-MJIJ6GOX.js → context-I3BTOTCS.js} +12 -12
  97. package/dist/{context-XEWE3MOJ.js → context-MVOORGMF.js} +54 -47
  98. package/dist/{context-WFPKQSM6.js → context-PALKKQYL.js} +28 -28
  99. package/dist/{context-clear-KNOS2JPB.js → context-clear-N2WOYZ2K.js} +53 -46
  100. package/dist/{context-index-SSR5ECNE.js → context-index-HNG3MOME.js} +6 -6
  101. package/dist/{context-working-set-EUXAZI6N.js → context-working-set-MIEVECVZ.js} +17 -18
  102. package/dist/{dispatch-runner-B7MTOVKL.js → dispatch-runner-VVA4SRRH.js} +90 -61
  103. package/dist/{docs-FLJTIDSE.js → docs-7LQ23DLM.js} +8 -8
  104. package/dist/doctor-TWBWFK5V.js +165 -0
  105. package/dist/eval-IJ5VEZDJ.js +4483 -0
  106. package/dist/{evidence-JZNBUOQZ.js → evidence-L5APPXNV.js} +68 -61
  107. package/dist/{evolve-FJVC4KKI.js → evolve-RGNKFJ52.js} +47 -40
  108. package/dist/{extensions-IQL36S7K.js → extensions-7WYWUX5A.js} +13 -7
  109. package/dist/{fleet-BDKYJFCP.js → fleet-6CNVBZZP.js} +113 -76
  110. package/dist/{fleet-commands-ZFIWZSB3.js → fleet-commands-L2SXSYEI.js} +10 -10
  111. package/dist/{fleet-graph-Y6HPXIVF.js → fleet-graph-2J3OOIPO.js} +17 -15
  112. package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-CZRJ4JP5.js} +5 -6
  113. package/dist/{fleet-validate-BIYREGIK.js → fleet-validate-C5RI6DP7.js} +20 -19
  114. package/dist/{init-LQUB5COQ.js → init-VBN2ACVA.js} +70 -63
  115. package/dist/{library-NJAHIGG4.js → library-JHGUMLY2.js} +22 -20
  116. package/dist/{memory-OG6HOYKM.js → memory-K4OQIYWG.js} +49 -42
  117. package/dist/{models-5ZG5XY7J.js → models-2NCZUWDD.js} +35 -29
  118. package/dist/{monitor-TJ7AMTGB.js → monitor-MMVTJABD.js} +64 -45
  119. package/dist/{orchestrator-WZYB54DM.js → orchestrator-ZKBPCHW6.js} +1971 -520
  120. package/dist/{paths-XUC7GS6E.js → paths-DBXMZMDU.js} +5 -5
  121. package/dist/registry-LG64LTF4.js +11 -0
  122. package/dist/{reset-PXQT45IY.js → reset-DD5JGOY3.js} +11 -11
  123. package/dist/{run-FQ74YF62.js → run-QEGNX7FL.js} +89 -83
  124. package/dist/{share-FW7SVCL3.js → share-JKD3BQMW.js} +20 -18
  125. package/dist/{skills-7E7IRB3R.js → skills-LMQIKDOZ.js} +23 -21
  126. package/dist/{skills-eval-LI75W6OK.js → skills-eval-I7X2774U.js} +59 -52
  127. package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
  128. package/dist/support-I7LOJLIF.js +38 -0
  129. package/dist/{targets-4CIFKCTW.js → targets-RUSR6B5Z.js} +77 -42
  130. package/dist/{terminal-lease-WUZY7ZV5.js → terminal-lease-QYVORFR4.js} +6 -4
  131. package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
  132. package/dist/{uninstall-7FV7IP4E.js → uninstall-ZJF5H5ZN.js} +8 -8
  133. package/dist/{upgrade-K2HVIVMQ.js → upgrade-XANW3FXB.js} +29 -26
  134. package/dist/{usage-GTZELZQX.js → usage-4H7ZRXQT.js} +110 -61
  135. package/dist/{verifiers-RLAHT27O.js → verifiers-UZXNBZEB.js} +13 -13
  136. package/dist/{verify-BX3BRKH5.js → verify-BVKWTNDL.js} +9 -9
  137. package/dist/{wiki-generate-ASIFASCN.js → wiki-generate-MY7WV2QI.js} +76 -69
  138. package/dist/worker/entry.js +69 -66
  139. package/docs/alcf-provider.md +1 -1
  140. package/docs/architecture.md +1 -1
  141. package/docs/artifact-versions.md +11 -5
  142. package/docs/built-in-agents.md +1 -1
  143. package/docs/capacity-and-scheduling.md +23 -2
  144. package/docs/commands-and-modes.md +2 -2
  145. package/docs/configuration-and-targets.md +37 -5
  146. package/docs/context-engine.md +63 -4
  147. package/docs/documentation-coverage.md +3 -3
  148. package/docs/documentation-guide.md +1 -1
  149. package/docs/environment-variables.md +2 -0
  150. package/docs/eval-runner.md +262 -11
  151. package/docs/evals-internal.md +72 -2
  152. package/docs/evidence-and-memory.md +77 -12
  153. package/docs/evolution.md +1 -1
  154. package/docs/extensions-and-sharing.md +3 -1
  155. package/docs/fleet-dispatch.md +34 -9
  156. package/docs/glossary.md +21 -1
  157. package/docs/installation-and-lifecycle.md +1 -1
  158. package/docs/middleware-and-components.md +1 -1
  159. package/docs/model-catalog.md +1 -1
  160. package/docs/observability.md +54 -3
  161. package/docs/proactive-memory.md +127 -14
  162. package/docs/prompt-envelope-and-tools.md +22 -2
  163. package/docs/provider-adapter-cookbook.md +1 -1
  164. package/docs/release-cut-checklist.md +60 -41
  165. package/docs/safety-model.md +1 -1
  166. package/docs/scientific-validation.md +1 -1
  167. package/docs/skills-marketplace.md +1 -1
  168. package/docs/tool-usage.md +1 -1
  169. package/docs/trace-store.md +1 -1
  170. package/docs/troubleshooting.md +87 -0
  171. package/docs/tui-design.md +1 -1
  172. package/docs/worker-dispatch-mechanics.md +1 -1
  173. package/package.json +2 -2
  174. package/src/cli/agents.ts +1 -1
  175. package/src/cli/argv.ts +5 -0
  176. package/src/cli/config-inspect.ts +33 -6
  177. package/src/cli/config.ts +1 -1
  178. package/src/cli/configure.ts +107 -23
  179. package/src/cli/doctor-state-size.ts +82 -0
  180. package/src/cli/doctor.ts +7 -1
  181. package/src/cli/eval.ts +80 -16
  182. package/src/cli/evidence.ts +30 -25
  183. package/src/cli/extensions.ts +5 -1
  184. package/src/cli/fleet-preflight.ts +2 -12
  185. package/src/cli/fleet.ts +32 -3
  186. package/src/cli/shared.ts +1 -0
  187. package/src/cli/targets.ts +45 -11
  188. package/src/cli/trace.ts +63 -4
  189. package/src/cli/usage.ts +63 -14
  190. package/src/cli/validate-model.ts +60 -5
  191. package/src/core/bus-events.ts +54 -1
  192. package/src/core/cache-telemetry.ts +42 -0
  193. package/src/core/commit-attribution.ts +4 -4
  194. package/src/core/config.ts +18 -0
  195. package/src/core/defaults.ts +36 -6
  196. package/src/core/endpoint-key.ts +27 -0
  197. package/src/core/path-boundary.ts +100 -0
  198. package/src/core/residency-target-key.ts +25 -0
  199. package/src/core/response-schema.ts +36 -2
  200. package/src/domains/agents/extension.ts +2 -11
  201. package/src/domains/agents/fleet-contract.ts +30 -12
  202. package/src/domains/agents/recipe.ts +7 -1
  203. package/src/domains/agents/registry.ts +73 -5
  204. package/src/domains/agents/result-contract.ts +128 -17
  205. package/src/domains/agents/write-boundary.ts +15 -50
  206. package/src/domains/config/classify.ts +3 -0
  207. package/src/domains/context/codewiki/coordinator.ts +12 -4
  208. package/src/domains/context/project-rules.ts +51 -1
  209. package/src/domains/dispatch/admission.ts +40 -3
  210. package/src/domains/dispatch/assignment-reconcile.ts +22 -5
  211. package/src/domains/dispatch/assignment-store.ts +151 -14
  212. package/src/domains/dispatch/capacity-lease.ts +98 -9
  213. package/src/domains/dispatch/contract.ts +26 -1
  214. package/src/domains/dispatch/delegation-plan.ts +2 -5
  215. package/src/domains/dispatch/execution-plan.ts +44 -4
  216. package/src/domains/dispatch/execution-role.ts +9 -1
  217. package/src/domains/dispatch/extension.ts +309 -96
  218. package/src/domains/dispatch/fleet-run.ts +78 -4
  219. package/src/domains/dispatch/gate-role-prompts.ts +38 -0
  220. package/src/domains/dispatch/heartbeat.ts +32 -8
  221. package/src/domains/dispatch/index.ts +6 -1
  222. package/src/domains/dispatch/intent-requirements.ts +40 -0
  223. package/src/domains/dispatch/intent.ts +84 -8
  224. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  225. package/src/domains/dispatch/path-scope.ts +370 -0
  226. package/src/domains/dispatch/receipt-integrity.ts +2 -1
  227. package/src/domains/dispatch/reservation-store.ts +116 -8
  228. package/src/domains/dispatch/state.ts +4 -0
  229. package/src/domains/dispatch/types.ts +14 -7
  230. package/src/domains/dispatch/validation.ts +6 -3
  231. package/src/domains/dispatch/worker-spawn.ts +25 -11
  232. package/src/domains/dispatch/write-boundary-enforcer.ts +62 -0
  233. package/src/domains/dispatch/write-boundary.ts +262 -22
  234. package/src/domains/eval/artifacts/store.ts +62 -0
  235. package/src/domains/eval/compare/behavioral.ts +224 -0
  236. package/src/domains/eval/compare/compare.ts +355 -2
  237. package/src/domains/eval/compare/envelope.ts +128 -0
  238. package/src/domains/eval/compare/gates.ts +24 -6
  239. package/src/domains/eval/compare/thresholds.ts +30 -3
  240. package/src/domains/eval/execution-provenance.ts +240 -0
  241. package/src/domains/eval/metrics/aggregate.ts +136 -0
  242. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  243. package/src/domains/eval/metrics/evidence.ts +79 -2
  244. package/src/domains/eval/metrics/tracked.ts +413 -0
  245. package/src/domains/eval/provenance.ts +117 -0
  246. package/src/domains/eval/reports/comparison.ts +128 -0
  247. package/src/domains/eval/reports/junit.ts +17 -3
  248. package/src/domains/eval/reports/markdown.ts +3 -3
  249. package/src/domains/eval/reports/text.ts +14 -0
  250. package/src/domains/eval/run-compare.ts +20 -0
  251. package/src/domains/eval/runners/clio-run.ts +139 -2
  252. package/src/domains/eval/runners/external-command.ts +28 -3
  253. package/src/domains/eval/schema/adapter.ts +111 -0
  254. package/src/domains/eval/schema/artifact.ts +20 -0
  255. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  256. package/src/domains/eval/schema/behavioral.ts +520 -0
  257. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  258. package/src/domains/eval/schema/serving.ts +74 -0
  259. package/src/domains/eval/schema/suite.ts +38 -8
  260. package/src/domains/eval/schema/validate.ts +58 -3
  261. package/src/domains/eval/schema/verdict.ts +237 -0
  262. package/src/domains/eval/suites/resolve.ts +2 -0
  263. package/src/domains/eval/suites/run.ts +264 -33
  264. package/src/domains/eval/verifiers/command.ts +2 -1
  265. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  266. package/src/domains/evidence/build.ts +68 -21
  267. package/src/domains/evidence/eval.ts +2 -12
  268. package/src/domains/evidence/findings-markdown.ts +33 -0
  269. package/src/domains/evidence/index.ts +21 -0
  270. package/src/domains/evidence/provenance.ts +46 -11
  271. package/src/domains/evidence/run-trust.ts +7 -113
  272. package/src/domains/evidence/trust-projection.ts +274 -0
  273. package/src/domains/evidence/trust-status.ts +145 -17
  274. package/src/domains/evidence/types.ts +4 -0
  275. package/src/domains/extensions/compatibility.ts +285 -0
  276. package/src/domains/extensions/discovery.ts +126 -4
  277. package/src/domains/extensions/resources.ts +21 -9
  278. package/src/domains/extensions/state.ts +18 -5
  279. package/src/domains/extensions/types.ts +6 -1
  280. package/src/domains/lifecycle/doctor.ts +209 -2
  281. package/src/domains/memory/index.ts +14 -0
  282. package/src/domains/memory/task-bank-promotion.ts +64 -0
  283. package/src/domains/memory/task-memory-policy.ts +77 -8
  284. package/src/domains/memory/task-memory-spend.ts +131 -0
  285. package/src/domains/memory/task-memory-status.ts +7 -0
  286. package/src/domains/memory/task-memory-telemetry.ts +2 -0
  287. package/src/domains/middleware/index.ts +1 -0
  288. package/src/domains/middleware/memory-intervention.ts +69 -5
  289. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  290. package/src/domains/observability/background-memory-usage.ts +140 -0
  291. package/src/domains/observability/cost.ts +1 -1
  292. package/src/domains/observability/index.ts +7 -0
  293. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  294. package/src/domains/observability/trace-store.ts +192 -2
  295. package/src/domains/prompts/compiler.ts +100 -13
  296. package/src/domains/prompts/contract.ts +3 -5
  297. package/src/domains/providers/endpoint-capacity.ts +96 -0
  298. package/src/domains/providers/extension.ts +30 -2
  299. package/src/domains/providers/index.ts +10 -0
  300. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  301. package/src/domains/providers/runtime-resolution.ts +8 -1
  302. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  303. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  304. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  305. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  306. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  307. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  308. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  309. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  310. package/src/domains/providers/types/capability-flags.ts +2 -0
  311. package/src/domains/providers/types/target-descriptor.ts +2 -0
  312. package/src/domains/resources/common-loader.ts +3 -0
  313. package/src/domains/resources/prompts/loader.ts +184 -17
  314. package/src/domains/safety/call-target.ts +52 -0
  315. package/src/domains/safety/policy-engine.ts +5 -5
  316. package/src/domains/safety/run-effects.ts +96 -2
  317. package/src/domains/safety/scope.ts +7 -12
  318. package/src/domains/session/context-accounting.ts +52 -1
  319. package/src/domains/session/context-ledger.ts +37 -13
  320. package/src/domains/session/index.ts +6 -0
  321. package/src/domains/session/prompt-cache.ts +140 -0
  322. package/src/domains/session/prompt-manifest.ts +42 -0
  323. package/src/engine/acp/adapter.ts +18 -3
  324. package/src/engine/acp/server.ts +4 -1
  325. package/src/engine/ai.ts +35 -0
  326. package/src/engine/apis/llamacpp-residency.ts +55 -3
  327. package/src/engine/apis/lmstudio.ts +25 -5
  328. package/src/engine/apis/ollama-native.ts +2 -1
  329. package/src/engine/apis/openai-completions.ts +80 -17
  330. package/src/engine/apis/residency-lock.ts +3 -1
  331. package/src/engine/apis/residency.ts +34 -1
  332. package/src/engine/prompt-templates.ts +18 -1
  333. package/src/engine/provider-payload.ts +29 -1
  334. package/src/engine/worker-runtime.ts +6 -3
  335. package/src/entry/orchestrator.ts +176 -30
  336. package/src/interactive/chat-loop-messages.ts +26 -7
  337. package/src/interactive/chat-loop.ts +318 -41
  338. package/src/interactive/chat-panel.ts +62 -8
  339. package/src/interactive/clio-editor.ts +45 -8
  340. package/src/interactive/context-activity.ts +5 -1
  341. package/src/interactive/context-meter.ts +1 -1
  342. package/src/interactive/context-overlay.ts +40 -10
  343. package/src/interactive/cost-overlay.ts +64 -6
  344. package/src/interactive/dispatch-board.ts +127 -5
  345. package/src/interactive/fleet-run-preview.ts +41 -15
  346. package/src/interactive/handoff-round.ts +41 -2
  347. package/src/interactive/interactive-application.ts +24 -1
  348. package/src/interactive/interactive-event-projection.ts +14 -0
  349. package/src/interactive/interactive-input-runtime.ts +8 -0
  350. package/src/interactive/interactive-presentation.ts +4 -0
  351. package/src/interactive/interactive-shell.ts +20 -17
  352. package/src/interactive/interactive-slash-runtime.ts +27 -4
  353. package/src/interactive/memory-overlay.ts +8 -0
  354. package/src/interactive/mutation-preview.ts +295 -0
  355. package/src/interactive/overlay-general-openers.ts +16 -0
  356. package/src/interactive/overlay-key-routing.ts +38 -0
  357. package/src/interactive/overlay-lifecycle.ts +38 -5
  358. package/src/interactive/overlay-permission-lifecycle.ts +22 -2
  359. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  360. package/src/interactive/overlays/ask-user.ts +91 -19
  361. package/src/interactive/overlays/help-reference.ts +4 -0
  362. package/src/interactive/overlays/prompts.ts +11 -1
  363. package/src/interactive/overlays/settings.ts +176 -48
  364. package/src/interactive/permission-hint.ts +34 -2
  365. package/src/interactive/permission-overlay.ts +159 -9
  366. package/src/interactive/prewarm.ts +197 -0
  367. package/src/interactive/render-trace.ts +162 -15
  368. package/src/interactive/renderers/tool-execution.ts +4 -0
  369. package/src/interactive/side-question.ts +58 -1
  370. package/src/interactive/slash-commands.ts +7 -2
  371. package/src/interactive/status/controller.ts +11 -0
  372. package/src/interactive/status/state-machine.ts +54 -2
  373. package/src/interactive/status/types.ts +7 -0
  374. package/src/interactive/terminal-lease.ts +2 -0
  375. package/src/interactive/turn-context.ts +299 -31
  376. package/src/interactive/turn-persistence.ts +14 -4
  377. package/src/interactive/turn-prewarm.ts +364 -0
  378. package/src/interactive/turn-queues.ts +7 -4
  379. package/src/interactive/turn-runtime.ts +8 -1
  380. package/src/interactive/turn-state.ts +23 -0
  381. package/src/interactive/view/artifacts.ts +42 -9
  382. package/src/interactive/view/view-overlay.ts +43 -6
  383. package/src/interactive/worker-receipts.ts +14 -2
  384. package/src/interactive/worker-stream.ts +8 -0
  385. package/src/tools/ask-user.ts +43 -2
  386. package/src/tools/dispatch-admission.ts +12 -13
  387. package/src/tools/dispatch-arguments.ts +27 -0
  388. package/src/tools/dispatch-plan.ts +46 -9
  389. package/src/tools/dispatch-runner.ts +48 -13
  390. package/src/tools/dispatch-scout.ts +1 -1
  391. package/src/tools/monitor.ts +13 -0
  392. package/src/tools/registry.ts +16 -0
  393. package/src/tools/worker-evidence.ts +19 -13
  394. package/src/worker/spec-contract.ts +2 -1
  395. package/dist/chunk-AOCYTWAV.js +0 -449
  396. package/dist/chunk-HWUFFB6L.js +0 -83
  397. package/dist/chunk-R346GLFC.js +0 -31
  398. package/dist/chunk-ZGH7FGS5.js +0 -1079
  399. package/dist/doctor-RN4YKO2X.js +0 -87
  400. package/dist/eval-RUBJVSNQ.js +0 -2557
@@ -4,7 +4,7 @@ import {
4
4
  sanitizeToolResultDigest,
5
5
  type ToolResultDigest,
6
6
  } from "../../tools/result-disposition.js";
7
- import { TASK_MEMORY_DEFAULT_PROCEDURAL_CAP, type TaskMemoryBank } from "../memory/task-bank.js";
7
+ import { TASK_MEMORY_DEFAULT_PROCEDURAL_CAP, type TaskMemoryBank, type TaskMemoryEntry } from "../memory/task-bank.js";
8
8
  import {
9
9
  runTaskMemoryPolicy,
10
10
  TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
@@ -12,6 +12,7 @@ import {
12
12
  type TaskMemoryModelClient,
13
13
  type TaskMemoryPolicyReason,
14
14
  type TaskMemoryPolicyResult,
15
+ type TaskMemoryStepUsage,
15
16
  type TaskMemoryTrajectoryStep,
16
17
  } from "../memory/task-memory-policy.js";
17
18
  import type { TaskMemoryActivityEvent } from "../memory/task-memory-status.js";
@@ -75,6 +76,25 @@ export interface MemoryInterventionDeps {
75
76
  everyNTools?: number;
76
77
  /** Lazily resolves the explicitly configured background role. Null means rules-only. */
77
78
  getModelClient?: () => TaskMemoryModelClient | null;
79
+ /**
80
+ * True when the background target's inference endpoint is already serving the
81
+ * chat target's stream. A memory step then either queues behind the operator's
82
+ * own turn on a single-slot server or makes the server evict the resident
83
+ * model to serve it, so the boundary is skipped and the skip is recorded.
84
+ */
85
+ backgroundEndpointBusy?: () => boolean;
86
+ /**
87
+ * Provider-reported spend for one completed model step. The composition root
88
+ * routes it to the cost ledger; the middleware never prices anything.
89
+ */
90
+ onStepUsage?: (usage: TaskMemoryStepUsage) => void;
91
+ /**
92
+ * Bank entries an llm-tier reminder cited when it reached the operator. The
93
+ * composition root proposes them into the durable memory store, which is what
94
+ * connects the session bank to the records `/memory` and `clio-coder memory`
95
+ * read. Best effort and content-bearing, exactly like `onEnvelope`.
96
+ */
97
+ onInjectedEntries?: (entries: ReadonlyArray<TaskMemoryEntry>) => void;
78
98
  /** Live next-turn settings view; individual fields above remain test-friendly fallbacks. */
79
99
  getSettings?: () => Readonly<MemoryInterventionSettings>;
80
100
  /** Best-effort content-free telemetry; sink failures never affect intervention. */
@@ -348,6 +368,7 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
348
368
  reminder: null,
349
369
  inputTokens: 0,
350
370
  outputTokens: 0,
371
+ usage: null,
351
372
  effects: NO_EFFECTS,
352
373
  });
353
374
  const live = settings();
@@ -361,10 +382,20 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
361
382
  let tier: TaskMemoryTelemetryTier = "rules";
362
383
  promptedStepTier = tier;
363
384
  let promptedResult: TaskMemoryPolicyResult;
385
+ // A boundary that never reached the model is a skipped boundary rather than
386
+ // a policy decision, and `dropped` is the telemetry outcome for exactly
387
+ // that. The returned decision stays `silent`, since no reminder was
388
+ // produced and the policy vocabulary has no value for a step that never ran.
389
+ let telemetryDecision: TaskMemoryTelemetryDecision | null = null;
364
390
  try {
365
391
  const client = deps.getModelClient?.() ?? null;
366
392
  if (client === null) {
367
393
  promptedResult = silent("no_client");
394
+ } else if (deps.backgroundEndpointBusy?.() === true) {
395
+ tier = "llm";
396
+ promptedStepTier = tier;
397
+ promptedResult = silent("endpoint_busy");
398
+ telemetryDecision = "dropped";
368
399
  } else {
369
400
  tier = "llm";
370
401
  promptedStepTier = tier;
@@ -396,10 +427,18 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
396
427
  });
397
428
  }
398
429
  lastDecision = promptedResult.decision;
430
+ if (promptedResult.usage !== null) {
431
+ try {
432
+ deps.onStepUsage?.(promptedResult.usage);
433
+ } catch {
434
+ // Accounting is bookkeeping. A failing sink never changes memory behavior.
435
+ }
436
+ }
437
+ if (promptedResult.decision === "injected") reportInjectedEntries(promptedResult.reminder);
399
438
  emitTelemetry(
400
439
  triggers,
401
440
  tier,
402
- promptedResult.decision,
441
+ telemetryDecision ?? promptedResult.decision,
403
442
  promptedResult.reason,
404
443
  citedEntryCount(promptedResult.reminder),
405
444
  promptedResult.inputTokens,
@@ -462,10 +501,35 @@ export function createMemoryInterventionRegistration(deps: MemoryInterventionDep
462
501
  if (activity.length > MEMORY_INTERVENTION_ACTIVITY_LIMIT) activity.length = MEMORY_INTERVENTION_ACTIVITY_LIMIT;
463
502
  }
464
503
 
465
- function citedEntryCount(message: string | null): number {
466
- if (message === null) return 0;
504
+ function citedEntries(message: string | null): TaskMemoryEntry[] {
505
+ if (message === null) return [];
467
506
  const snapshot = deps.bank.snapshot();
468
- return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`)).length;
507
+ return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`));
508
+ }
509
+
510
+ function citedEntryCount(message: string | null): number {
511
+ return citedEntries(message).length;
512
+ }
513
+
514
+ /**
515
+ * Hand the cited entries to the durable store.
516
+ *
517
+ * Only the model tier reports here. A rules-tier reminder cites an entry this
518
+ * middleware wrote itself out of one repeated tool failure, and proposing
519
+ * every one of those as a durable lesson would fill the operator's review
520
+ * queue with rows nobody asked for. The model tier's entries are the ones the
521
+ * background plane produced, which is what #229 asks to be reviewable.
522
+ */
523
+ function reportInjectedEntries(reminder: string | null): void {
524
+ if (deps.onInjectedEntries === undefined) return;
525
+ const entries = citedEntries(reminder);
526
+ if (entries.length === 0) return;
527
+ try {
528
+ deps.onInjectedEntries(entries);
529
+ } catch {
530
+ // A failing store is the composition root's problem to report, never a
531
+ // reason to fail the step that produced the reminder.
532
+ }
469
533
  }
470
534
 
471
535
  function observeBeforeTool(input: MiddlewareHookInput): void {
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Publishing and accounting for the endpoint a background memory step uses.
3
+ *
4
+ * A proactive-memory step that runs on the chat target's own endpoint moves
5
+ * that server's prefix cache, so the next turn is cold for a reason Clio caused
6
+ * and can name. The turn context turns {@link BusChannels.MemoryStepCompleted}
7
+ * into the `background_memory` expected-cold reason; without it `/context`
8
+ * reports the turn as an unexplained provider re-prefill.
9
+ *
10
+ * The disturbance is a property of the request having left the process, not of
11
+ * the answer coming back. A step that times out still had its whole trajectory
12
+ * prefilled into the single prefix slot, because aborting the HTTP request does
13
+ * not stop a llama.cpp prefill (the measurement is recorded in
14
+ * `src/interactive/turn-prewarm.ts`). Publishing from the usage sink instead
15
+ * missed exactly that case, since usage is only assigned once the call resolves.
16
+ *
17
+ * The same request also occupies real endpoint capacity. Both responsibilities
18
+ * live here around the client's `complete`: the slot is registered only after
19
+ * the middleware's `endpoint_busy` admission check, so a step never sees its
20
+ * own slot, then released in the `finally` that also announces the disturbance.
21
+ * Both happen on resolve, timeout, and transport throw, and neither happens for
22
+ * a boundary that skipped the model altogether (`endpoint_busy`, no configured
23
+ * route), because those never call `complete`.
24
+ */
25
+
26
+ import { BusChannels } from "../../core/bus-events.js";
27
+ import type { SafeEventBus } from "../../core/event-bus.js";
28
+ import { registerForegroundStream } from "../providers/endpoint-capacity.js";
29
+
30
+ /** What the announcer needs: somewhere to publish, and the route to name. */
31
+ export interface MemoryStepEndpointAnnouncerDeps {
32
+ bus: Pick<SafeEventBus, "emit"> | null;
33
+ /** Canonical endpoint the step calls, or null when the route has none. */
34
+ endpointKey: string | null;
35
+ targetId: string;
36
+ }
37
+
38
+ /**
39
+ * Wrap one background memory `complete` so every request that leaves the
40
+ * process holds one endpoint slot and publishes its endpoint exactly once,
41
+ * whatever the call does next.
42
+ *
43
+ * A route with no canonical endpoint key is unchanged. A null bus suppresses
44
+ * the announcement but still counts capacity for a route whose key is known.
45
+ */
46
+ export function announceMemoryStepEndpoint<Request, Response>(
47
+ deps: MemoryStepEndpointAnnouncerDeps,
48
+ complete: (request: Request) => Promise<Response>,
49
+ ): (request: Request) => Promise<Response> {
50
+ const { bus, endpointKey, targetId } = deps;
51
+ if (endpointKey === null) return complete;
52
+ return async (request: Request): Promise<Response> => {
53
+ // `runPromptedStep` performs its busy check before it invokes `complete`,
54
+ // so this registration counts the outgoing request without self-refusing.
55
+ const releaseEndpointSlot = registerForegroundStream(endpointKey);
56
+ try {
57
+ return await complete(request);
58
+ } finally {
59
+ releaseEndpointSlot();
60
+ // Bookkeeping never changes memory behavior, and a crashing subscriber
61
+ // must not turn a resolved step into a failed one.
62
+ if (bus !== null) {
63
+ try {
64
+ bus.emit(BusChannels.MemoryStepCompleted, { endpointKey, targetId });
65
+ } catch {
66
+ // The safe bus already contains listener errors; this covers the rest.
67
+ }
68
+ }
69
+ }
70
+ };
71
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Accounting for one proactive-memory step.
3
+ *
4
+ * A background memory step is a priced model call that never enters the
5
+ * session: it appends nothing to the session JSONL, exactly as a `/btw` side
6
+ * question does not. Until this existed the spend was recorded nowhere at all.
7
+ * The operator's own telemetry ledger held 60 model steps, 137,205 tokens, and
8
+ * 1,666 seconds of model time across 14 days while `/cost` showed no row for
9
+ * any of it and `clio-coder usage report` could not see it either (#229).
10
+ *
11
+ * The two writes are the same pair the side-question path makes: the
12
+ * in-process cost tracker under the `background-memory` label, which is what
13
+ * `/cost` folds, and one durable row in the out-of-turn usage store, which is
14
+ * what an archive reader folds after the process is gone.
15
+ */
16
+
17
+ import { uncachedPrefillTokens } from "../../core/cache-telemetry.js";
18
+ import type { CostProvenance } from "../providers/index.js";
19
+ import type { CostEntryLabel, UsageBreakdown } from "./cost.js";
20
+ import { appendOutOfTurnUsageRow, type OutOfTurnUsageRow } from "./out-of-turn-usage.js";
21
+
22
+ /** Provider-reported spend for one memory step, as the calling client observed it. */
23
+ export interface BackgroundMemoryStepUsage {
24
+ targetId: string;
25
+ attributedModelId: string;
26
+ input: number;
27
+ output: number;
28
+ cacheRead: number;
29
+ cacheWrite: number;
30
+ reasoning: number;
31
+ totalTokens: number;
32
+ costUsd: number;
33
+ costProvenance: CostProvenance;
34
+ durationMs: number;
35
+ backend: {
36
+ promptTokens: number;
37
+ cachedTokens: number | null;
38
+ promptMs: number;
39
+ source: string;
40
+ } | null;
41
+ }
42
+
43
+ /** The subset of the observability contract this accounting needs. */
44
+ export interface BackgroundMemoryUsageSink {
45
+ recordTokens(
46
+ providerId: string,
47
+ attributedModelId: string,
48
+ tokens: number,
49
+ costUsd?: number,
50
+ breakdown?: Partial<UsageBreakdown>,
51
+ costProvenance?: CostProvenance,
52
+ modelIdFacts?: unknown,
53
+ label?: CostEntryLabel,
54
+ ): void;
55
+ }
56
+
57
+ export interface RecordBackgroundMemoryStepInput {
58
+ usage: BackgroundMemoryStepUsage;
59
+ stateDir: string;
60
+ sessionId: string | null;
61
+ /** The cwd hash the session ledger is filed under, so `usage report --repo` selects it. */
62
+ repoIdentity: string | null;
63
+ observability?: BackgroundMemoryUsageSink | undefined;
64
+ now?: Date;
65
+ /** Test seam; production appends to the out-of-turn store under the state dir. */
66
+ appendRow?: (stateDir: string, row: OutOfTurnUsageRow) => void;
67
+ }
68
+
69
+ /** Build the durable row for one memory step without writing it. */
70
+ export function backgroundMemoryUsageRow(
71
+ usage: BackgroundMemoryStepUsage,
72
+ options: { sessionId: string | null; repoIdentity: string | null; now?: Date },
73
+ ): OutOfTurnUsageRow {
74
+ return {
75
+ label: "background-memory",
76
+ sessionId: options.sessionId,
77
+ repoIdentity: options.repoIdentity,
78
+ timestamp: (options.now ?? new Date()).toISOString(),
79
+ target: usage.targetId,
80
+ attributedModelId: usage.attributedModelId,
81
+ usage: {
82
+ input: usage.input,
83
+ output: usage.output,
84
+ cacheRead: usage.cacheRead,
85
+ cacheWrite: usage.cacheWrite,
86
+ reasoning: usage.reasoning,
87
+ totalTokens: usage.totalTokens,
88
+ costUsd: usage.costUsd,
89
+ costProvenance: usage.costProvenance,
90
+ },
91
+ timing: { durationMs: usage.durationMs },
92
+ ...(usage.backend === null
93
+ ? {}
94
+ : {
95
+ promptCache: {
96
+ promptTokens: usage.backend.promptTokens,
97
+ cachedTokens: usage.backend.cachedTokens,
98
+ uncachedPrefillTokens: uncachedPrefillTokens({
99
+ promptTokens: usage.backend.promptTokens,
100
+ cachedTokens: usage.backend.cachedTokens,
101
+ predictedTokens: 0,
102
+ promptMs: usage.backend.promptMs,
103
+ predictedMs: 0,
104
+ source: "llamacpp-timings",
105
+ }),
106
+ promptMs: usage.backend.promptMs,
107
+ source: usage.backend.source,
108
+ },
109
+ }),
110
+ };
111
+ }
112
+
113
+ /** Record one memory step in the session's cost totals and in the durable store. */
114
+ export function recordBackgroundMemoryStep(input: RecordBackgroundMemoryStepInput): OutOfTurnUsageRow {
115
+ input.observability?.recordTokens(
116
+ input.usage.targetId,
117
+ input.usage.attributedModelId,
118
+ input.usage.totalTokens,
119
+ input.usage.costUsd,
120
+ {
121
+ input: input.usage.input,
122
+ output: input.usage.output,
123
+ cacheRead: input.usage.cacheRead,
124
+ cacheWrite: input.usage.cacheWrite,
125
+ reasoningTokens: input.usage.reasoning,
126
+ totalTokens: input.usage.totalTokens,
127
+ apiCalls: 1,
128
+ },
129
+ input.usage.costProvenance,
130
+ undefined,
131
+ "background-memory",
132
+ );
133
+ const row = backgroundMemoryUsageRow(input.usage, {
134
+ sessionId: input.sessionId,
135
+ repoIdentity: input.repoIdentity,
136
+ ...(input.now === undefined ? {} : { now: input.now }),
137
+ });
138
+ (input.appendRow ?? appendOutOfTurnUsageRow)(input.stateDir, row);
139
+ return row;
140
+ }
@@ -116,7 +116,7 @@ export interface UsageBreakdown {
116
116
  * the usage surfaces separate these out so an operator can see that money was
117
117
  * spent beside the session rather than inside it.
118
118
  */
119
- export type CostEntryLabel = "side-question" | "handoff";
119
+ export type CostEntryLabel = "side-question" | "handoff" | "prewarm" | "background-memory";
120
120
 
121
121
  export interface CostEntry {
122
122
  providerId: string;
@@ -16,6 +16,13 @@ export function createObservabilityDomainModule(options: ObservabilityBundleOpti
16
16
 
17
17
  export type { AccountabilitySummary } from "./accountability.js";
18
18
  export { readAccountabilitySummary, summarizeEvidenceIndex } from "./accountability.js";
19
+ export {
20
+ type BackgroundMemoryStepUsage,
21
+ type BackgroundMemoryUsageSink,
22
+ backgroundMemoryUsageRow,
23
+ type RecordBackgroundMemoryStepInput,
24
+ recordBackgroundMemoryStep,
25
+ } from "./background-memory-usage.js";
19
26
  export type {
20
27
  ObservabilityContract,
21
28
  ObservabilityNotice,
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Durable record of the model calls that were billed beside a session rather
3
- * than inside it: `/btw` side questions and `/handoff` extraction rounds.
3
+ * than inside it: `/btw` side questions, `/handoff` extraction rounds, and the
4
+ * session pre-warm.
4
5
  *
5
6
  * These rounds deliberately append nothing to the session JSONL. A fleet run
6
7
  * briefs its workers from the transcript, so a question the operator asked to
@@ -50,6 +51,27 @@ export const MAX_OUT_OF_TURN_USAGE_ROWS = 1000;
50
51
  */
51
52
  const BOUND_CHECK_INTERVAL = 64;
52
53
 
54
+ /** Wall-clock facts about one out-of-turn call. */
55
+ export interface OutOfTurnTiming {
56
+ /** Duration of the model call itself, as the caller measured it. */
57
+ durationMs: number;
58
+ }
59
+
60
+ /**
61
+ * Backend prefill facts for one out-of-turn call, in the shape brief #247
62
+ * established for assistant entries. A background memory step re-sends a whole
63
+ * trajectory to a server that has just been serving the chat prefix, so whether
64
+ * that prefill was cached is the difference between a cheap step and a step
65
+ * that re-prefills thousands of tokens on the operator's own machine.
66
+ */
67
+ export interface OutOfTurnPromptCache {
68
+ promptTokens: number;
69
+ cachedTokens: number | null;
70
+ uncachedPrefillTokens: number | null;
71
+ promptMs: number;
72
+ source: string;
73
+ }
74
+
53
75
  /** Provider-reported usage for one out-of-turn call. */
54
76
  export interface OutOfTurnUsage {
55
77
  input: number;
@@ -75,6 +97,10 @@ export interface OutOfTurnUsageRow {
75
97
  target: string;
76
98
  attributedModelId: string;
77
99
  usage: OutOfTurnUsage;
100
+ /** Present when the caller measured the call. */
101
+ timing?: OutOfTurnTiming;
102
+ /** Present when the serving backend reported prefill facts. */
103
+ promptCache?: OutOfTurnPromptCache;
78
104
  }
79
105
 
80
106
  export interface OutOfTurnUsageReadResult {
@@ -179,10 +205,13 @@ export function readOutOfTurnUsageRows(stateDir: string): OutOfTurnUsageReadResu
179
205
  function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
180
206
  if (!isRecord(value)) return null;
181
207
  const label = value.label;
182
- if (label !== "side-question" && label !== "handoff") return null;
208
+ if (label !== "side-question" && label !== "handoff" && label !== "prewarm" && label !== "background-memory")
209
+ return null;
183
210
  if (typeof value.timestamp !== "string" || value.timestamp.length === 0) return null;
184
211
  if (!isRecord(value.usage)) return null;
185
212
  const usage = value.usage;
213
+ const timing = asTiming(value.timing);
214
+ const promptCache = asPromptCache(value.promptCache);
186
215
  return {
187
216
  label,
188
217
  sessionId: typeof value.sessionId === "string" ? value.sessionId : null,
@@ -203,6 +232,26 @@ function asOutOfTurnUsageRow(value: unknown): OutOfTurnUsageRow | null {
203
232
  costUsd: numberOr0(usage.costUsd),
204
233
  costProvenance: asCostProvenance(usage.costProvenance),
205
234
  },
235
+ ...(timing === null ? {} : { timing }),
236
+ ...(promptCache === null ? {} : { promptCache }),
237
+ };
238
+ }
239
+
240
+ function asTiming(value: unknown): OutOfTurnTiming | null {
241
+ if (!isRecord(value)) return null;
242
+ const durationMs = numberOr0(value.durationMs);
243
+ return durationMs === 0 ? null : { durationMs };
244
+ }
245
+
246
+ function asPromptCache(value: unknown): OutOfTurnPromptCache | null {
247
+ if (!isRecord(value)) return null;
248
+ if (typeof value.source !== "string" || value.source.length === 0) return null;
249
+ return {
250
+ promptTokens: numberOr0(value.promptTokens),
251
+ cachedTokens: typeof value.cachedTokens === "number" ? value.cachedTokens : null,
252
+ uncachedPrefillTokens: typeof value.uncachedPrefillTokens === "number" ? value.uncachedPrefillTokens : null,
253
+ promptMs: numberOr0(value.promptMs),
254
+ source: value.source,
206
255
  };
207
256
  }
208
257