@tokenbuddy/tokenbuddy 1.0.5 → 1.0.6

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 (40) hide show
  1. package/dist/src/buyer-store.d.ts +20 -0
  2. package/dist/src/buyer-store.d.ts.map +1 -1
  3. package/dist/src/buyer-store.js +73 -1
  4. package/dist/src/buyer-store.js.map +1 -1
  5. package/dist/src/cli.d.ts.map +1 -1
  6. package/dist/src/cli.js +390 -62
  7. package/dist/src/cli.js.map +1 -1
  8. package/dist/src/daemon.d.ts +6 -5
  9. package/dist/src/daemon.d.ts.map +1 -1
  10. package/dist/src/daemon.js +298 -92
  11. package/dist/src/daemon.js.map +1 -1
  12. package/dist/src/doctor-diagnostics.d.ts +97 -0
  13. package/dist/src/doctor-diagnostics.d.ts.map +1 -0
  14. package/dist/src/doctor-diagnostics.js +547 -0
  15. package/dist/src/doctor-diagnostics.js.map +1 -0
  16. package/dist/src/init-payment-options.d.ts +34 -0
  17. package/dist/src/init-payment-options.d.ts.map +1 -0
  18. package/dist/src/init-payment-options.js +90 -0
  19. package/dist/src/init-payment-options.js.map +1 -0
  20. package/dist/src/provider-install.d.ts +37 -2
  21. package/dist/src/provider-install.d.ts.map +1 -1
  22. package/dist/src/provider-install.js +317 -67
  23. package/dist/src/provider-install.js.map +1 -1
  24. package/dist/src/seller-catalog.d.ts +79 -0
  25. package/dist/src/seller-catalog.d.ts.map +1 -0
  26. package/dist/src/seller-catalog.js +126 -0
  27. package/dist/src/seller-catalog.js.map +1 -0
  28. package/dist/src/tb-proxyd.js +13 -2
  29. package/dist/src/tb-proxyd.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/buyer-store.ts +113 -1
  32. package/src/cli.ts +490 -67
  33. package/src/daemon.ts +346 -117
  34. package/src/doctor-diagnostics.ts +850 -0
  35. package/src/init-payment-options.ts +131 -0
  36. package/src/provider-install.ts +426 -76
  37. package/src/seller-catalog.ts +222 -0
  38. package/src/tb-proxyd.ts +14 -2
  39. package/tests/e2e.test.ts +9 -0
  40. package/tests/tokenbuddy.test.ts +628 -19
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-catalog.d.ts","sourceRoot":"","sources":["../../src/seller-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import { createModuleLogger } from "@tokenbuddy/logging";
2
+ const logger = createModuleLogger("tb-proxyd");
3
+ export function normalizeSellerUrl(seller) {
4
+ return seller.url.replace(/\/+$/, "");
5
+ }
6
+ export function manifestProtocols(manifest, seller) {
7
+ const protocols = manifest.supportedProtocols || manifest.supported_protocols || seller.supportedProtocols || [];
8
+ return protocols.includes("anthropic_messages") && !protocols.includes("messages")
9
+ ? [...protocols, "messages"]
10
+ : protocols;
11
+ }
12
+ export function manifestPaymentMethods(manifest, seller) {
13
+ return manifest.paymentMethods || manifest.payment_methods || seller.paymentMethods || [];
14
+ }
15
+ export function manifestModelIds(manifest) {
16
+ return (manifest.models || [])
17
+ .map((model) => model.id)
18
+ .filter((id) => typeof id === "string" && id.trim().length > 0)
19
+ .map((id) => id.trim());
20
+ }
21
+ function numericPriceField(value) {
22
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
23
+ }
24
+ function manifestModels(manifest) {
25
+ return (manifest.models || [])
26
+ .filter((model) => Boolean(model?.id && typeof model.id === "string"));
27
+ }
28
+ export async function fetchSellerRegistry(registryUrl) {
29
+ const response = await fetch(registryUrl);
30
+ if (!response.ok) {
31
+ throw new Error(`registry returned ${response.status}`);
32
+ }
33
+ const data = await response.json();
34
+ if (!data || !Array.isArray(data.sellers)) {
35
+ throw new Error("registry response missing sellers");
36
+ }
37
+ return data;
38
+ }
39
+ export async function fetchSellerManifest(seller) {
40
+ const response = await fetch(`${normalizeSellerUrl(seller)}/manifest`);
41
+ if (!response.ok) {
42
+ throw new Error(`manifest returned ${response.status}`);
43
+ }
44
+ return await response.json();
45
+ }
46
+ export async function discoverSellerBackedModels(registryUrl) {
47
+ const registry = await fetchSellerRegistry(registryUrl);
48
+ const sellerResults = await Promise.all(registry.sellers.map(async (seller) => {
49
+ try {
50
+ const manifest = await fetchSellerManifest(seller);
51
+ const protocols = manifestProtocols(manifest, seller);
52
+ const paymentMethods = manifestPaymentMethods(manifest, seller);
53
+ const models = manifestModels(manifest).map((model) => ({
54
+ id: model.id.trim(),
55
+ sellerId: seller.id,
56
+ sellerName: seller.name,
57
+ sellerUrl: seller.url,
58
+ supportedProtocols: protocols,
59
+ paymentMethods,
60
+ inputPriceMicrosPer1m: numericPriceField(model.inputPriceMicrosPer1m) ?? numericPriceField(model.input_price_micros_per_1m),
61
+ outputPriceMicrosPer1m: numericPriceField(model.outputPriceMicrosPer1m) ?? numericPriceField(model.output_price_micros_per_1m),
62
+ }));
63
+ return {
64
+ seller: {
65
+ id: seller.id,
66
+ name: seller.name,
67
+ url: seller.url,
68
+ status: "ok",
69
+ manifestSellerId: manifest.sellerId || manifest.seller_id || seller.id,
70
+ discountRatio: manifest.selection?.discountRatio ?? manifest.selection?.discount_ratio,
71
+ modelCount: models.length,
72
+ supportedProtocols: protocols,
73
+ paymentMethods,
74
+ },
75
+ models
76
+ };
77
+ }
78
+ catch (error) {
79
+ const errorMessage = error instanceof Error ? error.message : String(error);
80
+ logger.warn("models.refresh.seller_failed", "seller manifest refresh failed", {
81
+ sellerId: seller.id,
82
+ errorMessage
83
+ });
84
+ return {
85
+ seller: {
86
+ id: seller.id,
87
+ name: seller.name,
88
+ url: seller.url,
89
+ status: "failed",
90
+ errorMessage
91
+ },
92
+ models: []
93
+ };
94
+ }
95
+ }));
96
+ return {
97
+ registryUrl,
98
+ version: registry.version,
99
+ defaultSeller: registry.defaultSeller,
100
+ models: sellerResults.flatMap((entry) => entry.models),
101
+ sellers: sellerResults.map((entry) => entry.seller)
102
+ };
103
+ }
104
+ export function filterCatalogByProtocol(models, protocol) {
105
+ return models.filter((entry) => entry.supportedProtocols.includes(protocol));
106
+ }
107
+ export function filterCatalogBySeller(models, sellerId) {
108
+ if (!sellerId) {
109
+ return models;
110
+ }
111
+ return models.filter((entry) => entry.sellerId === sellerId);
112
+ }
113
+ export function dedupeCatalogEntries(models) {
114
+ const seen = new Set();
115
+ const output = [];
116
+ for (const entry of models) {
117
+ const key = `${entry.sellerId}:${entry.id}`;
118
+ if (seen.has(key)) {
119
+ continue;
120
+ }
121
+ seen.add(key);
122
+ output.push(entry);
123
+ }
124
+ return output;
125
+ }
126
+ //# sourceMappingURL=seller-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-catalog.js","sourceRoot":"","sources":["../../src/seller-catalog.ts"],"names":[],"mappings":"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"}
@@ -7,19 +7,22 @@ const controlPort = parsePortEnv("TB_PROXYD_CONTROL_PORT", 17820);
7
7
  const proxyPort = parsePortEnv("TB_PROXYD_PROXY_PORT", 17821);
8
8
  const sellerRegistryUrl = process.env.TB_PROXYD_SELLER_REGISTRY_URL || "https://tb-wallet-bootstrap.fly.dev/registry/sellers";
9
9
  const selectionMode = parseSelectionModeEnv();
10
+ const selectedSellerId = parseSelectedSellerIdEnv();
10
11
  const daemon = new TokenbuddyDaemon({
11
12
  controlPort,
12
13
  proxyPort,
13
14
  dbPath,
14
15
  sellerRegistryUrl,
15
- selectionMode
16
+ selectionMode,
17
+ selectedSellerId
16
18
  });
17
19
  logger.info("proxy.process.initializing", "tb-proxyd process initializing", {
18
20
  dbPath,
19
21
  controlPort,
20
22
  proxyPort,
21
23
  sellerRegistryUrl,
22
- selectionMode
24
+ selectionMode,
25
+ selectedSellerId
23
26
  });
24
27
  daemon.start();
25
28
  // Handle graceful stop
@@ -51,4 +54,12 @@ function parseSelectionModeEnv() {
51
54
  }
52
55
  throw new Error("TB_PROXYD_SELECTION_MODE must be auto or manual");
53
56
  }
57
+ function parseSelectedSellerIdEnv() {
58
+ const rawValue = process.env.TB_PROXYD_SELECTED_SELLER_ID;
59
+ if (!rawValue) {
60
+ return undefined;
61
+ }
62
+ const trimmed = rawValue.trim();
63
+ return trimmed || undefined;
64
+ }
54
65
  //# sourceMappingURL=tb-proxyd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tb-proxyd.js","sourceRoot":"","sources":["../../src/tb-proxyd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAE/C,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;AACvC,MAAM,WAAW,GAAG,YAAY,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAClE,MAAM,SAAS,GAAG,YAAY,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;AAC9D,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,sDAAsD,CAAC;AAC9H,MAAM,aAAa,GAAG,qBAAqB,EAAE,CAAC;AAE9C,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC;IAClC,WAAW;IACX,SAAS;IACT,MAAM;IACN,iBAAiB;IACjB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,gCAAgC,EAAE;IAC1E,MAAM;IACN,WAAW;IACX,SAAS;IACT,iBAAiB;IACjB,aAAa;CACd,CAAC,CAAC;AACH,MAAM,CAAC,KAAK,EAAE,CAAC;AAEf,uBAAuB;AACvB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,oCAAoC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3F,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,oCAAoC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1F,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,IAAY,EAAE,QAAgB;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,8CAA8C,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,MAAM,CAAC;IAChE,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"tb-proxyd.js","sourceRoot":"","sources":["../../src/tb-proxyd.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.5",
3
+ "version": "1.0.6",
4
4
  "description": "TokenBuddy Client CLI and Daemon",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -90,6 +90,8 @@ export interface BuyerStoreSummary {
90
90
  pendingPurchasesCount: number;
91
91
  purchaseLedgerCount: number;
92
92
  inferenceLedgerCount: number;
93
+ providerRuntimeConfigCount: number;
94
+ daemonRuntimeConfigCount: number;
93
95
  }
94
96
 
95
97
  export interface ProviderInstallSnapshot {
@@ -101,6 +103,20 @@ export interface ProviderInstallSnapshot {
101
103
  }>;
102
104
  }
103
105
 
106
+ export interface ProviderRuntimeConfigRecord<T = unknown> {
107
+ providerId: string;
108
+ config: T;
109
+ createdAt: string;
110
+ updatedAt: string;
111
+ }
112
+
113
+ export interface DaemonRuntimeConfigRecord<T = unknown> {
114
+ configKey: string;
115
+ config: T;
116
+ createdAt: string;
117
+ updatedAt: string;
118
+ }
119
+
104
120
  export interface BuyerStoreOptions {
105
121
  root?: string;
106
122
  dbPath?: string;
@@ -158,7 +174,9 @@ export class BuyerStore {
158
174
  paymentsCount: this.countRows("payment_config"),
159
175
  pendingPurchasesCount: this.countRows("pending_purchases"),
160
176
  purchaseLedgerCount: this.countRows("purchase_ledger"),
161
- inferenceLedgerCount: this.countRows("inference_ledger")
177
+ inferenceLedgerCount: this.countRows("inference_ledger"),
178
+ providerRuntimeConfigCount: this.countRows("provider_runtime_config"),
179
+ daemonRuntimeConfigCount: this.countRows("daemon_runtime_config")
162
180
  };
163
181
  }
164
182
 
@@ -196,6 +214,86 @@ export class BuyerStore {
196
214
  return result.changes > 0;
197
215
  }
198
216
 
217
+ public saveProviderRuntimeConfig(providerId: string, config: unknown): void {
218
+ const updatedAt = nowIso();
219
+ this.db.prepare(
220
+ `INSERT OR REPLACE INTO provider_runtime_config (
221
+ provider_id, runtime_json, created_at, updated_at
222
+ ) VALUES (
223
+ ?, ?,
224
+ COALESCE((SELECT created_at FROM provider_runtime_config WHERE provider_id = ?), ?),
225
+ ?
226
+ )`
227
+ ).run(providerId, JSON.stringify(config), providerId, updatedAt, updatedAt);
228
+ }
229
+
230
+ public getProviderRuntimeConfig<T = unknown>(providerId: string): ProviderRuntimeConfigRecord<T> | undefined {
231
+ const row = this.db.prepare(
232
+ `SELECT provider_id, runtime_json, created_at, updated_at
233
+ FROM provider_runtime_config
234
+ WHERE provider_id = ?`
235
+ ).get(providerId) as {
236
+ provider_id: string;
237
+ runtime_json: string;
238
+ created_at: string;
239
+ updated_at: string;
240
+ } | undefined;
241
+ if (!row) {
242
+ return undefined;
243
+ }
244
+ return {
245
+ providerId: row.provider_id,
246
+ config: JSON.parse(row.runtime_json) as T,
247
+ createdAt: row.created_at,
248
+ updatedAt: row.updated_at
249
+ };
250
+ }
251
+
252
+ public removeProviderRuntimeConfig(providerId: string): boolean {
253
+ const result = this.db.prepare("DELETE FROM provider_runtime_config WHERE provider_id = ?").run(providerId) as { changes: number };
254
+ return result.changes > 0;
255
+ }
256
+
257
+ public saveDaemonRuntimeConfig(configKey: string, config: unknown): void {
258
+ const updatedAt = nowIso();
259
+ this.db.prepare(
260
+ `INSERT OR REPLACE INTO daemon_runtime_config (
261
+ config_key, config_json, created_at, updated_at
262
+ ) VALUES (
263
+ ?, ?,
264
+ COALESCE((SELECT created_at FROM daemon_runtime_config WHERE config_key = ?), ?),
265
+ ?
266
+ )`
267
+ ).run(configKey, JSON.stringify(config), configKey, updatedAt, updatedAt);
268
+ }
269
+
270
+ public getDaemonRuntimeConfig<T = unknown>(configKey: string): DaemonRuntimeConfigRecord<T> | undefined {
271
+ const row = this.db.prepare(
272
+ `SELECT config_key, config_json, created_at, updated_at
273
+ FROM daemon_runtime_config
274
+ WHERE config_key = ?`
275
+ ).get(configKey) as {
276
+ config_key: string;
277
+ config_json: string;
278
+ created_at: string;
279
+ updated_at: string;
280
+ } | undefined;
281
+ if (!row) {
282
+ return undefined;
283
+ }
284
+ return {
285
+ configKey: row.config_key,
286
+ config: JSON.parse(row.config_json) as T,
287
+ createdAt: row.created_at,
288
+ updatedAt: row.updated_at
289
+ };
290
+ }
291
+
292
+ public removeDaemonRuntimeConfig(configKey: string): boolean {
293
+ const result = this.db.prepare("DELETE FROM daemon_runtime_config WHERE config_key = ?").run(configKey) as { changes: number };
294
+ return result.changes > 0;
295
+ }
296
+
199
297
  public getToken(sellerKey: string): CachedToken | undefined {
200
298
  const stmt = this.db.prepare("SELECT token, balance_micros FROM token_cache WHERE seller_key = ?");
201
299
  const row = stmt.get(sellerKey) as { token: string; balance_micros: number } | undefined;
@@ -526,6 +624,20 @@ export class BuyerStore {
526
624
  created_at TEXT NOT NULL,
527
625
  updated_at TEXT NOT NULL
528
626
  );
627
+
628
+ CREATE TABLE IF NOT EXISTS provider_runtime_config (
629
+ provider_id TEXT PRIMARY KEY,
630
+ runtime_json TEXT NOT NULL,
631
+ created_at TEXT NOT NULL,
632
+ updated_at TEXT NOT NULL
633
+ );
634
+
635
+ CREATE TABLE IF NOT EXISTS daemon_runtime_config (
636
+ config_key TEXT PRIMARY KEY,
637
+ config_json TEXT NOT NULL,
638
+ created_at TEXT NOT NULL,
639
+ updated_at TEXT NOT NULL
640
+ );
529
641
  `);
530
642
  }
531
643