@t2000/discovery
Advanced tools
+0
-2
@@ -387,3 +387,1 @@ 'use strict'; | ||
| exports.validateOpenApi = validateOpenApi; | ||
| //# sourceMappingURL=index.cjs.map | ||
| //# sourceMappingURL=index.cjs.map |
+0
-2
@@ -376,3 +376,1 @@ // src/constants.ts | ||
| export { KNOWN_SUI_CURRENCIES, SUI_USDC_TESTNET_TYPE, SUI_USDC_TYPE, VALIDATION_CODES, check, discover, extractEndpoints, fetchOpenApi, probe, validateOpenApi }; | ||
| //# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
+4
-1
| { | ||
| "name": "@t2000/discovery", | ||
| "version": "10.32.0", | ||
| "version": "10.32.1", | ||
| "engines": { | ||
| "node": ">=20" | ||
| }, | ||
| "description": "Probe and validate x402 seller endpoints on Sui — 402 accepts[] / WWW-Authenticate probing plus OpenAPI paid-endpoint extraction. The discovery half of the @t2000 serve stack.", | ||
@@ -5,0 +8,0 @@ "type": "module", |
| {"version":3,"sources":["../src/constants.ts","../src/discover.ts","../src/probe.ts","../src/check.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const SUI_USDC_TYPE =\n '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC';\n\nexport const SUI_USDC_TESTNET_TYPE =\n '0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC';\n\nexport const KNOWN_SUI_CURRENCIES = new Set([SUI_USDC_TYPE, SUI_USDC_TESTNET_TYPE]);\n\nexport const SUI_ADDRESS_REGEX = /^0x[a-fA-F0-9]{1,64}$/;\n\nexport const VALIDATION_CODES = {\n OPENAPI_FETCH_FAILED: 'OPENAPI_FETCH_FAILED',\n OPENAPI_PARSE_FAILED: 'OPENAPI_PARSE_FAILED',\n OPENAPI_VERSION_INVALID: 'OPENAPI_VERSION_INVALID',\n NO_PAID_ENDPOINTS: 'NO_PAID_ENDPOINTS',\n MISSING_402_RESPONSE: 'MISSING_402_RESPONSE',\n MISSING_REQUEST_BODY: 'MISSING_REQUEST_BODY',\n MISSING_PROTOCOLS: 'MISSING_PROTOCOLS',\n PROTOCOL_NOT_MPP: 'PROTOCOL_NOT_MPP',\n MISSING_PRICING: 'MISSING_PRICING',\n INVALID_PRICE_FORMAT: 'INVALID_PRICE_FORMAT',\n MISSING_GUIDANCE: 'MISSING_GUIDANCE',\n HIGH_ROUTE_COUNT: 'HIGH_ROUTE_COUNT',\n PROBE_FAILED: 'PROBE_FAILED',\n PROBE_NOT_402: 'PROBE_NOT_402',\n PROBE_INVALID_RECIPIENT: 'PROBE_INVALID_RECIPIENT',\n PROBE_UNKNOWN_CURRENCY: 'PROBE_UNKNOWN_CURRENCY',\n PROBE_REALM_MISMATCH: 'PROBE_REALM_MISMATCH',\n} as const;\n","import { VALIDATION_CODES } from './constants.js';\nimport type {\n OpenApiDocument,\n DiscoverResult,\n DiscoveredEndpoint,\n ValidationIssue,\n} from './types.js';\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\nexport async function fetchOpenApi(origin: string): Promise<OpenApiDocument> {\n const url = new URL('/openapi.json', origin).toString();\n const res = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new Error(`GET ${url} returned ${res.status}`);\n }\n return (await res.json()) as OpenApiDocument;\n}\n\nexport function extractEndpoints(doc: OpenApiDocument): DiscoveredEndpoint[] {\n const endpoints: DiscoveredEndpoint[] = [];\n\n for (const [path, pathItem] of Object.entries(doc.paths ?? {})) {\n for (const method of HTTP_METHODS) {\n const op = pathItem[method];\n if (!op || !op['x-payment-info']) continue;\n\n endpoints.push({\n path,\n method: method.toUpperCase(),\n operationId: op.operationId,\n summary: op.summary,\n paymentInfo: op['x-payment-info'],\n hasRequestBody: !!op.requestBody,\n has402Response: !!op.responses?.['402'],\n });\n }\n }\n\n return endpoints;\n}\n\nexport function validateOpenApi(\n doc: OpenApiDocument,\n endpoints: DiscoveredEndpoint[],\n _origin?: string,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!doc.openapi?.startsWith('3.1')) {\n issues.push({\n code: VALIDATION_CODES.OPENAPI_VERSION_INVALID,\n severity: 'error',\n message: `Expected OpenAPI 3.1.x, got \"${doc.openapi}\"`,\n });\n }\n\n if (endpoints.length === 0) {\n issues.push({\n code: VALIDATION_CODES.NO_PAID_ENDPOINTS,\n severity: 'error',\n message: 'No operations with x-payment-info found',\n });\n return issues;\n }\n\n if (endpoints.length > 80) {\n issues.push({\n code: VALIDATION_CODES.HIGH_ROUTE_COUNT,\n severity: 'warning',\n message: `High route count (${endpoints.length}) may exceed agent token budgets for zero-hop injection`,\n });\n }\n\n if (!doc.info?.['x-guidance'] && !doc['x-service-info']) {\n issues.push({\n code: VALIDATION_CODES.MISSING_GUIDANCE,\n severity: 'warning',\n message: 'No x-guidance in info or x-service-info at root — agents may lack context',\n });\n }\n\n for (const ep of endpoints) {\n const loc = `${ep.method} ${ep.path}`;\n\n if (!ep.has402Response) {\n issues.push({\n code: VALIDATION_CODES.MISSING_402_RESPONSE,\n severity: 'error',\n message: `Missing 402 response definition`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n if (['POST', 'PUT', 'PATCH'].includes(ep.method) && !ep.hasRequestBody) {\n issues.push({\n code: VALIDATION_CODES.MISSING_REQUEST_BODY,\n severity: 'warning',\n message: `${loc} — POST/PUT/PATCH without requestBody schema`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n const pi = ep.paymentInfo;\n\n if (!pi.protocols || pi.protocols.length === 0) {\n issues.push({\n code: VALIDATION_CODES.MISSING_PROTOCOLS,\n severity: 'warning',\n message: `${loc} — x-payment-info missing \"protocols\" field`,\n path: ep.path,\n method: ep.method,\n });\n } else if (!pi.protocols.includes('mpp')) {\n issues.push({\n code: VALIDATION_CODES.PROTOCOL_NOT_MPP,\n severity: 'error',\n message: `${loc} — protocols ${JSON.stringify(pi.protocols)} does not include \"mpp\"`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n const mode = pi.pricingMode;\n if (mode === 'fixed' && !pi.price) {\n issues.push({\n code: VALIDATION_CODES.MISSING_PRICING,\n severity: 'error',\n message: `${loc} — pricingMode \"fixed\" but no price specified`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n if (pi.price && !/^\\$?\\d+(\\.\\d+)?$/.test(pi.price)) {\n issues.push({\n code: VALIDATION_CODES.INVALID_PRICE_FORMAT,\n severity: 'warning',\n message: `${loc} — price \"${pi.price}\" may not be parseable`,\n path: ep.path,\n method: ep.method,\n });\n }\n }\n\n return issues;\n}\n\nexport async function discover(origin: string): Promise<DiscoverResult> {\n const normalizedOrigin = origin.startsWith('http') ? origin : `https://${origin}`;\n const specUrl = new URL('/openapi.json', normalizedOrigin).toString();\n\n try {\n const doc = await fetchOpenApi(normalizedOrigin);\n const endpoints = extractEndpoints(doc);\n const issues = validateOpenApi(doc, endpoints, normalizedOrigin);\n\n const hasErrors = issues.some(i => i.severity === 'error');\n\n return {\n ok: !hasErrors,\n origin: normalizedOrigin,\n specUrl,\n title: doc.info?.title ?? 'Unknown',\n version: doc.info?.version ?? '0.0.0',\n guidance: doc.info?.['x-guidance'] as string | undefined,\n endpoints,\n totalEndpoints: Object.keys(doc.paths ?? {}).length,\n paidEndpoints: endpoints.length,\n issues,\n };\n } catch (err) {\n return {\n ok: false,\n origin: normalizedOrigin,\n specUrl,\n title: 'Unknown',\n version: '0.0.0',\n endpoints: [],\n totalEndpoints: 0,\n paidEndpoints: 0,\n issues: [\n {\n code: VALIDATION_CODES.OPENAPI_FETCH_FAILED,\n severity: 'error',\n message: `Failed to fetch OpenAPI: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n };\n }\n}\n","import { SUI_ADDRESS_REGEX, KNOWN_SUI_CURRENCIES, VALIDATION_CODES } from './constants.js';\nimport type { ProbeResult, ValidationIssue } from './types.js';\n\ninterface MppChallenge {\n amount?: string;\n currency?: string;\n recipient?: string;\n realm?: string;\n network?: string;\n [key: string]: unknown;\n}\n\nfunction decodeRequest(encoded: string): Record<string, string> {\n try {\n const json = Buffer.from(encoded, 'base64').toString('utf-8');\n const parsed = JSON.parse(json);\n if (parsed && typeof parsed === 'object') return parsed;\n } catch {}\n return {};\n}\n\ninterface X402Accept {\n scheme?: unknown;\n network?: unknown;\n payTo?: unknown;\n asset?: unknown;\n maxAmountRequired?: unknown;\n resource?: unknown;\n}\n\n/** x402 `accepts[]` entry → the MPP challenge shape the rest of probe() reads.\n * `maxAmountRequired` is raw 6-decimal USDC units; the header dialect's\n * `amount` is a decimal string — convert (known-USDC only) so `amount` means\n * the same thing whichever dialect answered. */\nfunction challengeFromAccepts(accepts: unknown): MppChallenge | null {\n if (!Array.isArray(accepts)) return null;\n const sui = accepts.filter(\n (a: X402Accept) =>\n a &&\n typeof a === 'object' &&\n a.scheme === 'exact' &&\n typeof a.network === 'string' &&\n a.network.startsWith('sui'),\n ) as X402Accept[];\n const entry = sui.find(a => a.network === 'sui:mainnet') ?? sui[0];\n if (!entry || typeof entry.payTo !== 'string') return null;\n\n const challenge: MppChallenge = { recipient: entry.payTo };\n if (typeof entry.asset === 'string') challenge.currency = entry.asset;\n if (typeof entry.maxAmountRequired === 'string' && /^\\d+$/.test(entry.maxAmountRequired)) {\n challenge.amount =\n typeof entry.asset === 'string' && KNOWN_SUI_CURRENCIES.has(entry.asset)\n ? (Number(entry.maxAmountRequired) / 1_000_000).toString()\n : entry.maxAmountRequired;\n }\n if (typeof entry.resource === 'string') {\n try {\n challenge.realm = new URL(entry.resource).hostname;\n } catch {}\n }\n return challenge;\n}\n\nfunction extractChallenge(headers: Headers, body: unknown): MppChallenge | null {\n const wwwAuth = headers.get('www-authenticate');\n if (wwwAuth) {\n const params: Record<string, string> = {};\n for (const match of wwwAuth.matchAll(/(\\w+)=\"([^\"]*)\"/g)) {\n params[match[1]] = match[2];\n }\n\n // mppx encodes amount/currency/recipient inside a base64 `request` field\n if (params.request) {\n const decoded = decodeRequest(params.request);\n Object.assign(params, decoded);\n }\n\n if (params.recipient || params.currency) return params;\n }\n\n if (body && typeof body === 'object') {\n const b = body as Record<string, unknown>;\n if (b.recipient || b.currency || b.amount) return b as MppChallenge;\n\n if (b.paymentRequirements && typeof b.paymentRequirements === 'object') {\n return b.paymentRequirements as MppChallenge;\n }\n\n // x402 body-only sellers (@t2000/serve emits accepts[] and no\n // WWW-Authenticate) — the dialect this probe rejected until 0.2.2.\n const fromAccepts = challengeFromAccepts(b.accepts);\n if (fromAccepts) return fromAccepts;\n }\n\n return null;\n}\n\nexport async function probe(url: string, expectedOrigin?: string): Promise<ProbeResult> {\n const issues: ValidationIssue[] = [];\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(15_000),\n redirect: 'follow',\n });\n\n if (res.status !== 402) {\n return {\n ok: false,\n url,\n statusCode: res.status,\n hasSuiPayment: false,\n issues: [\n {\n code: VALIDATION_CODES.PROBE_NOT_402,\n severity: 'error',\n message: `Expected 402 Payment Required, got ${res.status}`,\n },\n ],\n };\n }\n\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n body = null;\n }\n\n const challenge = extractChallenge(res.headers, body);\n if (!challenge) {\n return {\n ok: false,\n url,\n statusCode: 402,\n hasSuiPayment: false,\n issues: [\n {\n code: VALIDATION_CODES.PROBE_FAILED,\n severity: 'error',\n message: 'Got 402 but could not extract payment challenge from headers or body',\n },\n ],\n };\n }\n\n if (challenge.recipient && !SUI_ADDRESS_REGEX.test(challenge.recipient)) {\n issues.push({\n code: VALIDATION_CODES.PROBE_INVALID_RECIPIENT,\n severity: 'error',\n message: `Recipient \"${challenge.recipient}\" is not a valid Sui address`,\n });\n }\n\n if (challenge.currency && !KNOWN_SUI_CURRENCIES.has(challenge.currency)) {\n issues.push({\n code: VALIDATION_CODES.PROBE_UNKNOWN_CURRENCY,\n severity: 'warning',\n message: `Currency \"${challenge.currency}\" is not a recognized Sui USDC type`,\n });\n }\n\n if (expectedOrigin && challenge.realm) {\n const expectedHost = new URL(expectedOrigin).hostname;\n if (challenge.realm !== expectedHost && !challenge.realm.endsWith(`.${expectedHost}`)) {\n issues.push({\n code: VALIDATION_CODES.PROBE_REALM_MISMATCH,\n severity: 'error',\n message: `Payment realm \"${challenge.realm}\" does not match origin host \"${expectedHost}\"`,\n });\n }\n }\n\n const hasErrors = issues.some(i => i.severity === 'error');\n\n return {\n ok: !hasErrors,\n url,\n statusCode: 402,\n hasSuiPayment: true,\n recipient: challenge.recipient,\n currency: challenge.currency,\n amount: challenge.amount,\n realm: challenge.realm,\n issues,\n };\n } catch (err) {\n return {\n ok: false,\n url,\n statusCode: 0,\n hasSuiPayment: false,\n issues: [\n {\n code: VALIDATION_CODES.PROBE_FAILED,\n severity: 'error',\n message: `Probe failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n };\n }\n}\n","import { discover } from './discover.js';\nimport { probe } from './probe.js';\nimport type { CheckResult } from './types.js';\n\nexport interface CheckOptions {\n probeEndpoint?: boolean;\n}\n\nexport async function check(\n origin: string,\n options: CheckOptions = {},\n): Promise<CheckResult> {\n const { probeEndpoint = true } = options;\n\n const normalizedOrigin = origin.startsWith('http') ? origin : `https://${origin}`;\n const discovery = await discover(normalizedOrigin);\n\n let probeResult = undefined;\n if (probeEndpoint && discovery.endpoints.length > 0) {\n const firstPost = discovery.endpoints.find(e => e.method === 'POST');\n const target = firstPost ?? discovery.endpoints[0];\n const probeUrl = new URL(target.path, normalizedOrigin).toString();\n probeResult = await probe(probeUrl, normalizedOrigin);\n }\n\n const allIssues = [\n ...discovery.issues,\n ...(probeResult?.issues ?? []),\n ];\n\n const errors = allIssues.filter(i => i.severity === 'error').length;\n const warnings = allIssues.filter(i => i.severity === 'warning').length;\n\n return {\n ok: errors === 0,\n origin: normalizedOrigin,\n discovery,\n probe: probeResult,\n summary: {\n totalIssues: allIssues.length,\n errors,\n warnings,\n },\n };\n}\n"]} |
| {"version":3,"sources":["../src/constants.ts","../src/discover.ts","../src/probe.ts","../src/check.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const SUI_USDC_TYPE =\n '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC';\n\nexport const SUI_USDC_TESTNET_TYPE =\n '0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC';\n\nexport const KNOWN_SUI_CURRENCIES = new Set([SUI_USDC_TYPE, SUI_USDC_TESTNET_TYPE]);\n\nexport const SUI_ADDRESS_REGEX = /^0x[a-fA-F0-9]{1,64}$/;\n\nexport const VALIDATION_CODES = {\n OPENAPI_FETCH_FAILED: 'OPENAPI_FETCH_FAILED',\n OPENAPI_PARSE_FAILED: 'OPENAPI_PARSE_FAILED',\n OPENAPI_VERSION_INVALID: 'OPENAPI_VERSION_INVALID',\n NO_PAID_ENDPOINTS: 'NO_PAID_ENDPOINTS',\n MISSING_402_RESPONSE: 'MISSING_402_RESPONSE',\n MISSING_REQUEST_BODY: 'MISSING_REQUEST_BODY',\n MISSING_PROTOCOLS: 'MISSING_PROTOCOLS',\n PROTOCOL_NOT_MPP: 'PROTOCOL_NOT_MPP',\n MISSING_PRICING: 'MISSING_PRICING',\n INVALID_PRICE_FORMAT: 'INVALID_PRICE_FORMAT',\n MISSING_GUIDANCE: 'MISSING_GUIDANCE',\n HIGH_ROUTE_COUNT: 'HIGH_ROUTE_COUNT',\n PROBE_FAILED: 'PROBE_FAILED',\n PROBE_NOT_402: 'PROBE_NOT_402',\n PROBE_INVALID_RECIPIENT: 'PROBE_INVALID_RECIPIENT',\n PROBE_UNKNOWN_CURRENCY: 'PROBE_UNKNOWN_CURRENCY',\n PROBE_REALM_MISMATCH: 'PROBE_REALM_MISMATCH',\n} as const;\n","import { VALIDATION_CODES } from './constants.js';\nimport type {\n OpenApiDocument,\n DiscoverResult,\n DiscoveredEndpoint,\n ValidationIssue,\n} from './types.js';\n\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\nexport async function fetchOpenApi(origin: string): Promise<OpenApiDocument> {\n const url = new URL('/openapi.json', origin).toString();\n const res = await fetch(url, {\n headers: { accept: 'application/json' },\n signal: AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n throw new Error(`GET ${url} returned ${res.status}`);\n }\n return (await res.json()) as OpenApiDocument;\n}\n\nexport function extractEndpoints(doc: OpenApiDocument): DiscoveredEndpoint[] {\n const endpoints: DiscoveredEndpoint[] = [];\n\n for (const [path, pathItem] of Object.entries(doc.paths ?? {})) {\n for (const method of HTTP_METHODS) {\n const op = pathItem[method];\n if (!op || !op['x-payment-info']) continue;\n\n endpoints.push({\n path,\n method: method.toUpperCase(),\n operationId: op.operationId,\n summary: op.summary,\n paymentInfo: op['x-payment-info'],\n hasRequestBody: !!op.requestBody,\n has402Response: !!op.responses?.['402'],\n });\n }\n }\n\n return endpoints;\n}\n\nexport function validateOpenApi(\n doc: OpenApiDocument,\n endpoints: DiscoveredEndpoint[],\n _origin?: string,\n): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n if (!doc.openapi?.startsWith('3.1')) {\n issues.push({\n code: VALIDATION_CODES.OPENAPI_VERSION_INVALID,\n severity: 'error',\n message: `Expected OpenAPI 3.1.x, got \"${doc.openapi}\"`,\n });\n }\n\n if (endpoints.length === 0) {\n issues.push({\n code: VALIDATION_CODES.NO_PAID_ENDPOINTS,\n severity: 'error',\n message: 'No operations with x-payment-info found',\n });\n return issues;\n }\n\n if (endpoints.length > 80) {\n issues.push({\n code: VALIDATION_CODES.HIGH_ROUTE_COUNT,\n severity: 'warning',\n message: `High route count (${endpoints.length}) may exceed agent token budgets for zero-hop injection`,\n });\n }\n\n if (!doc.info?.['x-guidance'] && !doc['x-service-info']) {\n issues.push({\n code: VALIDATION_CODES.MISSING_GUIDANCE,\n severity: 'warning',\n message: 'No x-guidance in info or x-service-info at root — agents may lack context',\n });\n }\n\n for (const ep of endpoints) {\n const loc = `${ep.method} ${ep.path}`;\n\n if (!ep.has402Response) {\n issues.push({\n code: VALIDATION_CODES.MISSING_402_RESPONSE,\n severity: 'error',\n message: `Missing 402 response definition`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n if (['POST', 'PUT', 'PATCH'].includes(ep.method) && !ep.hasRequestBody) {\n issues.push({\n code: VALIDATION_CODES.MISSING_REQUEST_BODY,\n severity: 'warning',\n message: `${loc} — POST/PUT/PATCH without requestBody schema`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n const pi = ep.paymentInfo;\n\n if (!pi.protocols || pi.protocols.length === 0) {\n issues.push({\n code: VALIDATION_CODES.MISSING_PROTOCOLS,\n severity: 'warning',\n message: `${loc} — x-payment-info missing \"protocols\" field`,\n path: ep.path,\n method: ep.method,\n });\n } else if (!pi.protocols.includes('mpp')) {\n issues.push({\n code: VALIDATION_CODES.PROTOCOL_NOT_MPP,\n severity: 'error',\n message: `${loc} — protocols ${JSON.stringify(pi.protocols)} does not include \"mpp\"`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n const mode = pi.pricingMode;\n if (mode === 'fixed' && !pi.price) {\n issues.push({\n code: VALIDATION_CODES.MISSING_PRICING,\n severity: 'error',\n message: `${loc} — pricingMode \"fixed\" but no price specified`,\n path: ep.path,\n method: ep.method,\n });\n }\n\n if (pi.price && !/^\\$?\\d+(\\.\\d+)?$/.test(pi.price)) {\n issues.push({\n code: VALIDATION_CODES.INVALID_PRICE_FORMAT,\n severity: 'warning',\n message: `${loc} — price \"${pi.price}\" may not be parseable`,\n path: ep.path,\n method: ep.method,\n });\n }\n }\n\n return issues;\n}\n\nexport async function discover(origin: string): Promise<DiscoverResult> {\n const normalizedOrigin = origin.startsWith('http') ? origin : `https://${origin}`;\n const specUrl = new URL('/openapi.json', normalizedOrigin).toString();\n\n try {\n const doc = await fetchOpenApi(normalizedOrigin);\n const endpoints = extractEndpoints(doc);\n const issues = validateOpenApi(doc, endpoints, normalizedOrigin);\n\n const hasErrors = issues.some(i => i.severity === 'error');\n\n return {\n ok: !hasErrors,\n origin: normalizedOrigin,\n specUrl,\n title: doc.info?.title ?? 'Unknown',\n version: doc.info?.version ?? '0.0.0',\n guidance: doc.info?.['x-guidance'] as string | undefined,\n endpoints,\n totalEndpoints: Object.keys(doc.paths ?? {}).length,\n paidEndpoints: endpoints.length,\n issues,\n };\n } catch (err) {\n return {\n ok: false,\n origin: normalizedOrigin,\n specUrl,\n title: 'Unknown',\n version: '0.0.0',\n endpoints: [],\n totalEndpoints: 0,\n paidEndpoints: 0,\n issues: [\n {\n code: VALIDATION_CODES.OPENAPI_FETCH_FAILED,\n severity: 'error',\n message: `Failed to fetch OpenAPI: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n };\n }\n}\n","import { SUI_ADDRESS_REGEX, KNOWN_SUI_CURRENCIES, VALIDATION_CODES } from './constants.js';\nimport type { ProbeResult, ValidationIssue } from './types.js';\n\ninterface MppChallenge {\n amount?: string;\n currency?: string;\n recipient?: string;\n realm?: string;\n network?: string;\n [key: string]: unknown;\n}\n\nfunction decodeRequest(encoded: string): Record<string, string> {\n try {\n const json = Buffer.from(encoded, 'base64').toString('utf-8');\n const parsed = JSON.parse(json);\n if (parsed && typeof parsed === 'object') return parsed;\n } catch {}\n return {};\n}\n\ninterface X402Accept {\n scheme?: unknown;\n network?: unknown;\n payTo?: unknown;\n asset?: unknown;\n maxAmountRequired?: unknown;\n resource?: unknown;\n}\n\n/** x402 `accepts[]` entry → the MPP challenge shape the rest of probe() reads.\n * `maxAmountRequired` is raw 6-decimal USDC units; the header dialect's\n * `amount` is a decimal string — convert (known-USDC only) so `amount` means\n * the same thing whichever dialect answered. */\nfunction challengeFromAccepts(accepts: unknown): MppChallenge | null {\n if (!Array.isArray(accepts)) return null;\n const sui = accepts.filter(\n (a: X402Accept) =>\n a &&\n typeof a === 'object' &&\n a.scheme === 'exact' &&\n typeof a.network === 'string' &&\n a.network.startsWith('sui'),\n ) as X402Accept[];\n const entry = sui.find(a => a.network === 'sui:mainnet') ?? sui[0];\n if (!entry || typeof entry.payTo !== 'string') return null;\n\n const challenge: MppChallenge = { recipient: entry.payTo };\n if (typeof entry.asset === 'string') challenge.currency = entry.asset;\n if (typeof entry.maxAmountRequired === 'string' && /^\\d+$/.test(entry.maxAmountRequired)) {\n challenge.amount =\n typeof entry.asset === 'string' && KNOWN_SUI_CURRENCIES.has(entry.asset)\n ? (Number(entry.maxAmountRequired) / 1_000_000).toString()\n : entry.maxAmountRequired;\n }\n if (typeof entry.resource === 'string') {\n try {\n challenge.realm = new URL(entry.resource).hostname;\n } catch {}\n }\n return challenge;\n}\n\nfunction extractChallenge(headers: Headers, body: unknown): MppChallenge | null {\n const wwwAuth = headers.get('www-authenticate');\n if (wwwAuth) {\n const params: Record<string, string> = {};\n for (const match of wwwAuth.matchAll(/(\\w+)=\"([^\"]*)\"/g)) {\n params[match[1]] = match[2];\n }\n\n // mppx encodes amount/currency/recipient inside a base64 `request` field\n if (params.request) {\n const decoded = decodeRequest(params.request);\n Object.assign(params, decoded);\n }\n\n if (params.recipient || params.currency) return params;\n }\n\n if (body && typeof body === 'object') {\n const b = body as Record<string, unknown>;\n if (b.recipient || b.currency || b.amount) return b as MppChallenge;\n\n if (b.paymentRequirements && typeof b.paymentRequirements === 'object') {\n return b.paymentRequirements as MppChallenge;\n }\n\n // x402 body-only sellers (@t2000/serve emits accepts[] and no\n // WWW-Authenticate) — the dialect this probe rejected until 0.2.2.\n const fromAccepts = challengeFromAccepts(b.accepts);\n if (fromAccepts) return fromAccepts;\n }\n\n return null;\n}\n\nexport async function probe(url: string, expectedOrigin?: string): Promise<ProbeResult> {\n const issues: ValidationIssue[] = [];\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({}),\n signal: AbortSignal.timeout(15_000),\n redirect: 'follow',\n });\n\n if (res.status !== 402) {\n return {\n ok: false,\n url,\n statusCode: res.status,\n hasSuiPayment: false,\n issues: [\n {\n code: VALIDATION_CODES.PROBE_NOT_402,\n severity: 'error',\n message: `Expected 402 Payment Required, got ${res.status}`,\n },\n ],\n };\n }\n\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n body = null;\n }\n\n const challenge = extractChallenge(res.headers, body);\n if (!challenge) {\n return {\n ok: false,\n url,\n statusCode: 402,\n hasSuiPayment: false,\n issues: [\n {\n code: VALIDATION_CODES.PROBE_FAILED,\n severity: 'error',\n message: 'Got 402 but could not extract payment challenge from headers or body',\n },\n ],\n };\n }\n\n if (challenge.recipient && !SUI_ADDRESS_REGEX.test(challenge.recipient)) {\n issues.push({\n code: VALIDATION_CODES.PROBE_INVALID_RECIPIENT,\n severity: 'error',\n message: `Recipient \"${challenge.recipient}\" is not a valid Sui address`,\n });\n }\n\n if (challenge.currency && !KNOWN_SUI_CURRENCIES.has(challenge.currency)) {\n issues.push({\n code: VALIDATION_CODES.PROBE_UNKNOWN_CURRENCY,\n severity: 'warning',\n message: `Currency \"${challenge.currency}\" is not a recognized Sui USDC type`,\n });\n }\n\n if (expectedOrigin && challenge.realm) {\n const expectedHost = new URL(expectedOrigin).hostname;\n if (challenge.realm !== expectedHost && !challenge.realm.endsWith(`.${expectedHost}`)) {\n issues.push({\n code: VALIDATION_CODES.PROBE_REALM_MISMATCH,\n severity: 'error',\n message: `Payment realm \"${challenge.realm}\" does not match origin host \"${expectedHost}\"`,\n });\n }\n }\n\n const hasErrors = issues.some(i => i.severity === 'error');\n\n return {\n ok: !hasErrors,\n url,\n statusCode: 402,\n hasSuiPayment: true,\n recipient: challenge.recipient,\n currency: challenge.currency,\n amount: challenge.amount,\n realm: challenge.realm,\n issues,\n };\n } catch (err) {\n return {\n ok: false,\n url,\n statusCode: 0,\n hasSuiPayment: false,\n issues: [\n {\n code: VALIDATION_CODES.PROBE_FAILED,\n severity: 'error',\n message: `Probe failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ],\n };\n }\n}\n","import { discover } from './discover.js';\nimport { probe } from './probe.js';\nimport type { CheckResult } from './types.js';\n\nexport interface CheckOptions {\n probeEndpoint?: boolean;\n}\n\nexport async function check(\n origin: string,\n options: CheckOptions = {},\n): Promise<CheckResult> {\n const { probeEndpoint = true } = options;\n\n const normalizedOrigin = origin.startsWith('http') ? origin : `https://${origin}`;\n const discovery = await discover(normalizedOrigin);\n\n let probeResult = undefined;\n if (probeEndpoint && discovery.endpoints.length > 0) {\n const firstPost = discovery.endpoints.find(e => e.method === 'POST');\n const target = firstPost ?? discovery.endpoints[0];\n const probeUrl = new URL(target.path, normalizedOrigin).toString();\n probeResult = await probe(probeUrl, normalizedOrigin);\n }\n\n const allIssues = [\n ...discovery.issues,\n ...(probeResult?.issues ?? []),\n ];\n\n const errors = allIssues.filter(i => i.severity === 'error').length;\n const warnings = allIssues.filter(i => i.severity === 'warning').length;\n\n return {\n ok: errors === 0,\n origin: normalizedOrigin,\n discovery,\n probe: probeResult,\n summary: {\n totalIssues: allIssues.length,\n errors,\n warnings,\n },\n };\n}\n"]} |
36296
-59.84%7
-22.22%875
-0.23%