@tokenbuddy/tokenbuddy 1.0.26 → 1.0.27
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/bin/tb-clawtip-proof.js +2 -0
- package/dist/src/clawtip-bootstrap.d.ts +1 -0
- package/dist/src/clawtip-bootstrap.d.ts.map +1 -1
- package/dist/src/clawtip-bootstrap.js +1 -0
- package/dist/src/clawtip-bootstrap.js.map +1 -1
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +172 -51
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon.d.ts +6 -0
- package/dist/src/daemon.d.ts.map +1 -1
- package/dist/src/daemon.js +562 -292
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/init-clawtip-activation.d.ts +5 -0
- package/dist/src/init-clawtip-activation.d.ts.map +1 -1
- package/dist/src/init-clawtip-activation.js +61 -1
- package/dist/src/init-clawtip-activation.js.map +1 -1
- package/dist/src/package-update.d.ts +60 -0
- package/dist/src/package-update.d.ts.map +1 -0
- package/dist/src/package-update.js +220 -0
- package/dist/src/package-update.js.map +1 -0
- package/dist/src/registry-trust.d.ts +7 -0
- package/dist/src/registry-trust.d.ts.map +1 -0
- package/dist/src/registry-trust.js +37 -0
- package/dist/src/registry-trust.js.map +1 -0
- package/dist/src/route-failover.d.ts +2 -2
- package/dist/src/route-failover.d.ts.map +1 -1
- package/dist/src/route-failover.js +11 -0
- package/dist/src/route-failover.js.map +1 -1
- package/dist/src/seller-catalog.d.ts +20 -0
- package/dist/src/seller-catalog.d.ts.map +1 -1
- package/dist/src/seller-catalog.js +41 -4
- package/dist/src/seller-catalog.js.map +1 -1
- package/dist/src/seller-concurrency-limiter.d.ts +36 -0
- package/dist/src/seller-concurrency-limiter.d.ts.map +1 -0
- package/dist/src/seller-concurrency-limiter.js +126 -0
- package/dist/src/seller-concurrency-limiter.js.map +1 -0
- package/dist/src/seller-pool.d.ts +7 -1
- package/dist/src/seller-pool.d.ts.map +1 -1
- package/dist/src/seller-pool.js +18 -0
- package/dist/src/seller-pool.js.map +1 -1
- package/dist/src/seller-route-planner.d.ts +21 -0
- package/dist/src/seller-route-planner.d.ts.map +1 -1
- package/dist/src/seller-route-planner.js +98 -20
- package/dist/src/seller-route-planner.js.map +1 -1
- package/dist/src/tb-clawtip-proof.d.ts +3 -0
- package/dist/src/tb-clawtip-proof.d.ts.map +1 -0
- package/dist/src/tb-clawtip-proof.js +24 -0
- package/dist/src/tb-clawtip-proof.js.map +1 -0
- package/dist/src/tb-proxyd.js +45 -3
- package/dist/src/tb-proxyd.js.map +1 -1
- package/package.json +3 -2
- package/src/clawtip-bootstrap.ts +1 -0
- package/src/cli.ts +200 -47
- package/src/daemon.ts +347 -50
- package/src/init-clawtip-activation.ts +77 -1
- package/src/package-update.ts +313 -0
- package/src/registry-trust.ts +51 -0
- package/src/route-failover.ts +14 -2
- package/src/seller-catalog.ts +67 -4
- package/src/seller-concurrency-limiter.ts +161 -0
- package/src/seller-pool.ts +20 -0
- package/src/seller-route-planner.ts +142 -20
- package/src/tb-clawtip-proof.ts +28 -0
- package/src/tb-proxyd.ts +48 -3
- package/static/ui/assets/index-Bzbrp7Qe.css +1 -0
- package/static/ui/assets/index-UAfOhbwC.js +236 -0
- package/static/ui/assets/index-UAfOhbwC.js.map +1 -0
- package/static/ui/index.html +2 -2
- package/tests/cli-routing.test.ts +37 -4
- package/tests/control-plane-ui-endpoints.test.ts +7 -7
- package/tests/daemon-trusted-registry-cache.test.ts +132 -0
- package/tests/e2e.test.ts +14 -1
- package/tests/package-update.test.ts +132 -0
- package/tests/registry-trust.test.ts +28 -0
- package/tests/route-failover.test.ts +13 -0
- package/tests/seller-catalog-413.test.ts +60 -1
- package/tests/seller-concurrency-limiter.test.ts +83 -0
- package/tests/seller-pool.test.ts +23 -0
- package/tests/seller-route-planner.test.ts +78 -0
- package/tests/tokenbuddy.test.ts +316 -34
- package/static/ui/assets/index-1uuyCCzj.css +0 -1
- package/static/ui/assets/index-cm_EgQZ-.js +0 -236
- package/static/ui/assets/index-cm_EgQZ-.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clawtip-bootstrap.d.ts","sourceRoot":"","sources":["../../src/clawtip-bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clawtip-bootstrap.d.ts","sourceRoot":"","sources":["../../src/clawtip-bootstrap.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAE3E,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAwBnG;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CActG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clawtip-bootstrap.js","sourceRoot":"","sources":["../../src/clawtip-bootstrap.ts"],"names":[],"mappings":"AAAA,MAAM,oCAAoC,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"clawtip-bootstrap.js","sourceRoot":"","sources":["../../src/clawtip-bootstrap.ts"],"names":[],"mappings":"AAAA,MAAM,oCAAoC,GAAG,kBAAkB,CAAC;AAChE,MAAM,CAAC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC;AAiB3E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,YAAoB;IAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,6BAA6B,EAAE;QAC7F,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;KACtD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmD,CAAC;IACpF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,sCAAsC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,oCAAoC,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CACb;YACE,gFAAgF,oCAAoC,KAAK;YACzH,kBAAkB,YAAY,EAAE;YAChC,kGAAkG;SACnG,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,oCAAoC,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxG,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oCAAoC,CAAC,YAAoB,EAAE,WAAmB;IAC5F,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,KAAK,mBAAmB,EAAE,CAAC;YACtF,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;YAClE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
package/dist/src/cli.d.ts
CHANGED
|
@@ -45,6 +45,7 @@ export interface LaunchdPlistOptions {
|
|
|
45
45
|
* @returns 完整的 plist XML 字符串
|
|
46
46
|
*/
|
|
47
47
|
export declare function buildLaunchdPlistContent(options: LaunchdPlistOptions): string;
|
|
48
|
+
export declare function installLaunchAgentWithRunner(plistPath: string, label: string, run: (args: string[], ignoreFailure?: boolean) => void): void;
|
|
48
49
|
interface RestartLaunchAgentDeps {
|
|
49
50
|
platform: NodeJS.Platform;
|
|
50
51
|
plistPath: string;
|
package/dist/src/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli.js
CHANGED
|
@@ -15,8 +15,10 @@ import { assertSellerRoutingConfig, defaultSellerRoutingConfig, normalizeSellerR
|
|
|
15
15
|
import { collectDoctorDiagnostics, collectDoctorModelsSummary, printDoctorProviders, printDoctorModelsSummary, readDoctorProviders, renderDoctorDiagnosticsProgressively, } from "./doctor-diagnostics.js";
|
|
16
16
|
import { buildInitSuccessMessage, buildInitTerminalSelectionState, buildInstalledTerminalMessage, INIT_PAYMENT_OPTIONS, inspectClawtipWalletReadiness, inspectOpenClawWalletConfig, noteInitComingSoonPayments, OTHER_TERMINAL_OPTION, validateInitTerminalSelection, } from "./init-payment-options.js";
|
|
17
17
|
import { checkOpenClawRuntime, readClawtipPayCredential, startClawtipWalletBootstrap, waitForClawtipActivationConfirmation, } from "./init-clawtip-activation.js";
|
|
18
|
-
import { fetchClawtipBootstrap, } from "./clawtip-bootstrap.js";
|
|
18
|
+
import { DEFAULT_CLAWTIP_BOOTSTRAP_URL, fetchClawtipBootstrap, } from "./clawtip-bootstrap.js";
|
|
19
19
|
import { displayTerminalImage } from "./terminal-image.js";
|
|
20
|
+
import { checkPackageUpdate, readInstalledPackageManifest, runPackageUpdate, } from "./package-update.js";
|
|
21
|
+
import { DEFAULT_SELLER_REGISTRY_URL } from "./registry-trust.js";
|
|
20
22
|
// @ts-ignore
|
|
21
23
|
import qrcode from "qrcode-terminal";
|
|
22
24
|
const CONTROL_PORT = 17820;
|
|
@@ -28,37 +30,7 @@ const STALE_TOKENBUDDY_LAUNCHD_LABELS = [
|
|
|
28
30
|
];
|
|
29
31
|
const logger = createModuleLogger("tokenbuddy-cli");
|
|
30
32
|
function readCliPackageVersion() {
|
|
31
|
-
|
|
32
|
-
process.argv[1],
|
|
33
|
-
path.join(process.cwd(), "packages", "tokenbuddy-cli"),
|
|
34
|
-
process.cwd(),
|
|
35
|
-
];
|
|
36
|
-
const seen = new Set();
|
|
37
|
-
for (const candidateRoot of candidateRoots) {
|
|
38
|
-
if (!candidateRoot)
|
|
39
|
-
continue;
|
|
40
|
-
let current = fs.existsSync(candidateRoot) ? fs.realpathSync(candidateRoot) : candidateRoot;
|
|
41
|
-
if (!fs.existsSync(current))
|
|
42
|
-
continue;
|
|
43
|
-
if (!fs.statSync(current).isDirectory()) {
|
|
44
|
-
current = path.dirname(current);
|
|
45
|
-
}
|
|
46
|
-
while (!seen.has(current)) {
|
|
47
|
-
seen.add(current);
|
|
48
|
-
const packageJsonPath = path.join(current, "package.json");
|
|
49
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
50
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
51
|
-
if (packageJson.name === "@tokenbuddy/tokenbuddy" && typeof packageJson.version === "string" && packageJson.version.length > 0) {
|
|
52
|
-
return packageJson.version;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const parent = path.dirname(current);
|
|
56
|
-
if (parent === current)
|
|
57
|
-
break;
|
|
58
|
-
current = parent;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return "0.0.0";
|
|
33
|
+
return readInstalledPackageManifest().version;
|
|
62
34
|
}
|
|
63
35
|
const SUPPORTED_PAYMENT_METHODS = ["mock", "clawtip"];
|
|
64
36
|
function isSupportedPaymentMethod(method) {
|
|
@@ -154,6 +126,12 @@ function defaultProxydLogPath(kind) {
|
|
|
154
126
|
function tbProxydScriptPath() {
|
|
155
127
|
return path.resolve(currentModuleDir(), "./tb-proxyd.js");
|
|
156
128
|
}
|
|
129
|
+
function tbClawtipProofScriptPath() {
|
|
130
|
+
return path.resolve(currentModuleDir(), "../../bin/tb-clawtip-proof.js");
|
|
131
|
+
}
|
|
132
|
+
function defaultClawtipProofCommand() {
|
|
133
|
+
return process.env.TB_PROXYD_CLAWTIP_PROOF_COMMAND || tbClawtipProofScriptPath();
|
|
134
|
+
}
|
|
157
135
|
function escapeXmlText(value) {
|
|
158
136
|
return value
|
|
159
137
|
.replace(/&/g, "&")
|
|
@@ -240,27 +218,49 @@ function runLaunchctl(args, ignoreFailure = false) {
|
|
|
240
218
|
}
|
|
241
219
|
}
|
|
242
220
|
}
|
|
243
|
-
function
|
|
221
|
+
function sleepSync(ms) {
|
|
222
|
+
const shared = new Int32Array(new SharedArrayBuffer(4));
|
|
223
|
+
Atomics.wait(shared, 0, 0, ms);
|
|
224
|
+
}
|
|
225
|
+
function runLaunchctlWithRetry(args, run, attempts = 3) {
|
|
226
|
+
let latestError;
|
|
227
|
+
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
228
|
+
try {
|
|
229
|
+
run(args);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
latestError = error;
|
|
234
|
+
if (attempt < attempts - 1) {
|
|
235
|
+
sleepSync(250 * (attempt + 1));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
throw latestError;
|
|
240
|
+
}
|
|
241
|
+
function launchAgentLoaded(label, run = runLaunchctl) {
|
|
244
242
|
try {
|
|
245
|
-
|
|
243
|
+
run(["print", launchdServiceTarget(label)]);
|
|
246
244
|
return true;
|
|
247
245
|
}
|
|
248
246
|
catch {
|
|
249
247
|
return false;
|
|
250
248
|
}
|
|
251
249
|
}
|
|
252
|
-
function
|
|
250
|
+
export function installLaunchAgentWithRunner(plistPath, label, run) {
|
|
253
251
|
const domain = launchdUserDomain();
|
|
254
252
|
for (const staleLabel of STALE_TOKENBUDDY_LAUNCHD_LABELS) {
|
|
255
|
-
|
|
253
|
+
run(["bootout", `${domain}/${staleLabel}`], true);
|
|
256
254
|
}
|
|
257
255
|
const target = launchdServiceTarget(label);
|
|
258
|
-
if (launchAgentLoaded(label)) {
|
|
259
|
-
|
|
260
|
-
return;
|
|
256
|
+
if (launchAgentLoaded(label, run)) {
|
|
257
|
+
run(["bootout", target], true);
|
|
261
258
|
}
|
|
262
|
-
|
|
263
|
-
|
|
259
|
+
runLaunchctlWithRetry(["bootstrap", domain, plistPath], run);
|
|
260
|
+
run(["kickstart", "-k", target]);
|
|
261
|
+
}
|
|
262
|
+
function installLaunchAgent(plistPath, label) {
|
|
263
|
+
installLaunchAgentWithRunner(plistPath, label, runLaunchctl);
|
|
264
264
|
}
|
|
265
265
|
async function repairDaemon(controlPort) {
|
|
266
266
|
const existing = await probeDaemonStatus(controlPort);
|
|
@@ -399,7 +399,7 @@ export async function runWebInitLauncher(deps = {}) {
|
|
|
399
399
|
controlPort,
|
|
400
400
|
proxyPort,
|
|
401
401
|
sellerRegistryUrl,
|
|
402
|
-
clawtipProofCommand: deps.clawtipProofCommand ??
|
|
402
|
+
clawtipProofCommand: deps.clawtipProofCommand ?? defaultClawtipProofCommand(),
|
|
403
403
|
clawtipProofTimeoutMs: deps.clawtipProofTimeoutMs ?? (process.env.TB_PROXYD_CLAWTIP_PROOF_TIMEOUT_MS
|
|
404
404
|
? Number(process.env.TB_PROXYD_CLAWTIP_PROOF_TIMEOUT_MS)
|
|
405
405
|
: undefined),
|
|
@@ -499,7 +499,7 @@ function rootActionName(command) {
|
|
|
499
499
|
}
|
|
500
500
|
function commandRequiresDaemon(command) {
|
|
501
501
|
const rootName = rootActionName(command);
|
|
502
|
-
return rootName !== "doctor" && rootName !== "init" && rootName !== "routing" && rootName !== "daemon" && rootName !== "ui";
|
|
502
|
+
return rootName !== "doctor" && rootName !== "init" && rootName !== "routing" && rootName !== "daemon" && rootName !== "ui" && rootName !== "update";
|
|
503
503
|
}
|
|
504
504
|
async function enforceDaemonGate(command) {
|
|
505
505
|
if (!commandRequiresDaemon(command)) {
|
|
@@ -576,6 +576,82 @@ function printPaymentList(payments, asJson) {
|
|
|
576
576
|
console.log("=== TokenBuddy Payment Methods ===");
|
|
577
577
|
console.log(table.toString());
|
|
578
578
|
}
|
|
579
|
+
async function safeCheckPackageUpdate() {
|
|
580
|
+
if (process.env.NODE_ENV === "test" && process.env.TOKENBUDDY_TEST_UPDATE_CHECK !== "1") {
|
|
581
|
+
return { error: "version check skipped in tests" };
|
|
582
|
+
}
|
|
583
|
+
try {
|
|
584
|
+
return { check: await checkPackageUpdate() };
|
|
585
|
+
}
|
|
586
|
+
catch (error) {
|
|
587
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
async function runDoctorPackageUpdate(fix, controlPort) {
|
|
591
|
+
if (process.env.NODE_ENV === "test" && process.env.TOKENBUDDY_TEST_UPDATE_CHECK !== "1") {
|
|
592
|
+
return { error: "version check skipped in tests" };
|
|
593
|
+
}
|
|
594
|
+
if (!fix) {
|
|
595
|
+
return safeCheckPackageUpdate();
|
|
596
|
+
}
|
|
597
|
+
return await runPackageUpdate({ apply: true, controlPort }, { restartProxyd: restartProxydForPackageUpdate });
|
|
598
|
+
}
|
|
599
|
+
function printPackageUpdateCheck(result) {
|
|
600
|
+
if (result.error) {
|
|
601
|
+
console.log(`⚠️ Version check unavailable: ${result.error}`);
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
const check = result.check;
|
|
605
|
+
if (check.updateAvailable) {
|
|
606
|
+
console.log(`⬆️ TokenBuddy update available: ${check.currentVersion} -> ${check.latestVersion}`);
|
|
607
|
+
console.log(` Run \`tb update\` to install and restart tb-proxyd.`);
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
console.log(`✅ TokenBuddy package is current (${check.currentVersion}).`);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
function packageUpdateExitCode(result) {
|
|
614
|
+
if (!result.check.updateAvailable) {
|
|
615
|
+
return 0;
|
|
616
|
+
}
|
|
617
|
+
if (!result.install.succeeded || !result.restart.restarted) {
|
|
618
|
+
return 1;
|
|
619
|
+
}
|
|
620
|
+
return 0;
|
|
621
|
+
}
|
|
622
|
+
function printPackageUpdateResult(result) {
|
|
623
|
+
const { check, install, restart } = result;
|
|
624
|
+
if (!check.updateAvailable) {
|
|
625
|
+
console.log(`TokenBuddy is already current (${check.currentVersion}).`);
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
console.log(`TokenBuddy update available: ${check.currentVersion} -> ${check.latestVersion}`);
|
|
629
|
+
if (!install.attempted) {
|
|
630
|
+
console.log(`Run \`${check.installCommand}\` to install it.`);
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
if (!install.succeeded) {
|
|
634
|
+
console.error(`Failed to install ${check.packageName}@${check.latestVersion}: ${install.error || "unknown error"}`);
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
console.log(`Installed ${check.packageName}@${check.latestVersion}.`);
|
|
638
|
+
if (!restart.restarted) {
|
|
639
|
+
console.error(`Failed to restart tb-proxyd: ${restart.error || "unknown error"}`);
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
console.log("tb-proxyd restarted.");
|
|
643
|
+
}
|
|
644
|
+
async function restartProxydForPackageUpdate(controlPort) {
|
|
645
|
+
const result = await restartLaunchAgent(controlPort);
|
|
646
|
+
return {
|
|
647
|
+
attempted: result.attempted,
|
|
648
|
+
restarted: result.restarted,
|
|
649
|
+
method: result.method,
|
|
650
|
+
plistPath: result.plistPath,
|
|
651
|
+
target: result.target,
|
|
652
|
+
error: result.error,
|
|
653
|
+
};
|
|
654
|
+
}
|
|
579
655
|
export { fetchClawtipBootstrap, normalizeClawtipBootstrapResourceUrl, } from "./clawtip-bootstrap.js";
|
|
580
656
|
function readProof(options) {
|
|
581
657
|
const proofFile = options.proofFile || process.env.TOKENBUDDY_CLAWTIP_PROOF_FILE;
|
|
@@ -595,7 +671,7 @@ function readProof(options) {
|
|
|
595
671
|
return proof;
|
|
596
672
|
}
|
|
597
673
|
function sellerRegistryUrlForInit() {
|
|
598
|
-
return process.env.TB_PROXYD_SELLER_REGISTRY_URL ||
|
|
674
|
+
return process.env.TB_PROXYD_SELLER_REGISTRY_URL || DEFAULT_SELLER_REGISTRY_URL;
|
|
599
675
|
}
|
|
600
676
|
function stableModelChoices(models) {
|
|
601
677
|
const grouped = new Map();
|
|
@@ -900,12 +976,45 @@ export function buildCli() {
|
|
|
900
976
|
program.hook("preAction", async (_thisCommand, actionCommand) => {
|
|
901
977
|
await enforceDaemonGate(actionCommand);
|
|
902
978
|
});
|
|
979
|
+
program
|
|
980
|
+
.command("update")
|
|
981
|
+
.description("Check for a TokenBuddy package update, install it, and restart tb-proxyd")
|
|
982
|
+
.option("--check", "Only check for an available update")
|
|
983
|
+
.option("--json", "Output update state as JSON")
|
|
984
|
+
.action(async (options) => {
|
|
985
|
+
const controlPort = configuredControlPort();
|
|
986
|
+
try {
|
|
987
|
+
const result = await runPackageUpdate({ apply: !options.check, controlPort }, { restartProxyd: restartProxydForPackageUpdate });
|
|
988
|
+
if (options.json) {
|
|
989
|
+
console.log(JSON.stringify(result, null, 2));
|
|
990
|
+
}
|
|
991
|
+
else if (options.check) {
|
|
992
|
+
printPackageUpdateCheck({ check: result.check });
|
|
993
|
+
}
|
|
994
|
+
else {
|
|
995
|
+
printPackageUpdateResult(result);
|
|
996
|
+
}
|
|
997
|
+
if (!options.check) {
|
|
998
|
+
process.exitCode = packageUpdateExitCode(result);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
catch (error) {
|
|
1002
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1003
|
+
process.exitCode = 1;
|
|
1004
|
+
if (options.json) {
|
|
1005
|
+
console.log(JSON.stringify({ error: { code: "package_update_failed", message: errorMessage } }, null, 2));
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
console.error(`TokenBuddy update failed: ${errorMessage}`);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
});
|
|
903
1012
|
// 1. tb doctor
|
|
904
1013
|
program
|
|
905
1014
|
.command("doctor")
|
|
906
1015
|
.description("Check running status, system agents, and network diagnostics")
|
|
907
1016
|
.option("--json", "Output diagnostics as JSON")
|
|
908
|
-
.option("--fix", "Start tb-proxyd
|
|
1017
|
+
.option("--fix", "Start tb-proxyd when needed, install available package updates, and restart the service")
|
|
909
1018
|
.action(async (options) => {
|
|
910
1019
|
const controlPort = configuredControlPort();
|
|
911
1020
|
const proxyPort = configuredProxyPort();
|
|
@@ -927,9 +1036,18 @@ export function buildCli() {
|
|
|
927
1036
|
? daemonInfo
|
|
928
1037
|
: undefined;
|
|
929
1038
|
const providers = readDoctorProviders();
|
|
1039
|
+
const updateState = await runDoctorPackageUpdate(Boolean(options.fix), controlPort).catch((error) => ({
|
|
1040
|
+
error: error instanceof Error ? error.message : String(error)
|
|
1041
|
+
}));
|
|
930
1042
|
if (options.fix && repair.attempted && !repair.fixed) {
|
|
931
1043
|
process.exitCode = 1;
|
|
932
1044
|
}
|
|
1045
|
+
if (options.fix && "check" in updateState && updateState.check?.updateAvailable) {
|
|
1046
|
+
process.exitCode = packageUpdateExitCode(updateState);
|
|
1047
|
+
}
|
|
1048
|
+
if (options.fix && "error" in updateState && updateState.error) {
|
|
1049
|
+
process.exitCode = 1;
|
|
1050
|
+
}
|
|
933
1051
|
if (options.json) {
|
|
934
1052
|
const diagnostics = await collectDoctorDiagnostics({
|
|
935
1053
|
controlPort,
|
|
@@ -956,6 +1074,7 @@ export function buildCli() {
|
|
|
956
1074
|
requested: Boolean(options.fix),
|
|
957
1075
|
...repair
|
|
958
1076
|
},
|
|
1077
|
+
packageUpdate: updateState,
|
|
959
1078
|
service: {
|
|
960
1079
|
platform: process.platform,
|
|
961
1080
|
plistPath,
|
|
@@ -967,6 +1086,11 @@ export function buildCli() {
|
|
|
967
1086
|
return;
|
|
968
1087
|
}
|
|
969
1088
|
console.log("=== TokenBuddy System Diagnostics ===");
|
|
1089
|
+
printPackageUpdateCheck("check" in updateState ? { check: updateState.check } : updateState);
|
|
1090
|
+
if (options.fix && "install" in updateState) {
|
|
1091
|
+
printPackageUpdateResult(updateState);
|
|
1092
|
+
}
|
|
1093
|
+
console.log("");
|
|
970
1094
|
// 1. Detect if daemon is listening
|
|
971
1095
|
if (daemonRunning) {
|
|
972
1096
|
const info = daemonInfo;
|
|
@@ -1178,10 +1302,7 @@ export function buildCli() {
|
|
|
1178
1302
|
console.log("Mock payment method registered and set as default.");
|
|
1179
1303
|
return;
|
|
1180
1304
|
}
|
|
1181
|
-
const bootstrapUrl = options.bootstrapUrl || process.env.TOKENBUDDY_BOOTSTRAP_URL;
|
|
1182
|
-
if (!bootstrapUrl) {
|
|
1183
|
-
throw new Error("ClawTip bootstrap URL is required; pass --bootstrap-url or TOKENBUDDY_BOOTSTRAP_URL");
|
|
1184
|
-
}
|
|
1305
|
+
const bootstrapUrl = options.bootstrapUrl || process.env.TOKENBUDDY_BOOTSTRAP_URL || DEFAULT_CLAWTIP_BOOTSTRAP_URL;
|
|
1185
1306
|
const proof = readProof({
|
|
1186
1307
|
proofFile: options.proofFile,
|
|
1187
1308
|
requireProof: options.requireProof
|
|
@@ -1491,7 +1612,7 @@ export function buildCli() {
|
|
|
1491
1612
|
spinner.stop("OpenClaw CLI detected.");
|
|
1492
1613
|
}
|
|
1493
1614
|
spinner.start("Requesting payment activation payload from public bootstrap registry...");
|
|
1494
|
-
const bootstrapUrl = process.env.TOKENBUDDY_BOOTSTRAP_URL ||
|
|
1615
|
+
const bootstrapUrl = process.env.TOKENBUDDY_BOOTSTRAP_URL || DEFAULT_CLAWTIP_BOOTSTRAP_URL;
|
|
1495
1616
|
const bootstrap = await fetchClawtipBootstrap(bootstrapUrl);
|
|
1496
1617
|
spinner.stop("Bootstrap payload received.");
|
|
1497
1618
|
if (!bootstrap.payment?.orderNo || !bootstrap.payment?.indicator) {
|
|
@@ -1692,7 +1813,7 @@ export function buildCli() {
|
|
|
1692
1813
|
proxyPort,
|
|
1693
1814
|
sellerRegistryUrl,
|
|
1694
1815
|
pathEnv: process.env.PATH,
|
|
1695
|
-
clawtipProofCommand:
|
|
1816
|
+
clawtipProofCommand: defaultClawtipProofCommand(),
|
|
1696
1817
|
clawtipProofTimeoutMs: process.env.TB_PROXYD_CLAWTIP_PROOF_TIMEOUT_MS
|
|
1697
1818
|
? Number(process.env.TB_PROXYD_CLAWTIP_PROOF_TIMEOUT_MS)
|
|
1698
1819
|
: undefined,
|