@tokenbuddy/tokenbuddy 1.0.26 → 1.0.28

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 (84) hide show
  1. package/bin/tb-clawtip-proof.js +2 -0
  2. package/dist/src/clawtip-bootstrap.d.ts +1 -0
  3. package/dist/src/clawtip-bootstrap.d.ts.map +1 -1
  4. package/dist/src/clawtip-bootstrap.js +1 -0
  5. package/dist/src/clawtip-bootstrap.js.map +1 -1
  6. package/dist/src/cli.d.ts +1 -0
  7. package/dist/src/cli.d.ts.map +1 -1
  8. package/dist/src/cli.js +172 -51
  9. package/dist/src/cli.js.map +1 -1
  10. package/dist/src/daemon.d.ts +6 -0
  11. package/dist/src/daemon.d.ts.map +1 -1
  12. package/dist/src/daemon.js +562 -292
  13. package/dist/src/daemon.js.map +1 -1
  14. package/dist/src/init-clawtip-activation.d.ts +5 -0
  15. package/dist/src/init-clawtip-activation.d.ts.map +1 -1
  16. package/dist/src/init-clawtip-activation.js +61 -1
  17. package/dist/src/init-clawtip-activation.js.map +1 -1
  18. package/dist/src/package-update.d.ts +60 -0
  19. package/dist/src/package-update.d.ts.map +1 -0
  20. package/dist/src/package-update.js +218 -0
  21. package/dist/src/package-update.js.map +1 -0
  22. package/dist/src/registry-trust.d.ts +7 -0
  23. package/dist/src/registry-trust.d.ts.map +1 -0
  24. package/dist/src/registry-trust.js +37 -0
  25. package/dist/src/registry-trust.js.map +1 -0
  26. package/dist/src/route-failover.d.ts +2 -2
  27. package/dist/src/route-failover.d.ts.map +1 -1
  28. package/dist/src/route-failover.js +11 -0
  29. package/dist/src/route-failover.js.map +1 -1
  30. package/dist/src/seller-catalog.d.ts +20 -0
  31. package/dist/src/seller-catalog.d.ts.map +1 -1
  32. package/dist/src/seller-catalog.js +41 -4
  33. package/dist/src/seller-catalog.js.map +1 -1
  34. package/dist/src/seller-concurrency-limiter.d.ts +36 -0
  35. package/dist/src/seller-concurrency-limiter.d.ts.map +1 -0
  36. package/dist/src/seller-concurrency-limiter.js +126 -0
  37. package/dist/src/seller-concurrency-limiter.js.map +1 -0
  38. package/dist/src/seller-pool.d.ts +7 -1
  39. package/dist/src/seller-pool.d.ts.map +1 -1
  40. package/dist/src/seller-pool.js +18 -0
  41. package/dist/src/seller-pool.js.map +1 -1
  42. package/dist/src/seller-route-planner.d.ts +21 -0
  43. package/dist/src/seller-route-planner.d.ts.map +1 -1
  44. package/dist/src/seller-route-planner.js +98 -20
  45. package/dist/src/seller-route-planner.js.map +1 -1
  46. package/dist/src/tb-clawtip-proof.d.ts +3 -0
  47. package/dist/src/tb-clawtip-proof.d.ts.map +1 -0
  48. package/dist/src/tb-clawtip-proof.js +24 -0
  49. package/dist/src/tb-clawtip-proof.js.map +1 -0
  50. package/dist/src/tb-proxyd.js +45 -3
  51. package/dist/src/tb-proxyd.js.map +1 -1
  52. package/package.json +3 -2
  53. package/src/clawtip-bootstrap.ts +1 -0
  54. package/src/cli.ts +200 -47
  55. package/src/daemon.ts +347 -50
  56. package/src/init-clawtip-activation.ts +77 -1
  57. package/src/package-update.ts +311 -0
  58. package/src/registry-trust.ts +51 -0
  59. package/src/route-failover.ts +14 -2
  60. package/src/seller-catalog.ts +67 -4
  61. package/src/seller-concurrency-limiter.ts +161 -0
  62. package/src/seller-pool.ts +20 -0
  63. package/src/seller-route-planner.ts +142 -20
  64. package/src/tb-clawtip-proof.ts +28 -0
  65. package/src/tb-proxyd.ts +48 -3
  66. package/static/ui/assets/index-Bzbrp7Qe.css +1 -0
  67. package/static/ui/assets/index-UAfOhbwC.js +236 -0
  68. package/static/ui/assets/index-UAfOhbwC.js.map +1 -0
  69. package/static/ui/index.html +2 -2
  70. package/tests/cli-routing.test.ts +37 -4
  71. package/tests/control-plane-ui-endpoints.test.ts +7 -7
  72. package/tests/daemon-trusted-registry-cache.test.ts +132 -0
  73. package/tests/e2e.test.ts +14 -1
  74. package/tests/package-update.test.ts +147 -0
  75. package/tests/registry-trust.test.ts +28 -0
  76. package/tests/route-failover.test.ts +13 -0
  77. package/tests/seller-catalog-413.test.ts +60 -1
  78. package/tests/seller-concurrency-limiter.test.ts +83 -0
  79. package/tests/seller-pool.test.ts +23 -0
  80. package/tests/seller-route-planner.test.ts +78 -0
  81. package/tests/tokenbuddy.test.ts +316 -34
  82. package/static/ui/assets/index-1uuyCCzj.css +0 -1
  83. package/static/ui/assets/index-cm_EgQZ-.js +0 -236
  84. package/static/ui/assets/index-cm_EgQZ-.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/src/tb-clawtip-proof.js";
@@ -1,3 +1,4 @@
1
+ export declare const DEFAULT_CLAWTIP_BOOTSTRAP_URL = "https://tb-registry.fly.dev";
1
2
  export interface ClawtipBootstrapResponse {
2
3
  activationFeeFen?: number;
3
4
  payment?: {
@@ -1 +1 @@
1
- {"version":3,"file":"clawtip-bootstrap.d.ts","sourceRoot":"","sources":["../../src/clawtip-bootstrap.ts"],"names":[],"mappings":"AAEA,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
+ {"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,4 +1,5 @@
1
1
  const CLAWTIP_BOOTSTRAP_PLACEHOLDER_PAY_TO = "bootstrap-pay-to";
2
+ export const DEFAULT_CLAWTIP_BOOTSTRAP_URL = "https://tb-registry.fly.dev";
2
3
  /**
3
4
  * Fetch wallet-bootstrap's ClawTip activation payment payload.
4
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"clawtip-bootstrap.js","sourceRoot":"","sources":["../../src/clawtip-bootstrap.ts"],"names":[],"mappings":"AAAA,MAAM,oCAAoC,GAAG,kBAAkB,CAAC;AAiBhE;;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"}
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;
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
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
- const candidateRoots = [
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 launchAgentLoaded(label) {
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
- runLaunchctl(["print", launchdServiceTarget(label)]);
243
+ run(["print", launchdServiceTarget(label)]);
246
244
  return true;
247
245
  }
248
246
  catch {
249
247
  return false;
250
248
  }
251
249
  }
252
- function installLaunchAgent(plistPath, label) {
250
+ export function installLaunchAgentWithRunner(plistPath, label, run) {
253
251
  const domain = launchdUserDomain();
254
252
  for (const staleLabel of STALE_TOKENBUDDY_LAUNCHD_LABELS) {
255
- runLaunchctl(["bootout", `${domain}/${staleLabel}`], true);
253
+ run(["bootout", `${domain}/${staleLabel}`], true);
256
254
  }
257
255
  const target = launchdServiceTarget(label);
258
- if (launchAgentLoaded(label)) {
259
- runLaunchctl(["kickstart", target]);
260
- return;
256
+ if (launchAgentLoaded(label, run)) {
257
+ run(["bootout", target], true);
261
258
  }
262
- runLaunchctl(["bootstrap", domain, plistPath]);
263
- runLaunchctl(["kickstart", "-k", target]);
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 ?? process.env.TB_PROXYD_CLAWTIP_PROOF_COMMAND,
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 || "https://tb-wallet-bootstrap.fly.dev/registry/sellers";
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 in the background when it is not running")
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 || "https://tb-wallet-bootstrap.fly.dev";
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: process.env.TB_PROXYD_CLAWTIP_PROOF_COMMAND,
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,