agentcash 0.2.3 → 0.3.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 (41) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/run-server.cjs +37 -3
  3. package/dist/esm/{chunk-HIR4VH7V.js → chunk-4Z3HKYI5.js} +2 -9
  4. package/dist/esm/{chunk-HIR4VH7V.js.map → chunk-4Z3HKYI5.js.map} +1 -1
  5. package/dist/esm/{chunk-WW65CMHP.js → chunk-EDWPR5IJ.js} +34 -18
  6. package/dist/esm/chunk-EDWPR5IJ.js.map +1 -0
  7. package/dist/esm/{chunk-J3LUL7DB.js → chunk-ISR6DJ53.js} +1 -6
  8. package/dist/esm/{chunk-J3LUL7DB.js.map → chunk-ISR6DJ53.js.map} +1 -1
  9. package/dist/esm/{chunk-3MUBKDR7.js → chunk-KPEJO3KV.js} +1 -6
  10. package/dist/esm/{chunk-3MUBKDR7.js.map → chunk-KPEJO3KV.js.map} +1 -1
  11. package/dist/esm/{chunk-XCVCGASL.js → chunk-QO2UZVLV.js} +3 -8
  12. package/dist/esm/{chunk-XCVCGASL.js.map → chunk-QO2UZVLV.js.map} +1 -1
  13. package/dist/esm/{chunk-U6HC4IE3.js → chunk-WL5N26N4.js} +3 -8
  14. package/dist/esm/{chunk-U6HC4IE3.js.map → chunk-WL5N26N4.js.map} +1 -1
  15. package/dist/esm/{chunk-FYIUFEVS.js → chunk-XXKBL2AC.js} +1 -6
  16. package/dist/esm/{chunk-FYIUFEVS.js.map → chunk-XXKBL2AC.js.map} +1 -1
  17. package/dist/esm/chunk-Y5BSCN5L.js +515 -0
  18. package/dist/esm/chunk-Y5BSCN5L.js.map +1 -0
  19. package/dist/esm/cli-context-JTXXAIO4.js +9 -0
  20. package/dist/esm/{commands-EOBZV2HH.js → commands-XFTEJGGT.js} +9 -32
  21. package/dist/esm/commands-XFTEJGGT.js.map +1 -0
  22. package/dist/esm/{fund-GUW4GKZT.js → fund-56IKTU6D.js} +5 -9
  23. package/dist/esm/{fund-GUW4GKZT.js.map → fund-56IKTU6D.js.map} +1 -1
  24. package/dist/esm/index.js +11 -15
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/{install-OYN36YE4.js → install-WZ2WOFCE.js} +9 -25
  27. package/dist/esm/install-WZ2WOFCE.js.map +1 -0
  28. package/dist/esm/{server-BEEIW53K.js → server-B4N6JKFY.js} +9 -51
  29. package/dist/esm/server-B4N6JKFY.js.map +1 -0
  30. package/dist/esm/shared/operations/index.js +4 -5
  31. package/package.json +30 -31
  32. package/dist/esm/chunk-A2KI7TKE.js +0 -59
  33. package/dist/esm/chunk-A2KI7TKE.js.map +0 -1
  34. package/dist/esm/chunk-PBZIKECT.js +0 -46013
  35. package/dist/esm/chunk-PBZIKECT.js.map +0 -1
  36. package/dist/esm/chunk-WW65CMHP.js.map +0 -1
  37. package/dist/esm/cli-context-2MKOXVXU.js +0 -10
  38. package/dist/esm/commands-EOBZV2HH.js.map +0 -1
  39. package/dist/esm/install-OYN36YE4.js.map +0 -1
  40. package/dist/esm/server-BEEIW53K.js.map +0 -1
  41. /package/dist/esm/{cli-context-2MKOXVXU.js.map → cli-context-JTXXAIO4.js.map} +0 -0
@@ -0,0 +1,515 @@
1
+ import {
2
+ MCP_VERSION,
3
+ getBalance
4
+ } from "./chunk-QO2UZVLV.js";
5
+ import {
6
+ DEFAULT_NETWORK,
7
+ err,
8
+ fetchErr,
9
+ fetchOk,
10
+ getBaseUrl,
11
+ getChainName,
12
+ getDepositLink,
13
+ log,
14
+ ok,
15
+ resultFromPromise,
16
+ resultFromThrowable,
17
+ safeFetch,
18
+ safeFetchJson,
19
+ safeParseResponse
20
+ } from "./chunk-EDWPR5IJ.js";
21
+
22
+ // src/shared/openapi-cache.ts
23
+ var specCache = /* @__PURE__ */ new Map();
24
+ async function fetchOpenApiSpec(origin) {
25
+ const cached = specCache.get(origin);
26
+ if (cached) return cached;
27
+ const uniqueUrls = [
28
+ `${origin}/openapi.json`,
29
+ `${origin}/.well-known/openapi.json`,
30
+ `${origin}/.well-known/x402`,
31
+ `${origin}/.well-known/mpp`
32
+ ];
33
+ for (const url of uniqueUrls) {
34
+ log.debug(`Fetching OpenAPI spec from: ${url}`);
35
+ const fetchResult = await safeFetch(
36
+ "fetchOpenApiSpec",
37
+ new Request(url, { headers: { Accept: "application/json" } })
38
+ );
39
+ if (fetchResult.isErr()) {
40
+ log.debug(`Failed to fetch OpenAPI spec from: ${url}`);
41
+ continue;
42
+ }
43
+ const response = fetchResult.value;
44
+ if (!response.ok) continue;
45
+ const jsonResult = await resultFromPromise(
46
+ "json",
47
+ "fetchOpenApiSpec",
48
+ response.json(),
49
+ () => ({
50
+ cause: "parse",
51
+ message: `Failed to parse JSON from: ${url}`
52
+ })
53
+ );
54
+ if (jsonResult.isErr()) {
55
+ log.debug(`Failed to fetch OpenAPI spec from: ${url}`);
56
+ continue;
57
+ }
58
+ const spec = jsonResult.value;
59
+ if (spec && typeof spec === "object" && spec.paths) {
60
+ specCache.set(origin, spec);
61
+ log.info(`Cached OpenAPI spec for origin: ${origin}`);
62
+ return spec;
63
+ }
64
+ }
65
+ log.debug(`No OpenAPI spec found for origin: ${origin}`);
66
+ return null;
67
+ }
68
+ function resolveRef(spec, ref, seen) {
69
+ if (!ref.startsWith("#/")) return void 0;
70
+ if (seen.has(ref)) return { $circular: ref };
71
+ seen.add(ref);
72
+ const parts = ref.slice(2).split("/");
73
+ let current = spec;
74
+ for (const part of parts) {
75
+ if (current == null || typeof current !== "object" || Array.isArray(current))
76
+ return void 0;
77
+ const next = current[part];
78
+ if (next === void 0) return void 0;
79
+ current = next;
80
+ }
81
+ if (current != null && typeof current === "object" && !Array.isArray(current)) {
82
+ return resolveRefs(spec, current, seen);
83
+ }
84
+ return current;
85
+ }
86
+ function resolveRefs(spec, obj, seen, depth = 0) {
87
+ if (depth > 4) return obj;
88
+ const result = {};
89
+ for (const [key, value] of Object.entries(obj)) {
90
+ if (key === "$ref" && typeof value === "string") {
91
+ const resolved = resolveRef(spec, value, seen);
92
+ if (resolved != null && typeof resolved === "object" && !Array.isArray(resolved)) {
93
+ Object.assign(result, resolved);
94
+ } else {
95
+ result[key] = value;
96
+ }
97
+ } else if (value != null && typeof value === "object" && !Array.isArray(value)) {
98
+ result[key] = resolveRefs(spec, value, seen, depth + 1);
99
+ } else if (Array.isArray(value)) {
100
+ result[key] = value.map((item) => {
101
+ if (item != null && typeof item === "object" && !Array.isArray(item)) {
102
+ return resolveRefs(spec, item, seen, depth + 1);
103
+ }
104
+ return item;
105
+ });
106
+ } else {
107
+ result[key] = value;
108
+ }
109
+ }
110
+ return result;
111
+ }
112
+ function extractPath(url, origin) {
113
+ if (url.startsWith(origin)) {
114
+ return url.slice(origin.length) || "/";
115
+ }
116
+ return URL.canParse(url) ? new URL(url).pathname : url;
117
+ }
118
+ async function getEndpointSchema(endpointUrl, method) {
119
+ if (!URL.canParse(endpointUrl)) return null;
120
+ const origin = new URL(endpointUrl).origin;
121
+ const spec = await fetchOpenApiSpec(origin);
122
+ if (!spec) return null;
123
+ const paths = spec.paths;
124
+ if (!paths) return null;
125
+ const path = extractPath(endpointUrl, origin);
126
+ const httpMethod = (method ?? "post").toLowerCase();
127
+ let pathEntry = paths[path];
128
+ if (!pathEntry) {
129
+ for (const [specPath, specEntry] of Object.entries(paths)) {
130
+ if (specEntry == null || typeof specEntry !== "object") continue;
131
+ const pattern = specPath.replace(/\{[^}]+\}/g, "[^/]+");
132
+ const regex = new RegExp(`^${pattern}$`);
133
+ if (regex.test(path)) {
134
+ pathEntry = specEntry;
135
+ break;
136
+ }
137
+ }
138
+ }
139
+ if (!pathEntry) {
140
+ log.debug(`No OpenAPI path entry found for: ${path}`);
141
+ return null;
142
+ }
143
+ const operation = pathEntry[httpMethod];
144
+ if (!operation) {
145
+ const resolved2 = resolveRefs(spec, pathEntry, /* @__PURE__ */ new Set());
146
+ return { path, ...resolved2 };
147
+ }
148
+ const resolved = resolveRefs(spec, operation, /* @__PURE__ */ new Set());
149
+ return { path, method: httpMethod, ...resolved };
150
+ }
151
+ var indexCache = /* @__PURE__ */ new Map();
152
+ async function getOriginIndex(origin) {
153
+ const cached = indexCache.get(origin);
154
+ if (cached) return cached;
155
+ const spec = await fetchOpenApiSpec(origin);
156
+ if (!spec?.paths) return null;
157
+ const endpoints = [];
158
+ for (const [path, methods] of Object.entries(
159
+ spec.paths
160
+ )) {
161
+ for (const [method, operation] of Object.entries(methods)) {
162
+ if (typeof operation === "object" && operation !== null) {
163
+ const op = operation;
164
+ const paymentInfo = op["x-payment-info"];
165
+ const entry = {
166
+ path,
167
+ method: method.toUpperCase(),
168
+ summary: op.summary || op.description || ""
169
+ };
170
+ if (paymentInfo?.price != null) {
171
+ entry.price = `$${paymentInfo.price}`;
172
+ }
173
+ if (Array.isArray(paymentInfo?.protocols)) {
174
+ entry.protocols = paymentInfo.protocols;
175
+ }
176
+ endpoints.push(entry);
177
+ }
178
+ }
179
+ }
180
+ indexCache.set(origin, endpoints);
181
+ return endpoints;
182
+ }
183
+ function getIndexEntry(origin, path, method) {
184
+ const entries = indexCache.get(origin);
185
+ if (!entries) return void 0;
186
+ const m = method.toUpperCase();
187
+ return entries.find((e) => e.path === path && e.method === m);
188
+ }
189
+
190
+ // src/shared/operations/discover.ts
191
+ var ERROR_TYPE = "discovery";
192
+ async function fetchLlmsTxt(surface, origin) {
193
+ const llmsTxtUrl = `${origin}/llms.txt`;
194
+ log.debug(`Fetching llms.txt from: ${llmsTxtUrl}`);
195
+ const result = await safeFetch(
196
+ surface,
197
+ new Request(llmsTxtUrl, { headers: { Accept: "text/plain" } })
198
+ );
199
+ if (result.isErr()) return null;
200
+ const parseResult = await safeParseResponse(surface, result.value);
201
+ if (parseResult.isErr() || parseResult.value.type !== "text") return null;
202
+ return parseResult.value.data;
203
+ }
204
+ async function discoverResources(surface, url) {
205
+ const origin = URL.canParse(url) ? new URL(url).origin : url;
206
+ log.info(`Discovering resources for origin: ${origin}`);
207
+ const [spec, instructions] = await Promise.all([
208
+ fetchOpenApiSpec(origin),
209
+ fetchLlmsTxt(surface, origin)
210
+ ]);
211
+ if (!spec?.paths) {
212
+ return err(ERROR_TYPE, surface, {
213
+ cause: "not_found",
214
+ message: `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json, /.well-known/x402, /.well-known/mpp`,
215
+ origin
216
+ });
217
+ }
218
+ const endpoints = await getOriginIndex(origin);
219
+ if (!endpoints || endpoints.length === 0) {
220
+ return err(ERROR_TYPE, surface, {
221
+ cause: "not_found",
222
+ message: `OpenAPI spec found for ${origin} but no endpoints extracted`,
223
+ origin
224
+ });
225
+ }
226
+ log.info(`Found ${endpoints.length} endpoints for: ${origin}`);
227
+ return ok({
228
+ found: true,
229
+ origin,
230
+ source: "openapi",
231
+ endpoints: endpoints.map(({ path, summary, price }) => ({
232
+ path,
233
+ summary,
234
+ ...price ? { price } : {}
235
+ })),
236
+ ...instructions ? { instructions } : {}
237
+ });
238
+ }
239
+
240
+ // src/shared/neverthrow/x402/index.ts
241
+ import { createSIWxPayload } from "@x402/extensions/sign-in-with-x";
242
+ var errorType = "x402";
243
+ var x402Ok = (value) => ok(value);
244
+ var x402Err = (cause, error) => err(errorType, cause, error);
245
+ var x402ResultFromPromise = (surface, promise, error) => resultFromPromise(errorType, surface, promise, error);
246
+ var x402ResultFromThrowable = (surface, fn, error) => resultFromThrowable(errorType, surface, fn, error);
247
+ var safeGetPaymentRequired = (surface, client, response) => {
248
+ return x402ResultFromPromise(
249
+ surface,
250
+ response.json().then(
251
+ (json) => client.getPaymentRequiredResponse(
252
+ (name) => response.headers.get(name),
253
+ json
254
+ ),
255
+ () => client.getPaymentRequiredResponse((name) => response.headers.get(name))
256
+ ),
257
+ (error) => ({
258
+ cause: "parse_payment_required",
259
+ message: error instanceof Error ? error.message : "Failed to parse payment required"
260
+ })
261
+ );
262
+ };
263
+ var safeCreatePaymentPayload = (surface, client, paymentRequired) => {
264
+ return x402ResultFromPromise(
265
+ surface,
266
+ client.createPaymentPayload(paymentRequired),
267
+ (error) => ({
268
+ cause: "create_payment_payload",
269
+ message: error instanceof Error ? error.message : "Failed to create payment payload"
270
+ })
271
+ );
272
+ };
273
+ var safeGetPaymentSettlement = (surface, client, response) => {
274
+ return x402ResultFromThrowable(
275
+ surface,
276
+ () => client.getPaymentSettleResponse((name) => response.headers.get(name)),
277
+ (error) => ({
278
+ cause: "get_payment_settlement",
279
+ message: error instanceof Error ? error.message : "Failed to get payment settlement"
280
+ })
281
+ );
282
+ };
283
+ var safeCreateSIWxPayload = (surface, serverInfo, signer) => {
284
+ return x402ResultFromPromise(
285
+ surface,
286
+ createSIWxPayload(serverInfo, signer),
287
+ (error) => ({
288
+ cause: "create_siwx_payload",
289
+ message: error instanceof Error ? error.message : "Failed to create SIWX payload"
290
+ })
291
+ );
292
+ };
293
+
294
+ // src/shared/operations/fetch-with-payment.ts
295
+ function createFetchWithPayment(surface, client) {
296
+ return async (request) => {
297
+ const clonedRequest = request.clone();
298
+ const probeResult = await safeFetch(surface, request);
299
+ if (probeResult.isErr()) {
300
+ return fetchErr(surface, probeResult.error);
301
+ }
302
+ if (probeResult.value.status !== 402) {
303
+ return probeResult.andThen(
304
+ (response2) => fetchOk({
305
+ response: response2,
306
+ paymentPayload: void 0
307
+ })
308
+ );
309
+ }
310
+ const response = probeResult.value;
311
+ const paymentRequiredResult = await safeGetPaymentRequired(
312
+ surface,
313
+ client,
314
+ response
315
+ );
316
+ if (paymentRequiredResult.isErr()) {
317
+ return paymentRequiredResult;
318
+ }
319
+ const paymentRequired = paymentRequiredResult.value;
320
+ const paymentPayloadResult = await safeCreatePaymentPayload(
321
+ surface,
322
+ client,
323
+ paymentRequired
324
+ );
325
+ if (paymentPayloadResult.isErr()) {
326
+ return paymentPayloadResult;
327
+ }
328
+ const paymentPayload = paymentPayloadResult.value;
329
+ const paymentHeaders = client.encodePaymentSignatureHeader(paymentPayload);
330
+ if (clonedRequest.headers.has("PAYMENT-SIGNATURE") || clonedRequest.headers.has("X-PAYMENT")) {
331
+ return x402Err(surface, {
332
+ cause: "payment_already_attempted",
333
+ message: "Payment already attempted"
334
+ });
335
+ }
336
+ for (const [key, value] of Object.entries(paymentHeaders)) {
337
+ clonedRequest.headers.set(key, value);
338
+ }
339
+ clonedRequest.headers.set(
340
+ "Access-Control-Expose-Headers",
341
+ "PAYMENT-RESPONSE,X-PAYMENT-RESPONSE"
342
+ );
343
+ return await safeFetch(surface, clonedRequest).andThen(
344
+ (response2) => x402Ok({
345
+ response: response2,
346
+ paymentPayload
347
+ })
348
+ );
349
+ };
350
+ }
351
+
352
+ // src/shared/operations/wallet-info.ts
353
+ async function getWalletInfo(surface, address, flags) {
354
+ const balanceResult = await getBalance({
355
+ address,
356
+ flags,
357
+ surface
358
+ });
359
+ if (balanceResult.isErr()) {
360
+ return balanceResult;
361
+ }
362
+ const { balance } = balanceResult.value;
363
+ return ok({
364
+ address,
365
+ network: DEFAULT_NETWORK,
366
+ networkName: getChainName(DEFAULT_NETWORK),
367
+ usdcBalance: balance,
368
+ isNewWallet: balance === 0,
369
+ depositLink: getDepositLink(address, flags),
370
+ ...balance < 2.5 ? {
371
+ message: "Your balance is low. Consider topping it up"
372
+ } : {}
373
+ });
374
+ }
375
+
376
+ // src/shared/operations/check-endpoint.ts
377
+ import { x402Client, x402HTTPClient } from "@x402/core/client";
378
+
379
+ // src/shared/token.ts
380
+ import { formatUnits } from "viem";
381
+ var tokenStringToNumber = (amount, decimals = 6) => {
382
+ return Number(formatUnits(BigInt(amount), decimals));
383
+ };
384
+
385
+ // src/server/lib/x402-extensions.ts
386
+ var getBazaarExtension = (extensions) => {
387
+ const { bazaar } = extensions ?? {};
388
+ if (!bazaar) {
389
+ return void 0;
390
+ }
391
+ return bazaar;
392
+ };
393
+ var getInputSchema = (extensions) => getBazaarExtension(extensions)?.schema.properties.input;
394
+ var getSiwxExtension = (extensions) => {
395
+ const siwx = extensions?.["sign-in-with-x"];
396
+ if (!siwx?.info) {
397
+ return void 0;
398
+ }
399
+ const chain = siwx.supportedChains?.find(
400
+ (c) => c.chainId.startsWith("eip155:")
401
+ );
402
+ return {
403
+ ...siwx.info,
404
+ chainId: chain?.chainId ?? "eip155:8453",
405
+ type: chain?.type ?? "eip191",
406
+ signatureScheme: chain?.signatureScheme
407
+ };
408
+ };
409
+
410
+ // src/shared/operations/check-endpoint.ts
411
+ async function checkEndpoint(surface, request) {
412
+ log.info("Checking endpoint", request.url);
413
+ const responseResult = await safeFetch(surface, request);
414
+ if (responseResult.isErr()) {
415
+ return responseResult;
416
+ }
417
+ const response = responseResult.value;
418
+ if (!response.ok && response.status !== 402) {
419
+ return responseResult;
420
+ }
421
+ if (response.status !== 402) {
422
+ const parseResponseResult = await safeParseResponse(surface, response);
423
+ if (parseResponseResult.isErr()) {
424
+ return parseResponseResult;
425
+ }
426
+ return ok({
427
+ requiresPayment: false,
428
+ statusCode: response.status,
429
+ parsedResponse: parseResponseResult.value
430
+ });
431
+ }
432
+ const client = new x402HTTPClient(new x402Client());
433
+ const paymentRequiredResult = await safeGetPaymentRequired(
434
+ surface,
435
+ client,
436
+ response
437
+ );
438
+ if (paymentRequiredResult.isErr()) {
439
+ return paymentRequiredResult;
440
+ }
441
+ const { resource, extensions, accepts } = paymentRequiredResult.value;
442
+ const routeDetails = {
443
+ ...resource,
444
+ schema: getInputSchema(extensions),
445
+ paymentMethods: accepts.map((accept) => ({
446
+ price: tokenStringToNumber(accept.amount),
447
+ network: accept.network,
448
+ asset: accept.asset
449
+ }))
450
+ };
451
+ return ok({
452
+ requiresPayment: true,
453
+ statusCode: response.status,
454
+ routeDetails
455
+ });
456
+ }
457
+
458
+ // src/shared/operations/report-error.ts
459
+ import { z } from "zod";
460
+ async function submitErrorReport(surface, input, address, dev) {
461
+ const telemetryResult = await safeFetchJson(
462
+ surface,
463
+ new Request(`${getBaseUrl(dev)}/api/telemetry`, {
464
+ method: "POST",
465
+ headers: {
466
+ "Content-Type": "application/json"
467
+ },
468
+ body: JSON.stringify({
469
+ tool: input.tool,
470
+ summary: input.summary,
471
+ errorMessage: input.errorMessage,
472
+ resource: input.resource,
473
+ stack: input.stack,
474
+ fullReport: input.fullReport,
475
+ walletAddress: address,
476
+ mcpVersion: MCP_VERSION,
477
+ reportedAt: (/* @__PURE__ */ new Date()).toISOString()
478
+ })
479
+ }),
480
+ z.object({
481
+ reportId: z.string()
482
+ })
483
+ );
484
+ if (telemetryResult.isErr()) {
485
+ return telemetryResult;
486
+ }
487
+ const { reportId } = telemetryResult.value;
488
+ return ok({
489
+ submitted: true,
490
+ reportId,
491
+ message: "Error report submitted successfully. The agentcash team will investigate."
492
+ });
493
+ }
494
+
495
+ export {
496
+ tokenStringToNumber,
497
+ x402Ok,
498
+ x402Err,
499
+ safeGetPaymentRequired,
500
+ safeCreatePaymentPayload,
501
+ safeGetPaymentSettlement,
502
+ safeCreateSIWxPayload,
503
+ fetchOpenApiSpec,
504
+ getEndpointSchema,
505
+ getOriginIndex,
506
+ getIndexEntry,
507
+ discoverResources,
508
+ createFetchWithPayment,
509
+ getWalletInfo,
510
+ getInputSchema,
511
+ getSiwxExtension,
512
+ checkEndpoint,
513
+ submitErrorReport
514
+ };
515
+ //# sourceMappingURL=chunk-Y5BSCN5L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/openapi-cache.ts","../../src/shared/operations/discover.ts","../../src/shared/neverthrow/x402/index.ts","../../src/shared/operations/fetch-with-payment.ts","../../src/shared/operations/wallet-info.ts","../../src/shared/operations/check-endpoint.ts","../../src/shared/token.ts","../../src/server/lib/x402-extensions.ts","../../src/shared/operations/report-error.ts"],"sourcesContent":["import { resultFromPromise } from '@x402scan/neverthrow';\n\nimport { safeFetch } from './neverthrow/fetch';\nimport { log } from './log';\n\nimport type { JsonObject, JsonValue } from './neverthrow/json/types';\n\nexport interface EndpointSummary {\n path: string; // \"/api/apollo/people/search\"\n method: string; // \"POST\"\n summary: string; // \"Search for people by name, email, or domain\"\n price?: string; // \"$0.02\" — from x-payment-info, advisory only\n protocols?: string[]; // [\"x402\", \"mpp\"] — from x-payment-info\n}\n\n/**\n * In-memory cache for OpenAPI specs per origin.\n * Populated during discovery or on-demand when check_endpoint needs schema info.\n */\nconst specCache = new Map<string, JsonObject>();\n\n/**\n * Fetch and cache an OpenAPI spec for an origin.\n * Tries multiple well-known locations in order.\n */\nexport async function fetchOpenApiSpec(\n origin: string\n): Promise<JsonObject | null> {\n const cached = specCache.get(origin);\n if (cached) return cached;\n\n const uniqueUrls = [\n `${origin}/openapi.json`,\n `${origin}/.well-known/openapi.json`,\n `${origin}/.well-known/x402`,\n `${origin}/.well-known/mpp`,\n ];\n\n for (const url of uniqueUrls) {\n log.debug(`Fetching OpenAPI spec from: ${url}`);\n const fetchResult = await safeFetch(\n 'fetchOpenApiSpec',\n new Request(url, { headers: { Accept: 'application/json' } })\n );\n\n if (fetchResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI spec from: ${url}`);\n continue;\n }\n\n const response = fetchResult.value;\n if (!response.ok) continue;\n\n const jsonResult = await resultFromPromise(\n 'json',\n 'fetchOpenApiSpec',\n response.json() as Promise<JsonObject>,\n () => ({\n cause: 'parse' as const,\n message: `Failed to parse JSON from: ${url}`,\n })\n );\n\n if (jsonResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI spec from: ${url}`);\n continue;\n }\n\n const spec = jsonResult.value;\n\n // Basic validation - must have paths\n if (spec && typeof spec === 'object' && spec.paths) {\n specCache.set(origin, spec);\n log.info(`Cached OpenAPI spec for origin: ${origin}`);\n return spec;\n }\n }\n\n log.debug(`No OpenAPI spec found for origin: ${origin}`);\n return null;\n}\n\n/**\n * Resolve a JSON $ref pointer within the spec.\n * Only supports local refs: \"#/components/schemas/Foo\"\n */\nfunction resolveRef(\n spec: JsonObject,\n ref: string,\n seen: Set<string>\n): JsonValue | undefined {\n if (!ref.startsWith('#/')) return undefined;\n if (seen.has(ref)) return { $circular: ref } as unknown as JsonValue;\n seen.add(ref);\n\n const parts = ref.slice(2).split('/');\n let current: JsonValue = spec;\n\n for (const part of parts) {\n if (\n current == null ||\n typeof current !== 'object' ||\n Array.isArray(current)\n )\n return undefined;\n const next: JsonValue | undefined = current[part];\n if (next === undefined) return undefined;\n current = next;\n }\n\n if (\n current != null &&\n typeof current === 'object' &&\n !Array.isArray(current)\n ) {\n return resolveRefs(spec, current, seen);\n }\n return current;\n}\n\n/**\n * Recursively resolve all $ref pointers in a JSON object.\n * Keeps it shallow enough to avoid context bloat - max depth 4.\n */\nfunction resolveRefs(\n spec: JsonObject,\n obj: JsonObject,\n seen: Set<string>,\n depth = 0\n): JsonObject {\n if (depth > 4) return obj;\n\n const result: JsonObject = {};\n\n for (const [key, value] of Object.entries(obj)) {\n if (key === '$ref' && typeof value === 'string') {\n const resolved = resolveRef(spec, value, seen);\n if (\n resolved != null &&\n typeof resolved === 'object' &&\n !Array.isArray(resolved)\n ) {\n Object.assign(result, resolved);\n } else {\n result[key] = value;\n }\n } else if (\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n result[key] = resolveRefs(spec, value, seen, depth + 1);\n } else if (Array.isArray(value)) {\n result[key] = value.map(item => {\n if (item != null && typeof item === 'object' && !Array.isArray(item)) {\n return resolveRefs(spec, item, seen, depth + 1);\n }\n return item;\n });\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Normalize a URL path for matching against OpenAPI spec paths.\n * e.g. \"https://example.com/api/foo\" -> \"/api/foo\"\n */\nfunction extractPath(url: string, origin: string): string {\n if (url.startsWith(origin)) {\n return url.slice(origin.length) || '/';\n }\n return URL.canParse(url) ? new URL(url).pathname : url;\n}\n\n/**\n * Extract the schema for a specific endpoint from the OpenAPI spec.\n * Returns the operation object with resolved $refs, or null if not found.\n */\nexport async function getEndpointSchema(\n endpointUrl: string,\n method?: string\n): Promise<JsonObject | null> {\n if (!URL.canParse(endpointUrl)) return null;\n const origin = new URL(endpointUrl).origin;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec) return null;\n\n const paths = spec.paths as JsonObject | undefined;\n if (!paths) return null;\n\n const path = extractPath(endpointUrl, origin);\n const httpMethod = (method ?? 'post').toLowerCase();\n\n // Try exact match first, then try path patterns\n let pathEntry = paths[path] as JsonObject | undefined;\n\n if (!pathEntry) {\n // Try matching against parameterized paths like /api/foo/{id}\n for (const [specPath, specEntry] of Object.entries(paths)) {\n if (specEntry == null || typeof specEntry !== 'object') continue;\n\n const pattern = specPath.replace(/\\{[^}]+\\}/g, '[^/]+');\n const regex = new RegExp(`^${pattern}$`);\n if (regex.test(path)) {\n pathEntry = specEntry as JsonObject;\n break;\n }\n }\n }\n\n if (!pathEntry) {\n log.debug(`No OpenAPI path entry found for: ${path}`);\n return null;\n }\n\n const operation = pathEntry[httpMethod] as JsonObject | undefined;\n if (!operation) {\n // If method not found, return all operations for this path\n const resolved = resolveRefs(spec, pathEntry, new Set());\n return { path, ...resolved };\n }\n\n const resolved = resolveRefs(spec, operation, new Set());\n return { path, method: httpMethod, ...resolved };\n}\n\n// ── Lightweight Endpoint Index ──\n\nconst indexCache = new Map<string, EndpointSummary[]>();\n\n/**\n * Lazily build a lightweight index for an origin.\n * Fetches the OpenAPI spec if not cached, then extracts\n * path + method + summary + x-payment-info for each operation.\n */\nexport async function getOriginIndex(\n origin: string\n): Promise<EndpointSummary[] | null> {\n const cached = indexCache.get(origin);\n if (cached) return cached;\n\n const spec = await fetchOpenApiSpec(origin);\n if (!spec?.paths) return null;\n\n const endpoints: EndpointSummary[] = [];\n for (const [path, methods] of Object.entries(\n spec.paths as Record<string, JsonObject>\n )) {\n for (const [method, operation] of Object.entries(methods)) {\n if (typeof operation === 'object' && operation !== null) {\n const op = operation as Record<string, unknown>;\n const paymentInfo = op['x-payment-info'] as\n | Record<string, unknown>\n | undefined;\n const entry: EndpointSummary = {\n path,\n method: method.toUpperCase(),\n summary: (op.summary as string) || (op.description as string) || '',\n };\n if (paymentInfo?.price != null) {\n entry.price = `$${paymentInfo.price as number}`;\n }\n if (Array.isArray(paymentInfo?.protocols)) {\n entry.protocols = paymentInfo.protocols as string[];\n }\n endpoints.push(entry);\n }\n }\n }\n\n indexCache.set(origin, endpoints);\n return endpoints;\n}\n\n/**\n * Look up a single endpoint entry from the lightweight index cache.\n * Returns the matching EndpointSummary (with pricing hints) or undefined.\n * Synchronous — only checks what's already cached.\n */\nexport function getIndexEntry(\n origin: string,\n path: string,\n method: string\n): EndpointSummary | undefined {\n const entries = indexCache.get(origin);\n if (!entries) return undefined;\n\n const m = method.toUpperCase();\n return entries.find(e => e.path === path && e.method === m);\n}\n","import { ok, err } from '@x402scan/neverthrow';\nimport type { Result } from '@x402scan/neverthrow/types';\n\nimport { log } from '@/shared/log';\nimport { safeFetch, safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { fetchOpenApiSpec, getOriginIndex } from '@/shared/openapi-cache';\n\ninterface DiscoveredEndpoint {\n path: string;\n summary: string;\n price?: string;\n}\n\n/**\n * Discovery success result\n */\ninterface DiscoverySuccessResult {\n found: true;\n origin: string;\n source: 'openapi';\n endpoints: DiscoveredEndpoint[];\n instructions?: string;\n}\n\n/**\n * Discovery error with origin context\n */\ninterface DiscoveryError {\n cause: 'not_found';\n message: string;\n origin: string;\n}\n\nconst ERROR_TYPE = 'discovery';\n\n/**\n * Fetch llms.txt instructions from an origin (best-effort).\n */\nasync function fetchLlmsTxt(\n surface: string,\n origin: string\n): Promise<string | null> {\n const llmsTxtUrl = `${origin}/llms.txt`;\n log.debug(`Fetching llms.txt from: ${llmsTxtUrl}`);\n\n const result = await safeFetch(\n surface,\n new Request(llmsTxtUrl, { headers: { Accept: 'text/plain' } })\n );\n\n if (result.isErr()) return null;\n\n const parseResult = await safeParseResponse(surface, result.value);\n if (parseResult.isErr() || parseResult.value.type !== 'text') return null;\n\n return parseResult.value.data;\n}\n\n/**\n * Discover x402-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches llms.txt instructions.\n */\nexport async function discoverResources(\n surface: string,\n url: string\n): Promise<Result<DiscoverySuccessResult, DiscoveryError>> {\n const origin = URL.canParse(url) ? new URL(url).origin : url;\n\n log.info(`Discovering resources for origin: ${origin}`);\n\n // Fetch OpenAPI spec and llms.txt in parallel\n const [spec, instructions] = await Promise.all([\n fetchOpenApiSpec(origin),\n fetchLlmsTxt(surface, origin),\n ]);\n\n if (!spec?.paths) {\n return err(ERROR_TYPE, surface, {\n cause: 'not_found' as const,\n message: `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json, /.well-known/x402, /.well-known/mpp`,\n origin,\n });\n }\n\n // Build the lightweight endpoint index\n const endpoints = await getOriginIndex(origin);\n\n if (!endpoints || endpoints.length === 0) {\n return err(ERROR_TYPE, surface, {\n cause: 'not_found' as const,\n message: `OpenAPI spec found for ${origin} but no endpoints extracted`,\n origin,\n });\n }\n\n log.info(`Found ${endpoints.length} endpoints for: ${origin}`);\n\n return ok<DiscoverySuccessResult>({\n found: true,\n origin,\n source: 'openapi',\n endpoints: endpoints.map(({ path, summary, price }) => ({\n path,\n summary,\n ...(price ? { price } : {}),\n })),\n ...(instructions ? { instructions } : {}),\n });\n}\n","import {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@x402scan/neverthrow';\nimport { createSIWxPayload } from '@x402/extensions/sign-in-with-x';\n\nimport type { BaseX402Error } from './types';\nimport type { x402HTTPClient } from '@x402/core/http';\nimport type { PaymentRequired } from '@x402/core/types';\nimport type { CompleteSIWxInfo } from '@x402/extensions/sign-in-with-x';\nimport type { PrivateKeyAccount } from 'viem';\n\nconst errorType = 'x402';\n\nexport const x402Ok = <T>(value: T) => ok(value);\nexport const x402Err = (cause: string, error: BaseX402Error) =>\n err(errorType, cause, error);\n\nconst x402ResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseX402Error\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst x402ResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseX402Error\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const safeGetPaymentRequired = (\n surface: string,\n client: x402HTTPClient,\n response: Response\n) => {\n return x402ResultFromPromise(\n surface,\n response.json().then(\n json =>\n client.getPaymentRequiredResponse(\n name => response.headers.get(name),\n json\n ),\n () =>\n client.getPaymentRequiredResponse(name => response.headers.get(name))\n ),\n error => ({\n cause: 'parse_payment_required',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse payment required',\n })\n );\n};\n\nexport const safeCreatePaymentPayload = (\n surface: string,\n client: x402HTTPClient,\n paymentRequired: PaymentRequired\n) => {\n return x402ResultFromPromise(\n surface,\n client.createPaymentPayload(paymentRequired),\n error => ({\n cause: 'create_payment_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create payment payload',\n })\n );\n};\n\nexport const safeGetPaymentSettlement = (\n surface: string,\n client: x402HTTPClient,\n response: Response\n) => {\n return x402ResultFromThrowable(\n surface,\n () => client.getPaymentSettleResponse(name => response.headers.get(name)),\n error => ({\n cause: 'get_payment_settlement',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to get payment settlement',\n })\n );\n};\n\nexport const safeCreateSIWxPayload = (\n surface: string,\n serverInfo: CompleteSIWxInfo,\n signer: PrivateKeyAccount\n) => {\n return x402ResultFromPromise(\n surface,\n createSIWxPayload(serverInfo, signer),\n error => ({\n cause: 'create_siwx_payload',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create SIWX payload',\n })\n );\n};\n","import type { x402HTTPClient } from '@x402/core/client';\n\nimport { safeFetch, fetchErr, fetchOk } from '@/shared/neverthrow/fetch';\nimport {\n safeCreatePaymentPayload,\n safeGetPaymentRequired,\n x402Err,\n x402Ok,\n} from '@/shared/neverthrow/x402';\n\n/**\n * Execute a fetch request with automatic x402 payment handling.\n *\n * 1. Makes initial request\n * 2. If 402 response, extracts payment requirements\n * 3. Creates payment payload and signs it\n * 4. Retries request with payment headers\n */\nexport function createFetchWithPayment(\n surface: string,\n client: x402HTTPClient\n) {\n return async (request: Request) => {\n const clonedRequest = request.clone();\n\n const probeResult = await safeFetch(surface, request);\n\n if (probeResult.isErr()) {\n return fetchErr(surface, probeResult.error);\n }\n\n // Not a 402 response - return as-is\n if (probeResult.value.status !== 402) {\n return probeResult.andThen(response =>\n fetchOk({\n response,\n paymentPayload: undefined,\n })\n );\n }\n\n const response = probeResult.value;\n\n // Parse payment requirements from 402 response\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const paymentRequired = paymentRequiredResult.value;\n\n // Create and sign payment payload\n const paymentPayloadResult = await safeCreatePaymentPayload(\n surface,\n client,\n paymentRequired\n );\n\n if (paymentPayloadResult.isErr()) {\n return paymentPayloadResult;\n }\n\n const paymentPayload = paymentPayloadResult.value;\n\n // Encode payment header\n const paymentHeaders = client.encodePaymentSignatureHeader(paymentPayload);\n\n // Check if this is already a retry to prevent infinite loops\n if (\n clonedRequest.headers.has('PAYMENT-SIGNATURE') ||\n clonedRequest.headers.has('X-PAYMENT')\n ) {\n return x402Err(surface, {\n cause: 'payment_already_attempted',\n message: 'Payment already attempted',\n });\n }\n\n // Add payment headers to cloned request\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n clonedRequest.headers.set(\n 'Access-Control-Expose-Headers',\n 'PAYMENT-RESPONSE,X-PAYMENT-RESPONSE'\n );\n\n // Retry the request with payment\n return await safeFetch(surface, clonedRequest).andThen(response =>\n x402Ok({\n response,\n paymentPayload,\n })\n );\n };\n}\n","import { ok } from '@x402scan/neverthrow';\n\nimport { getBalance } from '@/shared/balance';\nimport { DEFAULT_NETWORK, getChainName } from '@/shared/networks';\nimport { getDepositLink } from '@/shared/utils';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\n/**\n * Wallet info result\n */\ninterface WalletInfoResult {\n address: Address;\n network: string;\n networkName: string;\n usdcBalance: number;\n isNewWallet: boolean;\n depositLink: string;\n message?: string;\n}\n\n/**\n * Get wallet info including balance and deposit link.\n * Returns the result from getBalance or a WalletInfoResult on success.\n */\nexport async function getWalletInfo(\n surface: string,\n address: Address,\n flags: GlobalFlags\n) {\n const balanceResult = await getBalance({\n address,\n flags,\n surface,\n });\n\n if (balanceResult.isErr()) {\n return balanceResult;\n }\n\n const { balance } = balanceResult.value;\n\n return ok<WalletInfoResult>({\n address,\n network: DEFAULT_NETWORK,\n networkName: getChainName(DEFAULT_NETWORK),\n usdcBalance: balance,\n isNewWallet: balance === 0,\n depositLink: getDepositLink(address, flags),\n ...(balance < 2.5\n ? {\n message: 'Your balance is low. Consider topping it up',\n }\n : {}),\n });\n}\n","import { ok } from '@x402scan/neverthrow';\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\n\nimport { log } from '@/shared/log';\nimport { safeFetch, safeParseResponse } from '@/shared/neverthrow/fetch';\nimport { safeGetPaymentRequired } from '@/shared/neverthrow/x402';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { getInputSchema } from '@/server/lib/x402-extensions';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { ParsedResponse } from '@/shared/neverthrow/fetch/types';\n\n/**\n * Check endpoint result for non-402 responses\n */\ninterface CheckEndpointFreeResult {\n requiresPayment: false;\n statusCode: number;\n parsedResponse: ParsedResponse;\n}\n\n/**\n * Check endpoint result for 402 responses\n */\ninterface CheckEndpointPaidResult {\n requiresPayment: true;\n statusCode: number;\n routeDetails: JsonObject;\n}\n\ntype CheckEndpointResult = CheckEndpointFreeResult | CheckEndpointPaidResult;\n\n/**\n * Check if an endpoint is x402-protected and get pricing/schema info.\n * Does not make any payment.\n */\nexport async function checkEndpoint(surface: string, request: Request) {\n log.info('Checking endpoint', request.url);\n\n const responseResult = await safeFetch(surface, request);\n\n if (responseResult.isErr()) {\n return responseResult;\n }\n\n const response = responseResult.value;\n\n // Non-402 error response - return for caller to handle\n if (!response.ok && response.status !== 402) {\n return responseResult;\n }\n\n // Non-402 success response\n if (response.status !== 402) {\n const parseResponseResult = await safeParseResponse(surface, response);\n if (parseResponseResult.isErr()) {\n return parseResponseResult;\n }\n\n return ok<CheckEndpointResult>({\n requiresPayment: false,\n statusCode: response.status,\n parsedResponse: parseResponseResult.value,\n });\n }\n\n // Parse 402 payment required response\n const client = new x402HTTPClient(new x402Client());\n\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const { resource, extensions, accepts } = paymentRequiredResult.value;\n\n // Build routeDetails as a clean JsonObject\n const routeDetails: JsonObject = {\n ...resource,\n schema: getInputSchema(extensions) as JsonObject | null,\n paymentMethods: accepts.map(accept => ({\n price: tokenStringToNumber(accept.amount),\n network: accept.network,\n asset: accept.asset,\n })),\n };\n\n return ok<CheckEndpointResult>({\n requiresPayment: true,\n statusCode: response.status,\n routeDetails,\n });\n}\n","import { formatUnits } from 'viem';\n\nexport const tokenStringToNumber = (amount: string, decimals = 6) => {\n return Number(formatUnits(BigInt(amount), decimals));\n};\n","import type { PaymentRequired } from '@x402/core/types';\nimport type { DiscoveryExtension } from '@x402/extensions/bazaar';\nimport type {\n CompleteSIWxInfo,\n SIWxExtensionInfo,\n SupportedChain,\n} from '@x402/extensions/sign-in-with-x';\n\nconst getBazaarExtension = (extensions: PaymentRequired['extensions']) => {\n const { bazaar } = extensions ?? {};\n\n if (!bazaar) {\n return undefined;\n }\n\n return bazaar as DiscoveryExtension;\n};\n\nexport const getInputSchema = (extensions: PaymentRequired['extensions']) =>\n getBazaarExtension(extensions)?.schema.properties.input;\n\nexport const getSiwxExtension = (\n extensions: PaymentRequired['extensions']\n): CompleteSIWxInfo | undefined => {\n const siwx = extensions?.['sign-in-with-x'] as\n | { info?: SIWxExtensionInfo; supportedChains?: SupportedChain[] }\n | undefined;\n\n if (!siwx?.info) {\n return undefined;\n }\n\n // Pick the first EVM chain from supportedChains, falling back to defaults\n const chain = siwx.supportedChains?.find(c =>\n c.chainId.startsWith('eip155:')\n );\n\n return {\n ...siwx.info,\n chainId: chain?.chainId ?? 'eip155:8453',\n type: chain?.type ?? 'eip191',\n signatureScheme: chain?.signatureScheme,\n };\n};\n","import { z } from 'zod';\nimport { ok } from '@x402scan/neverthrow';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { getBaseUrl } from '@/shared/utils';\nimport { MCP_VERSION } from '@/shared/version';\n\nimport type { Address } from 'viem';\n\n/**\n * Error report input\n */\ninterface ErrorReportInput {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: string;\n}\n\n/**\n * Error report result\n */\ninterface ErrorReportResult {\n submitted: true;\n reportId: string;\n message: string;\n}\n\n/**\n * Submit an error report to agentcash telemetry.\n */\nexport async function submitErrorReport(\n surface: string,\n input: ErrorReportInput,\n address: Address,\n dev: boolean\n) {\n const telemetryResult = await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(dev)}/api/telemetry`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n tool: input.tool,\n summary: input.summary,\n errorMessage: input.errorMessage,\n resource: input.resource,\n stack: input.stack,\n fullReport: input.fullReport,\n walletAddress: address,\n mcpVersion: MCP_VERSION,\n reportedAt: new Date().toISOString(),\n }),\n }),\n z.object({\n reportId: z.string(),\n })\n );\n\n if (telemetryResult.isErr()) {\n return telemetryResult;\n }\n\n const { reportId } = telemetryResult.value;\n\n return ok<ErrorReportResult>({\n submitted: true,\n reportId,\n message:\n 'Error report submitted successfully. The agentcash team will investigate.',\n });\n}\n"],"mappings":"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","names":["resolved","response"]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ configureCliContext,
3
+ isVerbose
4
+ } from "./chunk-ISR6DJ53.js";
5
+ export {
6
+ configureCliContext,
7
+ isVerbose
8
+ };
9
+ //# sourceMappingURL=cli-context-JTXXAIO4.js.map