@tokenbuddy/tokenbuddy 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/src/buyer-store.d.ts +20 -0
  2. package/dist/src/buyer-store.d.ts.map +1 -1
  3. package/dist/src/buyer-store.js +73 -1
  4. package/dist/src/buyer-store.js.map +1 -1
  5. package/dist/src/cli.d.ts.map +1 -1
  6. package/dist/src/cli.js +390 -62
  7. package/dist/src/cli.js.map +1 -1
  8. package/dist/src/daemon.d.ts +6 -5
  9. package/dist/src/daemon.d.ts.map +1 -1
  10. package/dist/src/daemon.js +298 -92
  11. package/dist/src/daemon.js.map +1 -1
  12. package/dist/src/doctor-diagnostics.d.ts +97 -0
  13. package/dist/src/doctor-diagnostics.d.ts.map +1 -0
  14. package/dist/src/doctor-diagnostics.js +547 -0
  15. package/dist/src/doctor-diagnostics.js.map +1 -0
  16. package/dist/src/init-payment-options.d.ts +34 -0
  17. package/dist/src/init-payment-options.d.ts.map +1 -0
  18. package/dist/src/init-payment-options.js +90 -0
  19. package/dist/src/init-payment-options.js.map +1 -0
  20. package/dist/src/provider-install.d.ts +37 -2
  21. package/dist/src/provider-install.d.ts.map +1 -1
  22. package/dist/src/provider-install.js +317 -67
  23. package/dist/src/provider-install.js.map +1 -1
  24. package/dist/src/seller-catalog.d.ts +79 -0
  25. package/dist/src/seller-catalog.d.ts.map +1 -0
  26. package/dist/src/seller-catalog.js +126 -0
  27. package/dist/src/seller-catalog.js.map +1 -0
  28. package/dist/src/tb-proxyd.js +13 -2
  29. package/dist/src/tb-proxyd.js.map +1 -1
  30. package/package.json +4 -4
  31. package/src/buyer-store.ts +113 -1
  32. package/src/cli.ts +490 -67
  33. package/src/daemon.ts +346 -117
  34. package/src/doctor-diagnostics.ts +850 -0
  35. package/src/init-payment-options.ts +131 -0
  36. package/src/provider-install.ts +426 -76
  37. package/src/seller-catalog.ts +222 -0
  38. package/src/tb-proxyd.ts +14 -2
  39. package/tests/e2e.test.ts +9 -0
  40. package/tests/tokenbuddy.test.ts +628 -19
  41. package/bin/tb-proxyd.js +0 -2
  42. package/bin/tb.js +0 -3
@@ -0,0 +1,90 @@
1
+ import * as p from "@clack/prompts";
2
+ export const OTHER_TERMINAL_OPTION = {
3
+ value: "other",
4
+ label: "Other",
5
+ hint: "I will configure my own terminal using the TokenBuddy proxy endpoints."
6
+ };
7
+ export const INIT_PAYMENT_OPTIONS = [
8
+ {
9
+ value: "clawtip",
10
+ label: "JD ClawTip Pay (Scan QR Code to activate)",
11
+ hint: "1 Fen activation fee"
12
+ }
13
+ ];
14
+ export const INIT_COMING_SOON_PAYMENT_OPTIONS = [
15
+ {
16
+ id: "wechat-pay",
17
+ label: "WeChat Pay"
18
+ },
19
+ {
20
+ id: "alipay-agent-payment",
21
+ label: "Alipay Agent Payment"
22
+ },
23
+ {
24
+ id: "coinbase-smart-wallet",
25
+ label: "Coinbase Smart Wallet"
26
+ }
27
+ ];
28
+ export function noteInitComingSoonPayments(note = p.note) {
29
+ note(INIT_COMING_SOON_PAYMENT_OPTIONS.map((entry) => `- ${entry.label}(接入中)`).join("\n"), "更多支付方式");
30
+ }
31
+ export function buildInitTerminalOptions(providers) {
32
+ const detected = providers
33
+ .filter((provider) => provider.detected)
34
+ .map((provider) => {
35
+ if (provider.status === "configured") {
36
+ return {
37
+ value: `${provider.id}:installed`,
38
+ label: `${provider.name}(已安装)`,
39
+ hint: provider.reason
40
+ };
41
+ }
42
+ return {
43
+ value: provider.id,
44
+ label: provider.name,
45
+ hint: provider.reason
46
+ };
47
+ });
48
+ return [...detected, OTHER_TERMINAL_OPTION];
49
+ }
50
+ export function validateInitTerminalSelection(selected) {
51
+ if (!selected || selected.length === 0) {
52
+ return "Select at least one terminal or choose Other.";
53
+ }
54
+ const actionable = selected.filter((value) => !value.endsWith(":installed"));
55
+ if (actionable.length === 0) {
56
+ return "Installed terminals are already configured. Select another terminal or choose Other.";
57
+ }
58
+ return undefined;
59
+ }
60
+ function stringField(value) {
61
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
62
+ }
63
+ export function detectExistingClawtipBinding(payment) {
64
+ if (!payment || payment.method !== "clawtip" || !payment.config || typeof payment.config !== "object") {
65
+ return undefined;
66
+ }
67
+ const config = payment.config;
68
+ const resourceUrl = stringField(config.resourceUrl);
69
+ const orderNo = stringField(config.orderNo);
70
+ if (!resourceUrl && !orderNo) {
71
+ return undefined;
72
+ }
73
+ return {
74
+ config,
75
+ resourceUrl,
76
+ orderNo,
77
+ };
78
+ }
79
+ export function buildInitSuccessMessage(summaryLines = []) {
80
+ const lines = ["✅ TokenBuddy setup completed successfully."];
81
+ for (const line of summaryLines) {
82
+ const trimmed = line.trim();
83
+ if (trimmed) {
84
+ lines.push(`- ${trimmed}`);
85
+ }
86
+ }
87
+ lines.push("Run `tb doctor` to audit status anytime.");
88
+ return lines.join("\n");
89
+ }
90
+ //# sourceMappingURL=init-payment-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-payment-options.js","sourceRoot":"","sources":["../../src/init-payment-options.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,41 @@
1
1
  import { BuyerStore } from "./buyer-store.js";
2
- export declare const SUPPORTED_PROVIDER_IDS: readonly ["codex", "claude-code", "claude-desktop", "openclaw", "hermes"];
2
+ import { ProtocolPreference, SellerRoutingPreference } from "./seller-catalog.js";
3
+ export declare const PROXY_ACCESS_TOKEN_PLACEHOLDER = "TOKENBUDDY_PROXY";
4
+ export declare const SUPPORTED_PROVIDER_IDS: readonly ["codex", "claude-code", "claude-desktop", "openclaw", "opencode", "hermes"];
3
5
  export type ProviderId = typeof SUPPORTED_PROVIDER_IDS[number];
6
+ export type ModelSelectionKind = "single-model" | "claude-role-mapping";
4
7
  export interface ProviderDetectOptions {
5
8
  home?: string;
6
9
  }
10
+ export interface SingleModelProviderRuntimeConfig {
11
+ selectionKind: "single-model";
12
+ protocolPreference?: ProtocolPreference;
13
+ defaultModel: string;
14
+ sellerId?: string;
15
+ }
16
+ export interface ClaudeRoleBinding {
17
+ upstreamModel: string;
18
+ displayName?: string;
19
+ declareOneM?: boolean;
20
+ }
21
+ export interface ClaudeCodeModelMappingConfig {
22
+ selectionKind: "claude-role-mapping";
23
+ protocolPreference?: ProtocolPreference;
24
+ fallbackModel?: string;
25
+ roles: {
26
+ haiku?: ClaudeRoleBinding;
27
+ sonnet?: ClaudeRoleBinding;
28
+ opus?: ClaudeRoleBinding;
29
+ };
30
+ }
31
+ export type ProviderRuntimeConfig = SingleModelProviderRuntimeConfig | ClaudeCodeModelMappingConfig;
32
+ export type ProviderSelections = Partial<Record<ProviderId, ProviderRuntimeConfig>>;
7
33
  export interface ProviderInstallOptions extends ProviderDetectOptions {
8
34
  providers: string[];
9
35
  proxyUrl: string;
10
- model: string;
36
+ model?: string;
37
+ providerSelections?: ProviderSelections;
38
+ sellerRouting?: SellerRoutingPreference;
11
39
  }
12
40
  export interface ProviderRollbackOptions extends ProviderDetectOptions {
13
41
  providers: string[];
@@ -16,7 +44,12 @@ export interface ProviderCandidate {
16
44
  id: ProviderId;
17
45
  name: string;
18
46
  detected: boolean;
47
+ configured: boolean;
48
+ status: "configured" | "installed" | "missing";
19
49
  configPath: string;
50
+ commandName?: string;
51
+ executablePath?: string;
52
+ observedPaths?: string[];
20
53
  reason: string;
21
54
  }
22
55
  export interface ProviderFileChange {
@@ -38,6 +71,8 @@ export interface ProviderRollbackResult {
38
71
  action: "restored" | "removed" | "missing_snapshot";
39
72
  }
40
73
  export declare function detectProviders(options?: ProviderDetectOptions): ProviderCandidate[];
74
+ export declare function getProviderProtocolPreference(providerId: ProviderId): ProtocolPreference | undefined;
75
+ export declare function getProviderModelSelectionKind(providerId: ProviderId): ModelSelectionKind;
41
76
  export declare function previewProviderInstall(options: ProviderInstallOptions): ProviderFileChange[];
42
77
  export declare function applyProviderInstall(options: ProviderInstallOptions, store: BuyerStore): ProviderApplyResult[];
43
78
  export declare function rollbackProviderInstall(options: ProviderRollbackOptions, store: BuyerStore): ProviderRollbackResult[];
@@ -1 +1 @@
1
- {"version":3,"file":"provider-install.d.ts","sourceRoot":"","sources":["../../src/provider-install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAA2B,MAAM,kBAAkB,CAAC;AAKvE,eAAO,MAAM,sBAAsB,2EAMzB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,UAAU,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,kBAAkB,CAAC;CACrD;AAkND,wBAAgB,eAAe,CAAC,OAAO,GAAE,qBAA0B,GAAG,iBAAiB,EAAE,CAaxF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,GAAG,kBAAkB,EAAE,CAgB5F;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,UAAU,GAAG,mBAAmB,EAAE,CAiC9G;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,EAAE,KAAK,EAAE,UAAU,GAAG,sBAAsB,EAAE,CAyBrH"}
1
+ {"version":3,"file":"provider-install.d.ts","sourceRoot":"","sources":["../../src/provider-install.ts"],"names":[],"mappings":"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"}