gatepay-local-mcp 1.0.0 → 1.0.2

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 (106) hide show
  1. package/Readme.md +122 -44
  2. package/dist/src/index.js +161 -86
  3. package/dist/src/index.js.map +1 -1
  4. package/dist/src/modes/build-pay-fetch.d.ts +7 -0
  5. package/dist/src/modes/build-pay-fetch.d.ts.map +1 -0
  6. package/dist/src/modes/build-pay-fetch.js +22 -0
  7. package/dist/src/modes/build-pay-fetch.js.map +1 -0
  8. package/dist/src/modes/input-normalizer.d.ts +17 -0
  9. package/dist/src/modes/input-normalizer.d.ts.map +1 -0
  10. package/dist/src/modes/input-normalizer.js +22 -0
  11. package/dist/src/modes/input-normalizer.js.map +1 -0
  12. package/dist/src/modes/local-private-key.d.ts +9 -0
  13. package/dist/src/modes/local-private-key.d.ts.map +1 -0
  14. package/dist/src/modes/local-private-key.js +35 -0
  15. package/dist/src/modes/local-private-key.js.map +1 -0
  16. package/dist/src/modes/plugin-wallet.d.ts +19 -0
  17. package/dist/src/modes/plugin-wallet.d.ts.map +1 -0
  18. package/dist/src/modes/plugin-wallet.js +153 -0
  19. package/dist/src/modes/plugin-wallet.js.map +1 -0
  20. package/dist/src/modes/quick-wallet.d.ts +15 -0
  21. package/dist/src/modes/quick-wallet.d.ts.map +1 -0
  22. package/dist/src/modes/quick-wallet.js +94 -0
  23. package/dist/src/modes/quick-wallet.js.map +1 -0
  24. package/dist/src/modes/registry.d.ts +26 -0
  25. package/dist/src/modes/registry.d.ts.map +1 -0
  26. package/dist/src/modes/registry.js +126 -0
  27. package/dist/src/modes/registry.js.map +1 -0
  28. package/dist/src/modes/signers.d.ts +40 -0
  29. package/dist/src/modes/signers.d.ts.map +1 -0
  30. package/dist/src/modes/signers.js +259 -0
  31. package/dist/src/modes/signers.js.map +1 -0
  32. package/dist/src/modes/types.d.ts +38 -0
  33. package/dist/src/modes/types.d.ts.map +1 -0
  34. package/dist/src/modes/types.js +2 -0
  35. package/dist/src/modes/types.js.map +1 -0
  36. package/dist/src/wallets/auth-token-store.d.ts +17 -0
  37. package/dist/src/wallets/auth-token-store.d.ts.map +1 -0
  38. package/dist/src/wallets/auth-token-store.js +43 -0
  39. package/dist/src/wallets/auth-token-store.js.map +1 -0
  40. package/dist/src/wallets/device-flow-login.d.ts +27 -0
  41. package/dist/src/wallets/device-flow-login.d.ts.map +1 -0
  42. package/dist/src/wallets/device-flow-login.js +235 -0
  43. package/dist/src/wallets/device-flow-login.js.map +1 -0
  44. package/dist/src/wallets/plugin-wallet-client.d.ts +15 -0
  45. package/dist/src/wallets/plugin-wallet-client.d.ts.map +1 -0
  46. package/dist/src/wallets/plugin-wallet-client.js +83 -0
  47. package/dist/src/wallets/plugin-wallet-client.js.map +1 -0
  48. package/dist/src/wallets/wallet-mcp-clients.d.ts +2121 -0
  49. package/dist/src/wallets/wallet-mcp-clients.d.ts.map +1 -0
  50. package/dist/src/wallets/wallet-mcp-clients.js +264 -0
  51. package/dist/src/wallets/wallet-mcp-clients.js.map +1 -0
  52. package/dist/src/x402/client.d.ts.map +1 -0
  53. package/dist/src/{x402-standalone → x402}/client.js +1 -0
  54. package/dist/src/x402/client.js.map +1 -0
  55. package/dist/src/x402/exactEvmScheme.d.ts.map +1 -0
  56. package/dist/src/x402/exactEvmScheme.js.map +1 -0
  57. package/dist/src/x402/fetch.d.ts.map +1 -0
  58. package/dist/src/x402/fetch.js.map +1 -0
  59. package/dist/src/x402/gatelayer.d.ts.map +1 -0
  60. package/dist/src/x402/gatelayer.js.map +1 -0
  61. package/dist/src/x402/http.d.ts.map +1 -0
  62. package/dist/src/x402/http.js.map +1 -0
  63. package/dist/src/x402/types.d.ts.map +1 -0
  64. package/dist/src/x402/types.js.map +1 -0
  65. package/dist/src/{x402-standalone → x402}/utils.d.ts +17 -0
  66. package/dist/src/x402/utils.d.ts.map +1 -0
  67. package/dist/src/{x402-standalone → x402}/utils.js +14 -1
  68. package/dist/src/x402/utils.js.map +1 -0
  69. package/package.json +14 -3
  70. package/dist/src/x402-standalone/client.d.ts.map +0 -1
  71. package/dist/src/x402-standalone/client.js.map +0 -1
  72. package/dist/src/x402-standalone/exactEvmScheme.d.ts.map +0 -1
  73. package/dist/src/x402-standalone/exactEvmScheme.js.map +0 -1
  74. package/dist/src/x402-standalone/fetch.d.ts.map +0 -1
  75. package/dist/src/x402-standalone/fetch.js.map +0 -1
  76. package/dist/src/x402-standalone/gatelayer.d.ts.map +0 -1
  77. package/dist/src/x402-standalone/gatelayer.js.map +0 -1
  78. package/dist/src/x402-standalone/http.d.ts.map +0 -1
  79. package/dist/src/x402-standalone/http.js.map +0 -1
  80. package/dist/src/x402-standalone/index.d.ts +0 -9
  81. package/dist/src/x402-standalone/index.d.ts.map +0 -1
  82. package/dist/src/x402-standalone/index.js +0 -8
  83. package/dist/src/x402-standalone/index.js.map +0 -1
  84. package/dist/src/x402-standalone/signer.d.ts +0 -4
  85. package/dist/src/x402-standalone/signer.d.ts.map +0 -1
  86. package/dist/src/x402-standalone/signer.js +0 -38
  87. package/dist/src/x402-standalone/signer.js.map +0 -1
  88. package/dist/src/x402-standalone/types.d.ts.map +0 -1
  89. package/dist/src/x402-standalone/types.js.map +0 -1
  90. package/dist/src/x402-standalone/utils.d.ts.map +0 -1
  91. package/dist/src/x402-standalone/utils.js.map +0 -1
  92. package/dist/test/fetch.d.ts +0 -2
  93. package/dist/test/fetch.d.ts.map +0 -1
  94. package/dist/test/fetch.js +0 -54
  95. package/dist/test/fetch.js.map +0 -1
  96. /package/dist/src/{x402-standalone → x402}/client.d.ts +0 -0
  97. /package/dist/src/{x402-standalone → x402}/exactEvmScheme.d.ts +0 -0
  98. /package/dist/src/{x402-standalone → x402}/exactEvmScheme.js +0 -0
  99. /package/dist/src/{x402-standalone → x402}/fetch.d.ts +0 -0
  100. /package/dist/src/{x402-standalone → x402}/fetch.js +0 -0
  101. /package/dist/src/{x402-standalone → x402}/gatelayer.d.ts +0 -0
  102. /package/dist/src/{x402-standalone → x402}/gatelayer.js +0 -0
  103. /package/dist/src/{x402-standalone → x402}/http.d.ts +0 -0
  104. /package/dist/src/{x402-standalone → x402}/http.js +0 -0
  105. /package/dist/src/{x402-standalone → x402}/types.d.ts +0 -0
  106. /package/dist/src/{x402-standalone → x402}/types.js +0 -0
@@ -0,0 +1,17 @@
1
+ import type { SignModeId } from "./types.js";
2
+ export interface RawX402RequestInput {
3
+ url?: unknown;
4
+ method?: unknown;
5
+ body?: unknown;
6
+ sign_mode?: unknown;
7
+ wallet_login_provider?: unknown;
8
+ }
9
+ export interface NormalizedX402RequestInput {
10
+ url: string;
11
+ method: string;
12
+ body?: string;
13
+ signMode?: SignModeId | string;
14
+ walletLoginProvider: "google" | "gate";
15
+ }
16
+ export declare function normalizeX402RequestInput(input: RawX402RequestInput): NormalizedX402RequestInput;
17
+ //# sourceMappingURL=input-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-normalizer.d.ts","sourceRoot":"","sources":["../../../src/modes/input-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC/B,mBAAmB,EAAE,QAAQ,GAAG,MAAM,CAAC;CACxC;AAQD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,mBAAmB,GACzB,0BAA0B,CAgB5B"}
@@ -0,0 +1,22 @@
1
+ function normalizeOptionalString(value) {
2
+ if (value == null)
3
+ return undefined;
4
+ const text = String(value).trim();
5
+ return text ? text : undefined;
6
+ }
7
+ export function normalizeX402RequestInput(input) {
8
+ const signMode = normalizeOptionalString(input.sign_mode);
9
+ const method = normalizeOptionalString(input.method)?.toUpperCase() ?? "POST";
10
+ const body = normalizeOptionalString(input.body);
11
+ const walletLoginProvider = normalizeOptionalString(input.wallet_login_provider)?.toLowerCase() === "google"
12
+ ? "google"
13
+ : "gate";
14
+ return {
15
+ url: normalizeOptionalString(input.url) ?? "",
16
+ method,
17
+ body,
18
+ signMode,
19
+ walletLoginProvider,
20
+ };
21
+ }
22
+ //# sourceMappingURL=input-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-normalizer.js","sourceRoot":"","sources":["../../../src/modes/input-normalizer.ts"],"names":[],"mappings":"AAkBA,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAA0B;IAE1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;IAC9E,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,mBAAmB,GACvB,uBAAuB,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,KAAK,QAAQ;QAC9E,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,MAAM,CAAC;IAEb,OAAO;QACL,GAAG,EAAE,uBAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;QAC7C,MAAM;QACN,IAAI;QACJ,QAAQ;QACR,mBAAmB;KACpB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedSignerSession, SignModeAvailability, SignModeDefinition } from "./types.js";
2
+ export declare class LocalPrivateKeyMode implements SignModeDefinition {
3
+ readonly id: "local_private_key";
4
+ readonly priority = 10;
5
+ checkAvailability(): SignModeAvailability;
6
+ resolveSigner(): Promise<ResolvedSignerSession>;
7
+ getCacheKey(): string;
8
+ }
9
+ //# sourceMappingURL=local-private-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-private-key.d.ts","sourceRoot":"","sources":["../../../src/modes/local-private-key.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,EAAG,mBAAmB,CAAU;IAC3C,QAAQ,CAAC,QAAQ,MAAM;IAEvB,iBAAiB,IAAI,oBAAoB;IAgBnC,aAAa,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAYrD,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,35 @@
1
+ import { createLocalPrivateKeySigner } from "./signers.js";
2
+ export class LocalPrivateKeyMode {
3
+ constructor() {
4
+ this.id = "local_private_key";
5
+ this.priority = 10;
6
+ }
7
+ checkAvailability() {
8
+ const privateKey = process.env.EVM_PRIVATE_KEY?.trim();
9
+ if (!privateKey) {
10
+ return {
11
+ status: "not_configured",
12
+ summary: "本地私钥模式未配置 EVM_PRIVATE_KEY。",
13
+ missing: ["EVM_PRIVATE_KEY"],
14
+ };
15
+ }
16
+ return {
17
+ status: "ready",
18
+ summary: "本地私钥模式可直接使用。",
19
+ };
20
+ }
21
+ async resolveSigner() {
22
+ const raw = process.env.EVM_PRIVATE_KEY?.trim();
23
+ if (!raw) {
24
+ throw new Error("EVM_PRIVATE_KEY is not set.");
25
+ }
26
+ const privateKey = (raw.startsWith("0x") ? raw : `0x${raw}`);
27
+ return {
28
+ signer: createLocalPrivateKeySigner(privateKey),
29
+ };
30
+ }
31
+ getCacheKey() {
32
+ return this.id;
33
+ }
34
+ }
35
+ //# sourceMappingURL=local-private-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-private-key.js","sourceRoot":"","sources":["../../../src/modes/local-private-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAO3D,MAAM,OAAO,mBAAmB;IAAhC;QACW,OAAE,GAAG,mBAA4B,CAAC;QAClC,aAAQ,GAAG,EAAE,CAAC;IAiCzB,CAAC;IA/BC,iBAAiB;QACf,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO;gBACL,MAAM,EAAE,gBAAgB;gBACxB,OAAO,EAAE,4BAA4B;gBACrC,OAAO,EAAE,CAAC,iBAAiB,CAAC;aAC7B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAkB,CAAC;QAC9E,OAAO;YACL,MAAM,EAAE,2BAA2B,CAAC,UAAU,CAAC;SAChD,CAAC;IACJ,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { type PluginWalletClient } from "../wallets/plugin-wallet-client.js";
2
+ import type { ResolveSignerContext, ResolvedSignerSession, SignModeAvailability, SignModeDefinition } from "./types.js";
3
+ export interface PluginWalletModeOptions {
4
+ serverUrl?: string;
5
+ clientFactory?: (serverUrl: string) => Promise<PluginWalletClient>;
6
+ }
7
+ export declare class PluginWalletMode implements SignModeDefinition {
8
+ private readonly options;
9
+ readonly id: "plugin_wallet";
10
+ readonly priority = 30;
11
+ constructor(options?: PluginWalletModeOptions);
12
+ checkAvailability(): Promise<SignModeAvailability>;
13
+ resolveSigner(context: ResolveSignerContext): Promise<ResolvedSignerSession>;
14
+ getCacheKey(): string;
15
+ private getServerUrl;
16
+ private getClient;
17
+ private resolveAddress;
18
+ }
19
+ //# sourceMappingURL=plugin-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-wallet.d.ts","sourceRoot":"","sources":["../../../src/modes/plugin-wallet.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACpE;AAED,qBAAa,gBAAiB,YAAW,kBAAkB;IAI7C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,EAAE,EAAG,eAAe,CAAU;IACvC,QAAQ,CAAC,QAAQ,MAAM;gBAEM,OAAO,GAAE,uBAA4B;IAE5D,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAgClD,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAiBlF,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,YAAY;YASN,SAAS;YAQT,cAAc;CAqB7B"}
@@ -0,0 +1,153 @@
1
+ import { createPluginWalletSigner } from "./signers.js";
2
+ import { getPluginWalletClient, getPluginWalletServerUrl, } from "../wallets/plugin-wallet-client.js";
3
+ export class PluginWalletMode {
4
+ constructor(options = {}) {
5
+ this.options = options;
6
+ this.id = "plugin_wallet";
7
+ this.priority = 30;
8
+ }
9
+ async checkAvailability() {
10
+ const serverUrl = this.getServerUrl();
11
+ if (!serverUrl) {
12
+ return {
13
+ status: "not_configured",
14
+ summary: "plugin_wallet 未配置 PLUGIN_WALLET_URL。",
15
+ missing: ["PLUGIN_WALLET_URL"],
16
+ };
17
+ }
18
+ try {
19
+ const client = await this.getClient(serverUrl);
20
+ const statusResult = await client.walletStatus();
21
+ const statusData = parseToolResult(statusResult);
22
+ if (isPluginWalletConnected(statusData)) {
23
+ return {
24
+ status: "ready",
25
+ summary: "plugin_wallet 已连接可用浏览器钱包。",
26
+ };
27
+ }
28
+ }
29
+ catch (error) {
30
+ const message = getErrorMessage(error);
31
+ console.error(`[plugin_wallet] checkAvailability failed: ${message}`);
32
+ }
33
+ return {
34
+ status: "needs_login",
35
+ summary: "plugin_wallet 需要先连接浏览器钱包。",
36
+ missing: ["browser_wallet_connection"],
37
+ };
38
+ }
39
+ async resolveSigner(context) {
40
+ void context;
41
+ const serverUrl = this.getServerUrl();
42
+ if (!serverUrl) {
43
+ throw new Error("PLUGIN_WALLET_URL is not set.");
44
+ }
45
+ const client = await this.getClient(serverUrl);
46
+ const connectResult = await client.connectWallet();
47
+ console.log("connectResult", connectResult);
48
+ const address = await this.resolveAddress(client, connectResult);
49
+ return {
50
+ signer: createPluginWalletSigner(client, address),
51
+ };
52
+ }
53
+ getCacheKey() {
54
+ return `${this.id}:${this.getServerUrl() ?? "missing-url"}`;
55
+ }
56
+ getServerUrl() {
57
+ const fromOptions = this.options.serverUrl?.trim();
58
+ if (fromOptions) {
59
+ return fromOptions;
60
+ }
61
+ return getPluginWalletServerUrl();
62
+ }
63
+ async getClient(serverUrl) {
64
+ if (this.options.clientFactory) {
65
+ return this.options.clientFactory(serverUrl);
66
+ }
67
+ return getPluginWalletClient({ serverUrl });
68
+ }
69
+ async resolveAddress(client, connectResult) {
70
+ const connectData = parseToolResult(connectResult);
71
+ const connectedAddress = extractEvmAddress(connectData);
72
+ if (connectedAddress) {
73
+ return connectedAddress;
74
+ }
75
+ const accountsResult = await client.getAccounts();
76
+ const accountsData = parseToolResult(accountsResult);
77
+ const accountAddress = extractEvmAddress(accountsData);
78
+ if (accountAddress) {
79
+ return accountAddress;
80
+ }
81
+ const hint = getExtensionHint(connectData) ?? getExtensionHint(accountsData)
82
+ ?? "请先在浏览器中打开 Gate Wallet 扩展并连接,或打开与 PLUGIN_WALLET_URL 同会话的页面后再重试。";
83
+ throw new Error(`plugin_wallet 未获取到 EVM 地址。${hint}`);
84
+ }
85
+ }
86
+ function getErrorMessage(error) {
87
+ return error instanceof Error ? error.message : String(error);
88
+ }
89
+ /** 从 MCP 返回里取出与「扩展未连接」相关的提示,用于抛错时附带说明。 */
90
+ function getExtensionHint(data) {
91
+ if (!data || typeof data.error !== "string")
92
+ return null;
93
+ const msg = data.error.trim();
94
+ if (!msg)
95
+ return null;
96
+ return msg.includes("扩展") || msg.includes("extension") || msg.includes("连接")
97
+ ? ` ${msg}`
98
+ : null;
99
+ }
100
+ function parseToolResult(result) {
101
+ if (result == null || typeof result !== "object" || !("content" in result)) {
102
+ return null;
103
+ }
104
+ const content = result.content;
105
+ if (!Array.isArray(content) || content.length === 0) {
106
+ return null;
107
+ }
108
+ const first = content[0];
109
+ if (!first || first.type !== "text" || typeof first.text !== "string") {
110
+ return null;
111
+ }
112
+ try {
113
+ let parsed = JSON.parse(first.text);
114
+ if (typeof parsed === "string") {
115
+ parsed = JSON.parse(parsed);
116
+ }
117
+ return parsed;
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ }
123
+ function isPluginWalletConnected(data) {
124
+ if (!data) {
125
+ return false;
126
+ }
127
+ if (typeof data.connected === "boolean") {
128
+ return data.connected;
129
+ }
130
+ return extractEvmAddress(data) !== null;
131
+ }
132
+ function extractEvmAddress(data) {
133
+ if (!data) {
134
+ return null;
135
+ }
136
+ const candidates = [];
137
+ if (typeof data.address === "string") {
138
+ candidates.push(data.address);
139
+ }
140
+ if (Array.isArray(data.accounts)) {
141
+ candidates.push(...data.accounts);
142
+ }
143
+ if (Array.isArray(data.addresses)) {
144
+ candidates.push(...data.addresses);
145
+ }
146
+ for (const candidate of candidates) {
147
+ if (typeof candidate === "string" && /^0x[a-fA-F0-9]{40}$/.test(candidate)) {
148
+ return candidate;
149
+ }
150
+ }
151
+ return null;
152
+ }
153
+ //# sourceMappingURL=plugin-wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-wallet.js","sourceRoot":"","sources":["../../../src/modes/plugin-wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ResolveSignerContext, ResolvedSignerSession, SignModeAvailability, SignModeDefinition } from "./types.js";
2
+ export interface QuickWalletModeOptions {
3
+ mcpWalletUrl: string;
4
+ mcpApiKey?: string;
5
+ }
6
+ export declare class QuickWalletMode implements SignModeDefinition {
7
+ private readonly options;
8
+ readonly id: "quick_wallet";
9
+ readonly priority = 20;
10
+ constructor(options: QuickWalletModeOptions);
11
+ checkAvailability(): Promise<SignModeAvailability>;
12
+ resolveSigner(context: ResolveSignerContext): Promise<ResolvedSignerSession>;
13
+ getCacheKey(): string;
14
+ }
15
+ //# sourceMappingURL=quick-wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-wallet.d.ts","sourceRoot":"","sources":["../../../src/modes/quick-wallet.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgCD,qBAAa,eAAgB,YAAW,kBAAkB;IAI5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,EAAE,EAAG,cAAc,CAAU;IACtC,QAAQ,CAAC,QAAQ,MAAM;gBAEM,OAAO,EAAE,sBAAsB;IAEtD,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAsBlD,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA4ClF,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,94 @@
1
+ import { createQuickWalletSigner } from "./signers.js";
2
+ import { loginWithDeviceFlow } from "../wallets/device-flow-login.js";
3
+ import { getMcpClient } from "../wallets/wallet-mcp-clients.js";
4
+ function parseMcpPayload(text) {
5
+ try {
6
+ const parsed = JSON.parse(text);
7
+ if (typeof parsed === "string") {
8
+ try {
9
+ return JSON.parse(parsed);
10
+ }
11
+ catch {
12
+ return parsed;
13
+ }
14
+ }
15
+ return parsed;
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ function extractAddressPayload(result) {
22
+ if (result == null || typeof result !== "object" || !("content" in result)) {
23
+ return result;
24
+ }
25
+ const content = result.content;
26
+ const first = Array.isArray(content)
27
+ ? content[0]
28
+ : undefined;
29
+ if (!first || first.type !== "text" || typeof first.text !== "string") {
30
+ return result;
31
+ }
32
+ return parseMcpPayload(first.text) ?? first.text;
33
+ }
34
+ export class QuickWalletMode {
35
+ constructor(options) {
36
+ this.options = options;
37
+ this.id = "quick_wallet";
38
+ this.priority = 20;
39
+ }
40
+ async checkAvailability() {
41
+ try {
42
+ const mcp = await getMcpClient({
43
+ serverUrl: this.options.mcpWalletUrl,
44
+ apiKey: this.options.mcpApiKey,
45
+ });
46
+ if (mcp.isMcpTokenUsable()) {
47
+ return {
48
+ status: "ready",
49
+ summary: "quick_wallet 进程内已有有效 MCP 登录态。",
50
+ };
51
+ }
52
+ }
53
+ catch {
54
+ // 连接失败时不阻断显式选择 quick_wallet,交由 resolveSigner 再试
55
+ }
56
+ return {
57
+ status: "needs_login",
58
+ summary: "quick_wallet 需设备流登录(无有效进程内 token 或已过期)。",
59
+ missing: ["mcp_token"],
60
+ };
61
+ }
62
+ async resolveSigner(context) {
63
+ const mcp = await getMcpClient({
64
+ serverUrl: this.options.mcpWalletUrl,
65
+ apiKey: this.options.mcpApiKey,
66
+ });
67
+ if (!mcp.isMcpTokenUsable()) {
68
+ const isGoogle = context.walletLoginProvider === "google";
69
+ const providerLabel = isGoogle ? "Google" : "Gate";
70
+ console.error(`[x402_request] quick_wallet: 无有效 MCP token(缺失或已过期),开始 ${providerLabel} 设备流登录…`);
71
+ const loginOk = await loginWithDeviceFlow(mcp, this.options.mcpWalletUrl, isGoogle, providerLabel, {
72
+ saveToken: false,
73
+ reportAddresses: false,
74
+ });
75
+ if (!loginOk) {
76
+ throw new Error("quick_wallet login did not complete (cancelled, failed, or timed out)");
77
+ }
78
+ const addressResult = await mcp.walletGetAddresses();
79
+ const addresses = extractAddressPayload(addressResult);
80
+ throw new Error([
81
+ "quick_wallet 登录成功。",
82
+ `钱包地址信息:${JSON.stringify(addresses, null, 2)}`,
83
+ "如果你想继续用这个接口进行支付,请回复yes",
84
+ ].join("\n"));
85
+ }
86
+ return {
87
+ signer: await createQuickWalletSigner(mcp),
88
+ };
89
+ }
90
+ getCacheKey() {
91
+ return this.id;
92
+ }
93
+ }
94
+ //# sourceMappingURL=quick-wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-wallet.js","sourceRoot":"","sources":["../../../src/modes/quick-wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { PayFetchFactory, ResolveSignerContext, SelectModeResult, SignModeDefinition, SignModeId } from "./types.js";
2
+ type SelectionErrorCode = "unknown_mode" | "no_mode_available" | "mode_not_ready" | "mode_init_failed";
3
+ export declare class SignModeSelectionError extends Error {
4
+ readonly code: SelectionErrorCode;
5
+ readonly mode?: string;
6
+ readonly supportedModes?: string[];
7
+ readonly missing?: string[];
8
+ readonly availableHints?: string[];
9
+ constructor(params: {
10
+ code: SelectionErrorCode;
11
+ message: string;
12
+ mode?: string;
13
+ supportedModes?: string[];
14
+ missing?: string[];
15
+ availableHints?: string[];
16
+ });
17
+ }
18
+ export interface SignModeRegistry {
19
+ selectMode(requestedMode?: string): Promise<SelectModeResult>;
20
+ getOrCreatePayFetch(mode: SignModeDefinition, context: ResolveSignerContext): Promise<typeof fetch>;
21
+ listSupportedModes(): SignModeId[];
22
+ }
23
+ export declare function createSignModeRegistry(modes: SignModeDefinition[], payFetchFactory?: PayFetchFactory): SignModeRegistry;
24
+ export declare function formatSignModeSelectionError(error: unknown): string;
25
+ export {};
26
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/modes/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,KAAK,kBAAkB,GACnB,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,kBAAkB,CAAC;AAEvB,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;gBAEvB,MAAM,EAAE;QAClB,IAAI,EAAE,kBAAkB,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B;CASF;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9D,mBAAmB,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC;IACpG,kBAAkB,IAAI,UAAU,EAAE,CAAC;CACpC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,eAAe,GAAE,eAA8C,GAC9D,gBAAgB,CAyGlB;AAaD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAuBnE"}
@@ -0,0 +1,126 @@
1
+ import { DefaultPayFetchFactory } from "./build-pay-fetch.js";
2
+ export class SignModeSelectionError extends Error {
3
+ constructor(params) {
4
+ super(params.message);
5
+ this.name = "SignModeSelectionError";
6
+ this.code = params.code;
7
+ this.mode = params.mode;
8
+ this.supportedModes = params.supportedModes;
9
+ this.missing = params.missing;
10
+ this.availableHints = params.availableHints;
11
+ }
12
+ }
13
+ export function createSignModeRegistry(modes, payFetchFactory = new DefaultPayFetchFactory()) {
14
+ const registeredModes = new Map();
15
+ const readyFetchCache = new Map();
16
+ const initPromiseCache = new Map();
17
+ for (const mode of modes) {
18
+ registeredModes.set(mode.id, mode);
19
+ }
20
+ async function selectMode(requestedMode) {
21
+ if (requestedMode) {
22
+ const mode = registeredModes.get(requestedMode);
23
+ if (!mode) {
24
+ throw new SignModeSelectionError({
25
+ code: "unknown_mode",
26
+ message: `Unknown sign_mode: ${requestedMode}`,
27
+ mode: requestedMode,
28
+ supportedModes: listSupportedModes(),
29
+ });
30
+ }
31
+ const availability = await mode.checkAvailability();
32
+ if (availability.status === "not_configured") {
33
+ throw new SignModeSelectionError({
34
+ code: "mode_not_ready",
35
+ message: availability.summary,
36
+ mode: mode.id,
37
+ missing: availability.missing,
38
+ });
39
+ }
40
+ return { mode, availability };
41
+ }
42
+ const checkedModes = await Promise.all(listSupportedModes().map(async (modeId) => {
43
+ const mode = registeredModes.get(modeId);
44
+ const availability = await mode.checkAvailability();
45
+ return { mode, availability };
46
+ }));
47
+ const readyModes = checkedModes
48
+ .filter((item) => item.availability.status === "ready")
49
+ .sort((left, right) => left.mode.priority - right.mode.priority);
50
+ if (readyModes.length === 0) {
51
+ throw new SignModeSelectionError({
52
+ code: "no_mode_available",
53
+ message: "No sign mode is currently ready.",
54
+ availableHints: checkedModes.map(({ mode, availability }) => `${mode.id}: ${availability.summary}`),
55
+ });
56
+ }
57
+ return readyModes[0];
58
+ }
59
+ async function getOrCreatePayFetch(mode, context) {
60
+ const cacheKey = await getModeCacheKey(mode, context);
61
+ const cached = readyFetchCache.get(cacheKey);
62
+ if (cached) {
63
+ return cached;
64
+ }
65
+ const pending = initPromiseCache.get(cacheKey);
66
+ if (pending) {
67
+ return pending;
68
+ }
69
+ const initPromise = (async () => {
70
+ try {
71
+ const session = await mode.resolveSigner(context);
72
+ const payFetch = payFetchFactory.build({ signer: session.signer });
73
+ readyFetchCache.set(cacheKey, payFetch);
74
+ return payFetch;
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : String(error);
78
+ throw new SignModeSelectionError({
79
+ code: "mode_init_failed",
80
+ message,
81
+ mode: mode.id,
82
+ });
83
+ }
84
+ finally {
85
+ initPromiseCache.delete(cacheKey);
86
+ }
87
+ })();
88
+ initPromiseCache.set(cacheKey, initPromise);
89
+ return initPromise;
90
+ }
91
+ function listSupportedModes() {
92
+ return [...registeredModes.keys()];
93
+ }
94
+ return {
95
+ selectMode,
96
+ getOrCreatePayFetch,
97
+ listSupportedModes,
98
+ };
99
+ }
100
+ async function getModeCacheKey(mode, context) {
101
+ if (mode.getCacheKey) {
102
+ return await mode.getCacheKey(context);
103
+ }
104
+ return mode.id;
105
+ }
106
+ export function formatSignModeSelectionError(error) {
107
+ if (!(error instanceof SignModeSelectionError)) {
108
+ return error instanceof Error ? error.message : String(error);
109
+ }
110
+ if (error.code === "unknown_mode") {
111
+ const supported = error.supportedModes?.join(", ") ?? "";
112
+ return `未知 sign_mode: ${error.mode}。支持的模式:${supported}`;
113
+ }
114
+ if (error.code === "no_mode_available") {
115
+ const hints = error.availableHints?.join(";") ?? "";
116
+ return `当前没有可自动选择的 sign_mode。请先配置可用的 token、session 或本地私钥。${hints ? ` 状态:${hints}` : ""}`;
117
+ }
118
+ if (error.code === "mode_not_ready") {
119
+ const missing = error.missing?.join(", ");
120
+ return missing
121
+ ? `sign_mode ${error.mode} 当前不可直接使用:${error.message} 缺失项:${missing}`
122
+ : `sign_mode ${error.mode} 当前不可直接使用:${error.message}`;
123
+ }
124
+ return `sign_mode ${error.mode} 初始化失败:${error.message}`;
125
+ }
126
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/modes/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Hex } from "viem";
2
+ import type { ClientEvmSigner } from "../x402/types.js";
3
+ import type { PluginWalletClient } from "../wallets/plugin-wallet-client.js";
4
+ import type { GateMcpClient } from "../wallets/wallet-mcp-clients.js";
5
+ /**
6
+ * 创建本地私钥 Signer (用于 local_private_key 签名模式)
7
+ *
8
+ * 特点:
9
+ * - 完全本地签名,不依赖远程服务
10
+ * - 支持 signTypedData (EIP-712) 和 signDigest
11
+ * - 适用于开发环境和对安全性要求高的场景
12
+ */
13
+ export declare function createLocalPrivateKeySigner(privateKey: Hex): ClientEvmSigner;
14
+ export declare const createSignerFromPrivateKey: typeof createLocalPrivateKeySigner;
15
+ /**
16
+ * 创建插件钱包 Signer (用于 plugin_wallet 签名模式)
17
+ *
18
+ * 特点:
19
+ * - 通过浏览器插件钱包 (如 Gate Wallet) 进行签名
20
+ * - signTypedData: 传递完整的 EIP-712 四字段 JSON 给插件钱包处理
21
+ * - signDigest: 直接传递 digest 给插件钱包的 sign_message
22
+ * - 需要用户在浏览器中手动确认签名
23
+ */
24
+ export declare function createPluginWalletSigner(client: PluginWalletClient, address: `0x${string}`): ClientEvmSigner;
25
+ export declare const createSignerFromPluginWallet: typeof createPluginWalletSigner;
26
+ /**
27
+ * 创建快速托管钱包 Signer (用于 quick_wallet 签名模式)
28
+ *
29
+ * 特点:
30
+ * - 通过远程 MCP 托管钱包服务进行签名
31
+ * - signDigest: 使用 wallet.sign_message
32
+ * - signTypedData: 使用 wallet.sign_transaction 传递序列化的 typed data
33
+ * - 需要用户通过 OAuth (Google/Gate) 登录并获得 mcp_token
34
+ * - 完全托管,用户无需管理私钥
35
+ */
36
+ export declare function createQuickWalletSigner(mcp: GateMcpClient, options?: {
37
+ evmAddress?: `0x${string}`;
38
+ }): Promise<ClientEvmSigner>;
39
+ export declare const createSignerFromMcpWallet: typeof createQuickWalletSigner;
40
+ //# sourceMappingURL=signers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signers.d.ts","sourceRoot":"","sources":["../../../src/modes/signers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AA4HtE;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,GAAG,GAAG,eAAe,CAQ5E;AAGD,eAAO,MAAM,0BAA0B,oCAA8B,CAAC;AAMtE;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACpC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,KAAK,MAAM,EAAE,GACvB,eAAe,CAoDjB;AAGD,eAAO,MAAM,4BAA4B,iCAA2B,CAAC;AAMrE;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CACzC,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,GACzC,OAAO,CAAC,eAAe,CAAC,CAkE1B;AAGD,eAAO,MAAM,yBAAyB,gCAA0B,CAAC"}