niceeval 0.16.2 → 0.17.0

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 (258) hide show
  1. package/dist/cli/bootstrap.cjs +7 -1
  2. package/dist/cli/bootstrap.cjs.map +1 -1
  3. package/dist/cli/project-configuration.cjs +8 -11
  4. package/dist/cli/project-configuration.cjs.map +1 -1
  5. package/dist/expect/index.cjs.map +1 -1
  6. package/dist/expect/index.d.cts +1 -0
  7. package/dist/expect/index.d.mts +1 -0
  8. package/dist/expect/index.d.ts +1 -0
  9. package/dist/experiment/host/cli/contribution.cjs +6 -11
  10. package/dist/experiment/host/cli/contribution.cjs.map +1 -1
  11. package/dist/experiment/host/cli/contribution.d.cts +0 -16
  12. package/dist/experiment/host/cli/contribution.d.mts +0 -16
  13. package/dist/experiment/host/cli/contribution.d.ts +0 -16
  14. package/dist/experiment/host/operations.cjs +3 -3
  15. package/dist/experiment/host/operations.cjs.map +1 -1
  16. package/dist/experiment/host/types.cjs.map +1 -1
  17. package/dist/experiment/host/types.d.cts +0 -4
  18. package/dist/experiment/host/types.d.mts +0 -4
  19. package/dist/experiment/host/types.d.ts +0 -4
  20. package/dist/fresh-import.cjs +2 -2
  21. package/dist/fresh-import.cjs.map +1 -1
  22. package/dist/fresh-import.d.cts +3 -3
  23. package/dist/fresh-import.d.mts +3 -3
  24. package/dist/fresh-import.d.ts +3 -3
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +1 -0
  27. package/dist/index.d.mts +1 -0
  28. package/dist/index.d.ts +1 -0
  29. package/dist/inspection/codec.cjs.map +1 -1
  30. package/dist/inspection/codec.d.cts +1 -1
  31. package/dist/inspection/codec.d.mts +1 -1
  32. package/dist/inspection/codec.d.ts +1 -1
  33. package/dist/inspection/facts.cjs +66 -9
  34. package/dist/inspection/facts.cjs.map +1 -1
  35. package/dist/inspection/facts.d.cts +4 -0
  36. package/dist/inspection/facts.d.mts +4 -0
  37. package/dist/inspection/facts.d.ts +4 -0
  38. package/dist/inspection/facts.js +4 -2
  39. package/dist/inspection/index.cjs +1 -3
  40. package/dist/inspection/index.cjs.map +1 -1
  41. package/dist/inspection/index.d.cts +1 -1
  42. package/dist/inspection/index.d.mts +1 -1
  43. package/dist/inspection/index.d.ts +1 -1
  44. package/dist/inspection/index.js +44 -48
  45. package/dist/inspection/limits.cjs +3 -1
  46. package/dist/inspection/limits.cjs.map +1 -1
  47. package/dist/inspection/limits.d.cts +2 -0
  48. package/dist/inspection/limits.d.mts +2 -0
  49. package/dist/inspection/limits.d.ts +2 -0
  50. package/dist/inspection/limits.js +6 -4
  51. package/dist/inspection/project-source.cjs +4 -1
  52. package/dist/inspection/project-source.cjs.map +1 -1
  53. package/dist/inspection/protocol.cjs +10 -18
  54. package/dist/inspection/protocol.cjs.map +1 -1
  55. package/dist/inspection/protocol.d.cts +111 -173
  56. package/dist/inspection/protocol.d.mts +111 -173
  57. package/dist/inspection/protocol.d.ts +111 -173
  58. package/dist/inspection/public.mjs +73 -109
  59. package/dist/inspection/results.cjs +12 -48
  60. package/dist/inspection/results.cjs.map +1 -1
  61. package/dist/inspection/results.d.cts +124 -122
  62. package/dist/inspection/results.d.mts +124 -122
  63. package/dist/inspection/results.d.ts +124 -122
  64. package/dist/inspection/results.js +16 -20
  65. package/dist/inspection/select.cjs +80 -117
  66. package/dist/inspection/select.cjs.map +1 -1
  67. package/dist/inspection/source.cjs +14 -15
  68. package/dist/inspection/source.cjs.map +1 -1
  69. package/dist/inspection/source.d.cts +6 -3
  70. package/dist/inspection/source.d.mts +6 -3
  71. package/dist/inspection/source.d.ts +6 -3
  72. package/dist/inspection/trace.cjs +1 -1
  73. package/dist/inspection/trace.cjs.map +1 -1
  74. package/dist/load-config.cjs +17 -11
  75. package/dist/load-config.cjs.map +1 -1
  76. package/dist/load-config.d.cts +3 -2
  77. package/dist/load-config.d.mts +3 -2
  78. package/dist/load-config.d.ts +3 -2
  79. package/dist/o11y/adapter-usage-projection.cjs +5 -1
  80. package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
  81. package/dist/o11y/adapter-usage-projection.d.cts +109 -1
  82. package/dist/o11y/adapter-usage-projection.d.mts +109 -1
  83. package/dist/o11y/adapter-usage-projection.d.ts +109 -1
  84. package/dist/o11y/cache-read.cjs +113 -0
  85. package/dist/o11y/cache-read.cjs.map +1 -0
  86. package/dist/o11y/cache-read.d.cts +80 -0
  87. package/dist/o11y/cache-read.d.mts +80 -0
  88. package/dist/o11y/cache-read.d.ts +80 -0
  89. package/dist/o11y/cache-read.js +8 -0
  90. package/dist/o11y/cache-read.js.map +1 -0
  91. package/dist/o11y/eval-usage.cjs +4 -1
  92. package/dist/o11y/eval-usage.cjs.map +1 -1
  93. package/dist/o11y/eval-usage.d.cts +4 -1
  94. package/dist/o11y/eval-usage.d.mts +4 -1
  95. package/dist/o11y/eval-usage.d.ts +4 -1
  96. package/dist/record/host/sqlite-host.cjs +188 -53
  97. package/dist/record/host/sqlite-host.cjs.map +1 -1
  98. package/dist/record/host/sqlite-host.d.cts +37 -1
  99. package/dist/record/host/sqlite-host.d.mts +37 -1
  100. package/dist/record/host/sqlite-host.d.ts +37 -1
  101. package/dist/record/host/sqlite-host.js +16 -8
  102. package/dist/record/maintenance/runtime.cjs +3 -3
  103. package/dist/record/maintenance/runtime.cjs.map +1 -1
  104. package/dist/record/sqlite/admission-repository.cjs +18 -18
  105. package/dist/record/sqlite/admission-repository.cjs.map +1 -1
  106. package/dist/record/sqlite/case-repository.cjs +6 -6
  107. package/dist/record/sqlite/case-repository.cjs.map +1 -1
  108. package/dist/record/sqlite/coordination-repository.cjs +25 -25
  109. package/dist/record/sqlite/coordination-repository.cjs.map +1 -1
  110. package/dist/record/sqlite/current-schema.cjs +115 -111
  111. package/dist/record/sqlite/current-schema.cjs.map +1 -1
  112. package/dist/record/sqlite/current-schema.d.cts +3 -3
  113. package/dist/record/sqlite/current-schema.d.mts +3 -3
  114. package/dist/record/sqlite/current-schema.d.ts +3 -3
  115. package/dist/record/sqlite/database.cjs +56 -53
  116. package/dist/record/sqlite/database.cjs.map +1 -1
  117. package/dist/record/sqlite/index.cjs +3 -1
  118. package/dist/record/sqlite/index.cjs.map +1 -1
  119. package/dist/record/sqlite/index.d.cts +5 -2
  120. package/dist/record/sqlite/index.d.mts +5 -2
  121. package/dist/record/sqlite/index.d.ts +5 -2
  122. package/dist/record/sqlite/legacy-schema-018.cjs +443 -0
  123. package/dist/record/sqlite/legacy-schema-018.cjs.map +1 -0
  124. package/dist/record/sqlite/legacy-schema-018.d.cts +6 -0
  125. package/dist/record/sqlite/legacy-schema-018.d.mts +6 -0
  126. package/dist/record/sqlite/legacy-schema-018.d.ts +6 -0
  127. package/dist/record/sqlite/legacy-schema-018.js +6 -0
  128. package/dist/record/sqlite/legacy-schema-018.js.map +1 -0
  129. package/dist/record/sqlite/migration.cjs +105 -46
  130. package/dist/record/sqlite/migration.cjs.map +1 -1
  131. package/dist/record/sqlite/migration.d.cts +2 -1
  132. package/dist/record/sqlite/migration.d.mts +2 -1
  133. package/dist/record/sqlite/migration.d.ts +2 -1
  134. package/dist/record/sqlite/portable-capture.cjs +13 -13
  135. package/dist/record/sqlite/portable-capture.cjs.map +1 -1
  136. package/dist/record/sqlite/registry-repository.cjs +22 -22
  137. package/dist/record/sqlite/registry-repository.cjs.map +1 -1
  138. package/dist/record/sqlite/schema.cjs +10 -2
  139. package/dist/record/sqlite/schema.cjs.map +1 -1
  140. package/dist/record/sqlite/schema.d.cts +4 -1
  141. package/dist/record/sqlite/schema.d.mts +4 -1
  142. package/dist/record/sqlite/schema.d.ts +4 -1
  143. package/dist/record/sqlite/schema.js +20 -14
  144. package/dist/record/sqlite/storage-worker.cjs +1 -1
  145. package/dist/record/sqlite/storage-worker.cjs.map +1 -1
  146. package/dist/record/sqlite/storage.cjs +316 -232
  147. package/dist/record/sqlite/storage.cjs.map +1 -1
  148. package/dist/record/sqlite/storage.d.cts +10 -2
  149. package/dist/record/sqlite/storage.d.mts +10 -2
  150. package/dist/record/sqlite/storage.d.ts +10 -2
  151. package/dist/record/sqlite/storage.js +54 -50
  152. package/dist/record/sqlite/types.cjs +1 -1
  153. package/dist/record/sqlite/types.cjs.map +1 -1
  154. package/dist/record/sqlite/types.d.cts +13 -1
  155. package/dist/record/sqlite/types.d.mts +13 -1
  156. package/dist/record/sqlite/types.d.ts +13 -1
  157. package/dist/run/cli/contribution.cjs +17 -12
  158. package/dist/run/cli/contribution.cjs.map +1 -1
  159. package/dist/run/host/lifecycle-adapter.cjs +1 -1
  160. package/dist/run/host/lifecycle-adapter.cjs.map +1 -1
  161. package/dist/run/storage/owner-identity.cjs +78 -16
  162. package/dist/run/storage/owner-identity.cjs.map +1 -1
  163. package/dist/run/storage/owner-identity.d.cts +2 -1
  164. package/dist/run/storage/owner-identity.d.mts +2 -1
  165. package/dist/run/storage/owner-identity.d.ts +2 -1
  166. package/dist/run/storage/sqlite.cjs +55 -55
  167. package/dist/run/storage/sqlite.cjs.map +1 -1
  168. package/dist/runner/accept.cjs +12 -42
  169. package/dist/runner/accept.cjs.map +1 -1
  170. package/dist/runner/accept.d.cts +2 -3
  171. package/dist/runner/accept.d.mts +2 -3
  172. package/dist/runner/accept.d.ts +2 -3
  173. package/dist/runner/adapter-usage.cjs +2 -2
  174. package/dist/runner/adapter-usage.cjs.map +1 -1
  175. package/dist/runner/adoption.cjs +14 -26
  176. package/dist/runner/adoption.cjs.map +1 -1
  177. package/dist/runner/adoption.d.cts +5 -13
  178. package/dist/runner/adoption.d.mts +5 -13
  179. package/dist/runner/adoption.d.ts +5 -13
  180. package/dist/runner/adoption.js +2 -4
  181. package/dist/runner/record.cjs +24 -18
  182. package/dist/runner/record.cjs.map +1 -1
  183. package/dist/runner/rename-experiment.cjs +5 -7
  184. package/dist/runner/rename-experiment.cjs.map +1 -1
  185. package/dist/runner/reuse-plan.cjs +37 -18
  186. package/dist/runner/reuse-plan.cjs.map +1 -1
  187. package/dist/runner/reuse-plan.d.cts +4 -1
  188. package/dist/runner/reuse-plan.d.mts +4 -1
  189. package/dist/runner/reuse-plan.d.ts +4 -1
  190. package/dist/runner/setup-prefix-plan.cjs +17 -12
  191. package/dist/runner/setup-prefix-plan.cjs.map +1 -1
  192. package/dist/runner/setup-prefix-plan.d.cts +0 -2
  193. package/dist/runner/setup-prefix-plan.d.mts +0 -2
  194. package/dist/runner/setup-prefix-plan.d.ts +0 -2
  195. package/dist/runner/setup-prefix-plan.js +8 -12
  196. package/dist/sandbox/backend.cjs +10 -1
  197. package/dist/sandbox/backend.cjs.map +1 -1
  198. package/dist/sandbox/backend.d.cts +16 -8
  199. package/dist/sandbox/backend.d.mts +16 -8
  200. package/dist/sandbox/backend.d.ts +16 -8
  201. package/dist/sandbox/backend.js +28 -26
  202. package/dist/sandbox/docker.cjs +7 -1
  203. package/dist/sandbox/docker.cjs.map +1 -1
  204. package/dist/sandbox/e2b-cache-repository.cjs +13 -3
  205. package/dist/sandbox/e2b-cache-repository.cjs.map +1 -1
  206. package/dist/sandbox/e2b-cache-repository.d.cts +3 -0
  207. package/dist/sandbox/e2b-cache-repository.d.mts +3 -0
  208. package/dist/sandbox/e2b-cache-repository.d.ts +3 -0
  209. package/dist/sandbox/e2b-cache-repository.js +16 -12
  210. package/dist/sandbox/e2b.cjs +2 -2
  211. package/dist/sandbox/e2b.cjs.map +1 -1
  212. package/dist/sandbox/incus/materialize.cjs +1 -1
  213. package/dist/sandbox/incus/materialize.cjs.map +1 -1
  214. package/dist/show/contribution.cjs +3 -3
  215. package/dist/show/contribution.cjs.map +1 -1
  216. package/dist/show/model.cjs +14 -13
  217. package/dist/show/model.cjs.map +1 -1
  218. package/dist/show/model.d.cts +7 -7
  219. package/dist/show/model.d.mts +7 -7
  220. package/dist/show/model.d.ts +7 -7
  221. package/dist/show/render.cjs +14 -0
  222. package/dist/show/render.cjs.map +1 -1
  223. package/dist/user-database/storage-worker.cjs +13 -3
  224. package/dist/user-database/storage-worker.cjs.map +1 -1
  225. package/dist/view/app-dist/.vite/manifest.json +2 -2
  226. package/dist/view/app-dist/assets/{index-CmVoXbwG.js → index-B3ijZRph.js} +17 -17
  227. package/dist/view/app-dist/assets/{quality-cost-scatter-BuLISaH4.js → quality-cost-scatter-B--DfJ9s.js} +1 -1
  228. package/dist/view/app-dist/index.html +1 -1
  229. package/dist/view/application-runtime.cjs +8 -0
  230. package/dist/view/application-runtime.cjs.map +1 -0
  231. package/dist/view/application-runtime.d.cts +9 -0
  232. package/dist/view/application-runtime.d.mts +9 -0
  233. package/dist/view/application-runtime.d.ts +9 -0
  234. package/dist/view/application-runtime.js +6 -0
  235. package/dist/view/application-runtime.js.map +1 -0
  236. package/dist/view/cli/contribution.cjs +5 -2
  237. package/dist/view/cli/contribution.cjs.map +1 -1
  238. package/dist/view/cli/contribution.d.cts +2 -1
  239. package/dist/view/cli/contribution.d.mts +2 -1
  240. package/dist/view/cli/contribution.d.ts +2 -1
  241. package/dist/view/function-runtime.mjs +1019 -456
  242. package/dist/view/http-protocol.d.cts +1 -9
  243. package/dist/view/http-protocol.d.mts +1 -9
  244. package/dist/view/http-protocol.d.ts +1 -9
  245. package/dist/view/inspection-host.cjs +39 -30
  246. package/dist/view/inspection-host.cjs.map +1 -1
  247. package/dist/view/inspection-host.d.cts +7545 -2
  248. package/dist/view/inspection-host.d.mts +7545 -2
  249. package/dist/view/inspection-host.d.ts +7545 -2
  250. package/dist/view/server.cjs +8 -5
  251. package/dist/view/server.cjs.map +1 -1
  252. package/dist/view/server.d.cts +4 -2
  253. package/dist/view/server.d.mts +4 -2
  254. package/dist/view/server.d.ts +4 -2
  255. package/docs-site/zh/reference/cli.mdx +1 -2
  256. package/docs-site/zh/tutorials/control-run-cost.mdx +22 -0
  257. package/docs-site/zh/tutorials/niceeval-taste-application.mdx +21 -0
  258. package/package.json +1 -1
@@ -6,22 +6,28 @@ exports.rebuildConfigModule = rebuildConfigModule;
6
6
  // 让当前配置模块图重新求值。
7
7
  const node_fs_1 = require("node:fs");
8
8
  const node_path_1 = require("node:path");
9
+ const effect_1 = require("effect");
9
10
  const fresh_import_ts_1 = require("./fresh-import.cjs");
10
- async function loadConfigModule(cwd, rebuild) {
11
- const path = (0, node_path_1.join)(cwd, "niceeval.config.ts");
12
- if (!(0, node_fs_1.existsSync)(path)) {
13
- throw new Error(`Could not find niceeval.config.ts.
11
+ function loadConfigModule(cwd, rebuild) {
12
+ return effect_1.Effect.gen(function* () {
13
+ const path = (0, node_path_1.join)(cwd, "niceeval.config.ts");
14
+ yield* effect_1.Effect.try({ try: () => {
15
+ if (!(0, node_fs_1.existsSync)(path))
16
+ throw new Error(`Could not find niceeval.config.ts.
14
17
  Ways to fix:
15
18
  - [init] Run \`npx niceeval init\` to scaffold niceeval.config.ts and evals/
16
19
  - [cd] Run from the project root that contains niceeval.config.ts
17
20
  Docs: node_modules/niceeval/docs-site/zh/tutorials/quickstart.mdx`);
18
- }
19
- const mod = rebuild
20
- ? (await (0, fresh_import_ts_1.freshImportModule)(path))
21
- : (await (0, fresh_import_ts_1.importProjectModule)(path));
22
- if (!mod.default)
23
- throw new Error(`niceeval.config.ts must default export defineConfig(...).`);
24
- return mod.default;
21
+ }, catch: (cause) => cause });
22
+ const mod = yield* (rebuild
23
+ ? (0, fresh_import_ts_1.freshImportModule)(path)
24
+ : effect_1.Effect.tryPromise({ try: () => (0, fresh_import_ts_1.importProjectModule)(path), catch: (cause) => cause }));
25
+ return yield* effect_1.Effect.try({ try: () => {
26
+ if (!mod.default)
27
+ throw new Error(`niceeval.config.ts must default export defineConfig(...).`);
28
+ return mod.default;
29
+ }, catch: (cause) => cause });
30
+ });
25
31
  }
26
32
  /** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
27
33
  function loadConfigModuleOnce(cwd) {
@@ -1 +1 @@
1
- {"version":3,"file":"load-config.js","sourceRoot":"","sources":["load-config.ts"],"names":[],"mappings":";;AA2BA,oDAEC;AAED,kDAEC;AAjCD,qEAAqE;AACrE,gBAAgB;AAChB,qCAAqC;AACrC,yCAAiC;AACjC,uDAA2E;AAE3E,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,OAAgB;IACzD,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC;;;;oEAI4C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,GAAG,GAAG,OAAO;QACf,CAAC,CAAE,CAAC,MAAM,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAE/B;QACF,CAAC,CAAE,CAAC,MAAM,IAAA,qCAAmB,EAAC,IAAI,CAAC,CAEjC,CAAC;IACP,IAAI,CAAC,GAAG,CAAC,OAAO;QACZ,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC,OAAO,CAAC;AACvB,CAAC;AACD,qFAAqF;AACrF,SAAgB,oBAAoB,CAAC,GAAW;IAC5C,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AACD,yFAAyF;AACzF,SAAgB,mBAAmB,CAAC,GAAW;IAC3C,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC","sourcesContent":["// niceeval.config.ts 装载:CLI 与 view 共用。view 本地模式每次重建都使用 fresh import,\n// 让当前配置模块图重新求值。\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { freshImportModule, importProjectModule } from \"./fresh-import.ts\";\nimport type { Config } from \"./runner/types.ts\";\nasync function loadConfigModule(cwd: string, rebuild: boolean): Promise<Config> {\n const path = join(cwd, \"niceeval.config.ts\");\n if (!existsSync(path)) {\n throw new Error(`Could not find niceeval.config.ts.\nWays to fix:\n - [init] Run \\`npx niceeval init\\` to scaffold niceeval.config.ts and evals/\n - [cd] Run from the project root that contains niceeval.config.ts\n Docs: node_modules/niceeval/docs-site/zh/tutorials/quickstart.mdx`);\n }\n const mod = rebuild\n ? ((await freshImportModule(path)) as {\n default?: Config;\n })\n : ((await importProjectModule(path)) as {\n default?: Config;\n });\n if (!mod.default)\n throw new Error(`niceeval.config.ts must default export defineConfig(...).`);\n return mod.default;\n}\n/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */\nexport function loadConfigModuleOnce(cwd: string): Promise<Config> {\n return loadConfigModule(cwd, false);\n}\n/** Serial callers deliberately request a new module graph rather than a boolean mode. */\nexport function rebuildConfigModule(cwd: string): Promise<Config> {\n return loadConfigModule(cwd, true);\n}\n"]}
1
+ {"version":3,"file":"load-config.js","sourceRoot":"","sources":["load-config.ts"],"names":[],"mappings":";;AA6BA,oDAEC;AAED,kDAEC;AAnCD,qEAAqE;AACrE,gBAAgB;AAChB,qCAAqC;AACrC,yCAAiC;AACjC,mCAAgC;AAChC,uDAA2E;AAE3E,SAAS,gBAAgB,CAAC,GAAW,EAAE,OAAgB;IACnD,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,MAAM,IAAI,GAAG,IAAA,gBAAI,EAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;QAC7C,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC;;;;oEAIgC,CAAC,CAAC;YAC1D,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO;YACvB,CAAC,CAAC,IAAA,mCAAiB,EAAC,IAAI,CAAC;YACzB,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAA,qCAAmB,EAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;gBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO;oBACZ,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBACjF,OAAO,GAAG,CAAC,OAAiB,CAAC;YACjC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACP,CAAC;AACD,qFAAqF;AACrF,SAAgB,oBAAoB,CAAC,GAAW;IAC5C,OAAO,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AACD,yFAAyF;AACzF,SAAgB,mBAAmB,CAAC,GAAW;IAC3C,OAAO,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC","sourcesContent":["// niceeval.config.ts 装载:CLI 与 view 共用。view 本地模式每次重建都使用 fresh import,\n// 让当前配置模块图重新求值。\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { Effect } from \"effect\";\nimport { freshImportModule, importProjectModule } from \"./fresh-import.ts\";\nimport type { Config } from \"./runner/types.ts\";\nfunction loadConfigModule(cwd: string, rebuild: boolean): Effect.Effect<Config, unknown> {\n return Effect.gen(function* () {\n const path = join(cwd, \"niceeval.config.ts\");\n yield* Effect.try({ try: () => {\n if (!existsSync(path))\n throw new Error(`Could not find niceeval.config.ts.\nWays to fix:\n - [init] Run \\`npx niceeval init\\` to scaffold niceeval.config.ts and evals/\n - [cd] Run from the project root that contains niceeval.config.ts\n Docs: node_modules/niceeval/docs-site/zh/tutorials/quickstart.mdx`);\n }, catch: (cause) => cause });\n const mod = yield* (rebuild\n ? freshImportModule(path)\n : Effect.tryPromise({ try: () => importProjectModule(path), catch: (cause) => cause }));\n return yield* Effect.try({ try: () => {\n if (!mod.default)\n throw new Error(`niceeval.config.ts must default export defineConfig(...).`);\n return mod.default as Config;\n }, catch: (cause) => cause });\n });\n}\n/** Canonical trusted module load; callers that need fresh evaluation use rebuild. */\nexport function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown> {\n return loadConfigModule(cwd, false);\n}\n/** Serial callers deliberately request a new module graph rather than a boolean mode. */\nexport function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown> {\n return loadConfigModule(cwd, true);\n}\n"]}
@@ -1,5 +1,6 @@
1
+ import { Effect } from "effect";
1
2
  import type { Config } from "./runner/types.cjs";
2
3
  /** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
3
- export declare function loadConfigModuleOnce(cwd: string): Promise<Config>;
4
+ export declare function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown>;
4
5
  /** Serial callers deliberately request a new module graph rather than a boolean mode. */
5
- export declare function rebuildConfigModule(cwd: string): Promise<Config>;
6
+ export declare function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown>;
@@ -1,5 +1,6 @@
1
+ import { Effect } from "effect";
1
2
  import type { Config } from "./runner/types.mjs";
2
3
  /** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
3
- export declare function loadConfigModuleOnce(cwd: string): Promise<Config>;
4
+ export declare function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown>;
4
5
  /** Serial callers deliberately request a new module graph rather than a boolean mode. */
5
- export declare function rebuildConfigModule(cwd: string): Promise<Config>;
6
+ export declare function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown>;
@@ -1,5 +1,6 @@
1
+ import { Effect } from "effect";
1
2
  import type { Config } from "./runner/types.js";
2
3
  /** Canonical trusted module load; callers that need fresh evaluation use rebuild. */
3
- export declare function loadConfigModuleOnce(cwd: string): Promise<Config>;
4
+ export declare function loadConfigModuleOnce(cwd: string): Effect.Effect<Config, unknown>;
4
5
  /** Serial callers deliberately request a new module graph rather than a boolean mode. */
5
- export declare function rebuildConfigModule(cwd: string): Promise<Config>;
6
+ export declare function rebuildConfigModule(cwd: string): Effect.Effect<Config, unknown>;
@@ -8,6 +8,7 @@ exports.compareAdapterModelGroups = compareAdapterModelGroups;
8
8
  exports.projectAdapterModelUsage = projectAdapterModelUsage;
9
9
  exports.projectAdapterUsageSnapshot = projectAdapterUsageSnapshot;
10
10
  exports.compareCanonicalDecimal = compareCanonicalDecimal;
11
+ const cache_read_ts_1 = require("./cache-read.cjs");
11
12
  const pricing_ts_1 = require("../record/family/adapter-usage/pricing.cjs");
12
13
  function effectiveUsageCalls(usage) {
13
14
  const receipts = new Map((usage.priceReceipts ?? []).map((receipt) => [receipt.callId, receipt]));
@@ -86,7 +87,8 @@ function compareAdapterModelGroups(left, right) {
86
87
  return 0;
87
88
  }
88
89
  /** Configuration counts and grouped statistics both consume the complete sealed ledger. */
89
- function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavailable", reason: "usage-not-recorded" }) {
90
+ function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavailable", reason: "usage-not-recorded" }, producerCompletenessKnown = true) {
91
+ const cacheRead = (0, cache_read_ts_1.projectCacheRead)(usage, models, producerCompletenessKnown, unavailable.reason === "physical-call-identity-not-recorded" ? "adapter-usage-required" : unavailable.reason);
90
92
  const counts = new Map();
91
93
  for (const call of usage?.calls ?? []) {
92
94
  if (call.modelSlot !== null)
@@ -103,6 +105,7 @@ function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavail
103
105
  });
104
106
  if (usage === null)
105
107
  return Object.freeze({
108
+ cacheRead,
106
109
  configuredModels,
107
110
  modelGroups: Object.freeze({
108
111
  state: "unavailable", ...unavailable,
@@ -134,6 +137,7 @@ function projectAdapterModelUsage(usage, models, unavailable = { basis: "unavail
134
137
  });
135
138
  });
136
139
  return Object.freeze({
140
+ cacheRead,
137
141
  configuredModels,
138
142
  modelGroups: Object.freeze({
139
143
  state: "available", basis: "recorded-calls",
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-usage-projection.js","sourceRoot":"","sources":["adapter-usage-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadableAdapterUsageAttachment, AdapterUsageCall, AdapterCallPriceReceipt } from \"../record/family/adapter-usage/schema.ts\";\nimport { addCanonicalDecimals } from \"../record/family/adapter-usage/pricing.ts\";\nimport type { NumericMaterial } from \"../assertions/match.ts\";\nimport type { ResolvedModelSlots } from \"../model-slots.ts\";\nexport interface EffectiveCallCost {\n readonly amount: string;\n readonly currency: string;\n readonly source: {\n readonly kind: \"reported\" | \"estimated\";\n readonly id: string;\n };\n readonly state: \"complete\" | \"partial\";\n}\nexport type EffectiveUsageCall = AdapterUsageCall & {\n readonly effectiveCost: EffectiveCallCost | null;\n};\nexport function effectiveUsageCalls(usage: ReadableAdapterUsageAttachment): readonly EffectiveUsageCall[] {\n const receipts = new Map((usage.priceReceipts ?? []).map((receipt) => [receipt.callId, receipt]));\n return Object.freeze(usage.calls.map((call) => {\n const receipt = receipts.get(call.callId);\n return Object.freeze({ ...call, effectiveCost: call.cost !== null ? Object.freeze({ ...call.cost, state: \"complete\" as const }) : receipt === undefined ? null : Object.freeze({ amount: receipt.amount, currency: receipt.currency, source: receipt.source, state: receipt.state }) });\n }));\n}\nexport function effectiveCostTotals(calls: readonly {\n readonly effectiveCost: EffectiveCallCost | null;\n}[], collectionState: \"complete\" | \"partial\") {\n const known = calls.flatMap((call) => call.effectiveCost === null ? [] : [call.effectiveCost]);\n const kind = (values: readonly EffectiveCallCost[]) => { const sources = new Set(values.map((value) => value.source.kind)); return sources.size === 0 ? null : sources.size === 1 ? [...sources][0]! : \"mixed\" as const; };\n const grouped = new Map<string, EffectiveCallCost[]>();\n for (const cost of known)\n grouped.set(cost.currency, [...(grouped.get(cost.currency) ?? []), cost]);\n const complete = collectionState === \"complete\" && known.length === calls.length && known.every((cost) => cost.state === \"complete\");\n return Object.freeze({ state: known.length === 0 ? \"unavailable\" as const : complete ? \"complete\" as const : \"partial\" as const, source: kind(known), values: Object.freeze([...grouped.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([currency, values]) => Object.freeze({ currency, value: addCanonicalDecimals(values.map((value) => value.amount)), source: kind(values)!, coveredCalls: values.filter((value) => value.state === \"complete\").length, reportedCalls: values.filter((value) => value.source.kind === \"reported\").length, estimatedCalls: values.filter((value) => value.source.kind === \"estimated\").length }))), totalCalls: calls.length });\n}\nfunction inputTotal(call: AdapterUsageCall): {\n value: number | null;\n complete: boolean;\n} {\n const known = [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens].filter((value): value is number => value !== null);\n return { value: call.inputTotalTokens ?? (known.length === 0 ? null : known.reduce((sum, value) => sum + value, 0)), complete: call.inputTotalTokens !== null || known.length === 3 };\n}\nexport function adapterTokenMaterial(usage: ReadableAdapterUsageAttachment, metric: \"inputTokens\" | \"inputTotalTokens\" | \"outputTokens\" | \"cacheReadTokens\" | \"cacheWriteTokens\" | \"totalTokens\"): NumericMaterial {\n const provenance = Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", unit: \"tokens\", cut: \"call-time\" });\n let value = 0;\n let observations = 0;\n let complete = usage.collection.state === \"complete\" && usage.calls.length > 0;\n for (const call of usage.calls) {\n if (call.status === \"unknown\")\n complete = false;\n const input = inputTotal(call);\n const buckets = metric === \"totalTokens\" ? [input.value, call.outputTokens] : metric === \"inputTotalTokens\" ? [input.value] : [call[metric]];\n const observedBuckets = metric === \"totalTokens\" || metric === \"inputTotalTokens\"\n ? [...(call.inputTotalTokens === null ? [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens] : [call.inputTotalTokens]), ...(metric === \"totalTokens\" ? [call.outputTokens] : [])]\n : buckets;\n if (observedBuckets.some((bucket) => bucket !== null && (!Number.isSafeInteger(bucket) || bucket < 0))) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-invalid-token-value\", provenance });\n }\n for (const bucket of buckets) {\n if (bucket === null)\n complete = false;\n else {\n value += bucket;\n observations += 1;\n }\n }\n if ((metric === \"totalTokens\" || metric === \"inputTotalTokens\") && !input.complete)\n complete = false;\n }\n return Object.freeze(!Number.isSafeInteger(value) ? { state: \"unavailable\", reason: \"usage-exceeds-safe-integer\", provenance } : observations === 0 ? { state: \"unavailable\", reason: \"usage-not-recorded\", provenance } : { state: complete ? \"exact\" : \"lower-bound\", value, provenance });\n}\nexport function adapterInspectionTokenTotal(usage: ReadableAdapterUsageAttachment, metric: \"inputTotalTokens\" | \"outputTokens\" | \"totalTokens\") {\n const material = adapterTokenMaterial(usage, metric);\n const observationCount = usage.calls.filter((call) => metric === \"outputTokens\"\n ? call.outputTokens !== null\n : inputTotal(call).value !== null || (metric === \"totalTokens\" && call.outputTokens !== null)).length;\n return Object.freeze({\n state: material.state === \"exact\" ? \"available\" as const\n : material.state === \"lower-bound\" ? \"partial\" as const : \"unavailable\" as const,\n value: material.state === \"unavailable\" ? null : material.value,\n observationCount,\n });\n}\n/** Tuple order is stable across hosts, with missing identities before strings. */\nexport function compareAdapterModelGroups(left: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">, right: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">): number {\n for (const key of [\"modelSlot\", \"provider\", \"model\"] as const) {\n const a = left[key];\n const b = right[key];\n if (a === b)\n continue;\n if (a === null)\n return -1;\n if (b === null)\n return 1;\n return a < b ? -1 : 1;\n }\n return 0;\n}\n/** Configuration counts and grouped statistics both consume the complete sealed ledger. */\nexport function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable: {\n readonly basis: \"recorded-calls\" | \"reported-sends\" | \"unavailable\";\n readonly reason: \"source-invalid\" | \"usage-not-recorded\" | \"physical-call-identity-not-recorded\";\n} = { basis: \"unavailable\", reason: \"usage-not-recorded\" }) {\n const counts = new Map<string, number>();\n for (const call of usage?.calls ?? []) {\n if (call.modelSlot !== null)\n counts.set(call.modelSlot, (counts.get(call.modelSlot) ?? 0) + 1);\n }\n const configuredModels = models === undefined\n ? Object.freeze({ state: \"not-recorded\" as const })\n : Object.freeze({\n state: \"available\" as const,\n bindings: Object.freeze(Object.keys(models).sort().map((modelSlot) => Object.freeze({\n modelSlot, ...models[modelSlot]!,\n recordedCalls: usage === null ? null : counts.get(modelSlot) ?? 0,\n }))),\n });\n if (usage === null)\n return Object.freeze({\n configuredModels,\n modelGroups: Object.freeze({\n state: \"unavailable\" as const, ...unavailable,\n groups: Object.freeze([]) as readonly [\n ], totalGroupCount: null,\n groupsTruncated: false as const, omittedGroupCount: 0 as const,\n }),\n });\n const grouped = new Map<string, EffectiveUsageCall[]>();\n for (const call of effectiveUsageCalls(usage)) {\n const identity = JSON.stringify([call.modelSlot, call.provider, call.model]);\n const group = grouped.get(identity);\n if (group === undefined)\n grouped.set(identity, [call]);\n else\n group.push(call);\n }\n const allGroups = [...grouped.values()].sort((left, right) => compareAdapterModelGroups(left[0]!, right[0]!));\n const groups = allGroups.slice(0, 64).map((calls) => {\n const { modelSlot, provider, model } = calls[0]!;\n const groupUsage = { ...usage, calls };\n return Object.freeze({\n modelSlot, provider, model, recordedCalls: calls.length,\n tokens: Object.freeze({\n inputTotalTokens: adapterInspectionTokenTotal(groupUsage, \"inputTotalTokens\"),\n outputTokens: adapterInspectionTokenTotal(groupUsage, \"outputTokens\"),\n totalTokens: adapterInspectionTokenTotal(groupUsage, \"totalTokens\"),\n }),\n costs: effectiveCostTotals(calls, usage.collection.state),\n });\n });\n return Object.freeze({\n configuredModels,\n modelGroups: Object.freeze({\n state: \"available\" as const, basis: \"recorded-calls\" as const,\n groups: Object.freeze(groups), totalGroupCount: allGroups.length,\n groupsTruncated: allGroups.length > groups.length,\n omittedGroupCount: allGroups.length - groups.length,\n }),\n });\n}\nexport interface AdapterAttemptUsageSnapshot {\n readonly source: \"adapter\";\n readonly scope: \"recorded-calls\";\n readonly cut: \"call-time\";\n readonly collection: ReadableAdapterUsageAttachment[\"collection\"];\n readonly calls: readonly EffectiveUsageCall[];\n readonly priceReceipts: readonly AdapterCallPriceReceipt[];\n readonly inputTokens: NumericMaterial;\n readonly inputTotalTokens: NumericMaterial;\n readonly outputTokens: NumericMaterial;\n readonly cacheReadTokens: NumericMaterial;\n readonly cacheWriteTokens: NumericMaterial;\n readonly totalTokens: NumericMaterial;\n readonly costs: ReturnType<typeof effectiveCostTotals>;\n}\nexport type AttemptUsageSnapshot = AdapterAttemptUsageSnapshot | {\n readonly source: \"unavailable\";\n readonly reason: \"usage-owner-not-bound\";\n};\nexport function projectAdapterUsageSnapshot(usage: ReadableAdapterUsageAttachment): AdapterAttemptUsageSnapshot {\n const calls = effectiveUsageCalls(usage);\n return Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", cut: \"call-time\", collection: usage.collection, calls, priceReceipts: usage.priceReceipts ?? [], inputTokens: adapterTokenMaterial(usage, \"inputTokens\"), inputTotalTokens: adapterTokenMaterial(usage, \"inputTotalTokens\"), outputTokens: adapterTokenMaterial(usage, \"outputTokens\"), cacheReadTokens: adapterTokenMaterial(usage, \"cacheReadTokens\"), cacheWriteTokens: adapterTokenMaterial(usage, \"cacheWriteTokens\"), totalTokens: adapterTokenMaterial(usage, \"totalTokens\"), costs: effectiveCostTotals(calls, usage.collection.state) });\n}\nexport function compareCanonicalDecimal(left: string, right: string): -1 | 0 | 1 {\n const [li, lf = \"\"] = left.split(\".\");\n const [ri, rf = \"\"] = right.split(\".\");\n const width = Math.max(lf.length, rf.length);\n const l = BigInt(li! + lf.padEnd(width, \"0\"));\n const r = BigInt(ri! + rf.padEnd(width, \"0\"));\n return l < r ? -1 : l > r ? 1 : 0;\n}\n"]}
1
+ {"version":3,"file":"adapter-usage-projection.js","sourceRoot":"","sources":["adapter-usage-projection.ts"],"names":[],"mappings":"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","sourcesContent":["import { projectCacheRead } from \"./cache-read.ts\";\nimport type { ReadableAdapterUsageAttachment, AdapterUsageCall, AdapterCallPriceReceipt } from \"../record/family/adapter-usage/schema.ts\";\nimport { addCanonicalDecimals } from \"../record/family/adapter-usage/pricing.ts\";\nimport type { NumericMaterial } from \"../assertions/match.ts\";\nimport type { ResolvedModelSlots } from \"../model-slots.ts\";\nexport interface EffectiveCallCost {\n readonly amount: string;\n readonly currency: string;\n readonly source: {\n readonly kind: \"reported\" | \"estimated\";\n readonly id: string;\n };\n readonly state: \"complete\" | \"partial\";\n}\nexport type EffectiveUsageCall = AdapterUsageCall & {\n readonly effectiveCost: EffectiveCallCost | null;\n};\nexport function effectiveUsageCalls(usage: ReadableAdapterUsageAttachment): readonly EffectiveUsageCall[] {\n const receipts = new Map((usage.priceReceipts ?? []).map((receipt) => [receipt.callId, receipt]));\n return Object.freeze(usage.calls.map((call) => {\n const receipt = receipts.get(call.callId);\n return Object.freeze({ ...call, effectiveCost: call.cost !== null ? Object.freeze({ ...call.cost, state: \"complete\" as const }) : receipt === undefined ? null : Object.freeze({ amount: receipt.amount, currency: receipt.currency, source: receipt.source, state: receipt.state }) });\n }));\n}\nexport function effectiveCostTotals(calls: readonly {\n readonly effectiveCost: EffectiveCallCost | null;\n}[], collectionState: \"complete\" | \"partial\") {\n const known = calls.flatMap((call) => call.effectiveCost === null ? [] : [call.effectiveCost]);\n const kind = (values: readonly EffectiveCallCost[]) => { const sources = new Set(values.map((value) => value.source.kind)); return sources.size === 0 ? null : sources.size === 1 ? [...sources][0]! : \"mixed\" as const; };\n const grouped = new Map<string, EffectiveCallCost[]>();\n for (const cost of known)\n grouped.set(cost.currency, [...(grouped.get(cost.currency) ?? []), cost]);\n const complete = collectionState === \"complete\" && known.length === calls.length && known.every((cost) => cost.state === \"complete\");\n return Object.freeze({ state: known.length === 0 ? \"unavailable\" as const : complete ? \"complete\" as const : \"partial\" as const, source: kind(known), values: Object.freeze([...grouped.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([currency, values]) => Object.freeze({ currency, value: addCanonicalDecimals(values.map((value) => value.amount)), source: kind(values)!, coveredCalls: values.filter((value) => value.state === \"complete\").length, reportedCalls: values.filter((value) => value.source.kind === \"reported\").length, estimatedCalls: values.filter((value) => value.source.kind === \"estimated\").length }))), totalCalls: calls.length });\n}\nfunction inputTotal(call: AdapterUsageCall): {\n value: number | null;\n complete: boolean;\n} {\n const known = [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens].filter((value): value is number => value !== null);\n return { value: call.inputTotalTokens ?? (known.length === 0 ? null : known.reduce((sum, value) => sum + value, 0)), complete: call.inputTotalTokens !== null || known.length === 3 };\n}\nexport function adapterTokenMaterial(usage: ReadableAdapterUsageAttachment, metric: \"inputTokens\" | \"inputTotalTokens\" | \"outputTokens\" | \"cacheReadTokens\" | \"cacheWriteTokens\" | \"totalTokens\"): NumericMaterial {\n const provenance = Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", unit: \"tokens\", cut: \"call-time\" });\n let value = 0;\n let observations = 0;\n let complete = usage.collection.state === \"complete\" && usage.calls.length > 0;\n for (const call of usage.calls) {\n if (call.status === \"unknown\")\n complete = false;\n const input = inputTotal(call);\n const buckets = metric === \"totalTokens\" ? [input.value, call.outputTokens] : metric === \"inputTotalTokens\" ? [input.value] : [call[metric]];\n const observedBuckets = metric === \"totalTokens\" || metric === \"inputTotalTokens\"\n ? [...(call.inputTotalTokens === null ? [call.inputTokens, call.cacheReadTokens, call.cacheWriteTokens] : [call.inputTotalTokens]), ...(metric === \"totalTokens\" ? [call.outputTokens] : [])]\n : buckets;\n if (observedBuckets.some((bucket) => bucket !== null && (!Number.isSafeInteger(bucket) || bucket < 0))) {\n return Object.freeze({ state: \"unavailable\", reason: \"usage-invalid-token-value\", provenance });\n }\n for (const bucket of buckets) {\n if (bucket === null)\n complete = false;\n else {\n value += bucket;\n observations += 1;\n }\n }\n if ((metric === \"totalTokens\" || metric === \"inputTotalTokens\") && !input.complete)\n complete = false;\n }\n return Object.freeze(!Number.isSafeInteger(value) ? { state: \"unavailable\", reason: \"usage-exceeds-safe-integer\", provenance } : observations === 0 ? { state: \"unavailable\", reason: \"usage-not-recorded\", provenance } : { state: complete ? \"exact\" : \"lower-bound\", value, provenance });\n}\nexport function adapterInspectionTokenTotal(usage: ReadableAdapterUsageAttachment, metric: \"inputTotalTokens\" | \"outputTokens\" | \"totalTokens\") {\n const material = adapterTokenMaterial(usage, metric);\n const observationCount = usage.calls.filter((call) => metric === \"outputTokens\"\n ? call.outputTokens !== null\n : inputTotal(call).value !== null || (metric === \"totalTokens\" && call.outputTokens !== null)).length;\n return Object.freeze({\n state: material.state === \"exact\" ? \"available\" as const\n : material.state === \"lower-bound\" ? \"partial\" as const : \"unavailable\" as const,\n value: material.state === \"unavailable\" ? null : material.value,\n observationCount,\n });\n}\n/** Tuple order is stable across hosts, with missing identities before strings. */\nexport function compareAdapterModelGroups(left: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">, right: Pick<AdapterUsageCall, \"modelSlot\" | \"provider\" | \"model\">): number {\n for (const key of [\"modelSlot\", \"provider\", \"model\"] as const) {\n const a = left[key];\n const b = right[key];\n if (a === b)\n continue;\n if (a === null)\n return -1;\n if (b === null)\n return 1;\n return a < b ? -1 : 1;\n }\n return 0;\n}\n/** Configuration counts and grouped statistics both consume the complete sealed ledger. */\nexport function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable: {\n readonly basis: \"recorded-calls\" | \"reported-sends\" | \"unavailable\";\n readonly reason: \"source-invalid\" | \"usage-not-recorded\" | \"physical-call-identity-not-recorded\";\n} = { basis: \"unavailable\", reason: \"usage-not-recorded\" }, producerCompletenessKnown = true) {\n const cacheRead = projectCacheRead(usage, models, producerCompletenessKnown, unavailable.reason === \"physical-call-identity-not-recorded\" ? \"adapter-usage-required\" : unavailable.reason);\n const counts = new Map<string, number>();\n for (const call of usage?.calls ?? []) {\n if (call.modelSlot !== null)\n counts.set(call.modelSlot, (counts.get(call.modelSlot) ?? 0) + 1);\n }\n const configuredModels = models === undefined\n ? Object.freeze({ state: \"not-recorded\" as const })\n : Object.freeze({\n state: \"available\" as const,\n bindings: Object.freeze(Object.keys(models).sort().map((modelSlot) => Object.freeze({\n modelSlot, ...models[modelSlot]!,\n recordedCalls: usage === null ? null : counts.get(modelSlot) ?? 0,\n }))),\n });\n if (usage === null)\n return Object.freeze({\n cacheRead,\n configuredModels,\n modelGroups: Object.freeze({\n state: \"unavailable\" as const, ...unavailable,\n groups: Object.freeze([]) as readonly [\n ], totalGroupCount: null,\n groupsTruncated: false as const, omittedGroupCount: 0 as const,\n }),\n });\n const grouped = new Map<string, EffectiveUsageCall[]>();\n for (const call of effectiveUsageCalls(usage)) {\n const identity = JSON.stringify([call.modelSlot, call.provider, call.model]);\n const group = grouped.get(identity);\n if (group === undefined)\n grouped.set(identity, [call]);\n else\n group.push(call);\n }\n const allGroups = [...grouped.values()].sort((left, right) => compareAdapterModelGroups(left[0]!, right[0]!));\n const groups = allGroups.slice(0, 64).map((calls) => {\n const { modelSlot, provider, model } = calls[0]!;\n const groupUsage = { ...usage, calls };\n return Object.freeze({\n modelSlot, provider, model, recordedCalls: calls.length,\n tokens: Object.freeze({\n inputTotalTokens: adapterInspectionTokenTotal(groupUsage, \"inputTotalTokens\"),\n outputTokens: adapterInspectionTokenTotal(groupUsage, \"outputTokens\"),\n totalTokens: adapterInspectionTokenTotal(groupUsage, \"totalTokens\"),\n }),\n costs: effectiveCostTotals(calls, usage.collection.state),\n });\n });\n return Object.freeze({\n cacheRead,\n configuredModels,\n modelGroups: Object.freeze({\n state: \"available\" as const, basis: \"recorded-calls\" as const,\n groups: Object.freeze(groups), totalGroupCount: allGroups.length,\n groupsTruncated: allGroups.length > groups.length,\n omittedGroupCount: allGroups.length - groups.length,\n }),\n });\n}\nexport interface AdapterAttemptUsageSnapshot {\n readonly source: \"adapter\";\n readonly scope: \"recorded-calls\";\n readonly cut: \"call-time\";\n readonly collection: ReadableAdapterUsageAttachment[\"collection\"];\n readonly calls: readonly EffectiveUsageCall[];\n readonly priceReceipts: readonly AdapterCallPriceReceipt[];\n readonly inputTokens: NumericMaterial;\n readonly inputTotalTokens: NumericMaterial;\n readonly outputTokens: NumericMaterial;\n readonly cacheReadTokens: NumericMaterial;\n readonly cacheWriteTokens: NumericMaterial;\n readonly totalTokens: NumericMaterial;\n readonly costs: ReturnType<typeof effectiveCostTotals>;\n}\nexport type AttemptUsageSnapshot = AdapterAttemptUsageSnapshot | {\n readonly source: \"unavailable\";\n readonly reason: \"usage-owner-not-bound\";\n};\nexport function projectAdapterUsageSnapshot(usage: ReadableAdapterUsageAttachment): AdapterAttemptUsageSnapshot {\n const calls = effectiveUsageCalls(usage);\n return Object.freeze({ source: \"adapter\", scope: \"recorded-calls\", cut: \"call-time\", collection: usage.collection, calls, priceReceipts: usage.priceReceipts ?? [], inputTokens: adapterTokenMaterial(usage, \"inputTokens\"), inputTotalTokens: adapterTokenMaterial(usage, \"inputTotalTokens\"), outputTokens: adapterTokenMaterial(usage, \"outputTokens\"), cacheReadTokens: adapterTokenMaterial(usage, \"cacheReadTokens\"), cacheWriteTokens: adapterTokenMaterial(usage, \"cacheWriteTokens\"), totalTokens: adapterTokenMaterial(usage, \"totalTokens\"), costs: effectiveCostTotals(calls, usage.collection.state) });\n}\nexport function compareCanonicalDecimal(left: string, right: string): -1 | 0 | 1 {\n const [li, lf = \"\"] = left.split(\".\");\n const [ri, rf = \"\"] = right.split(\".\");\n const width = Math.max(lf.length, rf.length);\n const l = BigInt(li! + lf.padEnd(width, \"0\"));\n const r = BigInt(ri! + rf.padEnd(width, \"0\"));\n return l < r ? -1 : l > r ? 1 : 0;\n}\n"]}
@@ -41,7 +41,61 @@ export declare function compareAdapterModelGroups(left: Pick<AdapterUsageCall, "
41
41
  export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable?: {
42
42
  readonly basis: "recorded-calls" | "reported-sends" | "unavailable";
43
43
  readonly reason: "source-invalid" | "usage-not-recorded" | "physical-call-identity-not-recorded";
44
- }): Readonly<{
44
+ }, producerCompletenessKnown?: boolean): Readonly<{
45
+ cacheRead: {
46
+ readonly total: {
47
+ readonly rate: {
48
+ readonly state: "exact";
49
+ readonly value: number;
50
+ } | {
51
+ readonly state: "unavailable";
52
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
53
+ };
54
+ readonly recordedCalls: number;
55
+ readonly coveredCalls: number;
56
+ readonly missingCacheReadCalls: number;
57
+ readonly missingInputTotalCalls: number;
58
+ readonly unknownStatusCalls: number;
59
+ readonly collectionComplete: boolean;
60
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
61
+ };
62
+ readonly modelSlots: readonly {
63
+ readonly rate: {
64
+ readonly state: "exact";
65
+ readonly value: number;
66
+ } | {
67
+ readonly state: "unavailable";
68
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
69
+ };
70
+ readonly recordedCalls: number;
71
+ readonly coveredCalls: number;
72
+ readonly missingCacheReadCalls: number;
73
+ readonly missingInputTotalCalls: number;
74
+ readonly unknownStatusCalls: number;
75
+ readonly collectionComplete: boolean;
76
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
77
+ readonly modelSlot: string | null;
78
+ }[];
79
+ readonly models: readonly {
80
+ readonly rate: {
81
+ readonly state: "exact";
82
+ readonly value: number;
83
+ } | {
84
+ readonly state: "unavailable";
85
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
86
+ };
87
+ readonly recordedCalls: number;
88
+ readonly coveredCalls: number;
89
+ readonly missingCacheReadCalls: number;
90
+ readonly missingInputTotalCalls: number;
91
+ readonly unknownStatusCalls: number;
92
+ readonly collectionComplete: boolean;
93
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
94
+ readonly modelSlot: string | null;
95
+ readonly provider: string | null;
96
+ readonly model: string | null;
97
+ }[];
98
+ };
45
99
  configuredModels: Readonly<{
46
100
  state: "not-recorded";
47
101
  }> | Readonly<{
@@ -63,6 +117,60 @@ export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAtta
63
117
  state: "unavailable";
64
118
  }>;
65
119
  }> | Readonly<{
120
+ cacheRead: {
121
+ readonly total: {
122
+ readonly rate: {
123
+ readonly state: "exact";
124
+ readonly value: number;
125
+ } | {
126
+ readonly state: "unavailable";
127
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
128
+ };
129
+ readonly recordedCalls: number;
130
+ readonly coveredCalls: number;
131
+ readonly missingCacheReadCalls: number;
132
+ readonly missingInputTotalCalls: number;
133
+ readonly unknownStatusCalls: number;
134
+ readonly collectionComplete: boolean;
135
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
136
+ };
137
+ readonly modelSlots: readonly {
138
+ readonly rate: {
139
+ readonly state: "exact";
140
+ readonly value: number;
141
+ } | {
142
+ readonly state: "unavailable";
143
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
144
+ };
145
+ readonly recordedCalls: number;
146
+ readonly coveredCalls: number;
147
+ readonly missingCacheReadCalls: number;
148
+ readonly missingInputTotalCalls: number;
149
+ readonly unknownStatusCalls: number;
150
+ readonly collectionComplete: boolean;
151
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
152
+ readonly modelSlot: string | null;
153
+ }[];
154
+ readonly models: readonly {
155
+ readonly rate: {
156
+ readonly state: "exact";
157
+ readonly value: number;
158
+ } | {
159
+ readonly state: "unavailable";
160
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
161
+ };
162
+ readonly recordedCalls: number;
163
+ readonly coveredCalls: number;
164
+ readonly missingCacheReadCalls: number;
165
+ readonly missingInputTotalCalls: number;
166
+ readonly unknownStatusCalls: number;
167
+ readonly collectionComplete: boolean;
168
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
169
+ readonly modelSlot: string | null;
170
+ readonly provider: string | null;
171
+ readonly model: string | null;
172
+ }[];
173
+ };
66
174
  configuredModels: Readonly<{
67
175
  state: "not-recorded";
68
176
  }> | Readonly<{
@@ -41,7 +41,61 @@ export declare function compareAdapterModelGroups(left: Pick<AdapterUsageCall, "
41
41
  export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable?: {
42
42
  readonly basis: "recorded-calls" | "reported-sends" | "unavailable";
43
43
  readonly reason: "source-invalid" | "usage-not-recorded" | "physical-call-identity-not-recorded";
44
- }): Readonly<{
44
+ }, producerCompletenessKnown?: boolean): Readonly<{
45
+ cacheRead: {
46
+ readonly total: {
47
+ readonly rate: {
48
+ readonly state: "exact";
49
+ readonly value: number;
50
+ } | {
51
+ readonly state: "unavailable";
52
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
53
+ };
54
+ readonly recordedCalls: number;
55
+ readonly coveredCalls: number;
56
+ readonly missingCacheReadCalls: number;
57
+ readonly missingInputTotalCalls: number;
58
+ readonly unknownStatusCalls: number;
59
+ readonly collectionComplete: boolean;
60
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
61
+ };
62
+ readonly modelSlots: readonly {
63
+ readonly rate: {
64
+ readonly state: "exact";
65
+ readonly value: number;
66
+ } | {
67
+ readonly state: "unavailable";
68
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
69
+ };
70
+ readonly recordedCalls: number;
71
+ readonly coveredCalls: number;
72
+ readonly missingCacheReadCalls: number;
73
+ readonly missingInputTotalCalls: number;
74
+ readonly unknownStatusCalls: number;
75
+ readonly collectionComplete: boolean;
76
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
77
+ readonly modelSlot: string | null;
78
+ }[];
79
+ readonly models: readonly {
80
+ readonly rate: {
81
+ readonly state: "exact";
82
+ readonly value: number;
83
+ } | {
84
+ readonly state: "unavailable";
85
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
86
+ };
87
+ readonly recordedCalls: number;
88
+ readonly coveredCalls: number;
89
+ readonly missingCacheReadCalls: number;
90
+ readonly missingInputTotalCalls: number;
91
+ readonly unknownStatusCalls: number;
92
+ readonly collectionComplete: boolean;
93
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
94
+ readonly modelSlot: string | null;
95
+ readonly provider: string | null;
96
+ readonly model: string | null;
97
+ }[];
98
+ };
45
99
  configuredModels: Readonly<{
46
100
  state: "not-recorded";
47
101
  }> | Readonly<{
@@ -63,6 +117,60 @@ export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAtta
63
117
  state: "unavailable";
64
118
  }>;
65
119
  }> | Readonly<{
120
+ cacheRead: {
121
+ readonly total: {
122
+ readonly rate: {
123
+ readonly state: "exact";
124
+ readonly value: number;
125
+ } | {
126
+ readonly state: "unavailable";
127
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
128
+ };
129
+ readonly recordedCalls: number;
130
+ readonly coveredCalls: number;
131
+ readonly missingCacheReadCalls: number;
132
+ readonly missingInputTotalCalls: number;
133
+ readonly unknownStatusCalls: number;
134
+ readonly collectionComplete: boolean;
135
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
136
+ };
137
+ readonly modelSlots: readonly {
138
+ readonly rate: {
139
+ readonly state: "exact";
140
+ readonly value: number;
141
+ } | {
142
+ readonly state: "unavailable";
143
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
144
+ };
145
+ readonly recordedCalls: number;
146
+ readonly coveredCalls: number;
147
+ readonly missingCacheReadCalls: number;
148
+ readonly missingInputTotalCalls: number;
149
+ readonly unknownStatusCalls: number;
150
+ readonly collectionComplete: boolean;
151
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
152
+ readonly modelSlot: string | null;
153
+ }[];
154
+ readonly models: readonly {
155
+ readonly rate: {
156
+ readonly state: "exact";
157
+ readonly value: number;
158
+ } | {
159
+ readonly state: "unavailable";
160
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
161
+ };
162
+ readonly recordedCalls: number;
163
+ readonly coveredCalls: number;
164
+ readonly missingCacheReadCalls: number;
165
+ readonly missingInputTotalCalls: number;
166
+ readonly unknownStatusCalls: number;
167
+ readonly collectionComplete: boolean;
168
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
169
+ readonly modelSlot: string | null;
170
+ readonly provider: string | null;
171
+ readonly model: string | null;
172
+ }[];
173
+ };
66
174
  configuredModels: Readonly<{
67
175
  state: "not-recorded";
68
176
  }> | Readonly<{
@@ -41,7 +41,61 @@ export declare function compareAdapterModelGroups(left: Pick<AdapterUsageCall, "
41
41
  export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAttachment | null, models: ResolvedModelSlots | undefined, unavailable?: {
42
42
  readonly basis: "recorded-calls" | "reported-sends" | "unavailable";
43
43
  readonly reason: "source-invalid" | "usage-not-recorded" | "physical-call-identity-not-recorded";
44
- }): Readonly<{
44
+ }, producerCompletenessKnown?: boolean): Readonly<{
45
+ cacheRead: {
46
+ readonly total: {
47
+ readonly rate: {
48
+ readonly state: "exact";
49
+ readonly value: number;
50
+ } | {
51
+ readonly state: "unavailable";
52
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
53
+ };
54
+ readonly recordedCalls: number;
55
+ readonly coveredCalls: number;
56
+ readonly missingCacheReadCalls: number;
57
+ readonly missingInputTotalCalls: number;
58
+ readonly unknownStatusCalls: number;
59
+ readonly collectionComplete: boolean;
60
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
61
+ };
62
+ readonly modelSlots: readonly {
63
+ readonly rate: {
64
+ readonly state: "exact";
65
+ readonly value: number;
66
+ } | {
67
+ readonly state: "unavailable";
68
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
69
+ };
70
+ readonly recordedCalls: number;
71
+ readonly coveredCalls: number;
72
+ readonly missingCacheReadCalls: number;
73
+ readonly missingInputTotalCalls: number;
74
+ readonly unknownStatusCalls: number;
75
+ readonly collectionComplete: boolean;
76
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
77
+ readonly modelSlot: string | null;
78
+ }[];
79
+ readonly models: readonly {
80
+ readonly rate: {
81
+ readonly state: "exact";
82
+ readonly value: number;
83
+ } | {
84
+ readonly state: "unavailable";
85
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
86
+ };
87
+ readonly recordedCalls: number;
88
+ readonly coveredCalls: number;
89
+ readonly missingCacheReadCalls: number;
90
+ readonly missingInputTotalCalls: number;
91
+ readonly unknownStatusCalls: number;
92
+ readonly collectionComplete: boolean;
93
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
94
+ readonly modelSlot: string | null;
95
+ readonly provider: string | null;
96
+ readonly model: string | null;
97
+ }[];
98
+ };
45
99
  configuredModels: Readonly<{
46
100
  state: "not-recorded";
47
101
  }> | Readonly<{
@@ -63,6 +117,60 @@ export declare function projectAdapterModelUsage(usage: ReadableAdapterUsageAtta
63
117
  state: "unavailable";
64
118
  }>;
65
119
  }> | Readonly<{
120
+ cacheRead: {
121
+ readonly total: {
122
+ readonly rate: {
123
+ readonly state: "exact";
124
+ readonly value: number;
125
+ } | {
126
+ readonly state: "unavailable";
127
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
128
+ };
129
+ readonly recordedCalls: number;
130
+ readonly coveredCalls: number;
131
+ readonly missingCacheReadCalls: number;
132
+ readonly missingInputTotalCalls: number;
133
+ readonly unknownStatusCalls: number;
134
+ readonly collectionComplete: boolean;
135
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
136
+ };
137
+ readonly modelSlots: readonly {
138
+ readonly rate: {
139
+ readonly state: "exact";
140
+ readonly value: number;
141
+ } | {
142
+ readonly state: "unavailable";
143
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
144
+ };
145
+ readonly recordedCalls: number;
146
+ readonly coveredCalls: number;
147
+ readonly missingCacheReadCalls: number;
148
+ readonly missingInputTotalCalls: number;
149
+ readonly unknownStatusCalls: number;
150
+ readonly collectionComplete: boolean;
151
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
152
+ readonly modelSlot: string | null;
153
+ }[];
154
+ readonly models: readonly {
155
+ readonly rate: {
156
+ readonly state: "exact";
157
+ readonly value: number;
158
+ } | {
159
+ readonly state: "unavailable";
160
+ readonly reason: "usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total";
161
+ };
162
+ readonly recordedCalls: number;
163
+ readonly coveredCalls: number;
164
+ readonly missingCacheReadCalls: number;
165
+ readonly missingInputTotalCalls: number;
166
+ readonly unknownStatusCalls: number;
167
+ readonly collectionComplete: boolean;
168
+ readonly reasons: readonly ("usage-not-recorded" | "source-invalid" | "adapter-usage-required" | "collection-incomplete" | "call-status-unknown" | "no-calls" | "cache-read-missing" | "input-total-missing" | "zero-input-total" | "unsafe-token-total")[];
169
+ readonly modelSlot: string | null;
170
+ readonly provider: string | null;
171
+ readonly model: string | null;
172
+ }[];
173
+ };
66
174
  configuredModels: Readonly<{
67
175
  state: "not-recorded";
68
176
  }> | Readonly<{