@tokenbuddy/tokenbuddy 1.0.4 → 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 (42) 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 +4 -4
  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
  41. package/bin/tb-proxyd.js +0 -2
  42. package/bin/tb.js +0 -3
@@ -0,0 +1,547 @@
1
+ import { BuyerStore } from "./buyer-store.js";
2
+ import Table from "cli-table3";
3
+ import { detectProviders, PROXY_ACCESS_TOKEN_PLACEHOLDER, SUPPORTED_PROVIDER_IDS, } from "./provider-install.js";
4
+ import { discoverSellerBackedModels, } from "./seller-catalog.js";
5
+ function parseJsonText(text) {
6
+ if (!text.trim()) {
7
+ return undefined;
8
+ }
9
+ return JSON.parse(text);
10
+ }
11
+ function extractRemoteError(payload, fallback) {
12
+ if (payload && typeof payload === "object") {
13
+ if ("error" in payload) {
14
+ const error = payload.error;
15
+ if (typeof error === "string" && error.trim()) {
16
+ return error;
17
+ }
18
+ if (error && typeof error === "object" && "message" in error && typeof error.message === "string" && error.message.trim()) {
19
+ return error.message;
20
+ }
21
+ }
22
+ if ("message" in payload && typeof payload.message === "string" && payload.message.trim()) {
23
+ return payload.message;
24
+ }
25
+ }
26
+ return fallback;
27
+ }
28
+ async function fetchJsonDocument(url) {
29
+ try {
30
+ const response = await fetch(url);
31
+ const text = await response.text();
32
+ const payload = text ? parseJsonText(text) : undefined;
33
+ if (!response.ok) {
34
+ return {
35
+ url,
36
+ available: false,
37
+ statusCode: response.status,
38
+ error: extractRemoteError(payload, `HTTP ${response.status}`),
39
+ };
40
+ }
41
+ return {
42
+ url,
43
+ available: true,
44
+ statusCode: response.status,
45
+ data: payload,
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ url,
51
+ available: false,
52
+ error: error instanceof Error ? error.message : String(error),
53
+ };
54
+ }
55
+ }
56
+ function providerRuntimeSummary(runtimeConfig) {
57
+ if (!runtimeConfig) {
58
+ return undefined;
59
+ }
60
+ if (runtimeConfig.selectionKind === "single-model") {
61
+ return [
62
+ runtimeConfig.protocolPreference,
63
+ runtimeConfig.defaultModel,
64
+ runtimeConfig.sellerId ? `seller=${runtimeConfig.sellerId}` : undefined,
65
+ ].filter(Boolean).join(" · ");
66
+ }
67
+ const bindings = [
68
+ runtimeConfig.roles.haiku?.upstreamModel ? `haiku=${runtimeConfig.roles.haiku.upstreamModel}` : undefined,
69
+ runtimeConfig.roles.sonnet?.upstreamModel ? `sonnet=${runtimeConfig.roles.sonnet.upstreamModel}` : undefined,
70
+ runtimeConfig.roles.opus?.upstreamModel ? `opus=${runtimeConfig.roles.opus.upstreamModel}` : undefined,
71
+ runtimeConfig.fallbackModel ? `fallback=${runtimeConfig.fallbackModel}` : undefined,
72
+ ].filter(Boolean);
73
+ return [runtimeConfig.protocolPreference, ...bindings].join(" · ");
74
+ }
75
+ function mergeDoctorSellerEntries(configuredSellers, probedSellers) {
76
+ const configuredById = new Map(configuredSellers.map((seller) => [seller.id, seller]));
77
+ const merged = [];
78
+ for (const seller of probedSellers) {
79
+ const configured = configuredById.get(seller.id);
80
+ merged.push({
81
+ ...configured,
82
+ ...seller,
83
+ discountRatio: seller.discountRatio ?? configured?.discountRatio,
84
+ supportedProtocols: seller.supportedProtocols || configured?.supportedProtocols,
85
+ paymentMethods: seller.paymentMethods || configured?.paymentMethods,
86
+ modelCount: seller.modelCount ?? configured?.modelCount,
87
+ errorMessage: seller.errorMessage || configured?.errorMessage,
88
+ });
89
+ configuredById.delete(seller.id);
90
+ }
91
+ for (const seller of configuredById.values()) {
92
+ merged.push(seller);
93
+ }
94
+ return merged;
95
+ }
96
+ function registrySellersToDoctorEntries(registry) {
97
+ if (!registry?.sellers) {
98
+ return [];
99
+ }
100
+ return registry.sellers.map((seller) => ({
101
+ id: seller.id,
102
+ name: seller.name,
103
+ url: seller.url,
104
+ status: "configured",
105
+ supportedProtocols: seller.supportedProtocols || [],
106
+ paymentMethods: seller.paymentMethods || [],
107
+ }));
108
+ }
109
+ function sellerCatalogEntriesToDoctorEntries(sellers) {
110
+ return sellers.map((seller) => ({
111
+ id: seller.id,
112
+ name: seller.name,
113
+ url: seller.url,
114
+ status: seller.status,
115
+ discountRatio: seller.discountRatio,
116
+ supportedProtocols: seller.supportedProtocols,
117
+ paymentMethods: seller.paymentMethods,
118
+ manifestSellerId: seller.manifestSellerId,
119
+ modelCount: seller.modelCount,
120
+ errorMessage: seller.errorMessage,
121
+ }));
122
+ }
123
+ function discountRatioFromSeller(seller) {
124
+ if (typeof seller.discountRatio === "number") {
125
+ return seller.discountRatio;
126
+ }
127
+ const match = seller.name?.match(/([0-9]+(?:\.[0-9]+)?)\s+discount/i);
128
+ if (!match) {
129
+ return undefined;
130
+ }
131
+ const parsed = Number(match[1]);
132
+ return Number.isFinite(parsed) ? parsed : undefined;
133
+ }
134
+ function formatDiscountRatio(value) {
135
+ return value.toFixed(2).replace(/\.?0+$/, "");
136
+ }
137
+ function formatUsdPer1m(microsPer1m) {
138
+ const usd = microsPer1m / 1_000_000;
139
+ return `$${usd.toFixed(2).replace(/\.?0+$/, "")}`;
140
+ }
141
+ function formatPriceRange(minMicros, maxMicros) {
142
+ if (minMicros == null || maxMicros == null) {
143
+ return "-";
144
+ }
145
+ if (minMicros === maxMicros) {
146
+ return formatUsdPer1m(minMicros);
147
+ }
148
+ return `${formatUsdPer1m(minMicros)}~${formatUsdPer1m(maxMicros)}`;
149
+ }
150
+ function modelsHaveExplicitPriceData(models) {
151
+ return models.some((model) => typeof model.inputPriceMicrosPer1m === "number" ||
152
+ typeof model.outputPriceMicrosPer1m === "number");
153
+ }
154
+ function buildDoctorModelSummaryEntries(models, sellers) {
155
+ const grouped = new Map();
156
+ const discountBySellerId = new Map(sellers
157
+ .map((seller) => [seller.id, discountRatioFromSeller(seller)])
158
+ .filter((entry) => typeof entry[1] === "number"));
159
+ for (const model of models) {
160
+ const entry = grouped.get(model.id) || {
161
+ sellerIds: new Set(),
162
+ discounts: [],
163
+ inputPrices: [],
164
+ outputPrices: [],
165
+ };
166
+ if (!entry.sellerIds.has(model.sellerId)) {
167
+ entry.sellerIds.add(model.sellerId);
168
+ const discount = discountBySellerId.get(model.sellerId);
169
+ if (typeof discount === "number") {
170
+ entry.discounts.push(discount);
171
+ }
172
+ if (typeof model.inputPriceMicrosPer1m === "number") {
173
+ entry.inputPrices.push(model.inputPriceMicrosPer1m);
174
+ }
175
+ if (typeof model.outputPriceMicrosPer1m === "number") {
176
+ entry.outputPrices.push(model.outputPriceMicrosPer1m);
177
+ }
178
+ }
179
+ grouped.set(model.id, entry);
180
+ }
181
+ return Array.from(grouped.entries())
182
+ .map(([id, entry]) => {
183
+ const discountMin = entry.discounts.length > 0 ? Math.min(...entry.discounts) : undefined;
184
+ const discountMax = entry.discounts.length > 0 ? Math.max(...entry.discounts) : undefined;
185
+ const inputPriceMinMicrosPer1m = entry.inputPrices.length > 0 ? Math.min(...entry.inputPrices) : undefined;
186
+ const inputPriceMaxMicrosPer1m = entry.inputPrices.length > 0 ? Math.max(...entry.inputPrices) : undefined;
187
+ const outputPriceMinMicrosPer1m = entry.outputPrices.length > 0 ? Math.min(...entry.outputPrices) : undefined;
188
+ const outputPriceMaxMicrosPer1m = entry.outputPrices.length > 0 ? Math.max(...entry.outputPrices) : undefined;
189
+ const discountRange = discountMin == null || discountMax == null
190
+ ? "-"
191
+ : discountMin === discountMax
192
+ ? formatDiscountRatio(discountMin)
193
+ : `${formatDiscountRatio(discountMin)}~${formatDiscountRatio(discountMax)}`;
194
+ const priceRange = inputPriceMinMicrosPer1m == null || outputPriceMinMicrosPer1m == null
195
+ ? "-"
196
+ : `in ${formatPriceRange(inputPriceMinMicrosPer1m, inputPriceMaxMicrosPer1m)} / out ${formatPriceRange(outputPriceMinMicrosPer1m, outputPriceMaxMicrosPer1m)}`;
197
+ return {
198
+ id,
199
+ sellerCount: entry.sellerIds.size,
200
+ discountMin,
201
+ discountMax,
202
+ discountRange,
203
+ inputPriceMinMicrosPer1m,
204
+ inputPriceMaxMicrosPer1m,
205
+ outputPriceMinMicrosPer1m,
206
+ outputPriceMaxMicrosPer1m,
207
+ priceRange,
208
+ };
209
+ })
210
+ .sort((left, right) => left.id.localeCompare(right.id));
211
+ }
212
+ function startDoctorFetches(controlPort, proxyPort, daemonRunning, daemonError, sellerRegistryUrl) {
213
+ const controlBaseUrl = `http://127.0.0.1:${controlPort}`;
214
+ const openAiBaseUrl = `http://127.0.0.1:${proxyPort}/v1`;
215
+ const unavailableMessage = daemonError || "tb-proxyd is not running";
216
+ if (!daemonRunning) {
217
+ return {
218
+ healthResult: Promise.resolve({ url: `${controlBaseUrl}/health`, available: false, error: unavailableMessage }),
219
+ sellersResult: Promise.resolve({ url: `${controlBaseUrl}/sellers`, available: false, error: unavailableMessage }),
220
+ modelsResult: Promise.resolve({ url: `${controlBaseUrl}/models`, available: false, error: unavailableMessage }),
221
+ proxyModelsResult: Promise.resolve({ url: `${openAiBaseUrl}/models`, available: false, error: unavailableMessage }),
222
+ registryResult: Promise.resolve({ url: sellerRegistryUrl || "", available: false, error: unavailableMessage }),
223
+ };
224
+ }
225
+ return {
226
+ healthResult: fetchJsonDocument(`${controlBaseUrl}/health`),
227
+ sellersResult: fetchJsonDocument(`${controlBaseUrl}/sellers`),
228
+ modelsResult: fetchJsonDocument(`${controlBaseUrl}/models`),
229
+ proxyModelsResult: fetchJsonDocument(`${openAiBaseUrl}/models`),
230
+ registryResult: sellerRegistryUrl
231
+ ? fetchJsonDocument(sellerRegistryUrl)
232
+ : Promise.resolve({ url: "", available: false, error: "registry url unavailable" }),
233
+ };
234
+ }
235
+ async function resolveDoctorFetches(fetches) {
236
+ const [healthResult, sellersResult, modelsResult, proxyModelsResult, registryResult,] = await Promise.all([
237
+ fetches.healthResult,
238
+ fetches.sellersResult,
239
+ fetches.modelsResult,
240
+ fetches.proxyModelsResult,
241
+ fetches.registryResult,
242
+ ]);
243
+ return {
244
+ healthResult,
245
+ sellersResult,
246
+ modelsResult,
247
+ proxyModelsResult,
248
+ registryResult,
249
+ };
250
+ }
251
+ function buildDoctorSellerSummary(sellersResult, registryResult, sellerRegistryUrl, probedSellers = []) {
252
+ const sellersData = sellersResult.data;
253
+ const configuredSellers = mergeDoctorSellerEntries(registrySellersToDoctorEntries(registryResult.data), sellersData?.sellers || []);
254
+ const mergedSellers = probedSellers.length > 0
255
+ ? mergeDoctorSellerEntries(configuredSellers, probedSellers)
256
+ : configuredSellers;
257
+ return {
258
+ available: sellersResult.available || registryResult.available || mergedSellers.length > 0,
259
+ registryUrl: sellersData?.registryUrl || sellerRegistryUrl,
260
+ version: sellersData?.version || registryResult.data?.version,
261
+ defaultSeller: sellersData?.defaultSeller || registryResult.data?.defaultSeller,
262
+ sellers: mergedSellers,
263
+ error: sellersResult.error || registryResult.error,
264
+ };
265
+ }
266
+ function buildDoctorAccessSummary(controlPort, proxyPort, healthResult, proxyModelsResult, availability = {}) {
267
+ const controlBaseUrl = `http://127.0.0.1:${controlPort}`;
268
+ const proxyBaseUrl = `http://127.0.0.1:${proxyPort}`;
269
+ const openAiBaseUrl = `${proxyBaseUrl}/v1`;
270
+ const anthropicBaseUrl = proxyBaseUrl;
271
+ return {
272
+ controlBaseUrl,
273
+ proxyBaseUrl,
274
+ openAiBaseUrl,
275
+ anthropicBaseUrl,
276
+ token: PROXY_ACCESS_TOKEN_PLACEHOLDER,
277
+ endpoints: [
278
+ {
279
+ id: "control.health",
280
+ name: "Control Plane Health",
281
+ url: `${controlBaseUrl}/health`,
282
+ available: healthResult.available,
283
+ requiresToken: false,
284
+ error: healthResult.error,
285
+ },
286
+ {
287
+ id: "control.sellers",
288
+ name: "Seller Registry",
289
+ url: `${controlBaseUrl}/sellers`,
290
+ available: availability.sellersAvailable ?? true,
291
+ requiresToken: false,
292
+ error: availability.sellersError,
293
+ },
294
+ {
295
+ id: "control.models",
296
+ name: "Seller-backed Models",
297
+ url: `${controlBaseUrl}/models`,
298
+ available: availability.modelsAvailable ?? true,
299
+ requiresToken: false,
300
+ error: availability.modelsError,
301
+ },
302
+ {
303
+ id: "proxy.openai",
304
+ name: "OpenAI-compatible Proxy",
305
+ url: openAiBaseUrl,
306
+ probeUrl: `${openAiBaseUrl}/models`,
307
+ available: proxyModelsResult.available,
308
+ requiresToken: true,
309
+ token: PROXY_ACCESS_TOKEN_PLACEHOLDER,
310
+ error: proxyModelsResult.error,
311
+ },
312
+ {
313
+ id: "proxy.anthropic",
314
+ name: "Anthropic-compatible Proxy",
315
+ url: anthropicBaseUrl,
316
+ probeUrl: `${openAiBaseUrl}/models`,
317
+ available: proxyModelsResult.available,
318
+ requiresToken: true,
319
+ token: PROXY_ACCESS_TOKEN_PLACEHOLDER,
320
+ error: proxyModelsResult.error,
321
+ },
322
+ ],
323
+ };
324
+ }
325
+ function buildDoctorModelsSummary(modelsResult, sellers) {
326
+ const modelsData = modelsResult.data;
327
+ const grouped = buildDoctorModelSummaryEntries(modelsData?.data || [], sellers);
328
+ return {
329
+ available: modelsResult.available,
330
+ count: modelsData?.data?.length || 0,
331
+ uniqueCount: grouped.length,
332
+ registryUrl: modelsData?.registryUrl,
333
+ data: modelsData?.data || [],
334
+ grouped,
335
+ sellers,
336
+ error: modelsResult.error,
337
+ };
338
+ }
339
+ function providerStatusIcon(status) {
340
+ if (status === "configured") {
341
+ return "✅";
342
+ }
343
+ if (status === "installed") {
344
+ return "🟡";
345
+ }
346
+ return "🔘";
347
+ }
348
+ function remoteStatusIcon(available) {
349
+ return available ? "✅" : "❌";
350
+ }
351
+ function formatList(values) {
352
+ return values && values.length > 0 ? values.join(", ") : "-";
353
+ }
354
+ function defaultWriter(line) {
355
+ console.log(line);
356
+ }
357
+ function printDoctorAccess(access, writeLine) {
358
+ writeLine("Access check complete.");
359
+ writeLine(`Proxy token: ${access.token}`);
360
+ for (const endpoint of access.endpoints) {
361
+ writeLine(`${remoteStatusIcon(endpoint.available)} ${endpoint.name}`);
362
+ writeLine(` URL: ${endpoint.url}`);
363
+ if (endpoint.probeUrl) {
364
+ writeLine(` Probe: ${endpoint.probeUrl}`);
365
+ }
366
+ if (endpoint.requiresToken && endpoint.token) {
367
+ writeLine(` Token: ${endpoint.token}`);
368
+ }
369
+ if (!endpoint.available && endpoint.error) {
370
+ writeLine(` Error: ${endpoint.error}`);
371
+ }
372
+ }
373
+ }
374
+ function printDoctorSellers(sellers, writeLine) {
375
+ writeLine("Seller registry refresh complete.");
376
+ if (!sellers.available) {
377
+ writeLine(`❌ Seller registry unavailable: ${sellers.error || "unknown error"}`);
378
+ return;
379
+ }
380
+ writeLine(`Registry: ${sellers.registryUrl || "-"}`);
381
+ writeLine(`Default seller: ${sellers.defaultSeller || "-"}`);
382
+ for (const seller of sellers.sellers) {
383
+ const label = seller.name ? `${seller.name} (${seller.id})` : seller.id;
384
+ const icon = seller.status === "ok" || seller.status === "configured"
385
+ ? "✅"
386
+ : seller.status === "failed"
387
+ ? "❌"
388
+ : "🔘";
389
+ writeLine(`${icon} ${label} [${seller.status}]`);
390
+ writeLine(` URL: ${seller.url}`);
391
+ writeLine(` Protocols: ${formatList(seller.supportedProtocols)}`);
392
+ writeLine(` Payments: ${formatList(seller.paymentMethods)}`);
393
+ if (seller.modelCount != null) {
394
+ writeLine(` Models: ${seller.modelCount}`);
395
+ }
396
+ if (seller.errorMessage) {
397
+ writeLine(` Error: ${seller.errorMessage}`);
398
+ }
399
+ }
400
+ }
401
+ export function printDoctorModelsSummary(models, writeLine = defaultWriter) {
402
+ writeLine("Model catalog refresh complete.");
403
+ if (!models.available) {
404
+ writeLine(`❌ Model catalog unavailable: ${models.error || "unknown error"}`);
405
+ return;
406
+ }
407
+ writeLine(`Unique models: ${models.uniqueCount}`);
408
+ writeLine(`Seller offers: ${models.count}`);
409
+ const table = new Table({
410
+ head: ["Model ID", "Seller Count", "Discount Range", "Price Range"],
411
+ style: {
412
+ head: []
413
+ }
414
+ });
415
+ for (const entry of models.grouped) {
416
+ table.push([
417
+ entry.id,
418
+ String(entry.sellerCount),
419
+ entry.discountRange,
420
+ entry.priceRange
421
+ ]);
422
+ }
423
+ writeLine(table.toString());
424
+ }
425
+ export function readDoctorProviders() {
426
+ const store = new BuyerStore();
427
+ try {
428
+ const runtimeConfigByProvider = new Map();
429
+ for (const providerId of SUPPORTED_PROVIDER_IDS) {
430
+ const record = store.getProviderRuntimeConfig(providerId);
431
+ if (record) {
432
+ runtimeConfigByProvider.set(providerId, {
433
+ config: record.config,
434
+ updatedAt: record.updatedAt,
435
+ });
436
+ }
437
+ }
438
+ return detectProviders().map((provider) => {
439
+ const runtime = runtimeConfigByProvider.get(provider.id);
440
+ return {
441
+ ...provider,
442
+ runtimeConfig: runtime?.config,
443
+ runtimeConfigUpdatedAt: runtime?.updatedAt,
444
+ };
445
+ });
446
+ }
447
+ finally {
448
+ store.close();
449
+ }
450
+ }
451
+ export function printDoctorProviders(providers, writeLine = defaultWriter) {
452
+ writeLine("\n--- Programming Terminals ---");
453
+ for (const provider of providers) {
454
+ writeLine(`${providerStatusIcon(provider.status)} ${provider.name} [${provider.status}]`);
455
+ if (provider.commandName) {
456
+ writeLine(` Command: ${provider.commandName}${provider.executablePath ? ` -> ${provider.executablePath}` : " (not found in PATH)"}`);
457
+ }
458
+ writeLine(` Config: ${provider.configPath}`);
459
+ if (provider.observedPaths && provider.observedPaths.length > 0) {
460
+ writeLine(` Native hints: ${provider.observedPaths.join(", ")}`);
461
+ }
462
+ const runtimeSummary = providerRuntimeSummary(provider.runtimeConfig);
463
+ if (runtimeSummary) {
464
+ writeLine(` Runtime: ${runtimeSummary}`);
465
+ }
466
+ writeLine(` Notes: ${provider.reason}`);
467
+ }
468
+ }
469
+ export async function collectDoctorDiagnostics(options) {
470
+ const fetches = startDoctorFetches(options.controlPort, options.proxyPort, options.daemonRunning, options.daemonError, options.sellerRegistryUrl);
471
+ const results = await resolveDoctorFetches(fetches);
472
+ const sellers = buildDoctorSellerSummary(results.sellersResult, results.registryResult, options.sellerRegistryUrl, results.modelsResult.data?.sellers || []);
473
+ const models = buildDoctorModelsSummary(results.modelsResult, sellers.sellers);
474
+ return {
475
+ access: buildDoctorAccessSummary(options.controlPort, options.proxyPort, results.healthResult, results.proxyModelsResult, {
476
+ sellersAvailable: sellers.available,
477
+ sellersError: sellers.error,
478
+ modelsAvailable: models.available,
479
+ modelsError: models.error,
480
+ }),
481
+ models,
482
+ providers: options.providers,
483
+ sellers,
484
+ };
485
+ }
486
+ export async function collectDoctorModelsSummary(options) {
487
+ const diagnostics = await collectDoctorDiagnostics({
488
+ ...options,
489
+ providers: [],
490
+ });
491
+ if (modelsHaveExplicitPriceData(diagnostics.models.data) || !options.sellerRegistryUrl) {
492
+ return diagnostics.models;
493
+ }
494
+ try {
495
+ const catalog = await discoverSellerBackedModels(options.sellerRegistryUrl);
496
+ const sellers = sellerCatalogEntriesToDoctorEntries(catalog.sellers);
497
+ return buildDoctorModelsSummary({
498
+ url: options.sellerRegistryUrl,
499
+ available: true,
500
+ data: {
501
+ object: "list",
502
+ registryUrl: catalog.registryUrl,
503
+ data: catalog.models,
504
+ },
505
+ }, sellers);
506
+ }
507
+ catch {
508
+ return diagnostics.models;
509
+ }
510
+ }
511
+ export async function renderDoctorDiagnosticsProgressively(options) {
512
+ const writeLine = options.writeLine || defaultWriter;
513
+ const fetches = startDoctorFetches(options.controlPort, options.proxyPort, options.daemonRunning, options.daemonError, options.sellerRegistryUrl);
514
+ writeLine("\n--- Access Interfaces ---");
515
+ writeLine("Checking local control plane and proxy endpoints...");
516
+ const [healthResult, proxyModelsResult] = await Promise.all([
517
+ fetches.healthResult,
518
+ fetches.proxyModelsResult,
519
+ ]);
520
+ const access = buildDoctorAccessSummary(options.controlPort, options.proxyPort, healthResult, proxyModelsResult);
521
+ printDoctorAccess(access, writeLine);
522
+ writeLine("\n--- Sellers ---");
523
+ writeLine("Refreshing seller registry...");
524
+ const [sellersResult, registryResult] = await Promise.all([
525
+ fetches.sellersResult,
526
+ fetches.registryResult,
527
+ ]);
528
+ const partialSellers = buildDoctorSellerSummary(sellersResult, registryResult, options.sellerRegistryUrl);
529
+ printDoctorSellers(partialSellers, writeLine);
530
+ const modelsResult = await fetches.modelsResult;
531
+ const finalSellers = buildDoctorSellerSummary(sellersResult, registryResult, options.sellerRegistryUrl, modelsResult.data?.sellers || []);
532
+ const models = buildDoctorModelsSummary(modelsResult, finalSellers.sellers);
533
+ access.endpoints = buildDoctorAccessSummary(options.controlPort, options.proxyPort, healthResult, proxyModelsResult, {
534
+ sellersAvailable: finalSellers.available,
535
+ sellersError: finalSellers.error,
536
+ modelsAvailable: models.available,
537
+ modelsError: models.error,
538
+ }).endpoints;
539
+ writeLine("\nModel catalog hidden in `tb doctor`. Run `tb models` for the current model summary.");
540
+ return {
541
+ access,
542
+ models,
543
+ providers: options.providers,
544
+ sellers: finalSellers,
545
+ };
546
+ }
547
+ //# sourceMappingURL=doctor-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-diagnostics.js","sourceRoot":"","sources":["../../src/doctor-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { PaymentConfig } from "./buyer-store.js";
2
+ import type { ProviderCandidate } from "./provider-install.js";
3
+ export type InitPaymentMethod = "clawtip";
4
+ export interface InitPaymentOption {
5
+ value: InitPaymentMethod;
6
+ label: string;
7
+ hint?: string;
8
+ }
9
+ export interface ComingSoonPaymentOption {
10
+ id: string;
11
+ label: string;
12
+ }
13
+ export interface ExistingClawtipBinding {
14
+ config: Record<string, unknown>;
15
+ resourceUrl?: string;
16
+ orderNo?: string;
17
+ }
18
+ export interface InitTerminalOption {
19
+ value: string;
20
+ label: string;
21
+ hint?: string;
22
+ }
23
+ export declare const OTHER_TERMINAL_OPTION: InitTerminalOption;
24
+ export declare const INIT_PAYMENT_OPTIONS: InitPaymentOption[];
25
+ export declare const INIT_COMING_SOON_PAYMENT_OPTIONS: {
26
+ id: string;
27
+ label: string;
28
+ }[];
29
+ export declare function noteInitComingSoonPayments(note?: (message?: string, title?: string) => void): void;
30
+ export declare function buildInitTerminalOptions(providers: ProviderCandidate[]): InitTerminalOption[];
31
+ export declare function validateInitTerminalSelection(selected: string[] | undefined): string | undefined;
32
+ export declare function detectExistingClawtipBinding(payment: PaymentConfig | undefined): ExistingClawtipBinding | undefined;
33
+ export declare function buildInitSuccessMessage(summaryLines?: string[]): string;
34
+ //# sourceMappingURL=init-payment-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-payment-options.d.ts","sourceRoot":"","sources":["../../src/init-payment-options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,qBAAqB,EAAE,kBAInC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,iBAAiB,EAMnD,CAAC;AAEF,eAAO,MAAM,gCAAgC;;;GAaK,CAAC;AAEnD,wBAAgB,0BAA0B,CACxC,IAAI,GAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAa,GACxD,IAAI,CAKN;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,kBAAkB,EAAE,CAmB7F;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAShG;AAMD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAenH;AAED,wBAAgB,uBAAuB,CAAC,YAAY,GAAE,MAAM,EAAO,GAAG,MAAM,CAU3E"}