@schlessera/brain-ui-server 0.19.0 → 0.21.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 (78) hide show
  1. package/README.md +5 -1
  2. package/data/model-prices.json +63 -0
  3. package/dist/activity/digest.d.ts.map +1 -1
  4. package/dist/activity/digest.js +30 -2
  5. package/dist/activity/digest.js.map +1 -1
  6. package/dist/activity/notify.d.ts.map +1 -1
  7. package/dist/activity/notify.js +26 -4
  8. package/dist/activity/notify.js.map +1 -1
  9. package/dist/activity/query.d.ts.map +1 -1
  10. package/dist/activity/query.js +28 -1
  11. package/dist/activity/query.js.map +1 -1
  12. package/dist/activity/recorder.d.ts +5 -0
  13. package/dist/activity/recorder.d.ts.map +1 -1
  14. package/dist/activity/recorder.js +37 -4
  15. package/dist/activity/recorder.js.map +1 -1
  16. package/dist/activity/runtime.d.ts +7 -1
  17. package/dist/activity/runtime.d.ts.map +1 -1
  18. package/dist/activity/runtime.js +28 -10
  19. package/dist/activity/runtime.js.map +1 -1
  20. package/dist/activity/store.d.ts +51 -2
  21. package/dist/activity/store.d.ts.map +1 -1
  22. package/dist/activity/store.js +236 -19
  23. package/dist/activity/store.js.map +1 -1
  24. package/dist/activity/stream.d.ts +6 -2
  25. package/dist/activity/stream.d.ts.map +1 -1
  26. package/dist/activity/stream.js +42 -1
  27. package/dist/activity/stream.js.map +1 -1
  28. package/dist/agent/backend.d.ts +13 -4
  29. package/dist/agent/backend.d.ts.map +1 -1
  30. package/dist/agent/backend.js +68 -5
  31. package/dist/agent/backend.js.map +1 -1
  32. package/dist/app.d.ts.map +1 -1
  33. package/dist/app.js +18 -3
  34. package/dist/app.js.map +1 -1
  35. package/dist/config/env.d.ts +36 -0
  36. package/dist/config/env.d.ts.map +1 -1
  37. package/dist/config/env.js +66 -2
  38. package/dist/config/env.js.map +1 -1
  39. package/dist/db/settings.d.ts +15 -0
  40. package/dist/db/settings.d.ts.map +1 -1
  41. package/dist/db/settings.js +43 -0
  42. package/dist/db/settings.js.map +1 -1
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/pricing/model-pricing.d.ts +61 -0
  47. package/dist/pricing/model-pricing.d.ts.map +1 -0
  48. package/dist/pricing/model-pricing.js +379 -0
  49. package/dist/pricing/model-pricing.js.map +1 -0
  50. package/dist/routes/activity.d.ts.map +1 -1
  51. package/dist/routes/activity.js +40 -32
  52. package/dist/routes/activity.js.map +1 -1
  53. package/dist/routes/models.d.ts +6 -0
  54. package/dist/routes/models.d.ts.map +1 -1
  55. package/dist/routes/models.js +38 -3
  56. package/dist/routes/models.js.map +1 -1
  57. package/dist/ws/run-session.d.ts.map +1 -1
  58. package/dist/ws/run-session.js +36 -2
  59. package/dist/ws/run-session.js.map +1 -1
  60. package/migrations/009_activity_followups.sql +22 -0
  61. package/migrations/010_effective_cost.sql +21 -0
  62. package/package.json +4 -3
  63. package/src/activity/digest.ts +30 -2
  64. package/src/activity/notify.ts +30 -8
  65. package/src/activity/query.ts +28 -1
  66. package/src/activity/recorder.ts +57 -5
  67. package/src/activity/runtime.ts +41 -13
  68. package/src/activity/store.ts +316 -21
  69. package/src/activity/stream.ts +39 -9
  70. package/src/agent/backend.ts +91 -10
  71. package/src/app.ts +19 -3
  72. package/src/config/env.ts +90 -2
  73. package/src/db/settings.ts +56 -0
  74. package/src/index.ts +1 -0
  75. package/src/pricing/model-pricing.ts +497 -0
  76. package/src/routes/activity.ts +41 -33
  77. package/src/routes/models.ts +57 -6
  78. package/src/ws/run-session.ts +45 -3
@@ -0,0 +1,379 @@
1
+ // Model pricing.
2
+ //
3
+ // The rollup layer needs per-token USD rates to turn a run's token usage into
4
+ // an effective cost, and prices change far faster than this package ships. So
5
+ // rates come from two remote catalogs, merged and TTL-cached, with a bundled
6
+ // snapshot as the offline fallback — the same shape as the model-discovery
7
+ // source in `ui-backend-claude` (versioned cache envelope, synchronous reads,
8
+ // cold-start-only await, single-flight refresh, serve-stale-on-error).
9
+ //
10
+ // The two sources cover different territory:
11
+ //
12
+ // 1. LITELLM (`model_prices_and_context_window.json`): community-maintained,
13
+ // per-single-token floats, keyed bare for Anthropic/OpenAI and
14
+ // `gemini/...` for Gemini. Broad coverage, known cross-key drift — so
15
+ // entries are validated on ingest and dropped, never trusted blindly.
16
+ //
17
+ // 2. OPENROUTER (`GET /api/v1/models`): the vendor's own catalog, keyed
18
+ // `vendor/model`, prices as STRING per-token USD. `"0"` is genuinely
19
+ // free, not unknown. OpenRouter wins for ids its catalog carries, since
20
+ // an openrouter-routed run is billed at OpenRouter's rate.
21
+ //
22
+ // Pricing is best-effort by construction: no network, a broken response, or a
23
+ // corrupt cache degrades to the last good table (or the snapshot), never to a
24
+ // throw. A model the table cannot price resolves to null — the caller renders
25
+ // unknown, never zero (the binding fail-loud decision).
26
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "fs";
27
+ import { dirname, join } from "path";
28
+ import { canonicalModelId } from "@schlessera/brain-ui-sdk/protocol";
29
+ const LITELLM_URL = "https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json";
30
+ const OPENROUTER_URL = "https://openrouter.ai/api/v1/models";
31
+ const REQUEST_TIMEOUT_MS = 10_000;
32
+ const CACHE_VERSION = 1;
33
+ const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
34
+ /** Hard cap on a catalog response — both real catalogs are ~2 MB; anything an
35
+ * order of magnitude past that is a broken or hostile endpoint, not data. */
36
+ const MAX_RESPONSE_BYTES = 20 * 1024 * 1024;
37
+ /** Plausibility ceiling on a per-token rate: $0.01/token = $10,000 per million
38
+ * tokens, far past any real price. A rate above it is a corrupt or hostile
39
+ * entry — once frozen into a rollup it would misreport spend forever. */
40
+ const MAX_RATE_PER_TOKEN = 0.01;
41
+ // --- ingest validation -------------------------------------------------------
42
+ /** A finite, non-negative, plausible price from a float or an OpenRouter
43
+ * string; else null. The ceiling drops absurd rates at ingest, before they
44
+ * can freeze into any rollup. */
45
+ function asPrice(value) {
46
+ if (typeof value !== "number" && typeof value !== "string")
47
+ return null;
48
+ if (typeof value === "string" && value.trim() === "")
49
+ return null;
50
+ const n = Number(value);
51
+ return Number.isFinite(n) && n >= 0 && n <= MAX_RATE_PER_TOKEN ? n : null;
52
+ }
53
+ /**
54
+ * Build a rate from raw fields, or null when input/output don't validate.
55
+ * Cache rates are optional — absent or malformed becomes null, which the
56
+ * resolution contract surfaces to the caller rather than papering over.
57
+ */
58
+ function toRate(input, output, cacheRead, cacheWrite) {
59
+ const inp = asPrice(input);
60
+ const out = asPrice(output);
61
+ if (inp === null || out === null)
62
+ return null;
63
+ return { input: inp, output: out, cacheRead: asPrice(cacheRead), cacheWrite: asPrice(cacheWrite) };
64
+ }
65
+ /** LiteLLM: one big object keyed by model id, per-single-token floats. */
66
+ function parseLitellm(body) {
67
+ if (typeof body !== "object" || body === null || Array.isArray(body)) {
68
+ throw new Error("unexpected LiteLLM payload");
69
+ }
70
+ // Null-prototype: ids are foreign strings — a "__proto__" entry must be an
71
+ // ordinary key, never a prototype write (same rule for every table below).
72
+ const rates = Object.create(null);
73
+ for (const [id, entry] of Object.entries(body)) {
74
+ // The field-set documentation row, not a model.
75
+ if (id === "sample_spec")
76
+ continue;
77
+ if (typeof entry !== "object" || entry === null)
78
+ continue;
79
+ const e = entry;
80
+ const rate = toRate(e.input_cost_per_token, e.output_cost_per_token, e.cache_read_input_token_cost, e.cache_creation_input_token_cost);
81
+ // Entries without usable input/output costs (context-window-only rows,
82
+ // malformed values) are dropped — a bad community entry must not be fatal.
83
+ if (rate)
84
+ rates[id] = rate;
85
+ }
86
+ return rates;
87
+ }
88
+ /** OpenRouter: `{"data":[...]}`, `vendor/model` ids, string per-token prices. */
89
+ function parseOpenRouter(body) {
90
+ const data = body?.data;
91
+ if (!Array.isArray(data))
92
+ throw new Error("unexpected OpenRouter payload");
93
+ const rates = Object.create(null);
94
+ for (const row of data) {
95
+ if (typeof row !== "object" || row === null)
96
+ continue;
97
+ const { id, pricing } = row;
98
+ if (typeof id !== "string" || id.length === 0)
99
+ continue;
100
+ if (typeof pricing !== "object" || pricing === null)
101
+ continue;
102
+ const p = pricing;
103
+ const rate = toRate(p.prompt, p.completion, p.input_cache_read, p.input_cache_write);
104
+ if (rate)
105
+ rates[id] = rate;
106
+ }
107
+ return rates;
108
+ }
109
+ // --- fetch -------------------------------------------------------------------
110
+ /** One GET-and-parse with a hard timeout and a single retry on 5xx / network failure. */
111
+ async function fetchSource(url, parse, fetchImpl) {
112
+ let lastError;
113
+ for (let attempt = 0; attempt < 2; attempt++) {
114
+ try {
115
+ const res = await fetchImpl(url, {
116
+ headers: { accept: "application/json" },
117
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
118
+ });
119
+ if (res.ok) {
120
+ // Size-capped read: an unbounded body from a broken or hostile
121
+ // endpoint must not be streamed into memory (and onward to the brain
122
+ // volume). The declared length rejects early; the actual length
123
+ // catches a body without one. Oversize is terminal, not retryable —
124
+ // the caller serves its last good table.
125
+ const declared = Number(res.headers.get("content-length"));
126
+ if (Number.isFinite(declared) && declared > MAX_RESPONSE_BYTES) {
127
+ lastError = new Error(`response too large (${declared} bytes)`);
128
+ break;
129
+ }
130
+ const text = await res.text();
131
+ if (text.length > MAX_RESPONSE_BYTES) {
132
+ lastError = new Error(`response too large (${text.length} chars)`);
133
+ break;
134
+ }
135
+ return parse(JSON.parse(text));
136
+ }
137
+ lastError = new Error(`HTTP ${res.status}`);
138
+ // 4xx is terminal (moved or removed endpoint) — don't burn a retry.
139
+ if (res.status < 500)
140
+ break;
141
+ }
142
+ catch (err) {
143
+ lastError = err;
144
+ }
145
+ }
146
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
147
+ }
148
+ // --- cache -------------------------------------------------------------------
149
+ /** Cache path: alongside the discovery and keyterm caches, on the brain volume. */
150
+ export function pricingCachePath(brainPath) {
151
+ return join(brainPath, ".brain-ui", "model-pricing.json");
152
+ }
153
+ /** Revalidate a stored table entry by entry; malformed entries are dropped. */
154
+ function sanitizeTable(raw) {
155
+ if (typeof raw !== "object" || raw === null)
156
+ return null;
157
+ const { fetchedAt, rates } = raw;
158
+ if (typeof rates !== "object" || rates === null)
159
+ return null;
160
+ const clean = Object.create(null);
161
+ for (const [id, entry] of Object.entries(rates)) {
162
+ const e = (entry ?? {});
163
+ const rate = toRate(e.input, e.output, e.cacheRead, e.cacheWrite);
164
+ if (rate)
165
+ clean[id] = rate;
166
+ }
167
+ return { fetchedAt: typeof fetchedAt === "number" ? fetchedAt : null, rates: clean };
168
+ }
169
+ function readCache(path) {
170
+ try {
171
+ if (!existsSync(path))
172
+ return null;
173
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
174
+ if (parsed?.version !== CACHE_VERSION || typeof parsed.fetchedAt !== "number") {
175
+ return null;
176
+ }
177
+ const litellm = sanitizeTable(parsed.litellm);
178
+ const openrouter = sanitizeTable(parsed.openrouter);
179
+ if (!litellm || !openrouter)
180
+ return null;
181
+ return { fetchedAt: parsed.fetchedAt, litellm, openrouter };
182
+ }
183
+ catch {
184
+ // A corrupt cache is not fatal — the next refresh rewrites it.
185
+ return null;
186
+ }
187
+ }
188
+ /**
189
+ * Atomic cache write: temp file + rename, so a concurrent writer (server and
190
+ * cron wrapper share this file) or a crash mid-write can never leave a torn
191
+ * file behind — the reader sees the old cache or the new one, nothing between.
192
+ * Returns the failure message instead of throwing: a read-only volume costs
193
+ * persistence across restarts, nothing else — the in-memory table keeps
194
+ * serving — but the failure must be observable in state(). (No console here
195
+ * by package rule.)
196
+ */
197
+ function writeCache(path, cache) {
198
+ const tmp = `${path}.tmp.${process.pid}`;
199
+ try {
200
+ mkdirSync(dirname(path), { recursive: true });
201
+ writeFileSync(tmp, JSON.stringify(cache, null, 2), "utf-8");
202
+ renameSync(tmp, path);
203
+ return null;
204
+ }
205
+ catch (err) {
206
+ try {
207
+ rmSync(tmp, { force: true });
208
+ }
209
+ catch {
210
+ // Best-effort cleanup; the stray temp file is harmless.
211
+ }
212
+ return err instanceof Error ? err.message : String(err);
213
+ }
214
+ }
215
+ /**
216
+ * The bundled snapshot ships inside the package (`data/` is in `files`).
217
+ * src/pricing/ and dist/pricing/ sit at the same depth, so the relative hop
218
+ * to the package root resolves identically on both resolution paths — the
219
+ * same pattern the migrations dir uses in src/db/client.ts.
220
+ */
221
+ function readSnapshot() {
222
+ try {
223
+ const path = join(import.meta.dir, "../../data/model-prices.json");
224
+ const parsed = JSON.parse(readFileSync(path, "utf-8"));
225
+ if (parsed?.version !== CACHE_VERSION)
226
+ return {};
227
+ const litellm = sanitizeTable(parsed.litellm);
228
+ const openrouter = sanitizeTable(parsed.openrouter);
229
+ return Object.assign(Object.create(null), litellm?.rates ?? {}, openrouter?.rates ?? {});
230
+ }
231
+ catch {
232
+ // A missing snapshot only narrows the fallback to "nothing resolves",
233
+ // which every caller already handles as unknown.
234
+ return {};
235
+ }
236
+ }
237
+ export function createModelPricing(options) {
238
+ const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
239
+ const enabled = options.enabled ?? true;
240
+ const now = options.now ?? Date.now;
241
+ const fetchImpl = options.fetchImpl ?? fetch;
242
+ const cachePath = pricingCachePath(options.brainPath);
243
+ // Remote data (disk cache or a completed refresh) and the bundled snapshot
244
+ // stay separate: the snapshot serves only while no remote table exists, and
245
+ // its resolutions are flagged estimate — mixing the two would silently
246
+ // launder dated rates as fresh ones.
247
+ let remote = enabled ? readCache(cachePath) : null;
248
+ const snapshot = enabled ? readSnapshot() : {};
249
+ let lastError;
250
+ let lastWriteError;
251
+ let inFlight = null;
252
+ // Staleness keys on the OLDEST source, not the envelope: a partial refresh
253
+ // (one catalog up, one down) must keep retrying the failed side on the
254
+ // normal ensureFresh cadence instead of hiding behind the winner's
255
+ // timestamp for a full TTL — which would also suppress the client's
256
+ // staleness indicator exactly while one source is dark.
257
+ const isStale = () => {
258
+ if (remote === null)
259
+ return true;
260
+ const oldest = Math.min(remote.litellm.fetchedAt ?? 0, remote.openrouter.fetchedAt ?? 0);
261
+ return now() - oldest > ttlMs;
262
+ };
263
+ async function doRefresh() {
264
+ const [litellm, openrouter] = await Promise.allSettled([
265
+ fetchSource(LITELLM_URL, parseLitellm, fetchImpl),
266
+ fetchSource(OPENROUTER_URL, parseOpenRouter, fetchImpl),
267
+ ]);
268
+ const failures = [];
269
+ const describe = (reason) => reason instanceof Error ? reason.message : String(reason);
270
+ if (litellm.status === "rejected")
271
+ failures.push(`litellm: ${describe(litellm.reason)}`);
272
+ if (openrouter.status === "rejected")
273
+ failures.push(`openrouter: ${describe(openrouter.reason)}`);
274
+ if (litellm.status === "rejected" && openrouter.status === "rejected") {
275
+ // Keep serving whatever we already had; surface the reason.
276
+ lastError = failures.join("; ");
277
+ throw new Error(lastError);
278
+ }
279
+ // Partial refresh is still a refresh: the failed source keeps its last
280
+ // table (empty if it never succeeded) and shows through its fetchedAt
281
+ // plus state().error.
282
+ remote = {
283
+ fetchedAt: now(),
284
+ litellm: litellm.status === "fulfilled"
285
+ ? { fetchedAt: now(), rates: litellm.value }
286
+ : (remote?.litellm ?? { fetchedAt: null, rates: {} }),
287
+ openrouter: openrouter.status === "fulfilled"
288
+ ? { fetchedAt: now(), rates: openrouter.value }
289
+ : (remote?.openrouter ?? { fetchedAt: null, rates: {} }),
290
+ };
291
+ lastError = failures.length > 0 ? failures.join("; ") : undefined;
292
+ lastWriteError =
293
+ writeCache(cachePath, { version: CACHE_VERSION, ...remote }) ?? undefined;
294
+ }
295
+ function refresh() {
296
+ if (!enabled)
297
+ return Promise.resolve();
298
+ // Single-flight: a burst of requests triggers one fetch pair, not N.
299
+ if (!inFlight) {
300
+ inFlight = doRefresh().finally(() => {
301
+ inFlight = null;
302
+ });
303
+ }
304
+ return inFlight;
305
+ }
306
+ function lookup(id) {
307
+ if (remote) {
308
+ // OpenRouter wins for ids its catalog carries — an openrouter-routed
309
+ // run is billed at OpenRouter's rate, not LiteLLM's idea of it.
310
+ // Own-property lookups only: an id like "toString" must never resolve
311
+ // a prototype member as phantom rates.
312
+ const or = Object.hasOwn(remote.openrouter.rates, id)
313
+ ? remote.openrouter.rates[id]
314
+ : undefined;
315
+ if (or)
316
+ return { ...or, estimate: false, source: "openrouter" };
317
+ const ll = Object.hasOwn(remote.litellm.rates, id)
318
+ ? remote.litellm.rates[id]
319
+ : undefined;
320
+ if (ll)
321
+ return { ...ll, estimate: false, source: "litellm" };
322
+ return null;
323
+ }
324
+ const snap = Object.hasOwn(snapshot, id) ? snapshot[id] : undefined;
325
+ return snap ? { ...snap, estimate: true, source: "snapshot" } : null;
326
+ }
327
+ const resolveId = (id) => lookup(id) ?? lookup(canonicalModelId(id));
328
+ return {
329
+ resolve(modelId) {
330
+ if (!enabled)
331
+ return null;
332
+ const direct = resolveId(modelId);
333
+ if (direct)
334
+ return direct;
335
+ // An OpenRouter routing suffix (`:nitro` / `:floor`) is a request-time
336
+ // shortcut with no catalog price of its own — price at the base id's
337
+ // rate, flagged ESTIMATE regardless of source: the routed premium is in
338
+ // no catalog (AE2).
339
+ const variant = modelId.match(/^(.+):(nitro|floor)$/);
340
+ if (variant) {
341
+ const base = resolveId(variant[1]);
342
+ if (base)
343
+ return { ...base, estimate: true };
344
+ }
345
+ return null;
346
+ },
347
+ state: () => {
348
+ // Cache-write failures ride the same error field as fetch failures —
349
+ // both mean "the table you see may not survive a restart / refresh".
350
+ const errors = [
351
+ lastError,
352
+ lastWriteError !== undefined ? `cache write failed: ${lastWriteError}` : undefined,
353
+ ].filter((e) => e !== undefined);
354
+ return {
355
+ enabled,
356
+ fetchedAt: remote?.fetchedAt ?? null,
357
+ stale: enabled ? isStale() : false,
358
+ source: remote ? "remote" : "snapshot",
359
+ litellmFetchedAt: remote?.litellm.fetchedAt ?? null,
360
+ openrouterFetchedAt: remote?.openrouter.fetchedAt ?? null,
361
+ ...(errors.length > 0 ? { error: errors.join("; ") } : {}),
362
+ };
363
+ },
364
+ async ensureFresh() {
365
+ if (!enabled || !isStale())
366
+ return;
367
+ // Cold start: no remote data yet, so the caller waits (bounded by the
368
+ // request timeout); the snapshot serves anyone who won't. Otherwise
369
+ // refresh in the background.
370
+ if (remote === null) {
371
+ await refresh().catch(() => { });
372
+ return;
373
+ }
374
+ void refresh().catch(() => { });
375
+ },
376
+ refresh,
377
+ };
378
+ }
379
+ //# sourceMappingURL=model-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-pricing.js","sourceRoot":"","sources":["../../src/pricing/model-pricing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/routes/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAU3C,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAS9D;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,GAAG,IAAI,CAqQP"}
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/routes/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAS9D;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B,GAAG,IAAI,CAkQP"}
@@ -1,7 +1,7 @@
1
1
  import { Hono } from "hono";
2
2
  import { isFailureOutcome, } from "@schlessera/brain-ui-sdk/protocol";
3
3
  import { rowToRunRollup } from "../activity/store.js";
4
- import { toWireEvent, toWireSpan } from "../activity/stream.js";
4
+ import { toWireEvent, toWireRollup, toWireSpan } from "../activity/stream.js";
5
5
  import { dismissActivityDigest, digestDismissedAt, generateActivityDigest, latestActivityDigest, } from "../activity/digest.js";
6
6
  import { getSetting, setSetting } from "../db/settings.js";
7
7
  /**
@@ -106,6 +106,8 @@ export function createActivityRoutes(deps) {
106
106
  running: true,
107
107
  durationMs: null,
108
108
  costUsd: s.usage.costUsd ?? null,
109
+ // No rollup yet — effective cost is unknown until the run prices.
110
+ effectiveCostUsd: null,
109
111
  failureReason: null,
110
112
  detailPruned: false,
111
113
  }));
@@ -136,19 +138,13 @@ export function createActivityRoutes(deps) {
136
138
  ORDER BY started_at DESC LIMIT ?`)
137
139
  .all(...params, limit)
138
140
  .map(rowToRunRollup)
141
+ // The wire mapping (explicit-null vs omit) lives in toWireRollup;
142
+ // a summary adds only its identity and liveness fields on top.
139
143
  .map((r) => ({
140
- runId: r.runId,
144
+ ...toWireRollup(r),
141
145
  origin: r.origin,
142
- name: r.name,
143
- sessionId: r.sessionId,
144
- jobName: r.jobName,
145
- startedAt: r.startedAt,
146
- endedAt: r.endedAt,
147
- outcome: r.outcome,
146
+ runId: r.runId,
148
147
  running: false,
149
- durationMs: r.durationMs,
150
- costUsd: r.costUsd,
151
- failureReason: r.failureReason,
152
148
  detailPruned: r.detailPruned,
153
149
  }));
154
150
  return c.json({ live, history });
@@ -161,40 +157,39 @@ export function createActivityRoutes(deps) {
161
157
  const runId = c.req.param("runId");
162
158
  try {
163
159
  const snapshot = store.snapshotRun(runId);
160
+ const row = db
161
+ .query("SELECT * FROM activity_run_rollups WHERE run_id = ?")
162
+ .get(runId);
164
163
  if (snapshot) {
164
+ // Tool payload events (up to 16 KB each) dominate a run's byte
165
+ // size, and the history list opens details eagerly — so the REST
166
+ // detail ships WITHOUT them unless the drill-in asks
167
+ // (?include=payloads). The WS snapshot path is untouched: a live
168
+ // subscription already committed to the full stream.
169
+ const includePayloads = c.req.query("include") === "payloads";
170
+ const events = includePayloads
171
+ ? snapshot.events
172
+ : snapshot.events.filter((e) => e.eventType !== "tool_input" && e.eventType !== "tool_output");
165
173
  // Through the SAME wire mappers the live stream uses: a raw
166
174
  // SpanRow serializes null fields where the wire contract omits
167
175
  // them, which broke the client's `outcome === undefined`
168
- // liveness test on REST-loaded runs.
176
+ // liveness test on REST-loaded runs. The rollup rides along when
177
+ // it exists (finished runs) so the detail view can show cost facts
178
+ // without waiting for detail pruning to force the rollup-only path.
169
179
  const detail = {
170
180
  runId,
171
181
  detailPruned: false,
172
182
  spans: snapshot.spans.map(toWireSpan),
173
- events: snapshot.events.map(toWireEvent),
183
+ events: events.map(toWireEvent),
174
184
  highWaterSeq: snapshot.highWaterSeq,
185
+ ...(row ? { rollup: toWireRollup(rowToRunRollup(row)) } : {}),
175
186
  };
176
187
  return c.json(detail);
177
188
  }
178
- const row = db
179
- .query("SELECT * FROM activity_run_rollups WHERE run_id = ?")
180
- .get(runId);
181
189
  if (!row)
182
190
  return c.json({ error: "Unknown run" }, 404);
183
191
  const r = rowToRunRollup(row);
184
- const rollup = {
185
- origin: r.origin,
186
- name: r.name,
187
- sessionId: r.sessionId,
188
- jobName: r.jobName,
189
- startedAt: r.startedAt,
190
- endedAt: r.endedAt,
191
- outcome: r.outcome,
192
- durationMs: r.durationMs,
193
- spanCount: r.spanCount,
194
- costUsd: r.costUsd,
195
- failureReason: r.failureReason,
196
- };
197
- const detail = { runId, detailPruned: true, rollup };
192
+ const detail = { runId, detailPruned: true, rollup: toWireRollup(r) };
198
193
  return c.json(detail);
199
194
  }
200
195
  catch (err) {
@@ -212,8 +207,8 @@ export function createActivityRoutes(deps) {
212
207
  // Job/session aggregates group SQL-side; the per-day fold stays in
213
208
  // JS because only Intl knows the configured timezone's day boundary.
214
209
  const rows = db
215
- .query(`SELECT started_at, outcome, duration_ms, cost_usd, input_tokens,
216
- output_tokens, cache_read_tokens, cache_creation_tokens
210
+ .query(`SELECT started_at, outcome, duration_ms, cost_usd, effective_cost_usd,
211
+ input_tokens, output_tokens, cache_read_tokens, cache_creation_tokens
217
212
  FROM activity_run_rollups WHERE started_at >= ?`)
218
213
  .all(since);
219
214
  const byDay = new Map();
@@ -252,6 +247,8 @@ function groupedAggregates(db, since, column) {
252
247
  COUNT(*) AS runs,
253
248
  SUM(CASE WHEN outcome IN ('error', 'timeout', 'interrupted') THEN 1 ELSE 0 END) AS failures,
254
249
  SUM(COALESCE(cost_usd, 0)) AS costUsd,
250
+ SUM(COALESCE(effective_cost_usd, 0)) AS effectiveCostUsd,
251
+ SUM(CASE WHEN effective_cost_usd IS NULL THEN 1 ELSE 0 END) AS unpricedRuns,
255
252
  SUM(COALESCE(input_tokens, 0)) AS inputTokens,
256
253
  SUM(COALESCE(output_tokens, 0)) AS outputTokens,
257
254
  SUM(COALESCE(cache_read_tokens, 0)) AS cacheReadTokens,
@@ -268,6 +265,8 @@ function add(map, key, r) {
268
265
  runs: 0,
269
266
  failures: 0,
270
267
  costUsd: 0,
268
+ effectiveCostUsd: 0,
269
+ unpricedRuns: 0,
271
270
  inputTokens: 0,
272
271
  outputTokens: 0,
273
272
  cacheReadTokens: 0,
@@ -278,7 +277,16 @@ function add(map, key, r) {
278
277
  if (isFailureOutcome(r.outcome)) {
279
278
  a.failures += 1;
280
279
  }
280
+ // Both cost sums are sum-of-KNOWNS (a missing value contributes nothing);
281
+ // for effective cost the excluded rows are counted so no surface can pass
282
+ // an unknown off as $0 (AE3).
281
283
  a.costUsd += r.cost_usd ?? 0;
284
+ if (r.effective_cost_usd == null) {
285
+ a.unpricedRuns = (a.unpricedRuns ?? 0) + 1;
286
+ }
287
+ else {
288
+ a.effectiveCostUsd = (a.effectiveCostUsd ?? 0) + r.effective_cost_usd;
289
+ }
282
290
  a.inputTokens += r.input_tokens ?? 0;
283
291
  a.outputTokens += r.output_tokens ?? 0;
284
292
  a.cacheReadTokens += r.cache_read_tokens ?? 0;
@@ -1 +1 @@
1
- {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/routes/activity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/routes/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EACL,gBAAgB,GAKjB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE9E,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAIpC;IACC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAErC,OAAO,IAAI,IAAI,EAAE;SACd,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,kEAAkE;YAClE,oCAAoC;YACpC,UAAU,CAAC,EAAE,EAAE,sBAAsB,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBAChC,WAAW,EAAE,iBAAiB,CAAC,EAAE,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EACvE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,EAAE,EACnE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE;QACvC,qEAAqE;QACrE,sEAAsE;QACtE,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,sBAAsB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAAE,EACpE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,EAAE,EACtE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EACvE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACpF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;YAC9C,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EACvE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SACD,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACnF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAErC,oEAAoE;YACpE,qEAAqE;YACrE,uDAAuD;YACvD,MAAM,IAAI,GAAyB,KAAK;iBACrC,aAAa,EAAE;iBACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;iBAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC;iBACxC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC;iBAClD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI;gBAChC,kEAAkE;gBAClE,gBAAgB,EAAE,IAAI;gBACtB,aAAa,EAAE,IAAI;gBACnB,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC,CAAC;YAEN,MAAM,OAAO,GAAa,CAAC,gBAAgB,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAc,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,OAAO,GACX,EAAE;iBACC,KAAK,CACJ,4CAA4C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gDAC/B,CACnC;iBACA,GAAG,CAAC,GAAI,MAAkB,EAAE,KAAK,CACrC;iBACE,GAAG,CAAC,cAAc,CAAC;gBACpB,kEAAkE;gBAClE,+DAA+D;iBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,GAAG,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,YAAY,EAAE,CAAC,CAAC,YAAY;aAC7B,CAAC,CAAC,CAAC;YAEN,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,EACzE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,EAAE;iBACX,KAAK,CAAC,qDAAqD,CAAC;iBAC5D,GAAG,CAAC,KAAK,CAAQ,CAAC;YACrB,IAAI,QAAQ,EAAE,CAAC;gBACb,+DAA+D;gBAC/D,iEAAiE;gBACjE,qDAAqD;gBACrD,iEAAiE;gBACjE,qDAAqD;gBACrD,MAAM,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,UAAU,CAAC;gBAC9D,MAAM,MAAM,GAAG,eAAe;oBAC5B,CAAC,CAAC,QAAQ,CAAC,MAAM;oBACjB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CACpB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,IAAI,CAAC,CAAC,SAAS,KAAK,aAAa,CACrE,CAAC;gBACN,4DAA4D;gBAC5D,+DAA+D;gBAC/D,yDAAyD;gBACzD,iEAAiE;gBACjE,mEAAmE;gBACnE,oEAAoE;gBACpE,MAAM,MAAM,GAAsB;oBAChC,KAAK;oBACL,YAAY,EAAE,KAAK;oBACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;oBACrC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;oBAC/B,YAAY,EAAE,QAAQ,CAAC,YAAY;oBACnC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9D,CAAC;gBACF,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,GAAG;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAsB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAAE,EACpE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YACtD,mEAAmE;YACnE,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,UAAU,CAAS,EAAE,EAAE,mBAAmB,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAEzC,mEAAmE;YACnE,qEAAqE;YACrE,MAAM,IAAI,GAAG,EAAE;iBACZ,KAAK,CACJ;;6DAEiD,CAClD;iBACA,GAAG,CAAC,KAAK,CAAU,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;YACnD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,OAAO,GAAoB;gBAC/B,QAAQ;gBACR,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;qBACvB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;qBACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3C,IAAI,EAAE,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACrE,OAAO,EAAE,GAAG;oBACZ,GAAG,CAAC;iBACL,CAAC,CAAC;gBACH,QAAQ,EAAE,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAC3E,SAAS,EAAE,GAAG;oBACd,GAAG,CAAC;iBACL,CAAC,CAAC;aACJ,CAAC;YACF,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAAE,EACrE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CACxB,EAAY,EACZ,KAAa,EACb,MAAiC;IAEjC,OAAO,EAAE;SACN,KAAK,CACJ,UAAU,MAAM;;;;;;;;;;;;mCAYa,MAAM;kBACvB,MAAM,EAAE,CACrB;SACA,GAAG,CAAC,KAAK,CAA+C,CAAC;AAC9D,CAAC;AAED,SAAS,GAAG,CAAC,GAAmC,EAAE,GAAW,EAAE,CAAM;IACnE,MAAM,CAAC,GACL,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACX;YACC,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;YACV,gBAAgB,EAAE,CAAC;YACnB,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,CAAC;YAClB,mBAAmB,EAAE,CAAC;YACtB,UAAU,EAAE,CAAC;SACe,CAAC;IACjC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACZ,IAAI,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,0EAA0E;IAC1E,0EAA0E;IAC1E,8BAA8B;IAC9B,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC,kBAAkB,IAAI,IAAI,EAAE,CAAC;QACjC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;IACxE,CAAC;IACD,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,mBAAmB,IAAI,CAAC,CAAC,qBAAqB,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;IACnC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,4EAA4E;AAC5E,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,GAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -2,9 +2,15 @@ import type { Logger } from "@opentelemetry/api-logs";
2
2
  import { Hono } from "hono";
3
3
  import type { Database } from "bun:sqlite";
4
4
  import type { BackendRegistry } from "../agent/backend.js";
5
+ import type { ModelPricingState } from "../pricing/model-pricing.js";
5
6
  export declare function createModelRoutes(deps: {
6
7
  registry: BackendRegistry;
7
8
  db: Database;
9
+ /** The shared pricing instance — its state drives the client's staleness indicator. */
10
+ pricing?: {
11
+ state(): ModelPricingState;
12
+ ensureFresh(): Promise<void>;
13
+ };
8
14
  /** Where refresh failures are reported. */
9
15
  log?: Logger;
10
16
  }): Hono;
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/routes/models.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,eAAe,CAAC;IAC1B,EAAE,EAAE,QAAQ,CAAC;IACb,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAqEP"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/routes/models.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAO3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAQrE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,eAAe,CAAC;IAC1B,EAAE,EAAE,QAAQ,CAAC;IACb,uFAAuF;IACvF,OAAO,CAAC,EAAE;QAAE,KAAK,IAAI,iBAAiB,CAAC;QAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACvE,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CA8GP"}