@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.
- package/dist/src/buyer-store.d.ts +20 -0
- package/dist/src/buyer-store.d.ts.map +1 -1
- package/dist/src/buyer-store.js +73 -1
- package/dist/src/buyer-store.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +390 -62
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon.d.ts +6 -5
- package/dist/src/daemon.d.ts.map +1 -1
- package/dist/src/daemon.js +298 -92
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/doctor-diagnostics.d.ts +97 -0
- package/dist/src/doctor-diagnostics.d.ts.map +1 -0
- package/dist/src/doctor-diagnostics.js +547 -0
- package/dist/src/doctor-diagnostics.js.map +1 -0
- package/dist/src/init-payment-options.d.ts +34 -0
- package/dist/src/init-payment-options.d.ts.map +1 -0
- package/dist/src/init-payment-options.js +90 -0
- package/dist/src/init-payment-options.js.map +1 -0
- package/dist/src/provider-install.d.ts +37 -2
- package/dist/src/provider-install.d.ts.map +1 -1
- package/dist/src/provider-install.js +317 -67
- package/dist/src/provider-install.js.map +1 -1
- package/dist/src/seller-catalog.d.ts +79 -0
- package/dist/src/seller-catalog.d.ts.map +1 -0
- package/dist/src/seller-catalog.js +126 -0
- package/dist/src/seller-catalog.js.map +1 -0
- package/dist/src/tb-proxyd.js +13 -2
- package/dist/src/tb-proxyd.js.map +1 -1
- package/package.json +4 -4
- package/src/buyer-store.ts +113 -1
- package/src/cli.ts +490 -67
- package/src/daemon.ts +346 -117
- package/src/doctor-diagnostics.ts +850 -0
- package/src/init-payment-options.ts +131 -0
- package/src/provider-install.ts +426 -76
- package/src/seller-catalog.ts +222 -0
- package/src/tb-proxyd.ts +14 -2
- package/tests/e2e.test.ts +9 -0
- package/tests/tokenbuddy.test.ts +628 -19
- package/bin/tb-proxyd.js +0 -2
- package/bin/tb.js +0 -3
|
@@ -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":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAgF/C,MAAM,UAAU,kBAAkB,CAAC,MAAsB;IACvD,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAwB,EAAE,MAAsB;IAChF,MAAM,SAAS,GAAG,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,mBAAmB,IAAI,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACjH,OAAO,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;QAChF,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,UAAU,CAAC;QAC5B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAwB,EAAE,MAAsB;IACrF,OAAO,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC,eAAe,IAAI,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAwB;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;SAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;SACxB,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,QAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;SAC3B,MAAM,CAAC,CAAC,KAAK,EAAgC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;IAC7D,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAsB;IAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAoB,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,WAAmB;IAClE,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC5E,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtD,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE;gBACnB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,SAAS,EAAE,MAAM,CAAC,GAAG;gBACrB,kBAAkB,EAAE,SAAS;gBAC7B,cAAc;gBACd,qBAAqB,EAAE,iBAAiB,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,yBAAyB,CAAC;gBAC3H,sBAAsB,EAAE,iBAAiB,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,0BAA0B,CAAC;aAC/H,CAAC,CAAC,CAAC;YACJ,OAAO;gBACL,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,MAAM,EAAE,IAAI;oBACZ,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE;oBACtE,aAAa,EAAE,QAAQ,CAAC,SAAS,EAAE,aAAa,IAAI,QAAQ,CAAC,SAAS,EAAE,cAAc;oBACtF,UAAU,EAAE,MAAM,CAAC,MAAM;oBACzB,kBAAkB,EAAE,SAAS;oBAC7B,cAAc;iBACf;gBACD,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,gCAAgC,EAAE;gBAC5E,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,YAAY;aACb,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,MAAM,EAAE,QAAQ;oBAChB,YAAY;iBACb;gBACD,MAAM,EAAE,EAAyB;aAClC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,WAAW;QACX,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QACtD,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA2B,EAC3B,QAA4B;IAE5B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA2B,EAC3B,QAA4B;IAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA2B;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/src/tb-proxyd.js
CHANGED
|
@@ -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;
|
|
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.
|
|
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",
|
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@clack/prompts": "^0.7.0",
|
|
17
|
+
"@tokenbuddy/contracts": "^1.0.0",
|
|
18
|
+
"@tokenbuddy/logging": "^1.0.0",
|
|
17
19
|
"cli-table3": "^0.6.4",
|
|
18
20
|
"commander": "^12.0.0",
|
|
19
21
|
"express": "^4.19.2",
|
|
20
|
-
"qrcode-terminal": "^0.12.0"
|
|
21
|
-
"@tokenbuddy/contracts": "^1.0.0",
|
|
22
|
-
"@tokenbuddy/logging": "^1.0.0"
|
|
22
|
+
"qrcode-terminal": "^0.12.0"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/express": "^4.17.21",
|
package/src/buyer-store.ts
CHANGED
|
@@ -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
|
|