@tokenbuddy/tokenbuddy 1.0.31 → 1.0.34

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 (57) hide show
  1. package/dist/src/buyer-store.d.ts +26 -0
  2. package/dist/src/buyer-store.d.ts.map +1 -1
  3. package/dist/src/buyer-store.js +61 -8
  4. package/dist/src/buyer-store.js.map +1 -1
  5. package/dist/src/daemon.d.ts +24 -0
  6. package/dist/src/daemon.d.ts.map +1 -1
  7. package/dist/src/daemon.js +1259 -9
  8. package/dist/src/daemon.js.map +1 -1
  9. package/dist/src/doctor-diagnostics.d.ts +12 -0
  10. package/dist/src/doctor-diagnostics.d.ts.map +1 -1
  11. package/dist/src/doctor-diagnostics.js +71 -2
  12. package/dist/src/doctor-diagnostics.js.map +1 -1
  13. package/dist/src/prewarm-cache.js +4 -1
  14. package/dist/src/prewarm-cache.js.map +1 -1
  15. package/dist/src/provider-routing-config.d.ts +91 -0
  16. package/dist/src/provider-routing-config.d.ts.map +1 -0
  17. package/dist/src/provider-routing-config.js +292 -0
  18. package/dist/src/provider-routing-config.js.map +1 -0
  19. package/package.json +1 -1
  20. package/src/buyer-store.ts +113 -8
  21. package/src/daemon.ts +1389 -16
  22. package/src/doctor-diagnostics.ts +100 -1
  23. package/src/prewarm-cache.ts +5 -1
  24. package/src/provider-routing-config.ts +410 -0
  25. package/static/ui/assets/index-0MVXD7bH.css +1 -0
  26. package/static/ui/assets/index-Mt3BZFuP.js +266 -0
  27. package/static/ui/assets/index-Mt3BZFuP.js.map +1 -0
  28. package/static/ui/icons/apple-touch-icon.png +0 -0
  29. package/static/ui/icons/tokenbuddy-192.png +0 -0
  30. package/static/ui/icons/tokenbuddy-512.png +0 -0
  31. package/static/ui/icons/tokenbuddy.svg +6 -0
  32. package/static/ui/index.html +3 -2
  33. package/static/ui/tool-logos/cc-switch.png +0 -0
  34. package/static/ui/tool-logos/claude.svg +1 -0
  35. package/static/ui/tool-logos/cline.svg +1 -0
  36. package/static/ui/tool-logos/codex.svg +1 -0
  37. package/static/ui/tool-logos/cursor.svg +1 -0
  38. package/static/ui/tool-logos/dirac.ico +18 -0
  39. package/static/ui/tool-logos/factory.svg +4 -0
  40. package/static/ui/tool-logos/fast-agent.svg +6 -0
  41. package/static/ui/tool-logos/glm.svg +1 -0
  42. package/static/ui/tool-logos/goose.svg +1 -0
  43. package/static/ui/tool-logos/hermes.svg +1 -0
  44. package/static/ui/tool-logos/kilocode.svg +1 -0
  45. package/static/ui/tool-logos/opencode.svg +1 -0
  46. package/static/ui/tool-logos/pi.svg +28 -0
  47. package/static/ui/tool-logos/qwen-code.png +0 -0
  48. package/tests/cli-routing.test.ts +43 -0
  49. package/tests/control-plane-ui-endpoints.test.ts +776 -0
  50. package/tests/daemon-classify.test.ts +5 -1
  51. package/tests/e2e.test.ts +5 -0
  52. package/tests/prewarm-cache.test.ts +15 -0
  53. package/tests/provider-routing-config.test.ts +150 -0
  54. package/tests/tokenbuddy.test.ts +27 -0
  55. package/static/ui/assets/index-Bzbrp7Qe.css +0 -1
  56. package/static/ui/assets/index-DEDEl8o2.js +0 -236
  57. package/static/ui/assets/index-DEDEl8o2.js.map +0 -1
@@ -0,0 +1,292 @@
1
+ export const PROVIDER_MODE_CONFIG_KEY = "provider-mode";
2
+ export const MANUAL_PROVIDER_CONFIG_KEY = "manual-providers";
3
+ export const AUTO_PROVIDER_CONFIG_KEY = "auto-provider";
4
+ export const MANUAL_PROVIDER_OBSERVATIONS_CONFIG_KEY = "manual-provider-observations";
5
+ const VALID_PROTOCOLS = new Set(["chat_completions", "responses", "messages"]);
6
+ const VALID_SCORERS = new Set(["balanced", "speed", "discount"]);
7
+ export function defaultProviderModeConfig(now = new Date().toISOString()) {
8
+ return {
9
+ mode: "manual",
10
+ updatedAt: now
11
+ };
12
+ }
13
+ export function normalizeProviderModeConfig(value, now = new Date().toISOString()) {
14
+ if (!isRecord(value)) {
15
+ return defaultProviderModeConfig(now);
16
+ }
17
+ return {
18
+ mode: readProviderMode(value.mode),
19
+ updatedAt: readOptionalString(value.updatedAt) ?? now
20
+ };
21
+ }
22
+ export function normalizeManualProvidersConfig(value, now = new Date().toISOString()) {
23
+ if (!isRecord(value)) {
24
+ return {
25
+ version: 1,
26
+ providers: [],
27
+ routing: defaultManualProviderRoutingConfig(),
28
+ updatedAt: now
29
+ };
30
+ }
31
+ const providersValue = Array.isArray(value.providers) ? value.providers : [];
32
+ const seen = new Set();
33
+ const providers = providersValue.map((providerValue) => {
34
+ const provider = normalizeManualProviderConfig(providerValue, { now });
35
+ if (seen.has(provider.id)) {
36
+ throw new Error(`manual provider id is duplicated: ${provider.id}`);
37
+ }
38
+ seen.add(provider.id);
39
+ return provider;
40
+ });
41
+ return {
42
+ version: 1,
43
+ providers,
44
+ routing: normalizeManualProviderRoutingConfig(value.routing),
45
+ updatedAt: readOptionalString(value.updatedAt) ?? now
46
+ };
47
+ }
48
+ export function defaultManualProviderRoutingConfig() {
49
+ return {
50
+ policy: "fallback"
51
+ };
52
+ }
53
+ export function normalizeManualProviderRoutingConfig(value) {
54
+ if (!isRecord(value)) {
55
+ return defaultManualProviderRoutingConfig();
56
+ }
57
+ const policy = readManualProviderRoutingPolicy(value.policy);
58
+ const lockedProviderId = readOptionalString(value.lockedProviderId);
59
+ if (policy === "locked" && !lockedProviderId) {
60
+ throw new Error("manual provider locked routing requires lockedProviderId");
61
+ }
62
+ return {
63
+ policy,
64
+ lockedProviderId: policy === "locked" ? readProviderId(lockedProviderId) : undefined
65
+ };
66
+ }
67
+ export function normalizeManualProviderConfig(value, options = {}) {
68
+ if (!isRecord(value)) {
69
+ throw new Error("manual provider config must be an object");
70
+ }
71
+ if ("apiKey" in value) {
72
+ throw new Error("manual provider config must not contain a raw apiKey; use apiKeyEnv or secretRef");
73
+ }
74
+ const now = options.now ?? new Date().toISOString();
75
+ const id = readProviderId(options.id ?? value.id);
76
+ if (options.existingIds?.has(id)) {
77
+ throw new Error(`manual provider id is duplicated: ${id}`);
78
+ }
79
+ const apiKeyEnv = readOptionalString(value.apiKeyEnv);
80
+ const secretRef = readOptionalString(value.secretRef);
81
+ if (!apiKeyEnv && !secretRef) {
82
+ throw new Error("manual provider requires apiKeyEnv or secretRef");
83
+ }
84
+ if (apiKeyEnv && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(apiKeyEnv)) {
85
+ throw new Error("manual provider apiKeyEnv must be a valid environment variable name");
86
+ }
87
+ return {
88
+ id,
89
+ name: readRequiredString(value.name, "manual provider name"),
90
+ kind: readManualProviderKind(value.kind),
91
+ baseUrl: normalizeProviderBaseUrl(value.baseUrl),
92
+ apiKeyEnv,
93
+ secretRef,
94
+ models: readNonEmptyStringList(value.models, "manual provider models"),
95
+ supportedProtocols: readProtocols(value.supportedProtocols),
96
+ enabled: value.enabled === undefined ? true : value.enabled === true,
97
+ notes: readOptionalString(value.notes),
98
+ createdAt: readOptionalString(value.createdAt) ?? now,
99
+ updatedAt: now
100
+ };
101
+ }
102
+ export function normalizeAutoProviderConfig(value, now = new Date().toISOString()) {
103
+ if (!isRecord(value)) {
104
+ return defaultAutoProviderConfig(now);
105
+ }
106
+ return {
107
+ enabled: value.enabled === true,
108
+ range: readAutoProviderRange(value.range),
109
+ scorer: readScorer(value.scorer),
110
+ modelIds: readStringList(value.modelIds),
111
+ sellerIds: readStringList(value.sellerIds),
112
+ maxConcurrentProviders: 10,
113
+ updatedAt: readOptionalString(value.updatedAt) ?? now
114
+ };
115
+ }
116
+ export function defaultAutoProviderConfig(now = new Date().toISOString()) {
117
+ return {
118
+ enabled: false,
119
+ range: "recommended",
120
+ scorer: "balanced",
121
+ modelIds: [],
122
+ sellerIds: [],
123
+ maxConcurrentProviders: 10,
124
+ updatedAt: now
125
+ };
126
+ }
127
+ export function normalizeManualProviderObservationsConfig(value, now = new Date().toISOString()) {
128
+ if (!isRecord(value)) {
129
+ return {
130
+ version: 1,
131
+ observations: [],
132
+ updatedAt: now
133
+ };
134
+ }
135
+ const observationsValue = Array.isArray(value.observations) ? value.observations : [];
136
+ const seen = new Set();
137
+ const observations = observationsValue
138
+ .filter(isRecord)
139
+ .map((entry) => normalizeManualProviderObservation(entry, now))
140
+ .filter((entry) => {
141
+ if (seen.has(entry.providerId)) {
142
+ return false;
143
+ }
144
+ seen.add(entry.providerId);
145
+ return true;
146
+ });
147
+ return {
148
+ version: 1,
149
+ observations,
150
+ updatedAt: readOptionalString(value.updatedAt) ?? now
151
+ };
152
+ }
153
+ export function publicManualProviderConfig(provider, observation, env = process.env) {
154
+ const keyRef = provider.apiKeyEnv
155
+ ? { kind: "env", name: provider.apiKeyEnv, configured: Boolean(env[provider.apiKeyEnv]) }
156
+ : provider.secretRef
157
+ ? { kind: "secret", name: provider.secretRef, configured: true }
158
+ : undefined;
159
+ const { apiKeyEnv: _apiKeyEnv, secretRef: _secretRef, ...publicProvider } = provider;
160
+ return {
161
+ ...publicProvider,
162
+ keyRef,
163
+ current: observation?.current,
164
+ lastAccess: observation?.lastAccess,
165
+ status: observation?.status,
166
+ errorClass: observation?.errorClass,
167
+ errorMessage: observation?.errorMessage,
168
+ ttftMs: observation?.ttftMs,
169
+ avgTokensPerSecond: observation?.avgTokensPerSecond
170
+ };
171
+ }
172
+ function normalizeManualProviderObservation(value, now) {
173
+ return {
174
+ providerId: readRequiredString(value.providerId, "manual provider observation providerId"),
175
+ current: value.current === true,
176
+ lastAccess: readOptionalString(value.lastAccess) ?? now,
177
+ status: readObservationStatus(value.status),
178
+ errorClass: readOptionalString(value.errorClass),
179
+ errorMessage: readOptionalString(value.errorMessage),
180
+ ttftMs: readOptionalNumber(value.ttftMs),
181
+ avgTokensPerSecond: readOptionalNumber(value.avgTokensPerSecond)
182
+ };
183
+ }
184
+ function readObservationStatus(value) {
185
+ if (value === "healthy" || value === "degraded" || value === "unhealthy" || value === "unknown") {
186
+ return value;
187
+ }
188
+ return "unknown";
189
+ }
190
+ function readProviderMode(value) {
191
+ if (value === "manual" || value === "auto") {
192
+ return value;
193
+ }
194
+ throw new Error("provider mode must be manual or auto");
195
+ }
196
+ function readManualProviderRoutingPolicy(value) {
197
+ if (value === undefined || value === null || value === "" || value === "fallback") {
198
+ return "fallback";
199
+ }
200
+ if (value === "locked") {
201
+ return "locked";
202
+ }
203
+ throw new Error("manual provider routing policy must be fallback or locked");
204
+ }
205
+ function readManualProviderKind(value) {
206
+ if (value === undefined || value === null || value === "" || value === "openai-compatible") {
207
+ return "openai-compatible";
208
+ }
209
+ throw new Error("manual provider kind must be openai-compatible");
210
+ }
211
+ function readAutoProviderRange(value) {
212
+ if (value === undefined || value === null || value === "" || value === "recommended") {
213
+ return "recommended";
214
+ }
215
+ if (value === "custom") {
216
+ return "custom";
217
+ }
218
+ throw new Error("auto provider range must be recommended or custom");
219
+ }
220
+ function readScorer(value) {
221
+ if (value === undefined || value === null || value === "") {
222
+ return "balanced";
223
+ }
224
+ if (typeof value === "string" && VALID_SCORERS.has(value)) {
225
+ return value;
226
+ }
227
+ throw new Error("auto provider scorer must be balanced, speed, or discount");
228
+ }
229
+ function readProtocols(value) {
230
+ const protocols = readStringList(value);
231
+ if (protocols.length === 0) {
232
+ return ["chat_completions"];
233
+ }
234
+ const invalid = protocols.find((protocol) => !VALID_PROTOCOLS.has(protocol));
235
+ if (invalid) {
236
+ throw new Error(`manual provider protocol is invalid: ${invalid}`);
237
+ }
238
+ return protocols;
239
+ }
240
+ function normalizeProviderBaseUrl(value) {
241
+ const raw = readRequiredString(value, "manual provider baseUrl");
242
+ let parsed;
243
+ try {
244
+ parsed = new URL(raw);
245
+ }
246
+ catch {
247
+ throw new Error("manual provider baseUrl must be a valid URL");
248
+ }
249
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
250
+ throw new Error("manual provider baseUrl must use http or https");
251
+ }
252
+ return parsed.toString().replace(/\/+$/, "");
253
+ }
254
+ function readProviderId(value) {
255
+ const id = readRequiredString(value, "manual provider id");
256
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]{1,63}$/.test(id)) {
257
+ throw new Error("manual provider id must be 2-64 characters of letters, numbers, underscore, or dash");
258
+ }
259
+ return id;
260
+ }
261
+ function readRequiredString(value, label) {
262
+ if (typeof value !== "string" || value.trim().length === 0) {
263
+ throw new Error(`${label} is required`);
264
+ }
265
+ return value.trim();
266
+ }
267
+ function readOptionalString(value) {
268
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
269
+ }
270
+ function readOptionalNumber(value) {
271
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
272
+ }
273
+ function readNonEmptyStringList(value, label) {
274
+ const entries = readStringList(value);
275
+ if (entries.length === 0) {
276
+ throw new Error(`${label} must contain at least one value`);
277
+ }
278
+ return entries;
279
+ }
280
+ function readStringList(value) {
281
+ if (!Array.isArray(value)) {
282
+ return [];
283
+ }
284
+ return value
285
+ .filter((entry) => typeof entry === "string")
286
+ .map((entry) => entry.trim())
287
+ .filter((entry, index, all) => entry.length > 0 && all.indexOf(entry) === index);
288
+ }
289
+ function isRecord(value) {
290
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
291
+ }
292
+ //# sourceMappingURL=provider-routing-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-routing-config.js","sourceRoot":"","sources":["../../src/provider-routing-config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tokenbuddy/tokenbuddy",
3
- "version": "1.0.31",
3
+ "version": "1.0.34",
4
4
  "description": "TokenBuddy Client CLI and Daemon",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -64,6 +64,9 @@ export interface PurchaseLedgerInput {
64
64
  status: string;
65
65
  creditMicros: number;
66
66
  currency: string;
67
+ paymentAmount?: string;
68
+ paymentAmountMinor?: number;
69
+ paymentCurrency?: string;
67
70
  paymentReference?: string;
68
71
  completedAt?: string;
69
72
  }
@@ -80,6 +83,9 @@ export interface SafePurchaseLedgerEntry {
80
83
  status: string;
81
84
  creditMicros: number;
82
85
  currency: string;
86
+ paymentAmount?: string;
87
+ paymentAmountMinor?: number;
88
+ paymentCurrency?: string;
83
89
  paymentReferenceHash?: string;
84
90
  createdAt: string;
85
91
  completedAt?: string;
@@ -106,11 +112,21 @@ export interface InferenceLedgerInput {
106
112
  status: string;
107
113
  promptTokens: number;
108
114
  completionTokens: number;
115
+ cacheReadTokens?: number;
109
116
  billedMicros: number;
110
117
  estimatedMicros?: number;
111
118
  settledMicros?: number;
112
119
  settledUsdMicros?: number;
113
120
  priceVersion?: string;
121
+ inputPriceMicrosPer1m?: number;
122
+ outputPriceMicrosPer1m?: number;
123
+ cacheReadPriceMicrosPer1m?: number;
124
+ inputCostMicros?: number;
125
+ outputCostMicros?: number;
126
+ cacheReadCostMicros?: number;
127
+ originalUsdMicros?: number;
128
+ billingMultiplier?: number;
129
+ serviceTier?: string;
114
130
  balanceSnapshotMicros?: number;
115
131
  balanceSource?: string;
116
132
  prompt?: string;
@@ -136,11 +152,21 @@ export interface SafeInferenceLedgerEntry {
136
152
  status: string;
137
153
  promptTokens: number;
138
154
  completionTokens: number;
155
+ cacheReadTokens: number;
139
156
  billedMicros: number;
140
157
  estimatedMicros?: number;
141
158
  settledMicros?: number;
142
159
  settledUsdMicros?: number;
143
160
  priceVersion?: string;
161
+ inputPriceMicrosPer1m?: number;
162
+ outputPriceMicrosPer1m?: number;
163
+ cacheReadPriceMicrosPer1m?: number;
164
+ inputCostMicros?: number;
165
+ outputCostMicros?: number;
166
+ cacheReadCostMicros?: number;
167
+ originalUsdMicros?: number;
168
+ billingMultiplier?: number;
169
+ serviceTier?: string;
144
170
  balanceSnapshotMicros?: number;
145
171
  balanceSource?: string;
146
172
  promptHash?: string;
@@ -609,8 +635,9 @@ export class BuyerStore {
609
635
  this.db.prepare(
610
636
  `INSERT INTO purchase_ledger (
611
637
  purchase_id, seller_key, model_id, payment_method, status, credit_micros,
612
- currency, payment_reference_hash, created_at, completed_at
613
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
638
+ currency, payment_amount, payment_amount_minor, payment_currency,
639
+ payment_reference_hash, created_at, completed_at
640
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
614
641
  ).run(
615
642
  input.purchaseId,
616
643
  input.sellerKey,
@@ -619,6 +646,9 @@ export class BuyerStore {
619
646
  input.status,
620
647
  input.creditMicros,
621
648
  input.currency,
649
+ input.paymentAmount ?? null,
650
+ input.paymentAmountMinor ?? null,
651
+ input.paymentCurrency ?? null,
622
652
  safeHash(input.paymentReference) || null,
623
653
  createdAt,
624
654
  input.completedAt || null
@@ -628,7 +658,8 @@ export class BuyerStore {
628
658
  public listPurchaseLedger(): SafePurchaseLedgerEntry[] {
629
659
  const rows = this.db.prepare(
630
660
  `SELECT purchase_id, seller_key, model_id, payment_method, status, credit_micros,
631
- currency, payment_reference_hash, created_at, completed_at
661
+ currency, payment_amount, payment_amount_minor, payment_currency,
662
+ payment_reference_hash, created_at, completed_at
632
663
  FROM purchase_ledger
633
664
  ORDER BY id ASC`
634
665
  ).all() as Array<{
@@ -639,6 +670,9 @@ export class BuyerStore {
639
670
  status: string;
640
671
  credit_micros: number;
641
672
  currency: string;
673
+ payment_amount: string | null;
674
+ payment_amount_minor: number | null;
675
+ payment_currency: string | null;
642
676
  payment_reference_hash: string | null;
643
677
  created_at: string;
644
678
  completed_at: string | null;
@@ -652,6 +686,9 @@ export class BuyerStore {
652
686
  status: row.status,
653
687
  creditMicros: row.credit_micros,
654
688
  currency: row.currency,
689
+ paymentAmount: row.payment_amount || undefined,
690
+ paymentAmountMinor: row.payment_amount_minor ?? undefined,
691
+ paymentCurrency: row.payment_currency || undefined,
655
692
  paymentReferenceHash: row.payment_reference_hash || undefined,
656
693
  createdAt: row.created_at,
657
694
  completedAt: row.completed_at || undefined
@@ -662,12 +699,16 @@ export class BuyerStore {
662
699
  this.db.prepare(
663
700
  `INSERT INTO inference_ledger (
664
701
  request_id, seller_key, model_id, endpoint, status, prompt_tokens,
665
- completion_tokens, billed_micros, estimated_micros, settled_micros,
666
- settled_usd_micros, price_version, balance_snapshot_micros, balance_source,
702
+ completion_tokens, cache_read_tokens, billed_micros, estimated_micros, settled_micros,
703
+ settled_usd_micros, price_version,
704
+ input_price_micros_per_1m, output_price_micros_per_1m, cache_read_price_micros_per_1m,
705
+ input_cost_micros, output_cost_micros, cache_read_cost_micros,
706
+ original_usd_micros, billing_multiplier, service_tier,
707
+ balance_snapshot_micros, balance_source,
667
708
  prompt_hash, response_hash, created_at,
668
709
  ttft_ms, fallback_count, route_reason, fallover_chain_json, upstream_status,
669
710
  duration_ms, payment_method
670
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
711
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
671
712
  ).run(
672
713
  input.requestId,
673
714
  input.sellerKey,
@@ -676,11 +717,21 @@ export class BuyerStore {
676
717
  input.status,
677
718
  input.promptTokens,
678
719
  input.completionTokens,
720
+ input.cacheReadTokens ?? 0,
679
721
  input.billedMicros,
680
722
  input.estimatedMicros ?? input.billedMicros,
681
723
  input.settledMicros ?? null,
682
724
  input.settledUsdMicros ?? null,
683
725
  input.priceVersion || null,
726
+ input.inputPriceMicrosPer1m ?? null,
727
+ input.outputPriceMicrosPer1m ?? null,
728
+ input.cacheReadPriceMicrosPer1m ?? null,
729
+ input.inputCostMicros ?? null,
730
+ input.outputCostMicros ?? null,
731
+ input.cacheReadCostMicros ?? null,
732
+ input.originalUsdMicros ?? null,
733
+ input.billingMultiplier ?? null,
734
+ input.serviceTier ?? null,
684
735
  input.balanceSnapshotMicros ?? null,
685
736
  input.balanceSource || "unknown",
686
737
  safeHash(input.prompt) || null,
@@ -699,8 +750,12 @@ export class BuyerStore {
699
750
  public listInferenceLedger(): SafeInferenceLedgerEntry[] {
700
751
  const rows = this.db.prepare(
701
752
  `SELECT request_id, seller_key, model_id, endpoint, status, prompt_tokens,
702
- completion_tokens, billed_micros, estimated_micros, settled_micros,
703
- settled_usd_micros, price_version, balance_snapshot_micros, balance_source,
753
+ completion_tokens, cache_read_tokens, billed_micros, estimated_micros, settled_micros,
754
+ settled_usd_micros, price_version,
755
+ input_price_micros_per_1m, output_price_micros_per_1m, cache_read_price_micros_per_1m,
756
+ input_cost_micros, output_cost_micros, cache_read_cost_micros,
757
+ original_usd_micros, billing_multiplier, service_tier,
758
+ balance_snapshot_micros, balance_source,
704
759
  prompt_hash, response_hash, created_at,
705
760
  ttft_ms, fallback_count, route_reason, fallover_chain_json, upstream_status,
706
761
  duration_ms, payment_method
@@ -714,11 +769,21 @@ export class BuyerStore {
714
769
  status: string;
715
770
  prompt_tokens: number;
716
771
  completion_tokens: number;
772
+ cache_read_tokens: number;
717
773
  billed_micros: number;
718
774
  estimated_micros: number | null;
719
775
  settled_micros: number | null;
720
776
  settled_usd_micros: number | null;
721
777
  price_version: string | null;
778
+ input_price_micros_per_1m: number | null;
779
+ output_price_micros_per_1m: number | null;
780
+ cache_read_price_micros_per_1m: number | null;
781
+ input_cost_micros: number | null;
782
+ output_cost_micros: number | null;
783
+ cache_read_cost_micros: number | null;
784
+ original_usd_micros: number | null;
785
+ billing_multiplier: number | null;
786
+ service_tier: string | null;
722
787
  balance_snapshot_micros: number | null;
723
788
  balance_source: string | null;
724
789
  prompt_hash: string | null;
@@ -741,11 +806,21 @@ export class BuyerStore {
741
806
  status: row.status,
742
807
  promptTokens: row.prompt_tokens,
743
808
  completionTokens: row.completion_tokens,
809
+ cacheReadTokens: row.cache_read_tokens,
744
810
  billedMicros: row.billed_micros,
745
811
  estimatedMicros: row.estimated_micros ?? undefined,
746
812
  settledMicros: row.settled_micros ?? undefined,
747
813
  settledUsdMicros: row.settled_usd_micros ?? undefined,
748
814
  priceVersion: row.price_version || undefined,
815
+ inputPriceMicrosPer1m: row.input_price_micros_per_1m ?? undefined,
816
+ outputPriceMicrosPer1m: row.output_price_micros_per_1m ?? undefined,
817
+ cacheReadPriceMicrosPer1m: row.cache_read_price_micros_per_1m ?? undefined,
818
+ inputCostMicros: row.input_cost_micros ?? undefined,
819
+ outputCostMicros: row.output_cost_micros ?? undefined,
820
+ cacheReadCostMicros: row.cache_read_cost_micros ?? undefined,
821
+ originalUsdMicros: row.original_usd_micros ?? undefined,
822
+ billingMultiplier: row.billing_multiplier ?? undefined,
823
+ serviceTier: row.service_tier || undefined,
749
824
  balanceSnapshotMicros: row.balance_snapshot_micros ?? undefined,
750
825
  balanceSource: row.balance_source || undefined,
751
826
  promptHash: row.prompt_hash || undefined,
@@ -810,6 +885,9 @@ export class BuyerStore {
810
885
  status TEXT NOT NULL,
811
886
  credit_micros INTEGER NOT NULL,
812
887
  currency TEXT NOT NULL,
888
+ payment_amount TEXT,
889
+ payment_amount_minor INTEGER,
890
+ payment_currency TEXT,
813
891
  payment_reference_hash TEXT,
814
892
  created_at TEXT NOT NULL,
815
893
  completed_at TEXT
@@ -824,11 +902,21 @@ export class BuyerStore {
824
902
  status TEXT NOT NULL,
825
903
  prompt_tokens INTEGER NOT NULL,
826
904
  completion_tokens INTEGER NOT NULL,
905
+ cache_read_tokens INTEGER NOT NULL DEFAULT 0,
827
906
  billed_micros INTEGER NOT NULL,
828
907
  estimated_micros INTEGER,
829
908
  settled_micros INTEGER,
830
909
  settled_usd_micros INTEGER,
831
910
  price_version TEXT,
911
+ input_price_micros_per_1m INTEGER,
912
+ output_price_micros_per_1m INTEGER,
913
+ cache_read_price_micros_per_1m INTEGER,
914
+ input_cost_micros INTEGER,
915
+ output_cost_micros INTEGER,
916
+ cache_read_cost_micros INTEGER,
917
+ original_usd_micros INTEGER,
918
+ billing_multiplier REAL,
919
+ service_tier TEXT,
832
920
  balance_snapshot_micros INTEGER,
833
921
  balance_source TEXT,
834
922
  prompt_hash TEXT,
@@ -871,11 +959,28 @@ export class BuyerStore {
871
959
  ]) {
872
960
  this.ensureColumn("token_cache", column, definition);
873
961
  }
962
+ for (const [column, definition] of [
963
+ ["payment_amount", "TEXT"],
964
+ ["payment_amount_minor", "INTEGER"],
965
+ ["payment_currency", "TEXT"]
966
+ ]) {
967
+ this.ensureColumn("purchase_ledger", column, definition);
968
+ }
874
969
  for (const [column, definition] of [
875
970
  ["estimated_micros", "INTEGER"],
971
+ ["cache_read_tokens", "INTEGER NOT NULL DEFAULT 0"],
876
972
  ["settled_micros", "INTEGER"],
877
973
  ["settled_usd_micros", "INTEGER"],
878
974
  ["price_version", "TEXT"],
975
+ ["input_price_micros_per_1m", "INTEGER"],
976
+ ["output_price_micros_per_1m", "INTEGER"],
977
+ ["cache_read_price_micros_per_1m", "INTEGER"],
978
+ ["input_cost_micros", "INTEGER"],
979
+ ["output_cost_micros", "INTEGER"],
980
+ ["cache_read_cost_micros", "INTEGER"],
981
+ ["original_usd_micros", "INTEGER"],
982
+ ["billing_multiplier", "REAL"],
983
+ ["service_tier", "TEXT"],
879
984
  ["balance_snapshot_micros", "INTEGER"],
880
985
  ["balance_source", "TEXT"],
881
986
  ["ttft_ms", "INTEGER"],