@tokenbuddy/tokenbuddy 1.0.6 → 1.0.7

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 (43) hide show
  1. package/dist/src/buyer-store.d.ts +28 -1
  2. package/dist/src/buyer-store.d.ts.map +1 -1
  3. package/dist/src/buyer-store.js +71 -16
  4. package/dist/src/buyer-store.js.map +1 -1
  5. package/dist/src/cli.d.ts +17 -0
  6. package/dist/src/cli.d.ts.map +1 -1
  7. package/dist/src/cli.js +201 -32
  8. package/dist/src/cli.js.map +1 -1
  9. package/dist/src/daemon.d.ts +5 -0
  10. package/dist/src/daemon.d.ts.map +1 -1
  11. package/dist/src/daemon.js +279 -72
  12. package/dist/src/daemon.js.map +1 -1
  13. package/dist/src/doctor-clawtip-wallet.d.ts +14 -0
  14. package/dist/src/doctor-clawtip-wallet.d.ts.map +1 -0
  15. package/dist/src/doctor-clawtip-wallet.js +54 -0
  16. package/dist/src/doctor-clawtip-wallet.js.map +1 -0
  17. package/dist/src/doctor-diagnostics.d.ts +2 -0
  18. package/dist/src/doctor-diagnostics.d.ts.map +1 -1
  19. package/dist/src/doctor-diagnostics.js +5 -0
  20. package/dist/src/doctor-diagnostics.js.map +1 -1
  21. package/dist/src/init-clawtip-activation.d.ts +48 -0
  22. package/dist/src/init-clawtip-activation.d.ts.map +1 -0
  23. package/dist/src/init-clawtip-activation.js +395 -0
  24. package/dist/src/init-clawtip-activation.js.map +1 -0
  25. package/dist/src/init-payment-options.d.ts +23 -1
  26. package/dist/src/init-payment-options.d.ts.map +1 -1
  27. package/dist/src/init-payment-options.js +97 -22
  28. package/dist/src/init-payment-options.js.map +1 -1
  29. package/dist/src/terminal-image.d.ts +22 -0
  30. package/dist/src/terminal-image.d.ts.map +1 -0
  31. package/dist/src/terminal-image.js +135 -0
  32. package/dist/src/terminal-image.js.map +1 -0
  33. package/package.json +1 -1
  34. package/src/buyer-store.ts +140 -17
  35. package/src/cli.ts +251 -33
  36. package/src/daemon.ts +308 -53
  37. package/src/doctor-clawtip-wallet.ts +70 -0
  38. package/src/doctor-diagnostics.ts +11 -0
  39. package/src/init-clawtip-activation.ts +487 -0
  40. package/src/init-payment-options.ts +140 -22
  41. package/src/terminal-image.ts +187 -0
  42. package/tests/e2e.test.ts +79 -5
  43. package/tests/tokenbuddy.test.ts +745 -19
@@ -1,6 +1,9 @@
1
1
  export interface CachedToken {
2
2
  token: string;
3
3
  balanceMicros: number;
4
+ reservedMicros: number;
5
+ spentMicros: number;
6
+ balanceSource?: string;
4
7
  }
5
8
  export interface PaymentConfig {
6
9
  method: string;
@@ -51,6 +54,12 @@ export interface InferenceLedgerInput {
51
54
  promptTokens: number;
52
55
  completionTokens: number;
53
56
  billedMicros: number;
57
+ estimatedMicros?: number;
58
+ settledMicros?: number;
59
+ settledUsdMicros?: number;
60
+ priceVersion?: string;
61
+ balanceSnapshotMicros?: number;
62
+ balanceSource?: string;
54
63
  prompt?: string;
55
64
  response?: string;
56
65
  }
@@ -63,10 +72,26 @@ export interface SafeInferenceLedgerEntry {
63
72
  promptTokens: number;
64
73
  completionTokens: number;
65
74
  billedMicros: number;
75
+ estimatedMicros?: number;
76
+ settledMicros?: number;
77
+ settledUsdMicros?: number;
78
+ priceVersion?: string;
79
+ balanceSnapshotMicros?: number;
80
+ balanceSource?: string;
66
81
  promptHash?: string;
67
82
  responseHash?: string;
68
83
  createdAt: string;
69
84
  }
85
+ export interface TokenBalanceSnapshotInput {
86
+ sellerKey: string;
87
+ token?: string;
88
+ tokenClass?: string;
89
+ balanceMicros: number;
90
+ reservedMicros?: number;
91
+ spentMicros?: number;
92
+ balanceSource: string;
93
+ expiresAt?: string;
94
+ }
70
95
  export interface BuyerStoreSummary {
71
96
  journalMode: string;
72
97
  paymentsCount: number;
@@ -117,7 +142,8 @@ export declare class BuyerStore {
117
142
  removeDaemonRuntimeConfig(configKey: string): boolean;
118
143
  getToken(sellerKey: string): CachedToken | undefined;
119
144
  saveToken(sellerKey: string, token: string, tokenClass: string, balanceMicros: number, expiresAt: string): void;
120
- deductBalance(sellerKey: string, amountMicros: number): void;
145
+ reconcileTokenBalance(input: TokenBalanceSnapshotInput): void;
146
+ markTokenStale(sellerKey: string): void;
121
147
  listPayments(): PaymentConfig[];
122
148
  savePayment(config: Omit<PaymentConfig, "updatedAt">): void;
123
149
  getPayment(method: string): PaymentConfig | undefined;
@@ -133,6 +159,7 @@ export declare class BuyerStore {
133
159
  listInferenceLedger(): SafeInferenceLedgerEntry[];
134
160
  close(): void;
135
161
  private initSchema;
162
+ private ensureColumn;
136
163
  private countRows;
137
164
  }
138
165
  //# sourceMappingURL=buyer-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buyer-store.d.ts","sourceRoot":"","sources":["../../src/buyer-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buyer-store.d.ts","sourceRoot":"","sources":["../../src/buyer-store.ts"],"names":[],"mappings":"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"}
@@ -133,36 +133,49 @@ export class BuyerStore {
133
133
  return result.changes > 0;
134
134
  }
135
135
  getToken(sellerKey) {
136
- const stmt = this.db.prepare("SELECT token, balance_micros FROM token_cache WHERE seller_key = ?");
136
+ const stmt = this.db.prepare("SELECT token, balance_micros, reserved_micros, spent_micros, balance_source FROM token_cache WHERE seller_key = ?");
137
137
  const row = stmt.get(sellerKey);
138
138
  if (!row) {
139
139
  return undefined;
140
140
  }
141
141
  return {
142
142
  token: row.token,
143
- balanceMicros: row.balance_micros
143
+ balanceMicros: row.balance_micros,
144
+ reservedMicros: row.reserved_micros,
145
+ spentMicros: row.spent_micros,
146
+ balanceSource: row.balance_source || undefined
144
147
  };
145
148
  }
146
149
  saveToken(sellerKey, token, tokenClass, balanceMicros, expiresAt) {
147
150
  const stmt = this.db.prepare(`INSERT OR REPLACE INTO token_cache (
148
- seller_key, token, token_class, balance_micros, expires_at, updated_at
149
- ) VALUES (?, ?, ?, ?, ?, ?)`);
151
+ seller_key, token, token_class, balance_micros, reserved_micros,
152
+ spent_micros, balance_source, expires_at, updated_at
153
+ ) VALUES (?, ?, ?, ?, 0, 0, 'purchase_complete', ?, ?)`);
150
154
  stmt.run(sellerKey, token, tokenClass, balanceMicros, expiresAt, nowIso());
151
155
  }
152
- deductBalance(sellerKey, amountMicros) {
153
- const token = this.getToken(sellerKey);
156
+ reconcileTokenBalance(input) {
157
+ const current = this.db.prepare("SELECT token, token_class, expires_at FROM token_cache WHERE seller_key = ?").get(input.sellerKey);
158
+ const token = input.token || current?.token;
159
+ const tokenClass = input.tokenClass || current?.token_class || "seller";
160
+ const expiresAt = input.expiresAt || current?.expires_at || new Date(Date.now() + 86400 * 1000).toISOString();
154
161
  if (!token) {
155
162
  return;
156
163
  }
157
- const newBalance = Math.max(0, token.balanceMicros - amountMicros);
158
- const stmt = this.db.prepare("UPDATE token_cache SET balance_micros = ?, updated_at = ? WHERE seller_key = ?");
159
- stmt.run(newBalance, nowIso(), sellerKey);
160
- logger.info("token.cache.debited", "token cache balance debited", {
161
- sellerKey,
162
- amountMicros,
163
- balanceMicros: newBalance
164
+ this.db.prepare(`INSERT OR REPLACE INTO token_cache (
165
+ seller_key, token, token_class, balance_micros, reserved_micros,
166
+ spent_micros, balance_source, expires_at, updated_at
167
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.sellerKey, token, tokenClass, input.balanceMicros, input.reservedMicros ?? 0, input.spentMicros ?? 0, input.balanceSource, expiresAt, nowIso());
168
+ logger.info("token.cache.reconciled", "token cache reconciled from seller balance snapshot", {
169
+ sellerKey: input.sellerKey,
170
+ balanceMicros: input.balanceMicros,
171
+ reservedMicros: input.reservedMicros ?? 0,
172
+ spentMicros: input.spentMicros ?? 0,
173
+ balanceSource: input.balanceSource
164
174
  });
165
175
  }
176
+ markTokenStale(sellerKey) {
177
+ this.db.prepare("UPDATE token_cache SET balance_micros = 0, balance_source = 'stale', updated_at = ? WHERE seller_key = ?").run(nowIso(), sellerKey);
178
+ }
166
179
  listPayments() {
167
180
  const rows = this.db.prepare(`SELECT method, enabled, is_default, config_json, updated_at
168
181
  FROM payment_config
@@ -251,12 +264,16 @@ export class BuyerStore {
251
264
  recordInferenceLedger(input) {
252
265
  this.db.prepare(`INSERT INTO inference_ledger (
253
266
  request_id, seller_key, model_id, endpoint, status, prompt_tokens,
254
- completion_tokens, billed_micros, prompt_hash, response_hash, created_at
255
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.requestId, input.sellerKey, input.modelId, input.endpoint, input.status, input.promptTokens, input.completionTokens, input.billedMicros, safeHash(input.prompt) || null, safeHash(input.response) || null, nowIso());
267
+ completion_tokens, billed_micros, estimated_micros, settled_micros,
268
+ settled_usd_micros, price_version, balance_snapshot_micros, balance_source,
269
+ prompt_hash, response_hash, created_at
270
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.requestId, input.sellerKey, input.modelId, input.endpoint, input.status, input.promptTokens, input.completionTokens, input.billedMicros, input.estimatedMicros ?? input.billedMicros, input.settledMicros ?? null, input.settledUsdMicros ?? null, input.priceVersion || null, input.balanceSnapshotMicros ?? null, input.balanceSource || "unknown", safeHash(input.prompt) || null, safeHash(input.response) || null, nowIso());
256
271
  }
257
272
  listInferenceLedger() {
258
273
  const rows = this.db.prepare(`SELECT request_id, seller_key, model_id, endpoint, status, prompt_tokens,
259
- completion_tokens, billed_micros, prompt_hash, response_hash, created_at
274
+ completion_tokens, billed_micros, estimated_micros, settled_micros,
275
+ settled_usd_micros, price_version, balance_snapshot_micros, balance_source,
276
+ prompt_hash, response_hash, created_at
260
277
  FROM inference_ledger
261
278
  ORDER BY id ASC`).all();
262
279
  return rows.map(row => ({
@@ -268,6 +285,12 @@ export class BuyerStore {
268
285
  promptTokens: row.prompt_tokens,
269
286
  completionTokens: row.completion_tokens,
270
287
  billedMicros: row.billed_micros,
288
+ estimatedMicros: row.estimated_micros ?? undefined,
289
+ settledMicros: row.settled_micros ?? undefined,
290
+ settledUsdMicros: row.settled_usd_micros ?? undefined,
291
+ priceVersion: row.price_version || undefined,
292
+ balanceSnapshotMicros: row.balance_snapshot_micros ?? undefined,
293
+ balanceSource: row.balance_source || undefined,
271
294
  promptHash: row.prompt_hash || undefined,
272
295
  responseHash: row.response_hash || undefined,
273
296
  createdAt: row.created_at
@@ -283,6 +306,9 @@ export class BuyerStore {
283
306
  token TEXT NOT NULL,
284
307
  token_class TEXT NOT NULL,
285
308
  balance_micros INTEGER NOT NULL,
309
+ reserved_micros INTEGER NOT NULL DEFAULT 0,
310
+ spent_micros INTEGER NOT NULL DEFAULT 0,
311
+ balance_source TEXT,
286
312
  expires_at TEXT NOT NULL,
287
313
  updated_at TEXT NOT NULL
288
314
  );
@@ -333,6 +359,12 @@ export class BuyerStore {
333
359
  prompt_tokens INTEGER NOT NULL,
334
360
  completion_tokens INTEGER NOT NULL,
335
361
  billed_micros INTEGER NOT NULL,
362
+ estimated_micros INTEGER,
363
+ settled_micros INTEGER,
364
+ settled_usd_micros INTEGER,
365
+ price_version TEXT,
366
+ balance_snapshot_micros INTEGER,
367
+ balance_source TEXT,
336
368
  prompt_hash TEXT,
337
369
  response_hash TEXT,
338
370
  created_at TEXT NOT NULL
@@ -359,6 +391,29 @@ export class BuyerStore {
359
391
  updated_at TEXT NOT NULL
360
392
  );
361
393
  `);
394
+ for (const [column, definition] of [
395
+ ["reserved_micros", "INTEGER NOT NULL DEFAULT 0"],
396
+ ["spent_micros", "INTEGER NOT NULL DEFAULT 0"],
397
+ ["balance_source", "TEXT"]
398
+ ]) {
399
+ this.ensureColumn("token_cache", column, definition);
400
+ }
401
+ for (const [column, definition] of [
402
+ ["estimated_micros", "INTEGER"],
403
+ ["settled_micros", "INTEGER"],
404
+ ["settled_usd_micros", "INTEGER"],
405
+ ["price_version", "TEXT"],
406
+ ["balance_snapshot_micros", "INTEGER"],
407
+ ["balance_source", "TEXT"]
408
+ ]) {
409
+ this.ensureColumn("inference_ledger", column, definition);
410
+ }
411
+ }
412
+ ensureColumn(table, column, definition) {
413
+ const rows = this.db.prepare(`PRAGMA table_info(${table})`).all();
414
+ if (!rows.some((row) => row.name === column)) {
415
+ this.db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
416
+ }
362
417
  }
363
418
  countRows(tableName) {
364
419
  const row = this.db.prepare(`SELECT COUNT(*) AS count FROM ${tableName}`).get();
@@ -1 +1 @@
1
- {"version":3,"file":"buyer-store.js","sourceRoot":"","sources":["../../src/buyer-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buyer-store.js","sourceRoot":"","sources":["../../src/buyer-store.ts"],"names":[],"mappings":"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"}
package/dist/src/cli.d.ts CHANGED
@@ -1,3 +1,20 @@
1
1
  import { Command } from "commander";
2
+ interface ClawtipBootstrapResponse {
3
+ activationFeeFen?: number;
4
+ payment?: {
5
+ orderNo?: string;
6
+ amountFen?: number;
7
+ payTo?: string;
8
+ encryptedData?: string;
9
+ indicator?: string;
10
+ slug?: string;
11
+ skillId?: string;
12
+ description?: string;
13
+ resourceUrl?: string;
14
+ };
15
+ }
16
+ export declare function fetchClawtipBootstrap(bootstrapUrl: string): Promise<ClawtipBootstrapResponse>;
17
+ export declare function normalizeClawtipBootstrapResourceUrl(bootstrapUrl: string, resourceUrl: string): string;
2
18
  export declare function buildCli(): Command;
19
+ export {};
3
20
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwmBpC,wBAAgB,QAAQ,IAAI,OAAO,CA0hBlC"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoFpC,UAAU,wBAAwB;IAChC,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;AAuQD,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAwBnG;AAED,wBAAgB,oCAAoC,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CActG;AAyQD,wBAAgB,QAAQ,IAAI,OAAO,CAmsBlC"}
package/dist/src/cli.js CHANGED
@@ -12,7 +12,9 @@ import * as crypto from "crypto";
12
12
  import { fileURLToPath } from "url";
13
13
  import { discoverSellerBackedModels, filterCatalogByProtocol, filterCatalogBySeller, } from "./seller-catalog.js";
14
14
  import { collectDoctorDiagnostics, collectDoctorModelsSummary, printDoctorProviders, printDoctorModelsSummary, readDoctorProviders, renderDoctorDiagnosticsProgressively, } from "./doctor-diagnostics.js";
15
- import { buildInitTerminalOptions, buildInitSuccessMessage, detectExistingClawtipBinding, INIT_PAYMENT_OPTIONS, noteInitComingSoonPayments, OTHER_TERMINAL_OPTION, validateInitTerminalSelection, } from "./init-payment-options.js";
15
+ import { buildInitSuccessMessage, buildInitTerminalSelectionState, buildInstalledTerminalMessage, INIT_PAYMENT_OPTIONS, inspectClawtipWalletReadiness, inspectOpenClawWalletConfig, noteInitComingSoonPayments, OTHER_TERMINAL_OPTION, validateInitTerminalSelection, } from "./init-payment-options.js";
16
+ import { checkOpenClawRuntime, readClawtipPayCredential, startClawtipWalletBootstrap, waitForClawtipActivationConfirmation, } from "./init-clawtip-activation.js";
17
+ import { displayTerminalImage } from "./terminal-image.js";
16
18
  // @ts-ignore
17
19
  import qrcode from "qrcode-terminal";
18
20
  const CONTROL_PORT = 17820;
@@ -78,6 +80,7 @@ async function probeDaemonStatus(controlPort) {
78
80
  };
79
81
  }
80
82
  }
83
+ const CLAWTIP_BOOTSTRAP_PLACEHOLDER_PAY_TO = "bootstrap-pay-to";
81
84
  async function waitForDaemonStatus(controlPort, timeoutMs) {
82
85
  const deadline = Date.now() + timeoutMs;
83
86
  let latest = { running: false, error: "not checked" };
@@ -233,7 +236,7 @@ function printPaymentList(payments, asJson) {
233
236
  console.log("=== TokenBuddy Payment Methods ===");
234
237
  console.log(table.toString());
235
238
  }
236
- async function fetchClawtipBootstrap(bootstrapUrl) {
239
+ export async function fetchClawtipBootstrap(bootstrapUrl) {
237
240
  const response = await fetch(`${bootstrapUrl.replace(/\/+$/, "")}/payments/clawtip/bootstrap`, {
238
241
  method: "POST",
239
242
  headers: { "Content-Type": "application/json" },
@@ -246,8 +249,32 @@ async function fetchClawtipBootstrap(bootstrapUrl) {
246
249
  if (!body.payment?.orderNo || !body.payment.indicator || !body.payment.resourceUrl) {
247
250
  throw new Error("ClawTip bootstrap response missing payment order fields");
248
251
  }
252
+ if ((body.payment.payTo || "").trim() === CLAWTIP_BOOTSTRAP_PLACEHOLDER_PAY_TO) {
253
+ throw new Error([
254
+ `ClawTip bootstrap service is misconfigured: payTo is still the placeholder \`${CLAWTIP_BOOTSTRAP_PLACEHOLDER_PAY_TO}\`.`,
255
+ `Bootstrap URL: ${bootstrapUrl}`,
256
+ "Configure the bootstrap service with the real ClawTip merchant pay_to before retrying `tb init`.",
257
+ ].join(" "));
258
+ }
259
+ body.payment.resourceUrl = normalizeClawtipBootstrapResourceUrl(bootstrapUrl, body.payment.resourceUrl);
249
260
  return body;
250
261
  }
262
+ export function normalizeClawtipBootstrapResourceUrl(bootstrapUrl, resourceUrl) {
263
+ try {
264
+ const bootstrap = new URL(bootstrapUrl);
265
+ const resource = new URL(resourceUrl);
266
+ if (resource.origin === bootstrap.origin && resource.pathname === "/registry/sellers") {
267
+ resource.pathname = bootstrap.pathname.replace(/\/+$/, "") || "/";
268
+ resource.search = "";
269
+ resource.hash = "";
270
+ return resource.toString().replace(/\/$/, "");
271
+ }
272
+ }
273
+ catch {
274
+ // Leave the server-provided value unchanged when URL parsing fails.
275
+ }
276
+ return resourceUrl;
277
+ }
251
278
  function readProof(options) {
252
279
  const proofFile = options.proofFile || process.env.TOKENBUDDY_CLAWTIP_PROOF_FILE;
253
280
  if (!proofFile) {
@@ -756,15 +783,20 @@ export function buildCli() {
756
783
  const spinner = p.spinner();
757
784
  spinner.start("Scanning local system for programming terminals...");
758
785
  const candidates = detectProviders();
759
- const terminalOptions = buildInitTerminalOptions(candidates);
786
+ const terminalSelection = buildInitTerminalSelectionState(candidates);
760
787
  spinner.stop("Scan completed.");
761
- if (terminalOptions.length === 1 && terminalOptions[0].value === OTHER_TERMINAL_OPTION.value) {
788
+ const installedTerminalMessage = buildInstalledTerminalMessage(terminalSelection.installed);
789
+ if (installedTerminalMessage) {
790
+ p.note(installedTerminalMessage, "Already Configured");
791
+ setupSummaryLines.push(`${terminalSelection.installed.length} terminal${terminalSelection.installed.length === 1 ? "" : "s"} already configured.`);
792
+ }
793
+ if (terminalSelection.options.length === 1 && terminalSelection.options[0].value === OTHER_TERMINAL_OPTION.value) {
762
794
  p.note("No active programming terminals detected. Install one of Codex, Claude Code, Claude Desktop, OpenCode, OpenClaw or Hermes first.");
763
795
  }
764
796
  else {
765
797
  const selected = await p.multiselect({
766
798
  message: "Select programming terminals to route via TokenBuddy (use Space to select, Enter to confirm):",
767
- options: terminalOptions,
799
+ options: terminalSelection.options,
768
800
  required: false
769
801
  });
770
802
  const selectionError = validateInitTerminalSelection(selected);
@@ -837,7 +869,9 @@ export function buildCli() {
837
869
  if (payMethod === "clawtip") {
838
870
  const store = openBuyerStore();
839
871
  try {
840
- const existingClawtip = detectExistingClawtipBinding(store.getPayment("clawtip"));
872
+ let walletConfig = inspectOpenClawWalletConfig();
873
+ const clawtipReadiness = inspectClawtipWalletReadiness(store.getPayment("clawtip"), walletConfig);
874
+ const existingClawtip = clawtipReadiness.reusableBinding;
841
875
  if (existingClawtip) {
842
876
  store.savePayment({
843
877
  method: "clawtip",
@@ -860,47 +894,182 @@ export function buildCli() {
860
894
  setupSummaryLines.push("ClawTip wallet already bound locally; activation skipped.");
861
895
  }
862
896
  else {
897
+ if (clawtipReadiness.status === "metadata_missing_wallet") {
898
+ p.note([
899
+ clawtipReadiness.message,
900
+ `Expected: ${walletConfig.expectedPath}`,
901
+ walletConfig.alternatePaths.length > 0
902
+ ? `Alternates: ${walletConfig.alternatePaths.join(", ")}`
903
+ : "Alternates: -"
904
+ ].join("\n"), "ClawTip");
905
+ setupSummaryLines.push("Saved ClawTip metadata found, but local wallet config is missing; activation restarted.");
906
+ }
907
+ const walletReadyBeforePay = walletConfig.exists;
908
+ let openClawVersion;
909
+ if (!walletReadyBeforePay) {
910
+ spinner.start("Checking OpenClaw CLI before ClawTip wallet bootstrap...");
911
+ openClawVersion = await checkOpenClawRuntime();
912
+ spinner.stop("OpenClaw CLI detected.");
913
+ }
863
914
  spinner.start("Requesting payment activation payload from public bootstrap registry...");
864
915
  const bootstrapUrl = process.env.TOKENBUDDY_BOOTSTRAP_URL || "https://tb-wallet-bootstrap.fly.dev";
865
- const res = await fetch(`${bootstrapUrl}/payments/clawtip/bootstrap`, {
866
- method: "POST",
867
- headers: { "Content-Type": "application/json" },
868
- body: JSON.stringify({ clientTag: "cli-init" })
869
- });
870
- const data = await res.json();
916
+ const bootstrap = await fetchClawtipBootstrap(bootstrapUrl);
871
917
  spinner.stop("Bootstrap payload received.");
872
- const qrUrl = data.payment?.resourceUrl || "https://example.com";
873
- p.note("Scan the QR code below using your JD / WeChat App to complete the 1 Fen payment activation:");
874
- // 💡 High fidelity QR code rendering directly inside the CLI terminal
875
- qrcode.generate(qrUrl, { small: true });
876
- // Start 5-second polling interval
877
- spinner.start("Waiting for JD收银台 payment confirmation (polling activation status)...");
878
- for (let i = 0; i < 5; i++) {
879
- await new Promise(resolve => setTimeout(resolve, 3000));
880
- // Simulate/Wait confirmed. For real deployment, poll actual backend
918
+ if (!bootstrap.payment?.orderNo || !bootstrap.payment?.indicator) {
919
+ throw new Error("ClawTip bootstrap response missing orderNo or indicator.");
881
920
  }
882
- spinner.stop("JD收银台 confirmed payment. ClawTip wallet is active! 🚀");
921
+ const activationPayment = {
922
+ orderNo: bootstrap.payment.orderNo,
923
+ amountFen: bootstrap.payment.amountFen ?? bootstrap.activationFeeFen ?? 1,
924
+ payTo: bootstrap.payment.payTo,
925
+ encryptedData: bootstrap.payment.encryptedData,
926
+ indicator: bootstrap.payment.indicator,
927
+ slug: bootstrap.payment.slug,
928
+ skillId: bootstrap.payment.skillId,
929
+ description: bootstrap.payment.description,
930
+ resourceUrl: bootstrap.payment.resourceUrl,
931
+ };
932
+ spinner.start("Starting the ClawTip payment activation flow...");
933
+ let activation = await startClawtipWalletBootstrap(activationPayment);
934
+ spinner.stop("ClawTip payment activation finished.");
935
+ let payCredential = activation.payCredential;
936
+ for (let authAttempt = 1; (walletReadyBeforePay ? !payCredential : !walletConfig.exists)
937
+ && activation.parsedOutput.requiresWalletAuth
938
+ && authAttempt <= 3; authAttempt += 1) {
939
+ let qrDisplayMessage;
940
+ let manualOpenCommand;
941
+ if (activation.parsedOutput.mediaPath) {
942
+ const qrDisplay = await displayTerminalImage(activation.parsedOutput.mediaPath);
943
+ qrDisplayMessage = qrDisplay.message;
944
+ manualOpenCommand = qrDisplay.fallbackCommand;
945
+ }
946
+ if (!activation.parsedOutput.mediaPath && !activation.parsedOutput.authUrl) {
947
+ throw new Error(`ClawTip pay requested authorization but did not return QR media or authUrl. Order file: ${activation.orderFile}`);
948
+ }
949
+ p.note([
950
+ activation.parsedOutput.mediaPath
951
+ ? `Open or scan this ClawTip wallet QR image with the JD app: ${activation.parsedOutput.mediaPath}`
952
+ : undefined,
953
+ activation.parsedOutput.authUrl
954
+ ? `Open or scan this ClawTip wallet auth URL with the JD app: ${activation.parsedOutput.authUrl}`
955
+ : undefined,
956
+ qrDisplayMessage,
957
+ manualOpenCommand ? `Manual open command: ${manualOpenCommand}` : undefined,
958
+ activation.parsedOutput.clawtipId ? `clawtipId: ${activation.parsedOutput.clawtipId}` : undefined,
959
+ activation.parsedOutput.clawtipId
960
+ ? "After scanning, ClawTip CLI will register the local agent wallet."
961
+ : "After scanning, TokenBuddy will retry ClawTip payment activation.",
962
+ `Expected wallet config: ${walletConfig.expectedPath}`,
963
+ openClawVersion ? `OpenClaw: ${openClawVersion}` : undefined,
964
+ ].filter(Boolean).join("\n"), activation.parsedOutput.clawtipId ? "ClawTip Wallet QR" : "ClawTip Authorization QR");
965
+ if (activation.parsedOutput.clawtipId && !walletReadyBeforePay) {
966
+ spinner.start("Waiting for ClawTip wallet registration. Press Ctrl+C to cancel.");
967
+ const walletRegistered = await waitForClawtipActivationConfirmation({
968
+ clawtipId: activation.parsedOutput.clawtipId,
969
+ });
970
+ spinner.stop(walletRegistered
971
+ ? "Detected local OpenClaw ClawTip wallet config."
972
+ : "ClawTip wallet registration cancelled.");
973
+ if (!walletRegistered) {
974
+ setupSummaryLines.push("ClawTip wallet registration was cancelled before local wallet config was saved.");
975
+ process.exitCode = 1;
976
+ return;
977
+ }
978
+ walletConfig = inspectOpenClawWalletConfig();
979
+ if (!walletConfig.exists) {
980
+ throw new Error(`ClawTip wallet registration finished but wallet config is still missing: ${walletConfig.expectedPath}`);
981
+ }
982
+ setupSummaryLines.push("ClawTip wallet registered locally.");
983
+ }
984
+ else {
985
+ const authorized = await p.confirm({
986
+ message: "Scan or authorize this ClawTip QR in the JD app, then press Enter to retry payment activation.",
987
+ initialValue: true,
988
+ });
989
+ if (authorized !== true) {
990
+ setupSummaryLines.push("ClawTip authorization was cancelled before payment activation completed.");
991
+ process.exitCode = 1;
992
+ return;
993
+ }
994
+ walletConfig = inspectOpenClawWalletConfig();
995
+ }
996
+ payCredential = readClawtipPayCredential(activation.orderFile);
997
+ if (!payCredential) {
998
+ spinner.start(`Retrying ClawTip payment activation after authorization (${authAttempt}/3)...`);
999
+ activation = await startClawtipWalletBootstrap(activationPayment);
1000
+ spinner.stop("ClawTip payment activation retry finished.");
1001
+ payCredential = activation.payCredential;
1002
+ }
1003
+ }
1004
+ const refreshedWalletConfig = inspectOpenClawWalletConfig();
1005
+ if (!walletReadyBeforePay && !refreshedWalletConfig.exists) {
1006
+ const paymentQrMessage = activation.parsedOutput.mediaPath
1007
+ ? ` ClawTip pay returned QR media: ${activation.parsedOutput.mediaPath}`
1008
+ : " ClawTip pay did not return QR media.";
1009
+ throw new Error([
1010
+ `ClawTip wallet config is still missing after payment activation: ${refreshedWalletConfig.expectedPath}.`,
1011
+ `Order file: ${activation.orderFile}.`,
1012
+ paymentQrMessage.trim(),
1013
+ ].join(" "));
1014
+ }
1015
+ const completedByWalletConfig = !payCredential && !walletReadyBeforePay && refreshedWalletConfig.exists;
1016
+ if (!payCredential && !completedByWalletConfig) {
1017
+ const paymentQrMessage = activation.parsedOutput.mediaPath
1018
+ ? ` ClawTip pay returned QR media: ${activation.parsedOutput.mediaPath}`
1019
+ : "";
1020
+ throw new Error(`ClawTip pay did not write payCredential to the order file. Order file: ${activation.orderFile}.${paymentQrMessage}`);
1021
+ }
1022
+ const activationCompletedBy = payCredential
1023
+ ? (refreshedWalletConfig.exists ? "payCredential+wallet-config" : "payCredential")
1024
+ : "wallet-config";
883
1025
  store.savePayment({
884
1026
  method: "clawtip",
885
1027
  enabled: true,
886
1028
  isDefault: true,
887
1029
  config: {
888
1030
  bootstrapUrl,
889
- orderNo: data.payment?.orderNo,
890
- amountFen: data.payment?.amountFen ?? data.activationFeeFen,
891
- indicator: data.payment?.indicator,
892
- slug: data.payment?.slug,
893
- skillId: data.payment?.skillId,
894
- description: data.payment?.description,
895
- resourceUrl: data.payment?.resourceUrl,
896
- proofRequired: false
1031
+ orderNo: bootstrap.payment?.orderNo,
1032
+ amountFen: bootstrap.payment?.amountFen ?? bootstrap.activationFeeFen,
1033
+ indicator: bootstrap.payment?.indicator,
1034
+ slug: bootstrap.payment?.slug,
1035
+ skillId: bootstrap.payment?.skillId,
1036
+ description: bootstrap.payment?.description,
1037
+ resourceUrl: bootstrap.payment?.resourceUrl,
1038
+ proofRequired: false,
1039
+ activationOrderFile: activation.orderFile,
1040
+ walletConfigPath: refreshedWalletConfig.expectedPath,
1041
+ walletConfigPresent: refreshedWalletConfig.exists,
1042
+ payCredentialWritten: Boolean(payCredential),
1043
+ activationCompletedBy
897
1044
  }
898
1045
  });
899
1046
  logger.info("payment.channel.added", "clawtip payment channel added during init", {
900
1047
  method: "clawtip",
901
- orderNo: data.payment?.orderNo
1048
+ orderNo: bootstrap.payment?.orderNo,
1049
+ payCredentialWritten: Boolean(payCredential),
1050
+ activationCompletedBy
902
1051
  });
903
- setupSummaryLines.push("ClawTip wallet activated and set as the default payment method.");
1052
+ if (refreshedWalletConfig.exists) {
1053
+ if (!payCredential) {
1054
+ p.note([
1055
+ "OpenClaw saved the local ClawTip wallet config, but the ClawTip order file did not contain payCredential.",
1056
+ `Order file: ${activation.orderFile}`,
1057
+ "TokenBuddy saved the wallet binding metadata and will rely on the local wallet for future ClawTip purchases."
1058
+ ].join("\n"), "ClawTip");
1059
+ }
1060
+ setupSummaryLines.push("ClawTip wallet activated and set as the default payment method.");
1061
+ }
1062
+ else {
1063
+ p.note([
1064
+ "ClawTip payment metadata was saved, but the local OpenClaw wallet config is still missing.",
1065
+ `Expected: ${refreshedWalletConfig.expectedPath}`,
1066
+ refreshedWalletConfig.alternatePaths.length > 0
1067
+ ? `Nearby files: ${refreshedWalletConfig.alternatePaths.join(", ")}`
1068
+ : "Nearby files: -",
1069
+ "Bind or restore the local wallet before using ClawTip-backed purchases."
1070
+ ].join("\n"), "ClawTip Wallet Required");
1071
+ setupSummaryLines.push("ClawTip payment metadata saved; local wallet config still needs binding before use.");
1072
+ }
904
1073
  }
905
1074
  }
906
1075
  catch (err) {