agentcash 0.6.3 → 0.6.4

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 (30) hide show
  1. package/dist/cjs/run-server.cjs +66 -48
  2. package/dist/esm/{check-endpoint-BGFpMl2m.d.ts → check-endpoint-Df0YnKdr.d.ts} +8 -3
  3. package/dist/esm/{chunk-XVQ7S42P.js → chunk-3STID4ZW.js} +3 -3
  4. package/dist/esm/chunk-L3LTEB5B.js +7 -0
  5. package/dist/esm/{chunk-VU4O2YQU.js → chunk-NFGTXPUD.js} +54 -40
  6. package/dist/esm/chunk-NFGTXPUD.js.map +1 -0
  7. package/dist/esm/{chunk-2RSGMWFW.js → chunk-RN73GKUU.js} +3 -3
  8. package/dist/esm/{chunk-FJNT5GH6.js → chunk-YXENPVZ4.js} +2 -2
  9. package/dist/esm/{commands-JAPV6DQL.js → commands-D3PD4CNW.js} +15 -10
  10. package/dist/esm/{commands-JAPV6DQL.js.map → commands-D3PD4CNW.js.map} +1 -1
  11. package/dist/esm/index.js +20 -12
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/{install-DTZT2V7I.js → install-KD7XNKVI.js} +2 -2
  14. package/dist/esm/lib.d.ts +1 -1
  15. package/dist/esm/lib.js +2 -2
  16. package/dist/esm/lib.js.map +1 -1
  17. package/dist/esm/{server-I6GY7YDA.js → server-NX7XT2F6.js} +20 -14
  18. package/dist/esm/server-NX7XT2F6.js.map +1 -0
  19. package/dist/esm/shared/operations/index.d.ts +1 -1
  20. package/dist/esm/shared/operations/index.js +4 -4
  21. package/dist/esm/shared/operations/index.js.map +1 -1
  22. package/package.json +3 -3
  23. package/dist/esm/chunk-VU4O2YQU.js.map +0 -1
  24. package/dist/esm/chunk-ZPI2XP7U.js +0 -7
  25. package/dist/esm/server-I6GY7YDA.js.map +0 -1
  26. /package/dist/esm/{chunk-XVQ7S42P.js.map → chunk-3STID4ZW.js.map} +0 -0
  27. /package/dist/esm/{chunk-ZPI2XP7U.js.map → chunk-L3LTEB5B.js.map} +0 -0
  28. /package/dist/esm/{chunk-2RSGMWFW.js.map → chunk-RN73GKUU.js.map} +0 -0
  29. /package/dist/esm/{chunk-FJNT5GH6.js.map → chunk-YXENPVZ4.js.map} +0 -0
  30. /package/dist/esm/{install-DTZT2V7I.js.map → install-KD7XNKVI.js.map} +0 -0
@@ -104303,7 +104303,7 @@ var import_path2 = require("path");
104303
104303
  var import_url = require("url");
104304
104304
  function getVersion2() {
104305
104305
  if (true) {
104306
- return "0.6.3";
104306
+ return "0.6.4";
104307
104307
  }
104308
104308
  const __dirname3 = (0, import_path2.dirname)((0, import_url.fileURLToPath)(importMetaUrl));
104309
104309
  const pkg = JSON.parse(
@@ -104466,7 +104466,7 @@ var TEMPO_TOKEN_ADDRESS = "0x20c0000000000000000000000000000000000000";
104466
104466
 
104467
104467
  // src/shared/mpp-enabled.ts
104468
104468
  init_cjs_shims();
104469
- var isMppEnabled = () => "0.6.3".includes("-mpp");
104469
+ var isMppEnabled = () => "0.6.4".includes("-mpp");
104470
104470
 
104471
104471
  // src/shared/operations/fetch-with-payment.ts
104472
104472
  init_cjs_shims();
@@ -110427,14 +110427,16 @@ init_cjs_shims();
110427
110427
 
110428
110428
  // src/shared/openapi-cache.ts
110429
110429
  init_cjs_shims();
110430
- var specCache = /* @__PURE__ */ new Map();
110430
+ var OPENAPI_SPEC_PATHS = [
110431
+ "/openapi.json",
110432
+ "/.well-known/openapi.json"
110433
+ ];
110431
110434
  async function fetchOpenApiSpec(origin) {
110432
- const cached2 = specCache.get(origin);
110433
- if (cached2) return cached2;
110434
- const uniqueUrls = [
110435
- `${origin}/openapi.json`,
110436
- `${origin}/.well-known/openapi.json`
110437
- ];
110435
+ const uniqueUrls = OPENAPI_SPEC_PATHS.map((p) => `${origin}${p}`);
110436
+ let failure = {
110437
+ ok: false,
110438
+ cause: "not_found"
110439
+ };
110438
110440
  for (const url3 of uniqueUrls) {
110439
110441
  log.debug(`Fetching OpenAPI spec from: ${url3}`);
110440
110442
  const fetchResult = await safeFetch(
@@ -110443,6 +110445,10 @@ async function fetchOpenApiSpec(origin) {
110443
110445
  DEFAULT_FETCH_TIMEOUT
110444
110446
  );
110445
110447
  if (fetchResult.isErr()) {
110448
+ const { cause, message } = fetchResult.error;
110449
+ if (cause === "network" || cause === "timeout") {
110450
+ failure = { ok: false, cause, message };
110451
+ }
110446
110452
  log.debug(`Failed to fetch OpenAPI spec from: ${url3}`);
110447
110453
  continue;
110448
110454
  }
@@ -110458,18 +110464,24 @@ async function fetchOpenApiSpec(origin) {
110458
110464
  })
110459
110465
  );
110460
110466
  if (jsonResult.isErr()) {
110461
- log.debug(`Failed to fetch OpenAPI spec from: ${url3}`);
110467
+ if (failure.cause === "not_found") {
110468
+ failure = {
110469
+ ok: false,
110470
+ cause: "parse",
110471
+ message: `Failed to parse JSON from: ${url3}`
110472
+ };
110473
+ }
110474
+ log.debug(`Failed to parse OpenAPI spec from: ${url3}`);
110462
110475
  continue;
110463
110476
  }
110464
110477
  const spec = jsonResult.value;
110465
110478
  if (spec && typeof spec === "object" && spec.paths) {
110466
- specCache.set(origin, spec);
110467
- log.info(`Cached OpenAPI spec for origin: ${origin}`);
110468
- return spec;
110479
+ log.info(`Fetched OpenAPI spec for origin: ${origin}`);
110480
+ return { ok: true, spec };
110469
110481
  }
110470
110482
  }
110471
110483
  log.debug(`No OpenAPI spec found for origin: ${origin}`);
110472
- return null;
110484
+ return failure;
110473
110485
  }
110474
110486
  function resolveRef2(spec, ref, seen) {
110475
110487
  if (!ref.startsWith("#/")) return void 0;
@@ -110524,8 +110536,9 @@ function extractPath(url3, origin) {
110524
110536
  async function getEndpointSchema(endpointUrl, method) {
110525
110537
  if (!URL.canParse(endpointUrl)) return null;
110526
110538
  const origin = new URL(endpointUrl).origin;
110527
- const spec = await fetchOpenApiSpec(origin);
110528
- if (!spec) return null;
110539
+ const result = await fetchOpenApiSpec(origin);
110540
+ if (!result.ok) return null;
110541
+ const spec = result.spec;
110529
110542
  const paths = spec.paths;
110530
110543
  if (!paths) return null;
110531
110544
  const path2 = extractPath(endpointUrl, origin);
@@ -110556,12 +110569,10 @@ async function getEndpointSchema(endpointUrl, method) {
110556
110569
  const resolved = resolveRefs(spec, operation, /* @__PURE__ */ new Set());
110557
110570
  return { path: path2, method: httpMethod, ...resolved };
110558
110571
  }
110559
- var indexCache = /* @__PURE__ */ new Map();
110560
110572
  async function getOriginIndex(origin) {
110561
- const cached2 = indexCache.get(origin);
110562
- if (cached2) return cached2;
110563
- const spec = await fetchOpenApiSpec(origin);
110564
- if (!spec?.paths) return null;
110573
+ const result = await fetchOpenApiSpec(origin);
110574
+ if (!result.ok) return null;
110575
+ const spec = result.spec;
110565
110576
  const endpoints = [];
110566
110577
  for (const [path2, methods] of Object.entries(
110567
110578
  spec.paths
@@ -110585,7 +110596,6 @@ async function getOriginIndex(origin) {
110585
110596
  }
110586
110597
  }
110587
110598
  }
110588
- indexCache.set(origin, endpoints);
110589
110599
  return endpoints;
110590
110600
  }
110591
110601
  var OPENAPI_HTTP_METHODS = /* @__PURE__ */ new Set([
@@ -110601,9 +110611,9 @@ var OPENAPI_HTTP_METHODS = /* @__PURE__ */ new Set([
110601
110611
  async function getSpecMethods(endpointUrl) {
110602
110612
  if (!URL.canParse(endpointUrl)) return null;
110603
110613
  const origin = new URL(endpointUrl).origin;
110604
- const spec = await fetchOpenApiSpec(origin);
110605
- if (!spec?.paths) return null;
110606
- const paths = spec.paths;
110614
+ const result = await fetchOpenApiSpec(origin);
110615
+ if (!result.ok) return null;
110616
+ const paths = result.spec.paths;
110607
110617
  const path2 = extractPath(endpointUrl, origin);
110608
110618
  let pathEntry = paths[path2];
110609
110619
  if (!pathEntry) {
@@ -110620,8 +110630,8 @@ async function getSpecMethods(endpointUrl) {
110620
110630
  if (!pathEntry) return null;
110621
110631
  return Object.keys(pathEntry).filter((k) => OPENAPI_HTTP_METHODS.has(k)).map((k) => k.toUpperCase());
110622
110632
  }
110623
- function getIndexEntry(origin, path2, method) {
110624
- const entries = indexCache.get(origin);
110633
+ async function getIndexEntry(origin, path2, method) {
110634
+ const entries = await getOriginIndex(origin);
110625
110635
  if (!entries) return void 0;
110626
110636
  const m = method.toUpperCase();
110627
110637
  return entries.find((e) => e.path === path2 && e.method === m);
@@ -110700,14 +110710,14 @@ async function probeMethod({
110700
110710
  if (!schema2) return null;
110701
110711
  let estimatedPrice2;
110702
110712
  let summary2;
110703
- const indexResult2 = resultFromThrowable(
110713
+ const indexResult2 = await resultFromPromise(
110704
110714
  "openapi",
110705
110715
  surface2,
110706
- () => {
110716
+ (async () => {
110707
110717
  const origin = new URL(url3).origin;
110708
110718
  const path2 = new URL(url3).pathname || "/";
110709
110719
  return getIndexEntry(origin, path2, method);
110710
- },
110720
+ })(),
110711
110721
  (e) => ({
110712
110722
  cause: "index_lookup",
110713
110723
  message: e instanceof Error ? e.message : String(e)
@@ -110818,14 +110828,14 @@ async function probeMethod({
110818
110828
  }
110819
110829
  let estimatedPrice;
110820
110830
  let summary;
110821
- const indexResult = resultFromThrowable(
110831
+ const indexResult = await resultFromPromise(
110822
110832
  "openapi",
110823
110833
  surface2,
110824
- () => {
110834
+ (async () => {
110825
110835
  const origin = new URL(url3).origin;
110826
110836
  const path2 = new URL(url3).pathname || "/";
110827
110837
  return getIndexEntry(origin, path2, method);
110828
- },
110838
+ })(),
110829
110839
  (e) => ({
110830
110840
  cause: "index_lookup",
110831
110841
  message: e instanceof Error ? e.message : String(e)
@@ -111173,7 +111183,6 @@ var ORIGINS = [
111173
111183
  "https://stablestudio.dev" /* StableStudio */,
111174
111184
  "https://stableupload.dev" /* StableUpload */,
111175
111185
  "https://stableemail.dev" /* StableEmail */,
111176
- "https://stablejobs.dev" /* StableJobs */,
111177
111186
  "https://x402scan.com" /* X402Scan */,
111178
111187
  "https://shirt.sh" /* Shirt */,
111179
111188
  "https://x402puppet.com" /* X402Puppet */
@@ -111198,20 +111207,23 @@ async function fetchLlmsTxt(surface2, origin) {
111198
111207
  async function discoverResources(surface2, url3) {
111199
111208
  const origin = URL.canParse(url3) ? new URL(url3).origin : url3;
111200
111209
  log.info(`Discovering resources for origin: ${origin}`);
111201
- const [spec, instructions] = await Promise.all([
111210
+ const [specResult, instructions] = await Promise.all([
111202
111211
  fetchOpenApiSpec(origin),
111203
111212
  fetchLlmsTxt(surface2, origin)
111204
111213
  ]);
111205
- if (!spec?.paths) {
111206
- log.debug(
111207
- `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json`
111208
- );
111209
- return null;
111214
+ if (!specResult.ok) {
111215
+ log.debug(`No OpenAPI spec found for ${origin}: ${specResult.cause}`);
111216
+ return {
111217
+ found: false,
111218
+ cause: specResult.cause,
111219
+ ..."message" in specResult ? { message: specResult.message } : {}
111220
+ };
111210
111221
  }
111222
+ const spec = specResult.spec;
111211
111223
  const endpoints = await getOriginIndex(origin);
111212
111224
  if (!endpoints || endpoints.length === 0) {
111213
111225
  log.debug(`OpenAPI spec found for ${origin} but no endpoints extracted`);
111214
- return null;
111226
+ return { found: false, cause: "not_found" };
111215
111227
  }
111216
111228
  log.info(`Found ${endpoints.length} endpoints for: ${origin}`);
111217
111229
  const rawInfo = spec.info;
@@ -111295,7 +111307,7 @@ function registerDiscoveryTools(server) {
111295
111307
  return mcpError(discoverResult);
111296
111308
  }
111297
111309
  const result = discoverResult.value;
111298
- if (result) {
111310
+ if ("endpoints" in result) {
111299
111311
  return mcpSuccessJson({
111300
111312
  found: true,
111301
111313
  origin: result.origin,
@@ -111307,10 +111319,20 @@ function registerDiscoveryTools(server) {
111307
111319
  });
111308
111320
  }
111309
111321
  const origin = URL.canParse(url3) ? new URL(url3).origin : url3;
111322
+ const tried = OPENAPI_SPEC_PATHS.join(", ");
111323
+ if (result.cause === "not_found") {
111324
+ return mcpSuccessJson({
111325
+ found: false,
111326
+ origin,
111327
+ error: `No OpenAPI spec found. Tried: ${tried}`
111328
+ });
111329
+ }
111310
111330
  return mcpSuccessJson({
111311
111331
  found: false,
111312
111332
  origin,
111313
- error: "No OpenAPI spec found. Tried: /openapi.json, /.well-known/openapi.json"
111333
+ cause: result.cause,
111334
+ error: result.message ?? `Failed to fetch OpenAPI spec (${result.cause})`,
111335
+ hint: result.cause === "timeout" ? "The server may be slow or unreachable. Try again later." : result.cause === "network" ? "Could not reach the server. Check the network connection and try again." : `The server returned an unparseable response. Tried: ${tried}`
111314
111336
  });
111315
111337
  })
111316
111338
  );
@@ -111339,10 +111361,6 @@ var ORIGIN_METADATA = {
111339
111361
  title: "StableEmail",
111340
111362
  description: "Send emails"
111341
111363
  },
111342
- ["https://stablejobs.dev" /* StableJobs */]: {
111343
- title: "StableJobs",
111344
- description: "Search job postings"
111345
- },
111346
111364
  ["https://x402scan.com" /* X402Scan */]: {
111347
111365
  title: "X402 Scan",
111348
111366
  description: "x402 protocol explorer"
@@ -111802,7 +111820,7 @@ var import_path3 = require("path");
111802
111820
  var import_url2 = require("url");
111803
111821
  function getVersion3() {
111804
111822
  if (true) {
111805
- return "0.6.3";
111823
+ return "0.6.4";
111806
111824
  }
111807
111825
  const __dirname3 = (0, import_path3.dirname)((0, import_url2.fileURLToPath)(importMetaUrl));
111808
111826
  const pkg = JSON.parse(
@@ -24,13 +24,18 @@ interface DiscoveryResult {
24
24
  endpoints: EndpointSummary[];
25
25
  instructions?: string;
26
26
  }
27
+ interface DiscoverFailure {
28
+ found: false;
29
+ cause: 'not_found' | 'network' | 'timeout' | 'parse';
30
+ message?: string;
31
+ }
27
32
  /**
28
33
  * Discover payment-protected resources on an origin.
29
34
  * Fetches OpenAPI spec, builds endpoint index, and fetches llms.txt instructions.
30
35
  *
31
- * Returns DiscoveryResult on success, null if no spec/endpoints found.
36
+ * Returns DiscoveryResult on success, DiscoverFailure with cause on failure.
32
37
  */
33
- declare function discoverResources(surface: string, url: string): Promise<DiscoveryResult | null>;
38
+ declare function discoverResources(surface: string, url: string): Promise<DiscoveryResult | DiscoverFailure>;
34
39
 
35
40
  type PaymentProtocol = 'x402' | 'mpp';
36
41
 
@@ -106,4 +111,4 @@ interface CheckEndpointOptions {
106
111
  */
107
112
  declare function checkEndpoint({ surface, url, methods, body, headers, includeMethodErrors, probeAllMethods, }: CheckEndpointOptions): Promise<CheckEndpointResult>;
108
113
 
109
- export { type CheckEndpointOptions as C, type DiscoveryResult as D, type MppPaymentOption as M, type OpenApiInfo as O, type PaymentOption as P, SUPPORTED_METHODS as S, type X402PaymentOption as X, type CheckEndpointResult as a, type ProbeMethodResult as b, type SupportedMethod as c, checkEndpoint as d, discoverResources as e };
114
+ export { type CheckEndpointOptions as C, type DiscoverFailure as D, type MppPaymentOption as M, type OpenApiInfo as O, type PaymentOption as P, SUPPORTED_METHODS as S, type X402PaymentOption as X, type CheckEndpointResult as a, type DiscoveryResult as b, type ProbeMethodResult as c, type SupportedMethod as d, checkEndpoint as e, discoverResources as f };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getTempoBalance
3
- } from "./chunk-2RSGMWFW.js";
3
+ } from "./chunk-RN73GKUU.js";
4
4
  import {
5
5
  detectPaymentProtocols,
6
6
  getSiwxExtension,
@@ -11,7 +11,7 @@ import {
11
11
  tokenStringToNumber,
12
12
  x402Err,
13
13
  x402Ok
14
- } from "./chunk-VU4O2YQU.js";
14
+ } from "./chunk-NFGTXPUD.js";
15
15
  import {
16
16
  getBalance
17
17
  } from "./chunk-UFSCGP67.js";
@@ -411,4 +411,4 @@ export {
411
411
  createFetchWithPayment,
412
412
  createFetchWithAuth
413
413
  };
414
- //# sourceMappingURL=chunk-XVQ7S42P.js.map
414
+ //# sourceMappingURL=chunk-3STID4ZW.js.map
@@ -0,0 +1,7 @@
1
+ // src/shared/mpp-enabled.ts
2
+ var isMppEnabled = () => "0.6.4".includes("-mpp");
3
+
4
+ export {
5
+ isMppEnabled
6
+ };
7
+ //# sourceMappingURL=chunk-L3LTEB5B.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isMppEnabled
3
- } from "./chunk-ZPI2XP7U.js";
3
+ } from "./chunk-L3LTEB5B.js";
4
4
  import {
5
5
  DEFAULT_FETCH_TIMEOUT,
6
6
  err,
@@ -90,14 +90,16 @@ function detectPaymentProtocols(response) {
90
90
  }
91
91
 
92
92
  // src/shared/openapi-cache.ts
93
- var specCache = /* @__PURE__ */ new Map();
93
+ var OPENAPI_SPEC_PATHS = [
94
+ "/openapi.json",
95
+ "/.well-known/openapi.json"
96
+ ];
94
97
  async function fetchOpenApiSpec(origin) {
95
- const cached = specCache.get(origin);
96
- if (cached) return cached;
97
- const uniqueUrls = [
98
- `${origin}/openapi.json`,
99
- `${origin}/.well-known/openapi.json`
100
- ];
98
+ const uniqueUrls = OPENAPI_SPEC_PATHS.map((p) => `${origin}${p}`);
99
+ let failure = {
100
+ ok: false,
101
+ cause: "not_found"
102
+ };
101
103
  for (const url of uniqueUrls) {
102
104
  log.debug(`Fetching OpenAPI spec from: ${url}`);
103
105
  const fetchResult = await safeFetch(
@@ -106,6 +108,10 @@ async function fetchOpenApiSpec(origin) {
106
108
  DEFAULT_FETCH_TIMEOUT
107
109
  );
108
110
  if (fetchResult.isErr()) {
111
+ const { cause, message } = fetchResult.error;
112
+ if (cause === "network" || cause === "timeout") {
113
+ failure = { ok: false, cause, message };
114
+ }
109
115
  log.debug(`Failed to fetch OpenAPI spec from: ${url}`);
110
116
  continue;
111
117
  }
@@ -121,18 +127,24 @@ async function fetchOpenApiSpec(origin) {
121
127
  })
122
128
  );
123
129
  if (jsonResult.isErr()) {
124
- log.debug(`Failed to fetch OpenAPI spec from: ${url}`);
130
+ if (failure.cause === "not_found") {
131
+ failure = {
132
+ ok: false,
133
+ cause: "parse",
134
+ message: `Failed to parse JSON from: ${url}`
135
+ };
136
+ }
137
+ log.debug(`Failed to parse OpenAPI spec from: ${url}`);
125
138
  continue;
126
139
  }
127
140
  const spec = jsonResult.value;
128
141
  if (spec && typeof spec === "object" && spec.paths) {
129
- specCache.set(origin, spec);
130
- log.info(`Cached OpenAPI spec for origin: ${origin}`);
131
- return spec;
142
+ log.info(`Fetched OpenAPI spec for origin: ${origin}`);
143
+ return { ok: true, spec };
132
144
  }
133
145
  }
134
146
  log.debug(`No OpenAPI spec found for origin: ${origin}`);
135
- return null;
147
+ return failure;
136
148
  }
137
149
  function resolveRef(spec, ref, seen) {
138
150
  if (!ref.startsWith("#/")) return void 0;
@@ -187,8 +199,9 @@ function extractPath(url, origin) {
187
199
  async function getEndpointSchema(endpointUrl, method) {
188
200
  if (!URL.canParse(endpointUrl)) return null;
189
201
  const origin = new URL(endpointUrl).origin;
190
- const spec = await fetchOpenApiSpec(origin);
191
- if (!spec) return null;
202
+ const result = await fetchOpenApiSpec(origin);
203
+ if (!result.ok) return null;
204
+ const spec = result.spec;
192
205
  const paths = spec.paths;
193
206
  if (!paths) return null;
194
207
  const path = extractPath(endpointUrl, origin);
@@ -219,12 +232,10 @@ async function getEndpointSchema(endpointUrl, method) {
219
232
  const resolved = resolveRefs(spec, operation, /* @__PURE__ */ new Set());
220
233
  return { path, method: httpMethod, ...resolved };
221
234
  }
222
- var indexCache = /* @__PURE__ */ new Map();
223
235
  async function getOriginIndex(origin) {
224
- const cached = indexCache.get(origin);
225
- if (cached) return cached;
226
- const spec = await fetchOpenApiSpec(origin);
227
- if (!spec?.paths) return null;
236
+ const result = await fetchOpenApiSpec(origin);
237
+ if (!result.ok) return null;
238
+ const spec = result.spec;
228
239
  const endpoints = [];
229
240
  for (const [path, methods] of Object.entries(
230
241
  spec.paths
@@ -248,7 +259,6 @@ async function getOriginIndex(origin) {
248
259
  }
249
260
  }
250
261
  }
251
- indexCache.set(origin, endpoints);
252
262
  return endpoints;
253
263
  }
254
264
  var OPENAPI_HTTP_METHODS = /* @__PURE__ */ new Set([
@@ -264,9 +274,9 @@ var OPENAPI_HTTP_METHODS = /* @__PURE__ */ new Set([
264
274
  async function getSpecMethods(endpointUrl) {
265
275
  if (!URL.canParse(endpointUrl)) return null;
266
276
  const origin = new URL(endpointUrl).origin;
267
- const spec = await fetchOpenApiSpec(origin);
268
- if (!spec?.paths) return null;
269
- const paths = spec.paths;
277
+ const result = await fetchOpenApiSpec(origin);
278
+ if (!result.ok) return null;
279
+ const paths = result.spec.paths;
270
280
  const path = extractPath(endpointUrl, origin);
271
281
  let pathEntry = paths[path];
272
282
  if (!pathEntry) {
@@ -283,8 +293,8 @@ async function getSpecMethods(endpointUrl) {
283
293
  if (!pathEntry) return null;
284
294
  return Object.keys(pathEntry).filter((k) => OPENAPI_HTTP_METHODS.has(k)).map((k) => k.toUpperCase());
285
295
  }
286
- function getIndexEntry(origin, path, method) {
287
- const entries = indexCache.get(origin);
296
+ async function getIndexEntry(origin, path, method) {
297
+ const entries = await getOriginIndex(origin);
288
298
  if (!entries) return void 0;
289
299
  const m = method.toUpperCase();
290
300
  return entries.find((e) => e.path === path && e.method === m);
@@ -394,14 +404,14 @@ async function probeMethod({
394
404
  if (!schema2) return null;
395
405
  let estimatedPrice2;
396
406
  let summary2;
397
- const indexResult2 = resultFromThrowable(
407
+ const indexResult2 = await resultFromPromise(
398
408
  "openapi",
399
409
  surface,
400
- () => {
410
+ (async () => {
401
411
  const origin = new URL(url).origin;
402
412
  const path = new URL(url).pathname || "/";
403
413
  return getIndexEntry(origin, path, method);
404
- },
414
+ })(),
405
415
  (e) => ({
406
416
  cause: "index_lookup",
407
417
  message: e instanceof Error ? e.message : String(e)
@@ -512,14 +522,14 @@ async function probeMethod({
512
522
  }
513
523
  let estimatedPrice;
514
524
  let summary;
515
- const indexResult = resultFromThrowable(
525
+ const indexResult = await resultFromPromise(
516
526
  "openapi",
517
527
  surface,
518
- () => {
528
+ (async () => {
519
529
  const origin = new URL(url).origin;
520
530
  const path = new URL(url).pathname || "/";
521
531
  return getIndexEntry(origin, path, method);
522
- },
532
+ })(),
523
533
  (e) => ({
524
534
  cause: "index_lookup",
525
535
  message: e instanceof Error ? e.message : String(e)
@@ -593,20 +603,23 @@ async function fetchLlmsTxt(surface, origin) {
593
603
  async function discoverResources(surface, url) {
594
604
  const origin = URL.canParse(url) ? new URL(url).origin : url;
595
605
  log.info(`Discovering resources for origin: ${origin}`);
596
- const [spec, instructions] = await Promise.all([
606
+ const [specResult, instructions] = await Promise.all([
597
607
  fetchOpenApiSpec(origin),
598
608
  fetchLlmsTxt(surface, origin)
599
609
  ]);
600
- if (!spec?.paths) {
601
- log.debug(
602
- `No OpenAPI spec found for ${origin}. Tried: /openapi.json, /.well-known/openapi.json`
603
- );
604
- return null;
610
+ if (!specResult.ok) {
611
+ log.debug(`No OpenAPI spec found for ${origin}: ${specResult.cause}`);
612
+ return {
613
+ found: false,
614
+ cause: specResult.cause,
615
+ ..."message" in specResult ? { message: specResult.message } : {}
616
+ };
605
617
  }
618
+ const spec = specResult.spec;
606
619
  const endpoints = await getOriginIndex(origin);
607
620
  if (!endpoints || endpoints.length === 0) {
608
621
  log.debug(`OpenAPI spec found for ${origin} but no endpoints extracted`);
609
- return null;
622
+ return { found: false, cause: "not_found" };
610
623
  }
611
624
  log.info(`Found ${endpoints.length} endpoints for: ${origin}`);
612
625
  const rawInfo = spec.info;
@@ -641,8 +654,9 @@ export {
641
654
  tokenStringToNumber,
642
655
  getInputSchema,
643
656
  getSiwxExtension,
657
+ OPENAPI_SPEC_PATHS,
644
658
  SUPPORTED_METHODS,
645
659
  checkEndpoint,
646
660
  discoverResources
647
661
  };
648
- //# sourceMappingURL=chunk-VU4O2YQU.js.map
662
+ //# sourceMappingURL=chunk-NFGTXPUD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/operations/check-endpoint.ts","../../src/shared/neverthrow/x402/index.ts","../../src/shared/protocol.ts","../../src/shared/openapi-cache.ts","../../src/shared/token.ts","../../src/server/lib/x402-extensions.ts","../../src/shared/operations/discover.ts"],"sourcesContent":["import { resultFromPromise, resultFromThrowable } from '@agentcash/neverthrow';\nimport { Challenge } from 'mppx';\nimport { x402Client, x402HTTPClient } from '@x402/core/client';\n\nimport { log } from '@/shared/log';\nimport { DEFAULT_FETCH_TIMEOUT, safeFetch } from '@/shared/neverthrow/fetch';\nimport { safeGetPaymentRequired } from '@/shared/neverthrow/x402';\nimport { detectPaymentProtocols } from '@/shared/protocol';\nimport { isMppEnabled } from '@/shared/mpp-enabled';\nimport {\n getEndpointSchema,\n getIndexEntry,\n getSpecMethods,\n} from '@/shared/openapi-cache';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { getInputSchema } from '@/server/lib/x402-extensions';\n\nimport type { JsonObject } from '@/shared/neverthrow/json/types';\nimport type { PaymentProtocol } from '@/shared/protocol';\n\n// ─── Public types ────────────────────────────────────────────────\n\n/** Tempo mainnet chain ID, used when the MPP challenge omits methodDetails.chainId. */\nconst TEMPO_DEFAULT_CHAIN_ID = 4217;\n\nexport const SUPPORTED_METHODS = [\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH',\n] as const;\n\nexport type SupportedMethod = (typeof SUPPORTED_METHODS)[number];\n\n// ─── Payment option types (protocol-agnostic) ───────────────────\n\n/** Fields common to every payment option regardless of protocol. */\ninterface PaymentOptionBase {\n /** Protocol that issued this payment option. */\n protocol: PaymentProtocol;\n /** Human-readable price in dollars (e.g., 0.02). */\n price: number;\n /** CAIP-2 style chain identifier (e.g., \"eip155:8453\", \"tempo:4217\"). */\n network: string;\n /** Token / asset contract address. */\n asset: string;\n /** Payment destination address. */\n recipient?: string;\n /** Human-readable description of the resource being paid for. */\n description?: string;\n}\n\n/** MPP (Machine Payments Protocol) payment option. */\nexport interface MppPaymentOption extends PaymentOptionBase {\n protocol: 'mpp';\n /** Payment method identifier (e.g., \"tempo\", \"stripe\"). */\n paymentMethod: string;\n /** Payment intent type (e.g., \"charge\", \"session\"). */\n intent: string;\n /** Server protection realm. */\n realm: string;\n}\n\n/** x402 payment option. */\nexport interface X402PaymentOption extends PaymentOptionBase {\n protocol: 'x402';\n /** Response MIME type from the x402 resource descriptor. */\n mimeType?: string;\n}\n\n/** A single payment option extracted from a 402 response. */\nexport type PaymentOption = MppPaymentOption | X402PaymentOption;\n\n/** A single method's probe outcome (only 402 or 2xx responses are kept). */\nexport interface ProbeMethodResult {\n method: SupportedMethod;\n requiresPayment: boolean;\n statusCode: number;\n protocols?: PaymentProtocol[];\n paymentOptions?: PaymentOption[];\n /** OpenAPI operation schema when available. */\n schema?: JsonObject;\n /** Advisory price string from the OpenAPI x-payment-info extension. */\n estimatedPrice?: string;\n /** Human-readable summary from the OpenAPI spec. */\n summary?: string;\n}\n\nexport interface CheckEndpointResult {\n url: string;\n results: ProbeMethodResult[];\n}\n\nexport interface CheckEndpointOptions {\n surface: string;\n url: string;\n /** Methods to probe. Defaults to spec-defined methods, or all if no spec / probeAllMethods is set. */\n methods?: SupportedMethod[];\n body?: unknown;\n headers?: Record<string, string>;\n /** When true, include 404/405 responses in results. Useful when a specific method is targeted. */\n includeMethodErrors?: boolean;\n /** When true, probe all HTTP methods regardless of what the OpenAPI spec declares. */\n probeAllMethods?: boolean;\n}\n\n// ─── Public entry point ──────────────────────────────────────────\n\n/**\n * Probe an endpoint across one or more HTTP methods in parallel.\n * Returns only the methods that responded with 402 or 2xx.\n * Does not make any payment.\n */\nexport async function checkEndpoint({\n surface,\n url,\n methods,\n body,\n headers = {},\n includeMethodErrors = false,\n probeAllMethods = false,\n}: CheckEndpointOptions): Promise<CheckEndpointResult> {\n let methodsToCheck: SupportedMethod[];\n if (methods) {\n methodsToCheck = methods;\n } else if (probeAllMethods) {\n methodsToCheck = [...SUPPORTED_METHODS];\n } else {\n const specMethods = await getSpecMethods(url);\n if (specMethods?.length) {\n methodsToCheck = specMethods.filter((m): m is SupportedMethod =>\n SUPPORTED_METHODS.includes(m as SupportedMethod)\n );\n } else {\n methodsToCheck = [...SUPPORTED_METHODS];\n }\n }\n\n log.info('Checking endpoint', { url, methods: methodsToCheck });\n\n const results = await Promise.all(\n methodsToCheck.map(method =>\n probeMethod({ surface, method, url, body, headers, includeMethodErrors })\n )\n );\n\n return {\n url,\n results: results.filter((r): r is ProbeMethodResult => r !== null),\n };\n}\n\n// ─── Per-method probe (private) ──────────────────────────────────\n\ninterface ProbeMethodOptions {\n surface: string;\n method: SupportedMethod;\n url: string;\n body?: unknown;\n headers: Record<string, string>;\n includeMethodErrors: boolean;\n}\n\nasync function probeMethod({\n surface,\n method,\n url,\n body,\n headers,\n includeMethodErrors,\n}: ProbeMethodOptions): Promise<ProbeMethodResult | null> {\n // ── Kick off the OpenAPI schema fetch in parallel with the probe ──\n const schemaPromise = resultFromPromise(\n 'openapi',\n surface,\n getEndpointSchema(url, method),\n e => ({\n cause: 'schema_fetch' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n\n // ── Probe the endpoint to get a live 402 challenge ──\n const request = buildProbeRequest(url, method, body, headers);\n const responseResult = await safeFetch(\n surface,\n request,\n DEFAULT_FETCH_TIMEOUT\n );\n\n // Helper: build a result from the OpenAPI spec alone (no probe data).\n const fallbackToSpec = async (): Promise<ProbeMethodResult | null> => {\n const schemaResult = await schemaPromise;\n const schema =\n schemaResult.isOk() && schemaResult.value\n ? schemaResult.value\n : undefined;\n\n if (!schema) return null;\n\n let estimatedPrice: string | undefined;\n let summary: string | undefined;\n\n const indexResult = await resultFromPromise(\n 'openapi',\n surface,\n (async () => {\n const origin = new URL(url).origin;\n const path = new URL(url).pathname || '/';\n return getIndexEntry(origin, path, method);\n })(),\n e => ({\n cause: 'index_lookup' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n let protocols: PaymentProtocol[] | undefined;\n\n if (indexResult.isOk() && indexResult.value) {\n if (indexResult.value.price) estimatedPrice = indexResult.value.price;\n if (indexResult.value.summary) summary = indexResult.value.summary;\n if (indexResult.value.protocols?.length) {\n protocols = indexResult.value.protocols as PaymentProtocol[];\n }\n }\n\n return {\n method,\n requiresPayment: true,\n statusCode: 402,\n schema,\n ...(protocols ? { protocols } : {}),\n ...(estimatedPrice ? { estimatedPrice } : {}),\n ...(summary ? { summary } : {}),\n };\n };\n\n if (responseResult.isErr()) {\n log.debug(`${method} ${url} probe failed`, responseResult.error);\n return fallbackToSpec();\n }\n\n const response = responseResult.value;\n\n // Non-402 error — fall back to OpenAPI spec if available\n if (!response.ok && response.status !== 402) {\n if (\n includeMethodErrors &&\n (response.status === 404 || response.status === 405)\n ) {\n return {\n method,\n requiresPayment: false,\n statusCode: response.status,\n };\n }\n log.debug(\n `${method} ${url} returned ${response.status} — falling back to spec`\n );\n return fallbackToSpec();\n }\n\n // 2xx success — include (no payment required)\n if (response.status !== 402) {\n return {\n method,\n requiresPayment: false,\n statusCode: response.status,\n };\n }\n\n // 402 — extract payment details\n const protocols = detectPaymentProtocols(response);\n const paymentOptions: PaymentOption[] = [];\n\n // Await the OpenAPI schema we kicked off earlier\n let schema: JsonObject | undefined;\n const endpointSchemaResult = await schemaPromise;\n if (endpointSchemaResult.isOk() && endpointSchemaResult.value) {\n schema = endpointSchemaResult.value;\n } else if (endpointSchemaResult.isErr()) {\n log.debug(`Failed to fetch OpenAPI schema for: ${url}`);\n }\n\n if (isMppEnabled() && protocols.includes('mpp')) {\n for (const challenge of parseMppChallenges(response)) {\n const currency = challenge.request.currency as string | undefined;\n const amount = challenge.request.amount as string | undefined;\n const decimals = (challenge.request.decimals as number | undefined) ?? 6;\n const recipient = challenge.request.recipient as string | undefined;\n const methodDetails = challenge.request.methodDetails as\n | { chainId?: number }\n | undefined;\n\n const chainId = methodDetails?.chainId ?? TEMPO_DEFAULT_CHAIN_ID;\n const network = `tempo:${String(chainId)}`;\n\n const description =\n challenge.description ??\n ((schema as Record<string, unknown> | undefined)?.summary as\n | string\n | undefined);\n\n if (amount && currency) {\n paymentOptions.push({\n protocol: 'mpp',\n paymentMethod: challenge.method,\n intent: challenge.intent,\n realm: challenge.realm,\n price: tokenStringToNumber(amount, decimals),\n network,\n asset: currency,\n ...(recipient ? { recipient } : {}),\n ...(description ? { description } : {}),\n });\n }\n }\n }\n\n if (protocols.includes('x402')) {\n const client = new x402HTTPClient(new x402Client());\n\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isOk()) {\n const { resource, extensions, accepts } = paymentRequiredResult.value;\n\n // Fall back to probe schema only if OpenAPI didn't provide one\n if (!schema) {\n const inputSchema = getInputSchema(extensions);\n if (inputSchema) schema = inputSchema as JsonObject;\n }\n\n for (const accept of accepts) {\n paymentOptions.push({\n protocol: 'x402',\n price: tokenStringToNumber(accept.amount),\n network: accept.network,\n asset: accept.asset,\n ...(accept.payTo ? { recipient: accept.payTo } : {}),\n ...(resource.description\n ? { description: resource.description }\n : {}),\n ...(resource.mimeType ? { mimeType: resource.mimeType } : {}),\n });\n }\n }\n }\n\n // Extract summary and estimatedPrice from OpenAPI index (best-effort)\n let estimatedPrice: string | undefined;\n let summary: string | undefined;\n\n const indexResult = await resultFromPromise(\n 'openapi',\n surface,\n (async () => {\n const origin = new URL(url).origin;\n const path = new URL(url).pathname || '/';\n return getIndexEntry(origin, path, method);\n })(),\n e => ({\n cause: 'index_lookup' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n if (indexResult.isOk() && indexResult.value) {\n if (indexResult.value.price) estimatedPrice = indexResult.value.price;\n if (indexResult.value.summary) summary = indexResult.value.summary;\n }\n\n return {\n method,\n requiresPayment: true,\n statusCode: response.status,\n protocols,\n paymentOptions,\n ...(schema ? { schema } : {}),\n ...(estimatedPrice ? { estimatedPrice } : {}),\n ...(summary ? { summary } : {}),\n };\n}\n\n// ─── MPP multi-challenge parser (private) ────────────────────────\n\n/**\n * Parse all MPP challenges from a 402 response.\n *\n * A server may include multiple `WWW-Authenticate: Payment ...` headers\n * to offer different payment methods (e.g., Tempo and Stripe).\n * `Headers.get()` joins them with `, ` so we split on the `Payment `\n * boundary and parse each challenge individually.\n */\nfunction parseMppChallenges(response: Response): Challenge.Challenge[] {\n const header = response.headers.get('WWW-Authenticate');\n if (!header) return [];\n\n const challenges: Challenge.Challenge[] = [];\n\n for (const segment of header.split(/,\\s*(?=Payment\\s)/i)) {\n const result = resultFromThrowable(\n 'mpp',\n 'check-endpoint',\n () => Challenge.deserialize(segment.trim()),\n e => ({\n cause: 'challenge_parse' as const,\n message: e instanceof Error ? e.message : String(e),\n })\n );\n if (result.isOk()) {\n challenges.push(result.value);\n } else {\n log.debug('Failed to parse MPP challenge segment', result.error.message);\n }\n }\n\n return challenges;\n}\n\n// ─── Request builder (private) ───────────────────────────────────\n\nfunction buildProbeRequest(\n url: string,\n method: string,\n body: unknown,\n headers: Record<string, string>\n): Request {\n const supportsBody = ['POST', 'PUT', 'PATCH'].includes(method);\n const requestBody =\n supportsBody && body\n ? typeof body === 'string'\n ? body\n : JSON.stringify(body)\n : undefined;\n\n return new Request(url, {\n method,\n body: requestBody,\n headers: {\n ...(requestBody ? { 'Content-Type': 'application/json' } : {}),\n ...headers,\n },\n });\n}\n","import {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/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 { isMppEnabled } from '@/shared/mpp-enabled';\n\nexport type PaymentProtocol = 'x402' | 'mpp';\n\n/**\n * Detects all payment protocols present in a 402 response.\n * MPP responses include a `WWW-Authenticate` header starting with \"Payment\".\n * x402 responses include a `payment-required` header.\n * If neither is explicitly detected, defaults to x402.\n *\n * MPP detection is gated behind {@link isMppEnabled} so it never surfaces\n * in agent context on the `latest` dist-tag.\n */\nexport function detectPaymentProtocols(response: Response): PaymentProtocol[] {\n const protocols: PaymentProtocol[] = [];\n if (isMppEnabled()) {\n const wwwAuth = response.headers.get('WWW-Authenticate');\n if (wwwAuth?.startsWith('Payment')) {\n protocols.push('mpp');\n }\n }\n const paymentRequired = response.headers.get('payment-required');\n if (paymentRequired) {\n protocols.push('x402');\n }\n // If we couldn't detect either explicitly, default to x402\n if (protocols.length === 0) {\n protocols.push('x402');\n }\n return protocols;\n}\n\n/**\n * Convenience: returns the first/preferred protocol from a 402 response.\n * Useful when a single protocol must be chosen (e.g. for payment).\n */\nexport function detectPaymentProtocol(response: Response): PaymentProtocol {\n return detectPaymentProtocols(response)[0]!;\n}\n","import { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { DEFAULT_FETCH_TIMEOUT, 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\nexport type SpecFetchResult =\n | { ok: true; spec: JsonObject }\n | { ok: false; cause: 'not_found' }\n | { ok: false; cause: 'network' | 'timeout' | 'parse'; message: string };\n\n/** Well-known paths tried for OpenAPI spec discovery. */\nexport const OPENAPI_SPEC_PATHS = [\n '/openapi.json',\n '/.well-known/openapi.json',\n];\n\n/**\n * Fetch an OpenAPI spec for an origin.\n * Tries multiple well-known locations in order.\n *\n * Returns a discriminated result so callers can distinguish\n * \"no spec exists\" from \"couldn't reach the server\".\n */\nexport async function fetchOpenApiSpec(\n origin: string\n): Promise<SpecFetchResult> {\n const uniqueUrls = OPENAPI_SPEC_PATHS.map(p => `${origin}${p}`);\n\n // Track the most informative failure. Network/timeout errors take\n // priority over not_found because they mean the server may be unreachable.\n let failure: SpecFetchResult & { ok: false } = {\n ok: false,\n cause: 'not_found',\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 DEFAULT_FETCH_TIMEOUT\n );\n\n if (fetchResult.isErr()) {\n const { cause, message } = fetchResult.error;\n if (cause === 'network' || cause === 'timeout') {\n failure = { ok: false, cause, message };\n }\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 if (failure.cause === 'not_found') {\n failure = {\n ok: false,\n cause: 'parse',\n message: `Failed to parse JSON from: ${url}`,\n };\n }\n log.debug(`Failed to parse 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 log.info(`Fetched OpenAPI spec for origin: ${origin}`);\n return { ok: true, spec };\n }\n }\n\n log.debug(`No OpenAPI spec found for origin: ${origin}`);\n return failure;\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 result = await fetchOpenApiSpec(origin);\n if (!result.ok) return null;\n const spec = result.spec;\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 log.debug(\n `No OpenAPI operation found for ${httpMethod.toUpperCase()} ${path}`\n );\n return null;\n }\n\n const resolved = resolveRefs(spec, operation, new Set());\n return { path, method: httpMethod, ...resolved };\n}\n\n// ── Lightweight Endpoint Index ──\n\n/**\n * Build a lightweight index for an origin.\n * Fetches the OpenAPI spec, 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 result = await fetchOpenApiSpec(origin);\n if (!result.ok) return null;\n const spec = result.spec;\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 return endpoints;\n}\n\n/** HTTP methods that represent operations in an OpenAPI path entry. */\nconst OPENAPI_HTTP_METHODS = new Set([\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace',\n]);\n\n/**\n * Return the HTTP methods defined in the OpenAPI spec for a given endpoint URL.\n * Returns null if no spec or path entry is available (caller should fall back to probing all methods).\n */\nexport async function getSpecMethods(\n endpointUrl: string\n): Promise<string[] | null> {\n if (!URL.canParse(endpointUrl)) return null;\n const origin = new URL(endpointUrl).origin;\n\n const result = await fetchOpenApiSpec(origin);\n if (!result.ok) return null;\n\n const paths = result.spec.paths as JsonObject;\n const path = extractPath(endpointUrl, origin);\n\n let pathEntry = paths[path] as JsonObject | undefined;\n\n if (!pathEntry) {\n for (const [specPath, specEntry] of Object.entries(paths)) {\n if (specEntry == null || typeof specEntry !== 'object') continue;\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) return null;\n\n return Object.keys(pathEntry)\n .filter(k => OPENAPI_HTTP_METHODS.has(k))\n .map(k => k.toUpperCase());\n}\n\n/**\n * Look up a single endpoint entry from the origin index.\n * Fetches the OpenAPI spec if needed.\n */\nexport async function getIndexEntry(\n origin: string,\n path: string,\n method: string\n): Promise<EndpointSummary | undefined> {\n const entries = await getOriginIndex(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 { 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 { log } from '@/shared/log';\nimport {\n DEFAULT_FETCH_TIMEOUT,\n safeFetch,\n safeParseResponse,\n} from '@/shared/neverthrow/fetch';\nimport { fetchOpenApiSpec, getOriginIndex } from '@/shared/openapi-cache';\n\nimport type { EndpointSummary } from '@/shared/openapi-cache';\n\nexport interface OpenApiInfo {\n title: string;\n version?: string;\n description?: string;\n}\n\nexport interface DiscoveryResult {\n origin: string;\n source: 'openapi';\n info?: OpenApiInfo;\n endpoints: EndpointSummary[];\n instructions?: string;\n}\n\nexport interface DiscoverFailure {\n found: false;\n cause: 'not_found' | 'network' | 'timeout' | 'parse';\n message?: string;\n}\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 DEFAULT_FETCH_TIMEOUT\n );\n\n if (result.isErr()) return null;\n\n if (!result.value.ok) 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 payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches llms.txt instructions.\n *\n * Returns DiscoveryResult on success, DiscoverFailure with cause on failure.\n */\nexport async function discoverResources(\n surface: string,\n url: string\n): Promise<DiscoveryResult | DiscoverFailure> {\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 [specResult, instructions] = await Promise.all([\n fetchOpenApiSpec(origin),\n fetchLlmsTxt(surface, origin),\n ]);\n\n if (!specResult.ok) {\n log.debug(`No OpenAPI spec found for ${origin}: ${specResult.cause}`);\n return {\n found: false,\n cause: specResult.cause,\n ...('message' in specResult ? { message: specResult.message } : {}),\n };\n }\n\n const spec = specResult.spec;\n\n // Build the lightweight endpoint index\n const endpoints = await getOriginIndex(origin);\n\n if (!endpoints || endpoints.length === 0) {\n log.debug(`OpenAPI spec found for ${origin} but no endpoints extracted`);\n return { found: false, cause: 'not_found' };\n }\n\n log.info(`Found ${endpoints.length} endpoints for: ${origin}`);\n\n // Extract info from the OpenAPI spec (title, version, description)\n const rawInfo = spec.info as Record<string, unknown> | undefined;\n const info: OpenApiInfo | undefined =\n rawInfo && typeof rawInfo.title === 'string'\n ? {\n title: rawInfo.title,\n ...(typeof rawInfo.version === 'string'\n ? { version: rawInfo.version }\n : {}),\n ...(typeof rawInfo.description === 'string'\n ? { description: rawInfo.description }\n : {}),\n }\n : undefined;\n\n return {\n origin,\n source: 'openapi',\n ...(info ? { info } : {}),\n endpoints: endpoints.map(({ path, method, summary, price, protocols }) => ({\n path,\n method,\n summary,\n ...(price ? { price } : {}),\n ...(protocols ? { protocols } : {}),\n })),\n ...(instructions ? { instructions } : {}),\n };\n}\n"],"mappings":"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","names":["schema","estimatedPrice","summary","indexResult","protocols"]}