agents 0.3.10 → 0.4.1

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 (67) hide show
  1. package/README.md +2 -2
  2. package/dist/{index-N6791tVt.d.ts → agent-DY6QmSI_.d.ts} +3 -25
  3. package/dist/ai-types.js +1 -1
  4. package/dist/client-connection-CGMuV62J.js +472 -0
  5. package/dist/client-connection-CGMuV62J.js.map +1 -0
  6. package/dist/client-storage-Cvy5r9FG.d.ts +355 -0
  7. package/dist/client.d.ts +11 -7
  8. package/dist/client.js +6 -2
  9. package/dist/client.js.map +1 -1
  10. package/dist/email.d.ts +146 -16
  11. package/dist/email.js +222 -2
  12. package/dist/email.js.map +1 -0
  13. package/dist/index.d.ts +142 -41
  14. package/dist/index.js +2326 -6
  15. package/dist/index.js.map +1 -0
  16. package/dist/internal_context.d.ts +33 -6
  17. package/dist/internal_context.js +11 -2
  18. package/dist/internal_context.js.map +1 -0
  19. package/dist/mcp/client.d.ts +516 -2
  20. package/dist/mcp/client.js +662 -3
  21. package/dist/mcp/client.js.map +1 -0
  22. package/dist/mcp/do-oauth-client-provider.d.ts +61 -2
  23. package/dist/mcp/do-oauth-client-provider.js +154 -2
  24. package/dist/mcp/do-oauth-client-provider.js.map +1 -0
  25. package/dist/mcp/index.d.ts +3 -5
  26. package/dist/mcp/index.js +8 -7
  27. package/dist/mcp/index.js.map +1 -1
  28. package/dist/mcp/x402.d.ts +34 -14
  29. package/dist/mcp/x402.js +128 -66
  30. package/dist/mcp/x402.js.map +1 -1
  31. package/dist/{mcp-BwPscEiF.d.ts → mcp-Dw5vDrY8.d.ts} +1 -1
  32. package/dist/observability/index.d.ts +23 -2
  33. package/dist/observability/index.js +25 -6
  34. package/dist/observability/index.js.map +1 -0
  35. package/dist/react.d.ts +10 -10
  36. package/dist/react.js +6 -2
  37. package/dist/react.js.map +1 -1
  38. package/dist/types.d.ts +14 -1
  39. package/dist/types.js +16 -2
  40. package/dist/types.js.map +1 -0
  41. package/dist/utils.js +15 -2
  42. package/dist/utils.js.map +1 -0
  43. package/dist/workflow-types.d.ts +235 -23
  44. package/dist/workflows.d.ts +22 -24
  45. package/dist/workflows.js +2 -5
  46. package/dist/workflows.js.map +1 -1
  47. package/package.json +24 -28
  48. package/dist/client-CtC9E06G.js +0 -1122
  49. package/dist/client-CtC9E06G.js.map +0 -1
  50. package/dist/client-DV1CZKqa.d.ts +0 -969
  51. package/dist/do-oauth-client-provider-BqnOQzjy.d.ts +0 -70
  52. package/dist/do-oauth-client-provider-DDg8QrEA.js +0 -155
  53. package/dist/do-oauth-client-provider-DDg8QrEA.js.map +0 -1
  54. package/dist/email-8ljcpvwV.d.ts +0 -157
  55. package/dist/email-XHsSYsTO.js +0 -223
  56. package/dist/email-XHsSYsTO.js.map +0 -1
  57. package/dist/internal_context-CEu5ji80.d.ts +0 -29
  58. package/dist/internal_context-D9eKFth1.js +0 -8
  59. package/dist/internal_context-D9eKFth1.js.map +0 -1
  60. package/dist/src-i_UcyBYf.js +0 -2147
  61. package/dist/src-i_UcyBYf.js.map +0 -1
  62. package/dist/types-BITaDFf-.js +0 -16
  63. package/dist/types-BITaDFf-.js.map +0 -1
  64. package/dist/types-DSSHBW6w.d.ts +0 -14
  65. package/dist/utils-B49TmLCI.js +0 -16
  66. package/dist/utils-B49TmLCI.js.map +0 -1
  67. package/dist/workflow-types-Z_Oem1FJ.d.ts +0 -260
@@ -1,33 +1,53 @@
1
1
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { CallToolRequest, CallToolResult, CallToolResultSchema, CompatibilityCallToolResultSchema, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
3
- import { Account } from "viem";
4
- import { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js";
5
3
  import { McpServer, RegisteredTool, ToolCallback } from "@modelcontextprotocol/sdk/server/mcp.js";
4
+ import { FacilitatorConfig, FacilitatorConfig as FacilitatorConfig$1 } from "@x402/core/server";
5
+ import { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js";
6
6
  import { ZodRawShape } from "zod";
7
- import { FacilitatorConfig, Network, PaymentRequirements } from "x402/types";
7
+ import { Network, Network as Network$1, PaymentRequired, PaymentRequirements, PaymentRequirements as PaymentRequirements$1 } from "@x402/core/types";
8
+ import { ClientEvmSigner, ClientEvmSigner as ClientEvmSigner$1 } from "@x402/evm";
8
9
 
9
10
  //#region src/mcp/x402.d.ts
11
+ /**
12
+ * Normalize a network identifier to CAIP-2 format.
13
+ * Accepts both legacy v1 names ("base-sepolia") and CAIP-2 ("eip155:84532").
14
+ */
15
+ declare function normalizeNetwork(network: string): Network$1;
10
16
  type X402Config = {
11
- network: Network;
12
- recipient: `0x${string}`;
13
- facilitator: FacilitatorConfig;
17
+ /**
18
+ * Network identifier.
19
+ * Accepts both legacy names ("base-sepolia") and CAIP-2 format ("eip155:84532").
20
+ */
21
+ network: string; /** Payment recipient address */
22
+ recipient: `0x${string}`; /** Facilitator configuration. Defaults to https://x402.org/facilitator */
23
+ facilitator?: FacilitatorConfig$1; /** @deprecated No longer used in v2. The protocol version is determined automatically. */
14
24
  version?: number;
15
25
  };
16
26
  interface X402AugmentedServer {
17
27
  paidTool<Args extends ZodRawShape>(name: string, description: string, priceUSD: number, paramsSchema: Args, annotations: ToolAnnotations, cb: ToolCallback<Args>): RegisteredTool;
18
28
  }
19
- declare function withX402<T extends McpServer>(server: McpServer, cfg: X402Config): T & X402AugmentedServer;
29
+ declare function withX402<T extends McpServer>(server: T, cfg: X402Config): T & X402AugmentedServer;
20
30
  interface X402AugmentedClient {
21
- callTool(x402ConfirmationCallback: ((payment: PaymentRequirements[]) => Promise<boolean>) | null, params: CallToolRequest["params"], resultSchema?: typeof CallToolResultSchema | typeof CompatibilityCallToolResultSchema, options?: RequestOptions): Promise<CallToolResult>;
31
+ callTool(x402ConfirmationCallback: ((payment: PaymentRequirements$1[]) => Promise<boolean>) | null, params: CallToolRequest["params"], resultSchema?: typeof CallToolResultSchema | typeof CompatibilityCallToolResultSchema, options?: RequestOptions): Promise<CallToolResult>;
22
32
  }
23
33
  type X402ClientConfig = {
24
- network: Network;
25
- account: Account;
26
- maxPaymentValue?: bigint;
27
- version?: number;
28
- confirmationCallback?: (payment: PaymentRequirements[]) => Promise<boolean>;
34
+ /**
35
+ * EVM account/signer for signing payment authorizations.
36
+ * Use `privateKeyToAccount()` from viem/accounts to create one.
37
+ */
38
+ account: ClientEvmSigner$1;
39
+ /**
40
+ * Preferred network identifier (optional).
41
+ * Accepts both legacy names ("base-sepolia") and CAIP-2 format ("eip155:84532").
42
+ * When set, the client prefers payment requirements matching this network.
43
+ * If omitted, the client automatically selects from available requirements.
44
+ */
45
+ network?: string; /** Maximum payment value in atomic units (default: 0.10 USDC = 100000) */
46
+ maxPaymentValue?: bigint; /** @deprecated No longer used in v2. The protocol version is determined automatically. */
47
+ version?: number; /** Confirmation callback for payment approval */
48
+ confirmationCallback?: (payment: PaymentRequirements$1[]) => Promise<boolean>;
29
49
  };
30
50
  declare function withX402Client<T extends Client>(client: T, x402Config: X402ClientConfig): X402AugmentedClient & T;
31
51
  //#endregion
32
- export { X402AugmentedClient, X402AugmentedServer, X402ClientConfig, X402Config, withX402, withX402Client };
52
+ export { type ClientEvmSigner, type FacilitatorConfig, type Network, type PaymentRequired, type PaymentRequirements, X402AugmentedClient, X402AugmentedServer, X402ClientConfig, X402Config, normalizeNetwork, withX402, withX402Client };
33
53
  //# sourceMappingURL=x402.d.ts.map
package/dist/mcp/x402.js CHANGED
@@ -1,14 +1,38 @@
1
- import { base, baseSepolia } from "viem/chains";
2
- import { processPriceToAtomicAmount } from "x402/shared";
3
- import { exact } from "x402/schemes";
4
- import { useFacilitator } from "x402/verify";
5
- import { createWalletClient, http } from "viem";
6
- import { createPaymentHeader } from "x402/client";
1
+ import { HTTPFacilitatorClient, x402ResourceServer } from "@x402/core/server";
2
+ import { x402Client } from "@x402/core/client";
3
+ import { registerExactEvmScheme } from "@x402/evm/exact/server";
4
+ import { registerExactEvmScheme as registerExactEvmScheme$1 } from "@x402/evm/exact/client";
7
5
 
8
6
  //#region src/mcp/x402.ts
7
+ /**
8
+ * Map of legacy v1 network names to CAIP-2 identifiers.
9
+ * Allows backward compatibility with v1 config.
10
+ */
11
+ const LEGACY_NETWORK_MAP = {
12
+ "base-sepolia": "eip155:84532",
13
+ base: "eip155:8453",
14
+ ethereum: "eip155:1",
15
+ sepolia: "eip155:11155111"
16
+ };
17
+ /**
18
+ * Normalize a network identifier to CAIP-2 format.
19
+ * Accepts both legacy v1 names ("base-sepolia") and CAIP-2 ("eip155:84532").
20
+ */
21
+ function normalizeNetwork(network) {
22
+ return LEGACY_NETWORK_MAP[network] ?? network;
23
+ }
9
24
  function withX402(server, cfg) {
10
- const { verify, settle } = useFacilitator(cfg.facilitator);
11
- const x402Version = cfg.version ?? 1;
25
+ const network = normalizeNetwork(cfg.network);
26
+ const resourceServer = new x402ResourceServer(new HTTPFacilitatorClient(cfg.facilitator ?? { url: "https://x402.org/facilitator" }));
27
+ registerExactEvmScheme(resourceServer);
28
+ let initPromise = null;
29
+ function ensureInitialized() {
30
+ if (!initPromise) initPromise = resourceServer.initialize().catch((err) => {
31
+ initPromise = null;
32
+ throw err;
33
+ });
34
+ return initPromise;
35
+ }
12
36
  function paidTool(name, description, priceUSD, paramsSchema, annotations, cb) {
13
37
  return server.registerTool(name, {
14
38
  description,
@@ -19,10 +43,20 @@ function withX402(server, cfg) {
19
43
  "agents-x402/priceUSD": priceUSD
20
44
  }
21
45
  }, (async (args, extra) => {
22
- const atomic = processPriceToAtomicAmount(priceUSD, cfg.network);
23
- if ("error" in atomic) {
46
+ await ensureInitialized();
47
+ const resourceConfig = {
48
+ scheme: "exact",
49
+ payTo: cfg.recipient,
50
+ price: priceUSD,
51
+ network,
52
+ maxTimeoutSeconds: 300
53
+ };
54
+ let requirements;
55
+ try {
56
+ requirements = await resourceServer.buildPaymentRequirements(resourceConfig);
57
+ } catch {
24
58
  const payload = {
25
- x402Version,
59
+ x402Version: 2,
26
60
  error: "PRICE_COMPUTE_FAILED"
27
61
  };
28
62
  return {
@@ -34,26 +68,19 @@ function withX402(server, cfg) {
34
68
  }]
35
69
  };
36
70
  }
37
- const { maxAmountRequired, asset } = atomic;
38
- const requirements = {
39
- scheme: "exact",
40
- network: cfg.network,
41
- maxAmountRequired,
42
- payTo: cfg.recipient,
43
- asset: asset.address,
44
- maxTimeoutSeconds: 300,
45
- resource: `x402://${name}`,
46
- mimeType: "application/json",
71
+ const resourceInfo = {
72
+ url: `x402://${name}`,
47
73
  description,
48
- extra: "eip712" in asset ? asset.eip712 : void 0
74
+ mimeType: "application/json"
49
75
  };
50
76
  const headers = extra?.requestInfo?.headers ?? {};
51
- const token = extra?._meta?.["x402/payment"] ?? headers["X-PAYMENT"];
77
+ const token = extra?._meta?.["x402/payment"] ?? headers["PAYMENT-SIGNATURE"] ?? headers["X-PAYMENT"];
52
78
  const paymentRequired = (reason = "PAYMENT_REQUIRED", extraFields = {}) => {
53
79
  const payload = {
54
- x402Version,
80
+ x402Version: 2,
55
81
  error: reason,
56
- accepts: [requirements],
82
+ resource: resourceInfo,
83
+ accepts: requirements,
57
84
  ...extraFields
58
85
  };
59
86
  return {
@@ -66,15 +93,20 @@ function withX402(server, cfg) {
66
93
  };
67
94
  };
68
95
  if (!token || typeof token !== "string") return paymentRequired();
69
- let decoded;
96
+ let paymentPayload;
70
97
  try {
71
- decoded = exact.evm.decodePayment(token);
72
- decoded.x402Version = x402Version;
98
+ paymentPayload = JSON.parse(atob(token));
99
+ } catch {
100
+ return paymentRequired("INVALID_PAYMENT");
101
+ }
102
+ const matchingReq = resourceServer.findMatchingRequirements(requirements, paymentPayload);
103
+ if (!matchingReq) return paymentRequired("INVALID_PAYMENT");
104
+ try {
105
+ const vr = await resourceServer.verifyPayment(paymentPayload, matchingReq);
106
+ if (!vr.isValid) return paymentRequired(vr.invalidReason ?? "INVALID_PAYMENT", { payer: vr.payer });
73
107
  } catch {
74
108
  return paymentRequired("INVALID_PAYMENT");
75
109
  }
76
- const vr = await verify(decoded, requirements);
77
- if (!vr.isValid) return paymentRequired(vr.invalidReason ?? "INVALID_PAYMENT", { payer: vr.payer });
78
110
  let result;
79
111
  let failed = false;
80
112
  try {
@@ -91,7 +123,7 @@ function withX402(server, cfg) {
91
123
  };
92
124
  }
93
125
  if (!failed) try {
94
- const s = await settle(decoded, requirements);
126
+ const s = await resourceServer.settlePayment(paymentPayload, matchingReq);
95
127
  if (s.success) {
96
128
  result._meta ??= {};
97
129
  result._meta["x402/payment-response"] = {
@@ -115,41 +147,39 @@ function withX402(server, cfg) {
115
147
  });
116
148
  return server;
117
149
  }
118
- const toChain = (network) => {
119
- switch (network) {
120
- case "base": return base;
121
- case "base-sepolia": return baseSepolia;
122
- default: throw new Error(`Unsupported network: ${network}`);
123
- }
124
- };
125
150
  function withX402Client(client, x402Config) {
126
- const { network, account, version } = x402Config;
127
- const wallet = createWalletClient({
128
- account,
129
- transport: http(),
130
- chain: toChain(network)
131
- });
132
- const maxPaymentValue = x402Config.maxPaymentValue ?? BigInt(.1 * 10 ** 6);
151
+ const { account } = x402Config;
152
+ const maxPaymentValue = x402Config.maxPaymentValue ?? BigInt(1e5);
153
+ const paymentClient = new x402Client();
154
+ registerExactEvmScheme$1(paymentClient, { signer: account });
155
+ if (x402Config.network) {
156
+ const preferredNetwork = normalizeNetwork(x402Config.network);
157
+ paymentClient.registerPolicy((_version, reqs) => {
158
+ const matching = reqs.filter((r) => r.network === preferredNetwork);
159
+ return matching.length > 0 ? matching : reqs;
160
+ });
161
+ }
133
162
  const _listTools = client.listTools.bind(client);
134
163
  const listTools = async (params, options) => {
135
164
  const toolsRes = await _listTools(params, options);
136
- toolsRes.tools = toolsRes.tools.map((tool) => {
137
- let description = tool.description;
138
- if (tool._meta?.["agents-x402/paymentRequired"]) {
139
- const cost = tool._meta?.["agents-x402/priceUSD"] ? `$${tool._meta?.["agents-x402/priceUSD"]}` : "an unknown amount";
140
- description += ` (This is a paid tool, you will be charged ${cost} for its execution)`;
141
- }
142
- return {
143
- ...tool,
144
- description
145
- };
146
- });
147
- return toolsRes;
165
+ return {
166
+ ...toolsRes,
167
+ tools: toolsRes.tools.map((tool) => {
168
+ let description = tool.description;
169
+ if (tool._meta?.["agents-x402/paymentRequired"]) {
170
+ const cost = tool._meta?.["agents-x402/priceUSD"] ? `$${tool._meta?.["agents-x402/priceUSD"]}` : "an unknown amount";
171
+ description += ` (This is a paid tool, you will be charged ${cost} for its execution)`;
172
+ }
173
+ return {
174
+ ...tool,
175
+ description
176
+ };
177
+ })
178
+ };
148
179
  };
149
180
  const _callTool = client.callTool.bind(client);
150
181
  const callToolWithPayment = async (x402ConfirmationCallback, params, resultSchema, options) => {
151
182
  const res = await _callTool(params, resultSchema, options);
152
- console.log("res", res);
153
183
  const maybeX402Error = res._meta?.["x402/error"];
154
184
  if (res.isError && maybeX402Error && maybeX402Error.accepts && Array.isArray(maybeX402Error.accepts) && maybeX402Error.accepts.length > 0) {
155
185
  const accepts = maybeX402Error.accepts;
@@ -161,17 +191,44 @@ function withX402Client(client, x402Config) {
161
191
  text: "User declined payment"
162
192
  }]
163
193
  };
164
- const req = accepts.find((a) => a?.scheme === "exact" && a?.network === network) ?? accepts[0];
165
- if (!req || req.scheme !== "exact") return res;
166
- const maxAmountRequired = BigInt(req.maxAmountRequired);
167
- if (maxAmountRequired > maxPaymentValue) return {
194
+ const selectedReq = accepts[0];
195
+ if (!selectedReq || selectedReq.scheme !== "exact") return res;
196
+ let amount;
197
+ try {
198
+ amount = BigInt(selectedReq.amount);
199
+ } catch {
200
+ return res;
201
+ }
202
+ if (amount > maxPaymentValue) return {
168
203
  isError: true,
169
204
  content: [{
170
205
  type: "text",
171
- text: `Payment exceeds client cap: ${maxAmountRequired} > ${maxPaymentValue}`
206
+ text: `Payment exceeds client cap: ${amount} > ${maxPaymentValue}`
172
207
  }]
173
208
  };
174
- const token = await createPaymentHeader(wallet, version ?? 1, req);
209
+ const paymentRequiredResponse = {
210
+ x402Version: maybeX402Error.x402Version ?? 2,
211
+ resource: maybeX402Error.resource ?? {
212
+ url: "",
213
+ description: "",
214
+ mimeType: "application/json"
215
+ },
216
+ accepts,
217
+ extensions: maybeX402Error.extensions
218
+ };
219
+ let paymentPayload;
220
+ try {
221
+ paymentPayload = await paymentClient.createPaymentPayload(paymentRequiredResponse);
222
+ } catch {
223
+ return {
224
+ isError: true,
225
+ content: [{
226
+ type: "text",
227
+ text: "Failed to create payment payload"
228
+ }]
229
+ };
230
+ }
231
+ const token = btoa(JSON.stringify(paymentPayload));
175
232
  return _callTool({
176
233
  ...params,
177
234
  _meta: {
@@ -183,7 +240,12 @@ function withX402Client(client, x402Config) {
183
240
  return res;
184
241
  };
185
242
  const _client = client;
186
- _client.listTools = listTools;
243
+ Object.defineProperty(_client, "listTools", {
244
+ value: listTools,
245
+ writable: false,
246
+ enumerable: false,
247
+ configurable: true
248
+ });
187
249
  Object.defineProperty(_client, "callTool", {
188
250
  value: callToolWithPayment,
189
251
  writable: false,
@@ -194,5 +256,5 @@ function withX402Client(client, x402Config) {
194
256
  }
195
257
 
196
258
  //#endregion
197
- export { withX402, withX402Client };
259
+ export { normalizeNetwork, withX402, withX402Client };
198
260
  //# sourceMappingURL=x402.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"x402.js","names":[],"sources":["../../src/mcp/x402.ts"],"sourcesContent":["/**\n * X402 MCP Integration\n *\n * Based on:\n * - Coinbase's x402 (Apache 2.0): https://github.com/coinbase/x402\n * - @ethanniser and his work at https://github.com/ethanniser/x402-mcp\n */\n\nimport type {\n McpServer,\n RegisteredTool,\n ToolCallback\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Client as MCPClient } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type {\n CallToolResultSchema,\n CompatibilityCallToolResultSchema,\n CallToolRequest,\n CallToolResult,\n ToolAnnotations\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ZodRawShape } from \"zod\";\nimport { base, baseSepolia, type Chain } from \"viem/chains\";\n\nimport { processPriceToAtomicAmount } from \"x402/shared\";\nimport { exact } from \"x402/schemes\";\nimport { useFacilitator } from \"x402/verify\";\nimport type {\n FacilitatorConfig,\n Network,\n PaymentPayload,\n PaymentRequirements,\n Wallet\n} from \"x402/types\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport { createWalletClient, http, type Account } from \"viem\";\nimport { createPaymentHeader } from \"x402/client\";\n\n/*\n ======= SERVER SIDE =======\n*/\n\nexport type X402Config = {\n network: Network;\n recipient: `0x${string}`;\n facilitator: FacilitatorConfig;\n version?: number;\n};\n\nexport interface X402AugmentedServer {\n paidTool<Args extends ZodRawShape>(\n name: string,\n description: string,\n priceUSD: number,\n paramsSchema: Args,\n annotations: ToolAnnotations,\n cb: ToolCallback<Args>\n ): RegisteredTool;\n}\n\nexport function withX402<T extends McpServer>(\n server: McpServer,\n cfg: X402Config\n): T & X402AugmentedServer {\n const { verify, settle } = useFacilitator(cfg.facilitator);\n const x402Version = cfg.version ?? 1;\n\n function paidTool<Args extends ZodRawShape>(\n name: string,\n description: string,\n priceUSD: number,\n paramsSchema: Args,\n annotations: ToolAnnotations,\n cb: ToolCallback<Args>\n ): RegisteredTool {\n return server.registerTool(\n name,\n {\n description,\n inputSchema: paramsSchema,\n annotations,\n _meta: {\n \"agents-x402/paymentRequired\": true,\n \"agents-x402/priceUSD\": priceUSD\n }\n },\n (async (args, extra) => {\n // Build PaymentRequirements for this call\n const atomic = processPriceToAtomicAmount(priceUSD, cfg.network);\n if (\"error\" in atomic) {\n const payload = { x402Version, error: \"PRICE_COMPUTE_FAILED\" };\n return {\n isError: true,\n _meta: { \"x402/error\": payload },\n content: [{ type: \"text\", text: JSON.stringify(payload) }]\n } as const;\n }\n const { maxAmountRequired, asset } = atomic;\n const requirements = {\n scheme: \"exact\" as const,\n network: cfg.network,\n maxAmountRequired,\n payTo: cfg.recipient,\n asset: asset.address,\n maxTimeoutSeconds: 300,\n resource: `x402://${name}`,\n mimeType: \"application/json\" as const,\n description,\n extra: \"eip712\" in asset ? asset.eip712 : undefined\n };\n\n // Get token either from MCP _meta or from header\n const headers = extra?.requestInfo?.headers ?? {};\n const token =\n (extra?._meta?.[\"x402/payment\"] as string | undefined) ??\n headers[\"X-PAYMENT\"];\n\n const paymentRequired = (\n reason = \"PAYMENT_REQUIRED\",\n extraFields: Record<string, unknown> = {}\n ) => {\n const payload = {\n x402Version,\n error: reason,\n accepts: [requirements],\n ...extraFields\n };\n return {\n isError: true,\n _meta: { \"x402/error\": payload },\n content: [{ type: \"text\", text: JSON.stringify(payload) }]\n } as const;\n };\n\n if (!token || typeof token !== \"string\") return paymentRequired();\n\n // Decode & verify\n let decoded: PaymentPayload;\n try {\n decoded = exact.evm.decodePayment(token);\n decoded.x402Version = x402Version;\n } catch {\n return paymentRequired(\"INVALID_PAYMENT\");\n }\n\n const vr = await verify(decoded, requirements);\n if (!vr.isValid) {\n return paymentRequired(vr.invalidReason ?? \"INVALID_PAYMENT\", {\n payer: vr.payer\n });\n }\n\n // Execute tool\n let result: CallToolResult;\n let failed = false;\n try {\n result = await cb(args, extra);\n if (\n result &&\n typeof result === \"object\" &&\n \"isError\" in result &&\n result.isError\n ) {\n failed = true;\n }\n } catch (e) {\n failed = true;\n result = {\n isError: true,\n content: [\n { type: \"text\", text: `Tool execution failed: ${String(e)}` }\n ]\n };\n }\n\n // Settle only on success\n if (!failed) {\n try {\n const s = await settle(decoded, requirements);\n if (s.success) {\n result._meta ??= {};\n result._meta[\"x402/payment-response\"] = {\n success: true,\n transaction: s.transaction,\n network: s.network,\n payer: s.payer\n };\n } else {\n return paymentRequired(s.errorReason ?? \"SETTLEMENT_FAILED\");\n }\n } catch {\n return paymentRequired(\"SETTLEMENT_FAILED\");\n }\n }\n\n return result;\n }) as ToolCallback<Args>\n );\n }\n\n Object.defineProperty(server, \"paidTool\", {\n value: paidTool,\n writable: false,\n enumerable: false,\n configurable: true\n });\n\n // Tell TS the object now also has the paidTool method\n return server as T & X402AugmentedServer;\n}\n\n/*\n ======= CLIENT SIDE =======\n*/\n\nconst toChain = (network: Network): Chain => {\n switch (network) {\n case \"base\":\n return base;\n case \"base-sepolia\":\n return baseSepolia;\n default:\n throw new Error(`Unsupported network: ${network}`);\n }\n};\n\nexport interface X402AugmentedClient {\n callTool(\n x402ConfirmationCallback:\n | ((payment: PaymentRequirements[]) => Promise<boolean>)\n | null,\n params: CallToolRequest[\"params\"],\n resultSchema?:\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema,\n options?: RequestOptions\n ): Promise<CallToolResult>;\n}\n\nexport type X402ClientConfig = {\n network: Network; // we only support base and base-sepolia for now\n account: Account;\n maxPaymentValue?: bigint;\n version?: number;\n confirmationCallback?: (payment: PaymentRequirements[]) => Promise<boolean>; // Confirmation callback for payment\n};\n\nexport function withX402Client<T extends MCPClient>(\n client: T,\n x402Config: X402ClientConfig\n): X402AugmentedClient & T {\n const { network, account, version } = x402Config;\n const wallet = createWalletClient({\n account,\n transport: http(),\n chain: toChain(network)\n });\n\n const maxPaymentValue = x402Config.maxPaymentValue ?? BigInt(0.1 * 10 ** 6); // 0.10 USDC\n\n const _listTools = client.listTools.bind(client);\n\n // Wrap the original method to include payment information in the description\n const listTools: typeof _listTools = async (params, options) => {\n const toolsRes = await _listTools(params, options);\n toolsRes.tools = toolsRes.tools.map((tool) => {\n let description = tool.description;\n // Check _meta for payment information (agents-x402/ is our extension for pre-advertising prices)\n if (tool._meta?.[\"agents-x402/paymentRequired\"]) {\n const cost = tool._meta?.[\"agents-x402/priceUSD\"]\n ? `$${tool._meta?.[\"agents-x402/priceUSD\"]}`\n : \"an unknown amount\";\n description += ` (This is a paid tool, you will be charged ${cost} for its execution)`;\n }\n return {\n ...tool,\n description\n };\n });\n\n // Wrap each tool to add payment support\n\n return toolsRes;\n };\n\n const _callTool = client.callTool.bind(client);\n\n const callToolWithPayment = async (\n x402ConfirmationCallback:\n | ((payment: PaymentRequirements[]) => Promise<boolean>)\n | null,\n params: CallToolRequest[\"params\"],\n resultSchema?:\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema,\n options?: RequestOptions\n ): ReturnType<typeof client.callTool> => {\n // call the tool\n const res = await _callTool(params, resultSchema, options);\n console.log(\"res\", res);\n\n // If it errored and returned accepts, we need to confirm payment\n const maybeX402Error = res._meta?.[\"x402/error\"] as\n | { accepts: PaymentRequirements[] }\n | undefined;\n\n if (\n res.isError &&\n maybeX402Error &&\n maybeX402Error.accepts &&\n Array.isArray(maybeX402Error.accepts) &&\n maybeX402Error.accepts.length > 0\n ) {\n const accepts = maybeX402Error.accepts;\n const confirmationCallback =\n x402ConfirmationCallback ?? x402Config.confirmationCallback;\n\n // Use the x402 confirmation callback if provided\n if (confirmationCallback && !(await confirmationCallback(accepts))) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"User declined payment\" }]\n };\n }\n\n // Pick the first exact-scheme requirement that matches our network\n // (we're only setting one on the McpAgent side for now)\n const req =\n accepts.find((a) => a?.scheme === \"exact\" && a?.network === network) ??\n accepts[0];\n\n if (!req || req.scheme !== \"exact\") return res;\n\n const maxAmountRequired = BigInt(req.maxAmountRequired);\n if (maxAmountRequired > maxPaymentValue) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Payment exceeds client cap: ${maxAmountRequired} > ${maxPaymentValue}`\n }\n ]\n };\n }\n\n // Use x402/client to get the X-PAYMENT token\n const token = await createPaymentHeader(\n wallet as Wallet,\n version ?? 1,\n req\n );\n\n // Call the tool with the payment token\n return _callTool(\n {\n ...params,\n _meta: {\n ...params._meta,\n \"x402/payment\": token\n }\n },\n resultSchema,\n options\n );\n }\n\n return res;\n };\n\n const _client = client as X402AugmentedClient & T;\n _client.listTools = listTools;\n Object.defineProperty(_client, \"callTool\", {\n value: callToolWithPayment,\n writable: false,\n enumerable: false,\n configurable: true\n });\n\n return _client;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"x402.js","names":[],"sources":["../../src/mcp/x402.ts"],"sourcesContent":["/**\n * X402 MCP Integration (v2)\n *\n * Based on:\n * - Coinbase's x402 (Apache 2.0): https://github.com/coinbase/x402\n * - @ethanniser and his work at https://github.com/ethanniser/x402-mcp\n */\n\nimport type {\n McpServer,\n RegisteredTool,\n ToolCallback\n} from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Client as MCPClient } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type {\n CallToolResultSchema,\n CompatibilityCallToolResultSchema,\n CallToolRequest,\n CallToolResult,\n ToolAnnotations\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ZodRawShape } from \"zod\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\n\n// v2 imports from @x402/core\nimport { x402ResourceServer, HTTPFacilitatorClient } from \"@x402/core/server\";\nimport type { FacilitatorConfig, ResourceConfig } from \"@x402/core/server\";\nimport { x402Client } from \"@x402/core/client\";\nimport type {\n PaymentPayload,\n PaymentRequirements,\n PaymentRequired,\n Network\n} from \"@x402/core/types\";\n\n// v2 imports from @x402/evm\nimport { registerExactEvmScheme as registerServerEvmScheme } from \"@x402/evm/exact/server\";\nimport { registerExactEvmScheme as registerClientEvmScheme } from \"@x402/evm/exact/client\";\nimport type { ClientEvmSigner } from \"@x402/evm\";\n\n// Re-export commonly used types for consumer convenience\nexport type {\n PaymentRequirements,\n PaymentRequired,\n Network\n} from \"@x402/core/types\";\nexport type { FacilitatorConfig } from \"@x402/core/server\";\nexport type { ClientEvmSigner } from \"@x402/evm\";\n\n/**\n * Map of legacy v1 network names to CAIP-2 identifiers.\n * Allows backward compatibility with v1 config.\n */\nconst LEGACY_NETWORK_MAP: Record<string, string> = {\n \"base-sepolia\": \"eip155:84532\",\n base: \"eip155:8453\",\n ethereum: \"eip155:1\",\n sepolia: \"eip155:11155111\"\n};\n\n/**\n * Normalize a network identifier to CAIP-2 format.\n * Accepts both legacy v1 names (\"base-sepolia\") and CAIP-2 (\"eip155:84532\").\n */\nexport function normalizeNetwork(network: string): Network {\n return (LEGACY_NETWORK_MAP[network] ?? network) as Network;\n}\n\n/*\n ======= SERVER SIDE =======\n*/\n\nexport type X402Config = {\n /**\n * Network identifier.\n * Accepts both legacy names (\"base-sepolia\") and CAIP-2 format (\"eip155:84532\").\n */\n network: string;\n /** Payment recipient address */\n recipient: `0x${string}`;\n /** Facilitator configuration. Defaults to https://x402.org/facilitator */\n facilitator?: FacilitatorConfig;\n /** @deprecated No longer used in v2. The protocol version is determined automatically. */\n version?: number;\n};\n\nexport interface X402AugmentedServer {\n paidTool<Args extends ZodRawShape>(\n name: string,\n description: string,\n priceUSD: number,\n paramsSchema: Args,\n annotations: ToolAnnotations,\n cb: ToolCallback<Args>\n ): RegisteredTool;\n}\n\nexport function withX402<T extends McpServer>(\n server: T,\n cfg: X402Config\n): T & X402AugmentedServer {\n const network = normalizeNetwork(cfg.network);\n const facilitatorConfig: FacilitatorConfig = cfg.facilitator ?? {\n url: \"https://x402.org/facilitator\"\n };\n\n // Create v2 resource server with facilitator client\n const facilitatorClient = new HTTPFacilitatorClient(facilitatorConfig);\n const resourceServer = new x402ResourceServer(facilitatorClient);\n registerServerEvmScheme(resourceServer);\n\n // Lazy initialization: fetch supported kinds from facilitator on first use\n let initPromise: Promise<void> | null = null;\n function ensureInitialized(): Promise<void> {\n if (!initPromise) {\n initPromise = resourceServer.initialize().catch((err) => {\n initPromise = null; // allow retry on failure\n throw err;\n });\n }\n return initPromise;\n }\n\n function paidTool<Args extends ZodRawShape>(\n name: string,\n description: string,\n priceUSD: number,\n paramsSchema: Args,\n annotations: ToolAnnotations,\n cb: ToolCallback<Args>\n ): RegisteredTool {\n return server.registerTool(\n name,\n {\n description,\n inputSchema: paramsSchema,\n annotations,\n _meta: {\n \"agents-x402/paymentRequired\": true,\n \"agents-x402/priceUSD\": priceUSD\n }\n },\n (async (args, extra) => {\n await ensureInitialized();\n\n // Build v2 payment requirements for this tool call\n const resourceConfig: ResourceConfig = {\n scheme: \"exact\",\n payTo: cfg.recipient,\n price: priceUSD,\n network,\n maxTimeoutSeconds: 300\n };\n\n let requirements: PaymentRequirements[];\n try {\n requirements =\n await resourceServer.buildPaymentRequirements(resourceConfig);\n } catch {\n const payload = { x402Version: 2, error: \"PRICE_COMPUTE_FAILED\" };\n return {\n isError: true,\n _meta: { \"x402/error\": payload },\n content: [{ type: \"text\", text: JSON.stringify(payload) }]\n } as const;\n }\n\n const resourceInfo = {\n url: `x402://${name}`,\n description,\n mimeType: \"application/json\"\n };\n\n // Get payment token from MCP _meta or HTTP headers\n // Support both v2 (PAYMENT-SIGNATURE) and v1 (X-PAYMENT) header names\n const headers = extra?.requestInfo?.headers ?? {};\n const token =\n (extra?._meta?.[\"x402/payment\"] as string | undefined) ??\n headers[\"PAYMENT-SIGNATURE\"] ??\n headers[\"X-PAYMENT\"];\n\n const paymentRequired = (\n reason = \"PAYMENT_REQUIRED\",\n extraFields: Record<string, unknown> = {}\n ) => {\n const payload = {\n x402Version: 2,\n error: reason,\n resource: resourceInfo,\n accepts: requirements,\n ...extraFields\n };\n return {\n isError: true,\n _meta: { \"x402/error\": payload },\n content: [{ type: \"text\", text: JSON.stringify(payload) }]\n } as const;\n };\n\n if (!token || typeof token !== \"string\") return paymentRequired();\n\n // Decode the payment payload (base64-encoded JSON)\n let paymentPayload: PaymentPayload;\n try {\n paymentPayload = JSON.parse(atob(token));\n } catch {\n return paymentRequired(\"INVALID_PAYMENT\");\n }\n\n // Find matching requirements for this payment\n const matchingReq = resourceServer.findMatchingRequirements(\n requirements,\n paymentPayload\n );\n if (!matchingReq) {\n return paymentRequired(\"INVALID_PAYMENT\");\n }\n\n // Verify payment with facilitator\n try {\n const vr = await resourceServer.verifyPayment(\n paymentPayload,\n matchingReq\n );\n if (!vr.isValid) {\n return paymentRequired(vr.invalidReason ?? \"INVALID_PAYMENT\", {\n payer: vr.payer\n });\n }\n } catch {\n return paymentRequired(\"INVALID_PAYMENT\");\n }\n\n // Execute the tool callback\n let result: CallToolResult;\n let failed = false;\n try {\n result = await cb(args, extra);\n if (\n result &&\n typeof result === \"object\" &&\n \"isError\" in result &&\n result.isError\n ) {\n failed = true;\n }\n } catch (e) {\n failed = true;\n result = {\n isError: true,\n content: [\n { type: \"text\", text: `Tool execution failed: ${String(e)}` }\n ]\n };\n }\n\n // Settle payment only on success\n if (!failed) {\n try {\n const s = await resourceServer.settlePayment(\n paymentPayload,\n matchingReq\n );\n if (s.success) {\n result._meta ??= {};\n result._meta[\"x402/payment-response\"] = {\n success: true,\n transaction: s.transaction,\n network: s.network,\n payer: s.payer\n };\n } else {\n return paymentRequired(s.errorReason ?? \"SETTLEMENT_FAILED\");\n }\n } catch {\n return paymentRequired(\"SETTLEMENT_FAILED\");\n }\n }\n\n return result;\n }) as ToolCallback<Args>\n );\n }\n\n Object.defineProperty(server, \"paidTool\", {\n value: paidTool,\n writable: false,\n enumerable: false,\n configurable: true\n });\n\n // Tell TS the object now also has the paidTool method\n return server as T & X402AugmentedServer;\n}\n\n/*\n ======= CLIENT SIDE =======\n*/\n\nexport interface X402AugmentedClient {\n callTool(\n x402ConfirmationCallback:\n | ((payment: PaymentRequirements[]) => Promise<boolean>)\n | null,\n params: CallToolRequest[\"params\"],\n resultSchema?:\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema,\n options?: RequestOptions\n ): Promise<CallToolResult>;\n}\n\nexport type X402ClientConfig = {\n /**\n * EVM account/signer for signing payment authorizations.\n * Use `privateKeyToAccount()` from viem/accounts to create one.\n */\n account: ClientEvmSigner;\n /**\n * Preferred network identifier (optional).\n * Accepts both legacy names (\"base-sepolia\") and CAIP-2 format (\"eip155:84532\").\n * When set, the client prefers payment requirements matching this network.\n * If omitted, the client automatically selects from available requirements.\n */\n network?: string;\n /** Maximum payment value in atomic units (default: 0.10 USDC = 100000) */\n maxPaymentValue?: bigint;\n /** @deprecated No longer used in v2. The protocol version is determined automatically. */\n version?: number;\n /** Confirmation callback for payment approval */\n confirmationCallback?: (payment: PaymentRequirements[]) => Promise<boolean>;\n};\n\nexport function withX402Client<T extends MCPClient>(\n client: T,\n x402Config: X402ClientConfig\n): X402AugmentedClient & T {\n const { account } = x402Config;\n\n const maxPaymentValue = x402Config.maxPaymentValue ?? BigInt(100_000); // 0.10 USDC\n\n // Create v2 x402 payment client with EVM scheme support\n const paymentClient = new x402Client();\n registerClientEvmScheme(paymentClient, { signer: account });\n\n // If a preferred network is specified, register a policy to prefer it\n if (x402Config.network) {\n const preferredNetwork = normalizeNetwork(x402Config.network);\n paymentClient.registerPolicy((_version, reqs) => {\n const matching = reqs.filter((r) => r.network === preferredNetwork);\n return matching.length > 0 ? matching : reqs;\n });\n }\n\n const _listTools = client.listTools.bind(client);\n\n // Wrap the original method to include payment information in the description\n const listTools: typeof _listTools = async (params, options) => {\n const toolsRes = await _listTools(params, options);\n return {\n ...toolsRes,\n tools: toolsRes.tools.map((tool) => {\n let description = tool.description;\n // Check _meta for payment information (agents-x402/ is our extension for pre-advertising prices)\n if (tool._meta?.[\"agents-x402/paymentRequired\"]) {\n const cost = tool._meta?.[\"agents-x402/priceUSD\"]\n ? `$${tool._meta?.[\"agents-x402/priceUSD\"]}`\n : \"an unknown amount\";\n description += ` (This is a paid tool, you will be charged ${cost} for its execution)`;\n }\n return {\n ...tool,\n description\n };\n })\n };\n };\n\n const _callTool = client.callTool.bind(client);\n\n const callToolWithPayment = async (\n x402ConfirmationCallback:\n | ((payment: PaymentRequirements[]) => Promise<boolean>)\n | null,\n params: CallToolRequest[\"params\"],\n resultSchema?:\n | typeof CallToolResultSchema\n | typeof CompatibilityCallToolResultSchema,\n options?: RequestOptions\n ): ReturnType<typeof client.callTool> => {\n // Call the tool\n const res = await _callTool(params, resultSchema, options);\n\n // Check for x402 payment required error in response metadata\n const maybeX402Error = res._meta?.[\"x402/error\"] as\n | (PaymentRequired & Record<string, unknown>)\n | undefined;\n\n if (\n res.isError &&\n maybeX402Error &&\n maybeX402Error.accepts &&\n Array.isArray(maybeX402Error.accepts) &&\n maybeX402Error.accepts.length > 0\n ) {\n const accepts = maybeX402Error.accepts;\n const confirmationCallback =\n x402ConfirmationCallback ?? x402Config.confirmationCallback;\n\n // Use the confirmation callback if provided\n if (confirmationCallback && !(await confirmationCallback(accepts))) {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"User declined payment\" }]\n };\n }\n\n // Check max payment value against the first requirement's amount\n const selectedReq = accepts[0];\n if (!selectedReq || selectedReq.scheme !== \"exact\") return res;\n\n let amount: bigint;\n try {\n amount = BigInt(selectedReq.amount);\n } catch {\n return res; // malformed amount — return original error\n }\n if (amount > maxPaymentValue) {\n return {\n isError: true,\n content: [\n {\n type: \"text\",\n text: `Payment exceeds client cap: ${amount} > ${maxPaymentValue}`\n }\n ]\n };\n }\n\n // Reconstruct the PaymentRequired response for the v2 x402 client\n const paymentRequiredResponse: PaymentRequired = {\n x402Version: (maybeX402Error.x402Version as number) ?? 2,\n resource: (maybeX402Error.resource as PaymentRequired[\"resource\"]) ?? {\n url: \"\",\n description: \"\",\n mimeType: \"application/json\"\n },\n accepts,\n extensions: maybeX402Error.extensions as\n | Record<string, unknown>\n | undefined\n };\n\n // Create the payment payload using the v2 x402 client\n let paymentPayload: PaymentPayload;\n try {\n paymentPayload = await paymentClient.createPaymentPayload(\n paymentRequiredResponse\n );\n } catch {\n return {\n isError: true,\n content: [{ type: \"text\", text: \"Failed to create payment payload\" }]\n };\n }\n\n // Encode the payment payload as a base64 JSON token for MCP transport\n const token = btoa(JSON.stringify(paymentPayload));\n\n // Retry the tool call with the payment token\n return _callTool(\n {\n ...params,\n _meta: {\n ...params._meta,\n \"x402/payment\": token\n }\n },\n resultSchema,\n options\n );\n }\n\n return res;\n };\n\n const _client = client as X402AugmentedClient & T;\n Object.defineProperty(_client, \"listTools\", {\n value: listTools,\n writable: false,\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(_client, \"callTool\", {\n value: callToolWithPayment,\n writable: false,\n enumerable: false,\n configurable: true\n });\n\n return _client;\n}\n"],"mappings":"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"}
@@ -58,4 +58,4 @@ type MCPObservabilityEvent =
58
58
  | BaseEvent<"mcp:client:discover", {}>;
59
59
  //#endregion
60
60
  export { BaseEvent as n, MCPObservabilityEvent as t };
61
- //# sourceMappingURL=mcp-BwPscEiF.d.ts.map
61
+ //# sourceMappingURL=mcp-Dw5vDrY8.d.ts.map
@@ -1,2 +1,23 @@
1
- import { n as ObservabilityEvent, r as genericObservability, t as Observability } from "../index-N6791tVt.js";
2
- export { Observability, ObservabilityEvent, genericObservability };
1
+ import { t as MCPObservabilityEvent } from "../mcp-Dw5vDrY8.js";
2
+ import { t as AgentObservabilityEvent } from "../agent-DY6QmSI_.js";
3
+
4
+ //#region src/observability/index.d.ts
5
+ /**
6
+ * Union of all observability event types from different domains
7
+ */
8
+ type ObservabilityEvent = AgentObservabilityEvent | MCPObservabilityEvent;
9
+ interface Observability {
10
+ /**
11
+ * Emit an event for the Agent's observability implementation to handle.
12
+ * @param event - The event to emit
13
+ * @param ctx - The execution context of the invocation (optional)
14
+ */
15
+ emit(event: ObservabilityEvent, ctx?: DurableObjectState): void;
16
+ }
17
+ /**
18
+ * A generic observability implementation that logs events to the console.
19
+ */
20
+ declare const genericObservability: Observability;
21
+ //#endregion
22
+ export { Observability, ObservabilityEvent, genericObservability };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -1,7 +1,26 @@
1
- import "../email-XHsSYsTO.js";
2
- import "../internal_context-D9eKFth1.js";
3
- import "../client-CtC9E06G.js";
4
- import "../do-oauth-client-provider-DDg8QrEA.js";
5
- import { d as genericObservability } from "../src-i_UcyBYf.js";
1
+ import "../client-connection-CGMuV62J.js";
2
+ import { getCurrentAgent } from "../index.js";
6
3
 
7
- export { genericObservability };
4
+ //#region src/observability/index.ts
5
+ /**
6
+ * A generic observability implementation that logs events to the console.
7
+ */
8
+ const genericObservability = { emit(event) {
9
+ if (isLocalMode()) {
10
+ console.log(event.displayMessage);
11
+ return;
12
+ }
13
+ console.log(event);
14
+ } };
15
+ let localMode = false;
16
+ function isLocalMode() {
17
+ if (localMode) return true;
18
+ const { request } = getCurrentAgent();
19
+ if (!request) return false;
20
+ localMode = new URL(request.url).hostname === "localhost";
21
+ return localMode;
22
+ }
23
+
24
+ //#endregion
25
+ export { genericObservability };
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/observability/index.ts"],"sourcesContent":["import { getCurrentAgent } from \"../index\";\nimport type { AgentObservabilityEvent } from \"./agent\";\nimport type { MCPObservabilityEvent } from \"./mcp\";\n\n/**\n * Union of all observability event types from different domains\n */\nexport type ObservabilityEvent =\n | AgentObservabilityEvent\n | MCPObservabilityEvent;\n\nexport interface Observability {\n /**\n * Emit an event for the Agent's observability implementation to handle.\n * @param event - The event to emit\n * @param ctx - The execution context of the invocation (optional)\n */\n emit(event: ObservabilityEvent, ctx?: DurableObjectState): void;\n}\n\n/**\n * A generic observability implementation that logs events to the console.\n */\nexport const genericObservability: Observability = {\n emit(event) {\n // In local mode, we display a pretty-print version of the event for easier debugging.\n if (isLocalMode()) {\n console.log(event.displayMessage);\n return;\n }\n\n console.log(event);\n }\n};\n\nlet localMode = false;\n\nfunction isLocalMode() {\n if (localMode) {\n return true;\n }\n const { request } = getCurrentAgent();\n if (!request) {\n return false;\n }\n\n const url = new URL(request.url);\n localMode = url.hostname === \"localhost\";\n return localMode;\n}\n"],"mappings":";;;;;;;AAuBA,MAAa,uBAAsC,EACjD,KAAK,OAAO;AAEV,KAAI,aAAa,EAAE;AACjB,UAAQ,IAAI,MAAM,eAAe;AACjC;;AAGF,SAAQ,IAAI,MAAM;GAErB;AAED,IAAI,YAAY;AAEhB,SAAS,cAAc;AACrB,KAAI,UACF,QAAO;CAET,MAAM,EAAE,YAAY,iBAAiB;AACrC,KAAI,CAAC,QACH,QAAO;AAIT,aADY,IAAI,IAAI,QAAQ,IAAI,CAChB,aAAa;AAC7B,QAAO"}
package/dist/react.d.ts CHANGED
@@ -1,9 +1,6 @@
1
1
  import { Method, RPCMethod } from "./serializable.js";
2
2
  import { StreamOptions } from "./client.js";
3
- import "./internal_context-CEu5ji80.js";
4
- import "./email-8ljcpvwV.js";
5
- import "./client-DV1CZKqa.js";
6
- import "./workflow-types-Z_Oem1FJ.js";
3
+ import "./client-storage-Cvy5r9FG.js";
7
4
  import { Agent, MCPServersState } from "./index.js";
8
5
  import { PartySocket } from "partysocket";
9
6
  import { usePartySocket } from "partysocket/react";
@@ -51,7 +48,7 @@ type UseAgentOptions<State = unknown> = Omit<
51
48
  Parameters<typeof usePartySocket>[0],
52
49
  "party" | "room" | "query"
53
50
  > & {
54
- /** Name of the agent to connect to (ignored if basePath is set) */ agent: string; /** Name of the specific Agent instance (ignored if basePath is set) */
51
+ /** Name of the agent to connect to (ignored if basePath is set) */ agent: string /** Name of the specific Agent instance (ignored if basePath is set) */;
55
52
  name?: string;
56
53
  /**
57
54
  * Full URL path - bypasses agent/name URL construction.
@@ -61,16 +58,19 @@ type UseAgentOptions<State = unknown> = Omit<
61
58
  * // Client connects to /user, server routes based on session
62
59
  * useAgent({ agent: "UserAgent", basePath: "user" })
63
60
  */
64
- basePath?: string; /** Query parameters - can be static object or async function */
61
+ basePath?: string /** Query parameters - can be static object or async function */;
65
62
  query?:
66
63
  | QueryObject
67
- | (() => Promise<QueryObject>); /** Dependencies for async query caching */
68
- queryDeps?: unknown[]; /** Cache TTL in milliseconds for auth tokens/time-sensitive data */
69
- cacheTtl?: number; /** Called when the Agent's state is updated */
64
+ | (() => Promise<QueryObject>) /** Dependencies for async query caching */;
65
+ queryDeps?: unknown[] /** Cache TTL in milliseconds for auth tokens/time-sensitive data */;
66
+ cacheTtl?: number /** Called when the Agent's state is updated */;
70
67
  onStateUpdate?: (
71
68
  state: State,
72
69
  source: "server" | "client"
73
- ) => void; /** Called when MCP server state is updated */
70
+ ) => void /** Called when a state update fails (e.g., connection is readonly) */;
71
+ onStateUpdateError?: (
72
+ error: string
73
+ ) => void /** Called when MCP server state is updated */;
74
74
  onMcpUpdate?: (mcpServers: MCPServersState) => void;
75
75
  /**
76
76
  * Called when the server sends the agent's identity on connect.
package/dist/react.js CHANGED
@@ -1,5 +1,5 @@
1
- import { t as MessageType } from "./types-BITaDFf-.js";
2
- import { t as camelCaseToKebabCase } from "./utils-B49TmLCI.js";
1
+ import { MessageType } from "./types.js";
2
+ import { camelCaseToKebabCase } from "./utils.js";
3
3
  import { usePartySocket } from "partysocket/react";
4
4
  import { use, useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
 
@@ -188,6 +188,10 @@ function useAgent(options) {
188
188
  options.onStateUpdate?.(parsedMessage.state, "server");
189
189
  return;
190
190
  }
191
+ if (parsedMessage.type === MessageType.CF_AGENT_STATE_ERROR) {
192
+ options.onStateUpdateError?.(parsedMessage.error);
193
+ return;
194
+ }
191
195
  if (parsedMessage.type === MessageType.CF_AGENT_MCP_SERVERS) {
192
196
  options.onMcpUpdate?.(parsedMessage.mcp);
193
197
  return;