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.
- package/dist/cjs/run-server.cjs +66 -48
- package/dist/esm/{check-endpoint-BGFpMl2m.d.ts → check-endpoint-Df0YnKdr.d.ts} +8 -3
- package/dist/esm/{chunk-XVQ7S42P.js → chunk-3STID4ZW.js} +3 -3
- package/dist/esm/chunk-L3LTEB5B.js +7 -0
- package/dist/esm/{chunk-VU4O2YQU.js → chunk-NFGTXPUD.js} +54 -40
- package/dist/esm/chunk-NFGTXPUD.js.map +1 -0
- package/dist/esm/{chunk-2RSGMWFW.js → chunk-RN73GKUU.js} +3 -3
- package/dist/esm/{chunk-FJNT5GH6.js → chunk-YXENPVZ4.js} +2 -2
- package/dist/esm/{commands-JAPV6DQL.js → commands-D3PD4CNW.js} +15 -10
- package/dist/esm/{commands-JAPV6DQL.js.map → commands-D3PD4CNW.js.map} +1 -1
- package/dist/esm/index.js +20 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{install-DTZT2V7I.js → install-KD7XNKVI.js} +2 -2
- package/dist/esm/lib.d.ts +1 -1
- package/dist/esm/lib.js +2 -2
- package/dist/esm/lib.js.map +1 -1
- package/dist/esm/{server-I6GY7YDA.js → server-NX7XT2F6.js} +20 -14
- package/dist/esm/server-NX7XT2F6.js.map +1 -0
- package/dist/esm/shared/operations/index.d.ts +1 -1
- package/dist/esm/shared/operations/index.js +4 -4
- package/dist/esm/shared/operations/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/esm/chunk-VU4O2YQU.js.map +0 -1
- package/dist/esm/chunk-ZPI2XP7U.js +0 -7
- package/dist/esm/server-I6GY7YDA.js.map +0 -1
- /package/dist/esm/{chunk-XVQ7S42P.js.map → chunk-3STID4ZW.js.map} +0 -0
- /package/dist/esm/{chunk-ZPI2XP7U.js.map → chunk-L3LTEB5B.js.map} +0 -0
- /package/dist/esm/{chunk-2RSGMWFW.js.map → chunk-RN73GKUU.js.map} +0 -0
- /package/dist/esm/{chunk-FJNT5GH6.js.map → chunk-YXENPVZ4.js.map} +0 -0
- /package/dist/esm/{install-DTZT2V7I.js.map → install-KD7XNKVI.js.map} +0 -0
package/dist/cjs/run-server.cjs
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
|
110430
|
+
var OPENAPI_SPEC_PATHS = [
|
|
110431
|
+
"/openapi.json",
|
|
110432
|
+
"/.well-known/openapi.json"
|
|
110433
|
+
];
|
|
110431
110434
|
async function fetchOpenApiSpec(origin) {
|
|
110432
|
-
const
|
|
110433
|
-
|
|
110434
|
-
|
|
110435
|
-
|
|
110436
|
-
|
|
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
|
-
|
|
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
|
-
|
|
110467
|
-
|
|
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
|
|
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
|
|
110528
|
-
if (!
|
|
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
|
|
110562
|
-
if (
|
|
110563
|
-
const spec =
|
|
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
|
|
110605
|
-
if (!
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 [
|
|
111210
|
+
const [specResult, instructions] = await Promise.all([
|
|
111202
111211
|
fetchOpenApiSpec(origin),
|
|
111203
111212
|
fetchLlmsTxt(surface2, origin)
|
|
111204
111213
|
]);
|
|
111205
|
-
if (!
|
|
111206
|
-
log.debug(
|
|
111207
|
-
|
|
111208
|
-
|
|
111209
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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,
|
|
36
|
+
* Returns DiscoveryResult on success, DiscoverFailure with cause on failure.
|
|
32
37
|
*/
|
|
33
|
-
declare function discoverResources(surface: string, url: string): Promise<DiscoveryResult |
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
414
|
+
//# sourceMappingURL=chunk-3STID4ZW.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isMppEnabled
|
|
3
|
-
} from "./chunk-
|
|
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
|
|
93
|
+
var OPENAPI_SPEC_PATHS = [
|
|
94
|
+
"/openapi.json",
|
|
95
|
+
"/.well-known/openapi.json"
|
|
96
|
+
];
|
|
94
97
|
async function fetchOpenApiSpec(origin) {
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
|
|
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
|
|
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
|
|
191
|
-
if (!
|
|
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
|
|
225
|
-
if (
|
|
226
|
-
const spec =
|
|
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
|
|
268
|
-
if (!
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 [
|
|
606
|
+
const [specResult, instructions] = await Promise.all([
|
|
597
607
|
fetchOpenApiSpec(origin),
|
|
598
608
|
fetchLlmsTxt(surface, origin)
|
|
599
609
|
]);
|
|
600
|
-
if (!
|
|
601
|
-
log.debug(
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
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
|
|
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-
|
|
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"]}
|