@probemesh/sdk 0.1.0

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 (83) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +160 -0
  3. package/dist/chunk-257Y7LN2.js +827 -0
  4. package/dist/chunk-257Y7LN2.js.map +1 -0
  5. package/dist/chunk-2ASMVLG4.js +56 -0
  6. package/dist/chunk-2ASMVLG4.js.map +1 -0
  7. package/dist/chunk-2KWGHJYP.js +285 -0
  8. package/dist/chunk-2KWGHJYP.js.map +1 -0
  9. package/dist/chunk-3H7UGVI6.js +1117 -0
  10. package/dist/chunk-3H7UGVI6.js.map +1 -0
  11. package/dist/chunk-5Q3PDYIA.js +657 -0
  12. package/dist/chunk-5Q3PDYIA.js.map +1 -0
  13. package/dist/chunk-CXZOO3U4.js +550 -0
  14. package/dist/chunk-CXZOO3U4.js.map +1 -0
  15. package/dist/chunk-FRFBK4SY.js +270 -0
  16. package/dist/chunk-FRFBK4SY.js.map +1 -0
  17. package/dist/chunk-HJK52QJF.js +994 -0
  18. package/dist/chunk-HJK52QJF.js.map +1 -0
  19. package/dist/chunk-HNBDX7IU.js +705 -0
  20. package/dist/chunk-HNBDX7IU.js.map +1 -0
  21. package/dist/chunk-NYTV263W.js +116 -0
  22. package/dist/chunk-NYTV263W.js.map +1 -0
  23. package/dist/chunk-PXG54XOG.js +595 -0
  24. package/dist/chunk-PXG54XOG.js.map +1 -0
  25. package/dist/chunk-TDOBAMYM.js +607 -0
  26. package/dist/chunk-TDOBAMYM.js.map +1 -0
  27. package/dist/chunk-TV42EZSI.js +2157 -0
  28. package/dist/chunk-TV42EZSI.js.map +1 -0
  29. package/dist/chunk-UU2ZG7P7.js +408 -0
  30. package/dist/chunk-UU2ZG7P7.js.map +1 -0
  31. package/dist/chunk-WKN7QOCA.js +977 -0
  32. package/dist/chunk-WKN7QOCA.js.map +1 -0
  33. package/dist/chunk-ZJOLPBJJ.js +1091 -0
  34. package/dist/chunk-ZJOLPBJJ.js.map +1 -0
  35. package/dist/cli/audit-trail-export.cjs +1193 -0
  36. package/dist/cli/audit-trail-export.cjs.map +1 -0
  37. package/dist/cli/audit-trail-export.d.cts +1 -0
  38. package/dist/cli/audit-trail-export.d.ts +1 -0
  39. package/dist/cli/audit-trail-export.js +24 -0
  40. package/dist/cli/audit-trail-export.js.map +1 -0
  41. package/dist/cli/catalog-check.cjs +2687 -0
  42. package/dist/cli/catalog-check.cjs.map +1 -0
  43. package/dist/cli/catalog-check.d.cts +1 -0
  44. package/dist/cli/catalog-check.d.ts +1 -0
  45. package/dist/cli/catalog-check.js +26 -0
  46. package/dist/cli/catalog-check.js.map +1 -0
  47. package/dist/cli/probemesh-init.cjs +1049 -0
  48. package/dist/cli/probemesh-init.cjs.map +1 -0
  49. package/dist/cli/probemesh-init.d.cts +1 -0
  50. package/dist/cli/probemesh-init.d.ts +1 -0
  51. package/dist/cli/probemesh-init.js +22 -0
  52. package/dist/cli/probemesh-init.js.map +1 -0
  53. package/dist/cli/provider-conformance.cjs +6180 -0
  54. package/dist/cli/provider-conformance.cjs.map +1 -0
  55. package/dist/cli/provider-conformance.d.cts +1 -0
  56. package/dist/cli/provider-conformance.d.ts +1 -0
  57. package/dist/cli/provider-conformance.js +29 -0
  58. package/dist/cli/provider-conformance.js.map +1 -0
  59. package/dist/cli/provider-dossier-check.cjs +2978 -0
  60. package/dist/cli/provider-dossier-check.cjs.map +1 -0
  61. package/dist/cli/provider-dossier-check.d.cts +1 -0
  62. package/dist/cli/provider-dossier-check.d.ts +1 -0
  63. package/dist/cli/provider-dossier-check.js +27 -0
  64. package/dist/cli/provider-dossier-check.js.map +1 -0
  65. package/dist/cli/provider-dossier.cjs +1753 -0
  66. package/dist/cli/provider-dossier.cjs.map +1 -0
  67. package/dist/cli/provider-dossier.d.cts +1 -0
  68. package/dist/cli/provider-dossier.d.ts +1 -0
  69. package/dist/cli/provider-dossier.js +26 -0
  70. package/dist/cli/provider-dossier.js.map +1 -0
  71. package/dist/cli/x402-accept.cjs +6009 -0
  72. package/dist/cli/x402-accept.cjs.map +1 -0
  73. package/dist/cli/x402-accept.d.cts +1 -0
  74. package/dist/cli/x402-accept.d.ts +1 -0
  75. package/dist/cli/x402-accept.js +28 -0
  76. package/dist/cli/x402-accept.js.map +1 -0
  77. package/dist/index.cjs +13671 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.cts +2026 -0
  80. package/dist/index.d.ts +2026 -0
  81. package/dist/index.js +2560 -0
  82. package/dist/index.js.map +1 -0
  83. package/package.json +111 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/providerConformanceCli.ts","../../src/cli/configLoader.ts","../../src/providerConformanceArtifact.ts","../../src/errors.ts","../../src/paymentOptions.ts","../../src/providerKit/manifest.ts","../../src/protocols/x402Redaction.ts","../../src/hostedRouter.ts","../../src/callAuditArtifact.ts","../../src/client.ts","../../src/providerCatalog.ts","../../src/providerCatalogPolicyBundle.ts","../../src/providerCatalogPolicy.ts","../../src/schemaValidation.ts","../../src/providerConformance.ts","../../src/cli/provider-conformance.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProviderConformanceArtifact,\n formatProviderConformanceArtifact,\n} from \"../providerConformanceArtifact\";\nimport type {\n ProviderConformanceArtifact,\n ProviderConformanceArtifactOptions,\n} from \"../providerConformanceArtifact\";\nimport {\n createProviderConformanceReport,\n formatProviderConformanceReport,\n runProviderConformance,\n} from \"../providerConformance\";\nimport type {\n ProviderConformanceOptions,\n ProviderConformanceReport,\n ProviderConformanceReportFormat,\n ProviderConformanceReportOptions,\n ProviderConformanceResult,\n} from \"../providerConformance\";\n\nexport interface ProviderConformanceCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderConformanceCliOutputs {\n json?: string;\n markdown?: string;\n artifact?: string;\n}\n\nexport interface ProviderConformanceCliArtifact\n extends Omit<ProviderConformanceArtifactOptions, \"manifest\" | \"report\"> {\n format?: \"json\" | \"markdown\";\n}\n\nexport interface ProviderConformanceCliConfig {\n conformance: ProviderConformanceOptions;\n report?: ProviderConformanceReportOptions & {\n format?: ProviderConformanceReportFormat;\n };\n artifact?: ProviderConformanceCliArtifact;\n outputs?: ProviderConformanceCliOutputs;\n}\n\nexport type ProviderConformanceCliConfigExport =\n | ProviderConformanceCliConfig\n | ProviderConformanceCliSkip;\n\nexport type ProviderConformanceCliConfigFactory = (\n context: ProviderConformanceCliConfigContext,\n) =>\n | ProviderConformanceCliConfigExport\n | Promise<ProviderConformanceCliConfigExport>;\n\nexport interface ProviderConformanceCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderConformanceCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderConformanceCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderConformanceCliSkip;\n result?: ProviderConformanceResult;\n report?: ProviderConformanceReport;\n artifact?: ProviderConformanceArtifact;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderConformanceCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderConformanceReportFormat;\n outJson?: string;\n outMarkdown?: string;\n outArtifact?: string;\n title?: string;\n artifactId?: string;\n generatedAt?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-conformance --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-artifact <path>] [--title <text>] [--artifact-id <text>] [--generated-at <iso>]\";\n\nexport async function runProviderConformanceCli(\n options: ProviderConformanceCliOptions = {},\n): Promise<ProviderConformanceCliResult> {\n const argv = options.argv ?? [];\n const cwd = options.cwd ?? process.cwd();\n\n try {\n const parsedArgs = parseCliArgs(argv);\n\n if (parsedArgs.help) {\n return {\n exitCode: 0,\n skipped: true,\n stdout: `${USAGE}\\n`,\n };\n }\n\n if (!parsedArgs.configPath) {\n return cliFailure(\"--config <path> is required.\");\n }\n\n const configExport = await loadCliConfig(parsedArgs.configPath, {\n argv,\n cwd,\n });\n\n if (isCliSkip(configExport)) {\n return {\n exitCode: 0,\n skipped: true,\n skip: configExport,\n stdout: `provider conformance skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const result = await runProviderConformance(configExport.conformance);\n const report = createProviderConformanceReport(result, {\n ...(configExport.report ?? {}),\n title: parsedArgs.title ?? configExport.report?.title,\n });\n const outputs = {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n artifact: parsedArgs.outArtifact ?? configExport.outputs?.artifact,\n };\n const artifact = createOptionalArtifact({\n config: configExport,\n report,\n artifactId: parsedArgs.artifactId,\n generatedAt: parsedArgs.generatedAt,\n requestedArtifactOutput: outputs.artifact,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.report?.format ?? \"markdown\";\n const stdout = formatProviderConformanceReport(report, {\n format: selectedFormat,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n report,\n artifact,\n outputs,\n });\n\n return {\n exitCode: result.status === \"passed\" ? 0 : 1,\n skipped: false,\n result,\n report,\n artifact,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error\n ? error.message\n : \"Unknown provider conformance CLI failure.\",\n );\n }\n}\n\nfunction parseCliArgs(argv: string[]): ParsedCliArgs {\n const parsedArgs: ParsedCliArgs = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n if (arg === \"--\") {\n continue;\n }\n\n if (arg === \"--help\" || arg === \"-h\") {\n parsedArgs.help = true;\n continue;\n }\n\n if (arg === \"--config\") {\n parsedArgs.configPath = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--format\") {\n const format = requireValue(argv, index, arg);\n\n if (format !== \"markdown\" && format !== \"json\") {\n throw new Error(\"--format must be markdown or json.\");\n }\n\n parsedArgs.format = format;\n index += 1;\n continue;\n }\n\n if (arg === \"--out-json\") {\n parsedArgs.outJson = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--out-md\") {\n parsedArgs.outMarkdown = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--out-artifact\") {\n parsedArgs.outArtifact = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--title\") {\n parsedArgs.title = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--artifact-id\") {\n parsedArgs.artifactId = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--generated-at\") {\n parsedArgs.generatedAt = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n throw new Error(`Unknown argument \"${arg}\".`);\n }\n\n return parsedArgs;\n}\n\nfunction requireValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n\n return value;\n}\n\nasync function loadCliConfig(\n configPath: string,\n context: ProviderConformanceCliConfigContext,\n): Promise<ProviderConformanceCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderConformanceCliConfigFactory)(context);\n }\n\n return configExport as ProviderConformanceCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderConformanceCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderConformanceCliSkip>).skip === true &&\n typeof (value as Partial<ProviderConformanceCliSkip>).reason === \"string\"\n );\n}\n\nfunction assertCliConfig(\n config: unknown,\n): asserts config is ProviderConformanceCliConfig {\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new Error(\"Provider conformance CLI config must be an object.\");\n }\n\n const candidate = config as Partial<ProviderConformanceCliConfig>;\n\n if (\n !candidate.conformance ||\n typeof candidate.conformance !== \"object\" ||\n Array.isArray(candidate.conformance)\n ) {\n throw new Error(\"Provider conformance CLI config requires conformance options.\");\n }\n\n if (candidate.report !== undefined && !isRecord(candidate.report)) {\n throw new Error(\"Provider conformance CLI report config must be an object.\");\n }\n\n if (candidate.artifact !== undefined && !isRecord(candidate.artifact)) {\n throw new Error(\"Provider conformance CLI artifact config must be an object.\");\n }\n\n if (candidate.outputs !== undefined) {\n assertOutputs(candidate.outputs);\n }\n}\n\nfunction assertOutputs(outputs: unknown) {\n if (!isRecord(outputs)) {\n throw new Error(\"Provider conformance CLI outputs must be an object.\");\n }\n\n for (const [key, value] of Object.entries(outputs)) {\n if (\n ![\"json\", \"markdown\", \"artifact\"].includes(key) ||\n (value !== undefined && typeof value !== \"string\")\n ) {\n throw new Error(\n \"Provider conformance CLI outputs may only include json, markdown, and artifact string paths.\",\n );\n }\n }\n}\n\nfunction createOptionalArtifact(options: {\n config: ProviderConformanceCliConfig;\n report: ProviderConformanceReport;\n artifactId?: string;\n generatedAt?: string;\n requestedArtifactOutput?: string;\n}) {\n if (!options.config.artifact && !options.requestedArtifactOutput) {\n return undefined;\n }\n\n return createProviderConformanceArtifact({\n manifest: options.config.conformance.manifest,\n report: options.report,\n artifactId: options.artifactId ?? options.config.artifact?.artifactId,\n generatedAt: options.generatedAt ?? options.config.artifact?.generatedAt,\n forbiddenOutputValues:\n options.config.artifact?.forbiddenOutputValues ??\n options.config.report?.forbiddenOutputValues ??\n options.config.conformance.forbiddenOutputValues,\n });\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n report: ProviderConformanceReport;\n artifact?: ProviderConformanceArtifact;\n outputs: ProviderConformanceCliOutputs;\n}) {\n const artifactPaths: ProviderConformanceCliOutputs = {};\n\n if (options.outputs.json) {\n const path = resolve(options.cwd, options.outputs.json);\n await writeTextFile(\n path,\n formatProviderConformanceReport(options.report, {\n format: \"json\",\n }),\n );\n artifactPaths.json = path;\n }\n\n if (options.outputs.markdown) {\n const path = resolve(options.cwd, options.outputs.markdown);\n await writeTextFile(\n path,\n formatProviderConformanceReport(options.report, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = path;\n }\n\n if (options.outputs.artifact) {\n if (!options.artifact) {\n throw new Error(\"Provider conformance artifact output requested but no artifact was created.\");\n }\n\n const path = resolve(options.cwd, options.outputs.artifact);\n await writeTextFile(\n path,\n formatProviderConformanceArtifact(options.artifact, {\n format: \"json\",\n }),\n );\n artifactPaths.artifact = path;\n }\n\n return artifactPaths;\n}\n\nasync function writeTextFile(path: string, body: string) {\n await mkdir(dirname(path), {\n recursive: true,\n });\n await writeFile(path, body);\n}\n\nfunction cliFailure(message: string): ProviderConformanceCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `Provider conformance CLI failed: ${message}\\n`,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport async function loadCliConfigDefault(\n configPath: string,\n cwd: string,\n): Promise<unknown> {\n const resolvedPath = resolve(cwd, configPath);\n const moduleUrl = pathToFileURL(resolvedPath);\n\n try {\n const loadedModule = await import(/* @vite-ignore */ moduleUrl.href);\n return loadedModule.default;\n } catch (error) {\n return loadSelfContainedConfigFallback(resolvedPath, error);\n }\n}\n\nasync function loadSelfContainedConfigFallback(\n resolvedPath: string,\n importError: unknown,\n): Promise<unknown> {\n const source = await readFile(resolvedPath, \"utf8\");\n\n if (/\\bimport\\s/.test(source) || !/\\bexport\\s+default\\b/.test(source)) {\n throw importError;\n }\n\n const transformedSource = source.replace(\n /\\bexport\\s+default\\b/,\n \"const __probemeshDefault =\",\n );\n\n try {\n const factory = new Function(\n `${transformedSource}\\nreturn __probemeshDefault;`,\n ) as () => unknown;\n return factory();\n } catch {\n throw importError;\n }\n}\n","import { createHash } from \"node:crypto\";\n\nimport { ProbeMeshError } from \"./errors\";\nimport { validateProviderManifest } from \"./providerKit/manifest\";\nimport type {\n JsonSchemaLike,\n ProviderLimits,\n ProviderManifest,\n ProviderReceiptSupport,\n} from \"./providerKit/types\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport type {\n Cost,\n ProbeMeshCallSafety,\n ProbeMeshRetrySafety,\n ProbeMeshTimelineEventType,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\nimport type {\n ProviderConformanceCheck,\n ProviderConformanceReport,\n ProviderConformanceStatus,\n ProviderConformanceSummary,\n} from \"./providerConformance\";\n\nexport const PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION =\n \"probemesh.provider-conformance.v1\" as const;\n\nexport type ProviderConformanceArtifactStatus = \"verified\" | \"failed\";\n\nexport type ProviderConformanceArtifactFormat = \"json\" | \"markdown\";\n\nexport interface ProviderConformanceArtifactOptions {\n manifest: ProviderManifest;\n report: ProviderConformanceReport;\n generatedAt?: string;\n artifactId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderConformanceArtifactManifestSummary {\n id: string;\n displayName: string;\n capabilities: string[];\n protocolMode: string;\n pricing?: Cost | Record<string, Cost>;\n receipts: ProviderReceiptSupport;\n limits?: ProviderLimits;\n paymentOptions?: ProviderPaymentOption[];\n schemas: {\n inputDeclared: boolean;\n outputDeclared: boolean;\n };\n}\n\nexport interface ProviderConformanceArtifactReceiptSummary {\n total: number;\n types: ReceiptType[];\n providers: string[];\n byType: Partial<Record<ReceiptType, number>>;\n hasPaymentProof: boolean;\n hasSettlementConfirmation: boolean;\n hasProviderDelivery: boolean;\n}\n\nexport interface ProviderConformanceArtifactHashes {\n manifest: string;\n report: string;\n checks: string;\n artifact: string;\n}\n\nexport interface ProviderConformanceArtifact {\n schemaVersion: typeof PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION;\n artifactId: string;\n generatedAt: string;\n status: ProviderConformanceArtifactStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProviderConformanceArtifactHashes;\n provider: ProviderConformanceArtifactManifestSummary;\n conformance: {\n title: string;\n status: ProviderConformanceStatus;\n summary: ProviderConformanceSummary;\n checks: ProviderConformanceCheck[];\n failedChecks: string[];\n receipts: ProviderConformanceArtifactReceiptSummary;\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProviderConformanceSummary[\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n errorCode?: string;\n };\n}\n\nexport interface ProviderConformanceArtifactValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderConformanceArtifactValidationResult {\n valid: boolean;\n errors: ProviderConformanceArtifactValidationError[];\n}\n\nexport function createProviderConformanceArtifact(\n options: ProviderConformanceArtifactOptions,\n): ProviderConformanceArtifact {\n assertProviderConformanceArtifactOptions(options);\n\n const status: ProviderConformanceArtifactStatus =\n options.report.status === \"passed\" &&\n options.report.checks.every((check) => check.status === \"passed\")\n ? \"verified\"\n : \"failed\";\n const provider = summarizeManifest(options.manifest);\n const conformance = {\n title: options.report.title,\n status: options.report.status,\n summary: cloneSerializable(options.report.summary),\n checks: cloneSerializable(options.report.checks),\n failedChecks: [...options.report.summary.failedCheckNames],\n receipts: cloneSerializable(options.report.receipts),\n safety: cloneSerializable(options.report.safety),\n retrySafety: cloneSerializable(options.report.retrySafety),\n route: cloneSerializable(options.report.route),\n timelineEventTypes: [...options.report.timelineEventTypes],\n telemetryEventTypes: [...options.report.telemetryEventTypes],\n errorCode: options.report.summary.errorCode,\n };\n const baseContent = sanitizeConformanceArtifactOutput(\n {\n schemaVersion: PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION,\n artifactId:\n options.artifactId ??\n `${options.manifest.id}:${options.report.summary.callId ?? \"unknown\"}:conformance`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status,\n hashAlgorithm: \"sha256\" as const,\n provider,\n conformance,\n },\n options.forbiddenOutputValues ?? [],\n );\n const hashesWithoutArtifact: ProviderConformanceArtifactHashes = {\n manifest: hashStableJson(baseContent.provider),\n report: hashStableJson(baseContent.conformance.summary),\n checks: hashStableJson(baseContent.conformance.checks),\n artifact: \"\",\n };\n const artifact: ProviderConformanceArtifact = {\n ...baseContent,\n hashes: {\n ...hashesWithoutArtifact,\n artifact: hashArtifactContent({\n ...baseContent,\n hashes: hashesWithoutArtifact,\n }),\n },\n };\n\n assertProviderConformanceArtifact(artifact);\n\n return artifact;\n}\n\nexport function validateProviderConformanceArtifact(\n artifact: unknown,\n): ProviderConformanceArtifactValidationResult {\n const errors: ProviderConformanceArtifactValidationError[] = [];\n\n if (!isRecord(artifact)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider conformance artifact must be an object.\",\n },\n ],\n };\n }\n\n if (artifact.schemaVersion !== PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(artifact.artifactId, \"artifactId\", errors);\n validateIsoTimestamp(artifact.generatedAt, \"generatedAt\", errors);\n\n if (artifact.status !== \"verified\" && artifact.status !== \"failed\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"verified\" or \"failed\".',\n });\n }\n\n if (artifact.hashAlgorithm !== \"sha256\") {\n errors.push({\n path: \"hashAlgorithm\",\n message: 'hashAlgorithm must be \"sha256\".',\n });\n }\n\n validateHashes(artifact.hashes, errors);\n validateManifestSummary(artifact.provider, errors);\n validateConformanceSummary(artifact.conformance, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderConformanceArtifact(\n artifact: unknown,\n): asserts artifact is ProviderConformanceArtifact {\n const result = validateProviderConformanceArtifact(artifact);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider conformance artifact: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProviderConformanceArtifact(\n artifact: ProviderConformanceArtifact,\n options: {\n format?: ProviderConformanceArtifactFormat;\n } = {},\n) {\n assertProviderConformanceArtifact(artifact);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatConformanceArtifactMarkdown(artifact);\n }\n\n return JSON.stringify(artifact, null, 2);\n}\n\nfunction assertProviderConformanceArtifactOptions(\n options: ProviderConformanceArtifactOptions,\n): asserts options is ProviderConformanceArtifactOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact options must be an object.\",\n });\n }\n\n const manifestValidation = validateProviderManifest(options.manifest);\n\n if (!manifestValidation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider conformance artifact manifest: ${formatValidationErrors(\n manifestValidation.errors,\n )}`,\n });\n }\n\n if (\n !options.report ||\n typeof options.report !== \"object\" ||\n Array.isArray(options.report)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact requires a conformance report.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact generatedAt must be an ISO timestamp.\",\n });\n }\n\n if (\n options.artifactId !== undefined &&\n (typeof options.artifactId !== \"string\" || options.artifactId.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact artifactId must be a non-empty string.\",\n });\n }\n\n if (\n options.forbiddenOutputValues !== undefined &&\n (!Array.isArray(options.forbiddenOutputValues) ||\n options.forbiddenOutputValues.some((value) => typeof value !== \"string\"))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Provider conformance artifact forbiddenOutputValues must be an array of strings.\",\n });\n }\n}\n\nfunction summarizeManifest(\n manifest: ProviderManifest,\n): ProviderConformanceArtifactManifestSummary {\n return {\n id: manifest.id,\n displayName: manifest.displayName,\n capabilities: [...manifest.capabilities],\n protocolMode: manifest.protocolMode,\n pricing: cloneSerializable(manifest.pricing),\n receipts: cloneSerializable(manifest.receipts),\n limits: cloneSerializable(manifest.limits),\n paymentOptions: cloneSerializable(manifest.paymentOptions),\n schemas: {\n inputDeclared: hasSchemaDeclaration(manifest.inputSchema),\n outputDeclared: hasSchemaDeclaration(manifest.outputSchema),\n },\n };\n}\n\nfunction hasSchemaDeclaration(\n declaration: JsonSchemaLike | Record<string, JsonSchemaLike>,\n) {\n return Object.keys(declaration).length > 0;\n}\n\nfunction formatConformanceArtifactMarkdown(\n artifact: ProviderConformanceArtifact,\n) {\n const lines = [\n `# ${artifact.provider.displayName} Conformance Artifact`,\n \"\",\n `Status: ${artifact.status}`,\n `Schema: ${artifact.schemaVersion}`,\n `Artifact ID: ${artifact.artifactId}`,\n `Generated: ${artifact.generatedAt}`,\n `Provider: ${artifact.provider.id}`,\n `Capabilities: ${formatInlineList(artifact.provider.capabilities)}`,\n \"\",\n \"## Conformance\",\n `- Result: ${artifact.conformance.status}`,\n `- Failed checks: ${formatInlineList(artifact.conformance.failedChecks)}`,\n `- Receipts: ${formatInlineList(artifact.conformance.receipts.types)}`,\n `- Timeline: ${formatInlineList(artifact.conformance.timelineEventTypes)}`,\n \"\",\n \"## Safety\",\n `- Payment: ${artifact.conformance.safety?.paymentStatus ?? \"unknown\"}`,\n `- Settlement: ${\n artifact.conformance.safety?.settlementStatus ?? \"unknown\"\n }`,\n `- Delivery: ${artifact.conformance.safety?.deliveryStatus ?? \"unknown\"}`,\n `- Money may have moved: ${String(\n artifact.conformance.safety?.moneyMayHaveMoved ?? false,\n )}`,\n \"\",\n \"## Hashes\",\n `- Manifest: ${artifact.hashes.manifest}`,\n `- Report: ${artifact.hashes.report}`,\n `- Checks: ${artifact.hashes.checks}`,\n `- Artifact: ${artifact.hashes.artifact}`,\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction validateManifestSummary(\n provider: unknown,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (!isRecord(provider)) {\n errors.push({\n path: \"provider\",\n message: \"provider must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(provider.id, \"provider.id\", errors);\n validateNonEmptyString(provider.displayName, \"provider.displayName\", errors);\n\n if (\n !Array.isArray(provider.capabilities) ||\n provider.capabilities.some((capability) => typeof capability !== \"string\")\n ) {\n errors.push({\n path: \"provider.capabilities\",\n message: \"provider.capabilities must be an array of strings.\",\n });\n }\n\n validateNonEmptyString(provider.protocolMode, \"provider.protocolMode\", errors);\n\n if (!isRecord(provider.receipts)) {\n errors.push({\n path: \"provider.receipts\",\n message: \"provider.receipts must be an object.\",\n });\n }\n\n if (\n !isRecord(provider.schemas) ||\n typeof provider.schemas.inputDeclared !== \"boolean\" ||\n typeof provider.schemas.outputDeclared !== \"boolean\"\n ) {\n errors.push({\n path: \"provider.schemas\",\n message: \"provider.schemas must include inputDeclared and outputDeclared booleans.\",\n });\n }\n}\n\nfunction validateConformanceSummary(\n conformance: unknown,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (!isRecord(conformance)) {\n errors.push({\n path: \"conformance\",\n message: \"conformance must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(conformance.title, \"conformance.title\", errors);\n\n if (conformance.status !== \"passed\" && conformance.status !== \"failed\") {\n errors.push({\n path: \"conformance.status\",\n message: 'conformance.status must be \"passed\" or \"failed\".',\n });\n }\n\n if (!isRecord(conformance.summary)) {\n errors.push({\n path: \"conformance.summary\",\n message: \"conformance.summary must be an object.\",\n });\n }\n\n if (\n !Array.isArray(conformance.checks) ||\n conformance.checks.some((check) => !isRecord(check))\n ) {\n errors.push({\n path: \"conformance.checks\",\n message: \"conformance.checks must be an array of check objects.\",\n });\n }\n\n if (\n !Array.isArray(conformance.failedChecks) ||\n conformance.failedChecks.some((checkName) => typeof checkName !== \"string\")\n ) {\n errors.push({\n path: \"conformance.failedChecks\",\n message: \"conformance.failedChecks must be an array of strings.\",\n });\n }\n\n if (!isRecord(conformance.receipts)) {\n errors.push({\n path: \"conformance.receipts\",\n message: \"conformance.receipts must be an object.\",\n });\n }\n\n if (\n !Array.isArray(conformance.timelineEventTypes) ||\n conformance.timelineEventTypes.some((eventType) => typeof eventType !== \"string\")\n ) {\n errors.push({\n path: \"conformance.timelineEventTypes\",\n message: \"conformance.timelineEventTypes must be an array of strings.\",\n });\n }\n\n if (\n !Array.isArray(conformance.telemetryEventTypes) ||\n conformance.telemetryEventTypes.some((eventType) => typeof eventType !== \"string\")\n ) {\n errors.push({\n path: \"conformance.telemetryEventTypes\",\n message: \"conformance.telemetryEventTypes must be an array of strings.\",\n });\n }\n}\n\nfunction validateHashes(\n hashes: unknown,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (!isRecord(hashes)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const field of [\"manifest\", \"report\", \"checks\", \"artifact\"]) {\n const value = hashes[field];\n\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n errors.push({\n path: `hashes.${field}`,\n message: `${field} hash must be a sha256 hex string.`,\n });\n }\n }\n}\n\nfunction sanitizeConformanceArtifactOutput<T>(\n value: T,\n forbiddenOutputValues: string[],\n): T {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(value, forbiddenValues, new WeakSet<object>()),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n seen: WeakSet<object>,\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n replaceForbiddenValues(entry, forbiddenValues, seen),\n );\n\n seen.delete(value);\n return entries;\n }\n\n const entries = Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues, seen),\n ]),\n );\n\n seen.delete(value);\n return entries;\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction hashArtifactContent(\n artifact: Omit<ProviderConformanceArtifact, \"hashes\"> & {\n hashes: ProviderConformanceArtifactHashes;\n },\n) {\n return hashStableJson(artifact);\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n\n return `{${entries\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`)\n .join(\",\")}}`;\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction formatValidationErrors(\n errors: Array<{\n path: string;\n message: string;\n }>,\n) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction formatInlineList(values: readonly string[] | undefined) {\n return values && values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type {\n CallStatus,\n ProbeMeshAttemptMetadata,\n ProbeMeshCallTimeline,\n ProbeMeshCallSafety,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteMetadata,\n ReceiptRef,\n} from \"./types\";\n\nexport interface ProbeMeshErrorOptions {\n code: ProbeMeshErrorCode;\n message: string;\n capability?: string;\n provider?: string;\n callId?: string;\n receiptRefs?: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n timeline?: ProbeMeshCallTimeline;\n retrySafety?: ProbeMeshRetrySafety;\n attempt?: ProbeMeshAttemptMetadata;\n route?: ProbeMeshRouteMetadata;\n cause?: unknown;\n}\n\nexport class ProbeMeshError extends Error {\n readonly code: ProbeMeshErrorCode;\n readonly status: CallStatus = \"failed\";\n readonly capability?: string;\n readonly provider?: string;\n readonly callId?: string;\n readonly receiptRefs?: ReceiptRef[];\n readonly safety?: ProbeMeshCallSafety;\n readonly timeline?: ProbeMeshCallTimeline;\n readonly retrySafety?: ProbeMeshRetrySafety;\n readonly attempt?: ProbeMeshAttemptMetadata;\n readonly route?: ProbeMeshRouteMetadata;\n readonly cause?: unknown;\n\n constructor(options: ProbeMeshErrorOptions) {\n super(options.message);\n this.name = \"ProbeMeshError\";\n this.code = options.code;\n this.capability = options.capability;\n this.provider = options.provider;\n this.callId = options.callId;\n this.receiptRefs = options.receiptRefs;\n this.safety = options.safety;\n this.timeline = options.timeline;\n this.retrySafety = options.retrySafety;\n this.attempt = options.attempt;\n this.route = options.route;\n this.cause = options.cause;\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n capability: this.capability,\n provider: this.provider,\n callId: this.callId,\n receiptRefs: this.receiptRefs,\n safety: this.safety,\n timeline: this.timeline,\n retrySafety: this.retrySafety,\n attempt: this.attempt,\n route: this.route,\n };\n }\n}\n\nexport function isProbeMeshError(error: unknown): error is ProbeMeshError {\n return error instanceof ProbeMeshError;\n}\n","import { ProbeMeshError } from \"./errors\";\nimport type {\n Cost,\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentSelection,\n ProbeMeshPaymentStrategy,\n ProbeMeshPaymentStrategyMode,\n ProbeMeshPricing,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\n\nexport interface PaymentOptionResolutionInput {\n providerId: string;\n providerMode?: string;\n capabilities: string[];\n capability: string;\n pricing?: ProbeMeshPricing | Record<string, ProbeMeshPricing>;\n paymentOptions?: ProviderPaymentOption[];\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n defaultReceiptTypes?: ReceiptType[];\n}\n\nexport interface PaymentOptionResolution {\n selection?: ProbeMeshPaymentSelection;\n reason?: string;\n options: ProviderPaymentOption[];\n}\n\ninterface PaymentOptionCandidate {\n option: ProviderPaymentOption;\n index: number;\n cost?: Cost;\n receiptTypes: ReceiptType[];\n}\n\ninterface RankedPaymentOptionCandidate extends PaymentOptionCandidate {\n score: number;\n scoreReasons: string[];\n}\n\nexport function resolveProviderPaymentOption(\n input: PaymentOptionResolutionInput,\n): PaymentOptionResolution {\n const options = getProviderPaymentOptions(input);\n const candidates = options\n .filter((option) => optionSupportsCapability(option, input.capability))\n .map((option, index) => ({\n option,\n index,\n cost: pricingToCost(resolvePaymentOptionPricing(option, input.capability) ?? resolvePricing(input.pricing, input.capability)),\n receiptTypes: option.receiptTypes ?? [],\n }));\n const filtered = candidates.filter(({ option, receiptTypes }) =>\n optionMatchesPaymentPreferences(option, receiptTypes, input.paymentPreferences),\n );\n\n if (filtered.length === 0) {\n return {\n options,\n reason: createNoPaymentOptionReason(input, candidates.length),\n };\n }\n\n const selected = choosePaymentOption(\n filtered,\n input.paymentPreferences,\n input.paymentStrategy,\n );\n\n return {\n options,\n selection: {\n providerId: input.providerId,\n optionId: selected.option.id,\n protocolMode: selected.option.protocolMode,\n cost: selected.cost,\n receiptTypes: [...selected.receiptTypes],\n score: selected.score,\n scoreReasons: [...selected.scoreReasons],\n metadata: cloneSerializable(selected.option.metadata),\n },\n };\n}\n\nexport function getProviderPaymentOptions(\n input: Omit<PaymentOptionResolutionInput, \"capability\" | \"paymentPreferences\">,\n): ProviderPaymentOption[] {\n if (input.paymentOptions && input.paymentOptions.length > 0) {\n return cloneSerializable(input.paymentOptions);\n }\n\n return [\n {\n id: \"default\",\n protocolMode: input.providerMode ?? \"local\",\n capabilities: [...input.capabilities],\n ...(input.pricing !== undefined ? { pricing: cloneSerializable(input.pricing) } : {}),\n receiptTypes: [...(input.defaultReceiptTypes ?? [])],\n },\n ];\n}\n\nexport function validateProviderPaymentOptions(\n paymentOptions: unknown,\n path: string,\n capabilities: readonly string[],\n errors: Array<{ path: string; message: string }>,\n) {\n if (paymentOptions === undefined) {\n return;\n }\n\n if (!Array.isArray(paymentOptions) || paymentOptions.length === 0) {\n errors.push({\n path,\n message: \"paymentOptions must be a non-empty array when provided.\",\n });\n return;\n }\n\n const seen = new Set<string>();\n\n paymentOptions.forEach((option, index) => {\n const optionPath = `${path}.${index}`;\n\n if (!isRecord(option)) {\n errors.push({\n path: optionPath,\n message: \"payment option must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(option.id, `${optionPath}.id`, errors);\n validateNonEmptyString(option.protocolMode, `${optionPath}.protocolMode`, errors);\n\n if (typeof option.id === \"string\") {\n if (seen.has(option.id)) {\n errors.push({\n path: `${optionPath}.id`,\n message: `duplicate payment option \"${option.id}\".`,\n });\n }\n\n seen.add(option.id);\n }\n\n if (option.capabilities !== undefined) {\n validateStringArray(option.capabilities, `${optionPath}.capabilities`, errors);\n\n if (Array.isArray(option.capabilities)) {\n for (const capability of option.capabilities) {\n if (\n typeof capability === \"string\" &&\n capability.length > 0 &&\n !capabilities.includes(capability)\n ) {\n errors.push({\n path: `${optionPath}.capabilities`,\n message: `payment option capability \"${capability}\" is not declared by the provider.`,\n });\n }\n }\n }\n }\n\n if (option.pricing !== undefined) {\n validatePricingDeclaration(option.pricing, `${optionPath}.pricing`, errors);\n }\n\n if (option.receiptTypes !== undefined) {\n if (\n !Array.isArray(option.receiptTypes) ||\n option.receiptTypes.some((receiptType) => !isReceiptType(receiptType))\n ) {\n errors.push({\n path: `${optionPath}.receiptTypes`,\n message: \"payment option receiptTypes must contain known receipt types.\",\n });\n }\n }\n\n if (option.metadata !== undefined && !isRecord(option.metadata)) {\n errors.push({\n path: `${optionPath}.metadata`,\n message: \"payment option metadata must be an object when provided.\",\n });\n }\n });\n}\n\nexport function validatePaymentPreferences(\n paymentPreferences: unknown,\n capability: string,\n) {\n if (paymentPreferences === undefined) {\n return;\n }\n\n if (!isRecord(paymentPreferences)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"paymentPreferences must be an object when provided.\",\n capability,\n });\n }\n\n validatePreferenceStringArray(\n paymentPreferences.allowedProtocols,\n \"allowedProtocols\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.preferredProtocols,\n \"preferredProtocols\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.blockedProtocols,\n \"blockedProtocols\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.allowedPaymentOptions,\n \"allowedPaymentOptions\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.preferredPaymentOptions,\n \"preferredPaymentOptions\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.blockedPaymentOptions,\n \"blockedPaymentOptions\",\n capability,\n );\n\n if (\n paymentPreferences.requiredReceiptTypes !== undefined &&\n (!Array.isArray(paymentPreferences.requiredReceiptTypes) ||\n paymentPreferences.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"paymentPreferences.requiredReceiptTypes must contain known receipt types.\",\n capability,\n });\n }\n}\n\nexport function validatePaymentStrategy(\n paymentStrategy: unknown,\n capability: string,\n) {\n if (paymentStrategy === undefined) {\n return;\n }\n\n if (!isRecord(paymentStrategy)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"paymentStrategy must be an object when provided.\",\n capability,\n });\n }\n\n if (!isPaymentStrategyMode(paymentStrategy.mode)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n 'paymentStrategy.mode must be one of \"provider_order\", \"lowest_cost\", \"preferred_protocol\", or \"receipt_coverage\".',\n capability,\n });\n }\n\n if (\n paymentStrategy.preferredReceiptTypes !== undefined &&\n (!Array.isArray(paymentStrategy.preferredReceiptTypes) ||\n paymentStrategy.preferredReceiptTypes.some(\n (receiptType) => !isReceiptType(receiptType),\n ))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"paymentStrategy.preferredReceiptTypes must contain known receipt types.\",\n capability,\n });\n }\n}\n\nexport function mergePaymentPreferences(\n first?: ProbeMeshPaymentPreferences,\n second?: ProbeMeshPaymentPreferences,\n): ProbeMeshPaymentPreferences | undefined {\n if (!first && !second) {\n return undefined;\n }\n\n return compactPaymentPreferences({\n allowedProtocols: intersectArrays(first?.allowedProtocols, second?.allowedProtocols),\n preferredProtocols: second?.preferredProtocols ?? first?.preferredProtocols,\n blockedProtocols: unionArrays(first?.blockedProtocols, second?.blockedProtocols),\n allowedPaymentOptions: intersectArrays(\n first?.allowedPaymentOptions,\n second?.allowedPaymentOptions,\n ),\n preferredPaymentOptions:\n second?.preferredPaymentOptions ?? first?.preferredPaymentOptions,\n blockedPaymentOptions: unionArrays(\n first?.blockedPaymentOptions,\n second?.blockedPaymentOptions,\n ),\n requiredReceiptTypes: unionArrays(\n first?.requiredReceiptTypes,\n second?.requiredReceiptTypes,\n ) as ReceiptType[] | undefined,\n });\n}\n\nexport function paymentSelectionToCost(\n selection: ProbeMeshPaymentSelection | undefined,\n): Cost | undefined {\n return selection?.cost;\n}\n\nfunction optionSupportsCapability(\n option: ProviderPaymentOption,\n capability: string,\n) {\n return !option.capabilities || option.capabilities.includes(capability);\n}\n\nfunction optionMatchesPaymentPreferences(\n option: ProviderPaymentOption,\n receiptTypes: ReceiptType[],\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n if (!preferences) {\n return true;\n }\n\n if (\n preferences.allowedProtocols &&\n !preferences.allowedProtocols.includes(option.protocolMode)\n ) {\n return false;\n }\n\n if (preferences.blockedProtocols?.includes(option.protocolMode)) {\n return false;\n }\n\n if (\n preferences.allowedPaymentOptions &&\n !preferences.allowedPaymentOptions.includes(option.id)\n ) {\n return false;\n }\n\n if (preferences.blockedPaymentOptions?.includes(option.id)) {\n return false;\n }\n\n const receiptSet = new Set(receiptTypes);\n\n return (preferences.requiredReceiptTypes ?? []).every((receiptType) =>\n receiptSet.has(receiptType),\n );\n}\n\nfunction choosePaymentOption(\n candidates: PaymentOptionCandidate[],\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n const mode = strategy?.mode ?? \"provider_order\";\n const ranked = [...candidates].sort((left, right) =>\n comparePaymentOptions(left, right, preferences, strategy),\n );\n\n return ranked.map((candidate, rank) => ({\n ...candidate,\n score: rank,\n scoreReasons: createScoreReasons(candidate, preferences, strategy, mode),\n }))[0];\n}\n\nfunction preferenceIndex(preferences: string[], value: string) {\n const index = preferences.indexOf(value);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction comparePaymentOptions(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n switch (strategy?.mode ?? \"provider_order\") {\n case \"lowest_cost\":\n return compareCost(left, right) || left.index - right.index;\n\n case \"preferred_protocol\":\n return (\n comparePreferredProtocol(left, right, preferences) ||\n compareCost(left, right) ||\n left.index - right.index\n );\n\n case \"receipt_coverage\":\n return (\n compareReceiptCoverage(left, right, preferences, strategy) ||\n comparePreferredProtocol(left, right, preferences) ||\n compareCost(left, right) ||\n left.index - right.index\n );\n\n case \"provider_order\":\n return compareProviderOrder(left, right, preferences);\n }\n}\n\nfunction compareProviderOrder(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n const optionPreference = preferences?.preferredPaymentOptions ?? [];\n const protocolPreference = preferences?.preferredProtocols ?? [];\n const optionPreferenceDelta =\n preferenceIndex(optionPreference, left.option.id) -\n preferenceIndex(optionPreference, right.option.id);\n\n if (optionPreferenceDelta !== 0) {\n return optionPreferenceDelta;\n }\n\n const protocolPreferenceDelta =\n preferenceIndex(protocolPreference, left.option.protocolMode) -\n preferenceIndex(protocolPreference, right.option.protocolMode);\n\n if (protocolPreferenceDelta !== 0) {\n return protocolPreferenceDelta;\n }\n\n return left.index - right.index;\n}\n\nfunction comparePreferredProtocol(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n const protocolPreference = preferences?.preferredProtocols ?? [];\n\n return (\n preferenceIndex(protocolPreference, left.option.protocolMode) -\n preferenceIndex(protocolPreference, right.option.protocolMode)\n );\n}\n\nfunction compareCost(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n) {\n const leftCost = costSortValue(left.cost);\n const rightCost = costSortValue(right.cost);\n\n if (leftCost === rightCost) {\n return 0;\n }\n\n return leftCost < rightCost ? -1 : 1;\n}\n\nfunction compareReceiptCoverage(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n return (\n receiptCoverage(right, preferences, strategy) -\n receiptCoverage(left, preferences, strategy)\n );\n}\n\nfunction receiptCoverage(\n candidate: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n const desiredReceiptTypes =\n strategy?.preferredReceiptTypes ?? preferences?.requiredReceiptTypes ?? [];\n const receiptSet = new Set(candidate.receiptTypes);\n\n if (desiredReceiptTypes.length > 0) {\n return desiredReceiptTypes.filter((receiptType) => receiptSet.has(receiptType))\n .length;\n }\n\n return receiptSet.size;\n}\n\nfunction costSortValue(cost: Cost | undefined) {\n return cost?.amountUsd ?? Number.POSITIVE_INFINITY;\n}\n\nfunction createScoreReasons(\n candidate: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n mode: ProbeMeshPaymentStrategy[\"mode\"],\n) {\n const reasons = [`strategy:${mode}`];\n\n if (mode === \"provider_order\") {\n const preferredOptionIndex = preferenceIndex(\n preferences?.preferredPaymentOptions ?? [],\n candidate.option.id,\n );\n const preferredProtocolIndex = preferenceIndex(\n preferences?.preferredProtocols ?? [],\n candidate.option.protocolMode,\n );\n\n if (preferredOptionIndex !== Number.MAX_SAFE_INTEGER) {\n reasons.push(`preferred_option:${candidate.option.id}`);\n } else if (preferredProtocolIndex !== Number.MAX_SAFE_INTEGER) {\n reasons.push(`preferred_protocol:${candidate.option.protocolMode}`);\n } else {\n reasons.push(`provider_order:${candidate.index}`);\n }\n }\n\n if (mode === \"lowest_cost\" || mode === \"preferred_protocol\" || mode === \"receipt_coverage\") {\n reasons.push(\n candidate.cost\n ? `cost:${candidate.cost.amountUsd}`\n : \"cost:unknown\",\n );\n }\n\n if (mode === \"preferred_protocol\") {\n reasons.push(\n isPreferredProtocol(candidate, preferences)\n ? `preferred_protocol:${candidate.option.protocolMode}`\n : `protocol:${candidate.option.protocolMode}`,\n );\n }\n\n if (mode === \"receipt_coverage\") {\n const desiredReceiptTypes =\n strategy?.preferredReceiptTypes ?? preferences?.requiredReceiptTypes ?? [];\n reasons.push(\n desiredReceiptTypes.length > 0\n ? `receipt_coverage:${receiptCoverage(candidate, preferences, strategy)}/${desiredReceiptTypes.length}`\n : `receipt_coverage:${candidate.receiptTypes.length}`,\n );\n\n if (isPreferredProtocol(candidate, preferences)) {\n reasons.push(`preferred_protocol:${candidate.option.protocolMode}`);\n }\n }\n\n return reasons;\n}\n\nfunction isPreferredProtocol(\n candidate: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n return (\n preferences?.preferredProtocols?.includes(candidate.option.protocolMode) ??\n false\n );\n}\n\nfunction createNoPaymentOptionReason(\n input: PaymentOptionResolutionInput,\n capabilityCandidateCount: number,\n) {\n if (capabilityCandidateCount === 0) {\n return `Provider \"${input.providerId}\" has no payment option for capability \"${input.capability}\".`;\n }\n\n return `Provider \"${input.providerId}\" has no payment option matching paymentPreferences for capability \"${input.capability}\".`;\n}\n\nfunction resolvePaymentOptionPricing(\n option: ProviderPaymentOption,\n capability: string,\n) {\n return resolvePricing(option.pricing, capability);\n}\n\nfunction resolvePricing(\n pricing: ProbeMeshPricing | Record<string, ProbeMeshPricing> | undefined,\n capability: string,\n): ProbeMeshPricing | undefined {\n if (!pricing) {\n return undefined;\n }\n\n if (isPricing(pricing)) {\n return pricing;\n }\n\n const capabilityPricing = pricing[capability];\n return isPricing(capabilityPricing) ? capabilityPricing : undefined;\n}\n\nfunction pricingToCost(pricing: ProbeMeshPricing | undefined): Cost | undefined {\n if (!pricing) {\n return undefined;\n }\n\n return {\n amountUsd: pricing.amountUsd,\n currency: pricing.currency ?? \"USD\",\n unit: pricing.unit,\n };\n}\n\nfunction validatePreferenceStringArray(\n value: unknown,\n field: string,\n capability: string,\n) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `paymentPreferences.${field} must be an array of non-empty strings when provided.`,\n capability,\n });\n }\n}\n\nfunction validatePricingDeclaration(\n pricing: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"payment option pricing must be an object.\",\n });\n return;\n }\n\n if (isPricing(pricing)) {\n validatePricing(pricing, path, errors);\n return;\n }\n\n for (const [capability, capabilityPricing] of Object.entries(pricing)) {\n validatePricing(capabilityPricing, `${path}.${capability}`, errors);\n }\n}\n\nfunction validatePricing(\n pricing: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"payment option pricing entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(pricing.unit, `${path}.unit`, errors);\n\n if (\n typeof pricing.amountUsd !== \"number\" ||\n !Number.isFinite(pricing.amountUsd) ||\n pricing.amountUsd < 0\n ) {\n errors.push({\n path: `${path}.amountUsd`,\n message: \"amountUsd must be a non-negative number.\",\n });\n }\n\n if (pricing.currency !== undefined && typeof pricing.currency !== \"string\") {\n errors.push({\n path: `${path}.currency`,\n message: \"currency must be a string when provided.\",\n });\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction isPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n value.unit.length > 0 &&\n typeof value.amountUsd === \"number\" &&\n Number.isFinite(value.amountUsd) &&\n value.amountUsd >= 0 &&\n (value.currency === undefined || typeof value.currency === \"string\")\n );\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\nfunction isPaymentStrategyMode(\n value: unknown,\n): value is ProbeMeshPaymentStrategyMode {\n return (\n value === \"provider_order\" ||\n value === \"lowest_cost\" ||\n value === \"preferred_protocol\" ||\n value === \"receipt_coverage\"\n );\n}\n\nfunction compactPaymentPreferences(\n preferences: ProbeMeshPaymentPreferences,\n): ProbeMeshPaymentPreferences | undefined {\n const entries = Object.entries(preferences).filter(\n ([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0),\n );\n\n return entries.length > 0\n ? (Object.fromEntries(entries) as ProbeMeshPaymentPreferences)\n : undefined;\n}\n\nfunction intersectArrays<T>(first?: T[], second?: T[]) {\n if (first === undefined) {\n return second === undefined ? undefined : [...second];\n }\n\n if (second === undefined) {\n return [...first];\n }\n\n const secondValues = new Set(second);\n return first.filter((value) => secondValues.has(value));\n}\n\nfunction unionArrays<T>(first?: T[], second?: T[]) {\n const values = [...(first ?? []), ...(second ?? [])];\n return values.length > 0 ? [...new Set(values)] : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n","import { ProbeMeshError } from \"../errors\";\nimport { validateProviderPaymentOptions } from \"../paymentOptions\";\nimport type { ProbeMeshPricing } from \"../types\";\nimport type {\n JsonSchemaLike,\n ProviderLimits,\n ProviderManifest,\n ProviderManifestValidationError,\n ProviderManifestValidationResult,\n ProviderReceiptSupport,\n} from \"./types\";\n\nconst JSON_SCHEMA_HINT_KEYS = new Set([\n \"$schema\",\n \"$id\",\n \"type\",\n \"properties\",\n \"required\",\n \"items\",\n \"enum\",\n \"description\",\n \"additionalProperties\",\n \"oneOf\",\n \"anyOf\",\n \"allOf\",\n]);\n\nexport function validateProviderManifest(\n manifest: unknown,\n): ProviderManifestValidationResult {\n const errors: ProviderManifestValidationError[] = [];\n\n if (!isRecord(manifest)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider manifest must be an object.\",\n },\n ],\n };\n }\n\n validateNonEmptyString(manifest.id, \"id\", errors);\n validateNonEmptyString(manifest.displayName, \"displayName\", errors);\n validateCapabilityList(manifest.capabilities, errors);\n validateNonEmptyString(manifest.protocolMode, \"protocolMode\", errors);\n validateProviderPaymentOptions(\n manifest.paymentOptions,\n \"paymentOptions\",\n Array.isArray(manifest.capabilities) ? manifest.capabilities : [],\n errors,\n );\n validatePricingDeclaration(\n manifest.pricing,\n \"pricing\",\n manifest.capabilities,\n errors,\n );\n validateSchemaDeclaration(\n manifest.inputSchema,\n \"inputSchema\",\n manifest.capabilities,\n errors,\n );\n validateSchemaDeclaration(\n manifest.outputSchema,\n \"outputSchema\",\n manifest.capabilities,\n errors,\n );\n validateReceipts(manifest.receipts, errors);\n\n if (manifest.limits !== undefined) {\n validateLimits(manifest.limits, errors);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderManifest(\n manifest: unknown,\n): asserts manifest is ProviderManifest {\n const result = validateProviderManifest(manifest);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider manifest: ${formatValidationErrors(result.errors)}`,\n });\n}\n\nexport function isSharedJsonSchemaLike(value: unknown): value is JsonSchemaLike {\n if (!isRecord(value)) {\n return false;\n }\n\n return Object.keys(value).some((key) => JSON_SCHEMA_HINT_KEYS.has(key));\n}\n\nexport function isSharedPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n value.unit.length > 0 &&\n typeof value.amountUsd === \"number\"\n );\n}\n\nfunction validateCapabilityList(\n capabilities: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!Array.isArray(capabilities) || capabilities.length === 0) {\n errors.push({\n path: \"capabilities\",\n message: \"capabilities must be a non-empty array.\",\n });\n return;\n }\n\n const seen = new Set<string>();\n\n capabilities.forEach((capability, index) => {\n if (typeof capability !== \"string\" || capability.length === 0) {\n errors.push({\n path: `capabilities.${index}`,\n message: \"capability ids must be non-empty strings.\",\n });\n return;\n }\n\n if (seen.has(capability)) {\n errors.push({\n path: `capabilities.${index}`,\n message: `duplicate capability \"${capability}\".`,\n });\n }\n\n seen.add(capability);\n });\n}\n\nfunction validatePricingDeclaration(\n pricing: unknown,\n path: string,\n capabilities: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing must be an object.\",\n });\n return;\n }\n\n if (isSharedPricing(pricing)) {\n validatePricing(pricing, path, errors);\n return;\n }\n\n if (!Array.isArray(capabilities)) {\n return;\n }\n\n for (const capability of capabilities) {\n if (typeof capability !== \"string\" || capability.length === 0) {\n continue;\n }\n\n validatePricing(pricing[capability], `${path}.${capability}`, errors);\n }\n}\n\nfunction validatePricing(\n pricing: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(pricing.unit, `${path}.unit`, errors);\n\n if (\n typeof pricing.amountUsd !== \"number\" ||\n !Number.isFinite(pricing.amountUsd) ||\n pricing.amountUsd < 0\n ) {\n errors.push({\n path: `${path}.amountUsd`,\n message: \"amountUsd must be a non-negative number.\",\n });\n }\n\n if (pricing.currency !== undefined && typeof pricing.currency !== \"string\") {\n errors.push({\n path: `${path}.currency`,\n message: \"currency must be a string when provided.\",\n });\n }\n}\n\nfunction validateSchemaDeclaration(\n schema: unknown,\n path: string,\n capabilities: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(schema)) {\n errors.push({\n path,\n message: `${path} must be an object.`,\n });\n return;\n }\n\n if (isSharedJsonSchemaLike(schema)) {\n validateSchemaLike(schema, path, errors);\n return;\n }\n\n if (!Array.isArray(capabilities)) {\n return;\n }\n\n for (const capability of capabilities) {\n if (typeof capability !== \"string\" || capability.length === 0) {\n continue;\n }\n\n validateSchemaLike(schema[capability], `${path}.${capability}`, errors);\n }\n}\n\nfunction validateSchemaLike(\n schema: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(schema)) {\n errors.push({\n path,\n message: \"schema entry must be an object.\",\n });\n return;\n }\n\n if (schema.type !== undefined && typeof schema.type !== \"string\") {\n errors.push({\n path: `${path}.type`,\n message: \"schema type must be a string when provided.\",\n });\n }\n\n if (\n schema.properties !== undefined &&\n !isRecord(schema.properties)\n ) {\n errors.push({\n path: `${path}.properties`,\n message: \"schema properties must be an object when provided.\",\n });\n }\n\n if (\n schema.required !== undefined &&\n (!Array.isArray(schema.required) ||\n schema.required.some((field) => typeof field !== \"string\"))\n ) {\n errors.push({\n path: `${path}.required`,\n message: \"schema required must be an array of strings when provided.\",\n });\n }\n}\n\nfunction validateReceipts(\n receipts: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path: \"receipts\",\n message: \"receipts must be an object.\",\n });\n return;\n }\n\n validateBoolean(receipts.payment, \"receipts.payment\", errors);\n validateBoolean(receipts.delivery, \"receipts.delivery\", errors);\n validateBoolean(\n receipts.responseEvidence,\n \"receipts.responseEvidence\",\n errors,\n );\n}\n\nfunction validateLimits(\n limits: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(limits)) {\n errors.push({\n path: \"limits\",\n message: \"limits must be an object when provided.\",\n });\n return;\n }\n\n const typedLimits = limits as ProviderLimits;\n\n if (\n typedLimits.maxRequestsPerMinute !== undefined &&\n (!Number.isFinite(typedLimits.maxRequestsPerMinute) ||\n typedLimits.maxRequestsPerMinute <= 0)\n ) {\n errors.push({\n path: \"limits.maxRequestsPerMinute\",\n message: \"maxRequestsPerMinute must be a positive number when provided.\",\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateBoolean(\n value: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (typeof value !== \"boolean\") {\n errors.push({\n path,\n message: `${path} must be a boolean.`,\n });\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction formatValidationErrors(errors: ProviderManifestValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","export interface X402SecretRedactionOptions {\n replacement?: string;\n maxDepth?: number;\n}\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst DEFAULT_MAX_DEPTH = 12;\nconst PRIVATE_KEY_PATTERN = /\\b0x[a-fA-F0-9]{64}\\b/g;\nconst HEX_SIGNATURE_PATTERN = /\\b0x[a-fA-F0-9]{130}\\b/g;\nconst SECRET_FIELD_NAMES = new Set([\n \"api-key\",\n \"apikey\",\n \"authorization\",\n \"bearer\",\n \"payment-required\",\n \"payment-response\",\n \"payment-signature\",\n \"privatekey\",\n \"signature\",\n \"x-api-key\",\n]);\n\nexport function redactX402Secrets<T>(\n value: T,\n options: X402SecretRedactionOptions = {},\n): T {\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n const seen = new WeakSet<object>();\n\n return redactValue(value, {\n replacement,\n maxDepth,\n depth: 0,\n seen,\n key: undefined,\n }) as T;\n}\n\nfunction redactValue(\n value: unknown,\n context: {\n replacement: string;\n maxDepth: number;\n depth: number;\n seen: WeakSet<object>;\n key: string | undefined;\n },\n): unknown {\n if (context.key && shouldRedactKey(context.key)) {\n return context.replacement;\n }\n\n if (typeof value === \"string\") {\n return redactString(value, context.replacement);\n }\n\n if (\n value === null ||\n typeof value !== \"object\" ||\n value instanceof Date\n ) {\n return value;\n }\n\n if (context.depth >= context.maxDepth) {\n return \"[MaxDepth]\";\n }\n\n if (context.seen.has(value)) {\n return \"[Circular]\";\n }\n\n context.seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((entry) =>\n redactValue(entry, {\n ...context,\n depth: context.depth + 1,\n key: undefined,\n }),\n );\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactValue(entry, {\n ...context,\n depth: context.depth + 1,\n key,\n }),\n ]),\n );\n}\n\nfunction shouldRedactKey(key: string) {\n const normalized = key.toLowerCase().replace(/_/g, \"-\");\n\n return (\n SECRET_FIELD_NAMES.has(normalized) ||\n normalized.includes(\"private-key\") ||\n normalized.includes(\"privatekey\") ||\n normalized.includes(\"payment-signature\") ||\n normalized.includes(\"payment-response\") ||\n normalized.includes(\"payment-required\") ||\n normalized.includes(\"api-key\")\n );\n}\n\nfunction redactString(value: string, replacement: string) {\n return value\n .replace(PRIVATE_KEY_PATTERN, replacement)\n .replace(HEX_SIGNATURE_PATTERN, replacement);\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\n\nimport {\n createProbeMeshCallAuditArtifact,\n type ProbeMeshCallAuditArtifact,\n} from \"./callAuditArtifact\";\nimport { createProbeMesh } from \"./client\";\nimport { ProbeMeshError, isProbeMeshError } from \"./errors\";\nimport {\n mergePaymentPreferences,\n paymentSelectionToCost,\n resolveProviderPaymentOption,\n validatePaymentPreferences,\n validatePaymentStrategy,\n} from \"./paymentOptions\";\nimport {\n assertProviderCatalog,\n findProviderCatalogMatches,\n type ProviderCatalog,\n type ProviderCatalogEntry,\n type ProviderCatalogMatch,\n} from \"./providerCatalog\";\nimport {\n verifyProviderCatalogPolicyBundleRuntime,\n type ProviderCatalogPolicyBundle,\n} from \"./providerCatalogPolicyBundle\";\nimport type {\n ProviderCatalogPolicyAdapterInventory,\n ProviderCatalogPolicyExpectedQuery,\n ProviderCatalogPolicyOptions,\n} from \"./providerCatalogPolicy\";\nimport type { ProviderCatalogArtifactStatus } from \"./providerCatalogArtifact\";\nimport type { ProviderProtocolMode } from \"./providerKit/types\";\nimport type {\n Cost,\n ProbeMeshAdapter,\n ProbeMeshAdapterCallRequest,\n ProbeMeshAdapterContext,\n ProbeMeshAttemptMetadata,\n ProbeMeshCallRequest,\n ProbeMeshCallResponse,\n ProbeMeshCallSafety,\n ProbeMeshCallTimeline,\n ProbeMeshErrorCode,\n ProbeMeshPricing,\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentSelection,\n ProbeMeshPaymentStrategy,\n ProbeMeshProviderHealthStatus,\n ProbeMeshProviderRouteAttempt,\n ProbeMeshRetryRequest,\n ProbeMeshRetrySafety,\n ProbeMeshRouteDecisionReason,\n ProbeMeshRouteExplanation,\n ProbeMeshRouteMetadata,\n ProbeMeshTimelineEvent,\n ProbeMeshTimelineEventType,\n ProviderCatalogPolicyBundleAttestation,\n ReceiptRef,\n ReceiptType,\n} from \"./types\";\n\nexport type HostedTelemetryEventType = ProbeMeshTimelineEventType;\n\nexport interface HostedTelemetryEvent extends ProbeMeshTimelineEvent {}\n\nexport interface HostedProviderHealthOptions {\n enabled?: boolean;\n cooldownMs?: number;\n}\n\nexport interface HostedProviderCatalogPolicyOptions {\n catalog: ProviderCatalog;\n bundle?: ProviderCatalogPolicyBundle;\n enabled?: boolean;\n status?: ProviderCatalogArtifactStatus;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n}\n\nexport interface HostedAuditArtifactOptions {\n enabled?: boolean;\n onArtifact?: (\n artifact: ProbeMeshCallAuditArtifact,\n ) => void | Promise<void>;\n}\n\nexport interface HostedRouterOptions {\n adapters: ProbeMeshAdapter[];\n apiKeys?: string[];\n providerHealth?: HostedProviderHealthOptions;\n catalogPolicy?: HostedProviderCatalogPolicyOptions;\n auditArtifacts?: HostedAuditArtifactOptions;\n onTelemetryEvent?: (event: HostedTelemetryEvent) => void;\n}\n\nexport interface HostedRouter {\n handle(request: IncomingMessage, response: ServerResponse): Promise<void>;\n}\n\nexport interface StartHostedRouterOptions extends HostedRouterOptions {\n port: number;\n host?: string;\n}\n\nexport interface StartedHostedRouter {\n server: Server;\n url: string;\n close(): Promise<void>;\n}\n\ninterface HostedAttemptRecord {\n originalRequest: ProbeMeshCallRequest;\n attempt: ProbeMeshAttemptMetadata;\n outcome: \"completed\" | \"failed\";\n safety?: ProbeMeshCallSafety;\n receiptRefs?: ReceiptRef[];\n retrySafety: ProbeMeshRetrySafety;\n timeline: ProbeMeshCallTimeline;\n}\n\ninterface HostedAttemptStore {\n attempts: Map<string, HostedAttemptRecord>;\n attemptCounts: Map<string, number>;\n}\n\ninterface ResolvedHostedProviderHealthOptions {\n enabled: boolean;\n cooldownMs: number;\n}\n\ninterface ResolvedHostedProviderCatalogPolicyOptions {\n enabled: boolean;\n catalog?: ProviderCatalog;\n status: ProviderCatalogArtifactStatus;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n bundle?: ProviderCatalogPolicyBundle;\n bundlePolicy?: ProviderCatalogPolicyOptions;\n bundleQueries?: ProviderCatalogPolicyExpectedQuery[];\n bundleAdapterInventory?: ProviderCatalogPolicyAdapterInventory;\n bundleAttestation?: ProviderCatalogPolicyBundleAttestation;\n}\n\ninterface HostedCatalogPolicyPlan {\n enabled: boolean;\n effectiveMaxCostUsd?: number;\n matchesByProviderId: Map<string, ProviderCatalogMatch>;\n missingAdapterMatches: ProviderCatalogMatch[];\n catalogEntryByProviderId: Map<string, ProviderCatalogEntry>;\n}\n\ninterface ProviderHealthRecord {\n healthStatus: Extract<ProbeMeshProviderHealthStatus, \"unhealthy\">;\n lastFailureAt: string;\n cooldownUntil: string;\n consecutiveFailures: number;\n}\n\ninterface ProviderHealthStore {\n records: Map<string, ProviderHealthRecord>;\n}\n\nconst DEFAULT_PROVIDER_HEALTH_COOLDOWN_MS = 60_000;\n\nexport function createHostedRouter(options: HostedRouterOptions): HostedRouter {\n const attemptStore = createAttemptStore();\n const providerHealthStore = createProviderHealthStore();\n const providerHealthOptions = resolveProviderHealthOptions(\n options.providerHealth,\n );\n const catalogPolicyOptions = resolveProviderCatalogPolicyOptions(\n options.catalogPolicy,\n options.adapters,\n );\n\n return {\n async handle(request, response) {\n const route = parseHostedRoute(request);\n\n if (!route) {\n writeJson(response, 404, {\n code: \"provider_unavailable\",\n message: \"Route not found.\",\n status: \"failed\",\n });\n return;\n }\n\n const routeId = `route_${randomUUID()}`;\n const timeline = createTimeline(routeId);\n\n try {\n assertAuthorized(request, options.apiKeys);\n\n if (route.kind === \"call\") {\n const body = await readJsonBody(request);\n const callRequest = body as ProbeMeshCallRequest;\n const attempt = createInitialAttempt(callRequest);\n\n await executeHostedCall({\n options,\n response,\n timeline,\n attemptStore,\n providerHealthStore,\n providerHealthOptions,\n catalogPolicyOptions,\n originalRequest: callRequest,\n callRequest,\n attempt,\n });\n return;\n }\n\n const body = await readOptionalJsonBody(request);\n const retryRequest = validateRetryBody(route.callId, body);\n\n await executeHostedRetry({\n options,\n response,\n timeline,\n attemptStore,\n providerHealthStore,\n providerHealthOptions,\n catalogPolicyOptions,\n retryRequest,\n });\n } catch (error) {\n emitPaymentAndReceiptTelemetry(options, timeline, {\n callId: isProbeMeshError(error) ? error.callId : undefined,\n capability: isProbeMeshError(error) ? error.capability : undefined,\n provider: isProbeMeshError(error) ? error.provider : undefined,\n safety: isProbeMeshError(error) ? error.safety : undefined,\n receiptRefs: isProbeMeshError(error) ? error.receiptRefs : undefined,\n attempt: isProbeMeshError(error) ? error.attempt : undefined,\n });\n emitFailureTelemetry(options, timeline, error);\n writeHostedError(response, error, timeline, retrySafetyForError(error));\n }\n },\n };\n}\n\nfunction createAttemptStore(): HostedAttemptStore {\n return {\n attempts: new Map(),\n attemptCounts: new Map(),\n };\n}\n\nfunction createProviderHealthStore(): ProviderHealthStore {\n return {\n records: new Map(),\n };\n}\n\nfunction resolveProviderHealthOptions(\n options: HostedProviderHealthOptions | undefined,\n): ResolvedHostedProviderHealthOptions {\n const requestedCooldownMs = options?.cooldownMs;\n const cooldownMs =\n typeof requestedCooldownMs === \"number\" &&\n Number.isFinite(requestedCooldownMs) &&\n requestedCooldownMs >= 0\n ? requestedCooldownMs\n : DEFAULT_PROVIDER_HEALTH_COOLDOWN_MS;\n\n return {\n enabled: options?.enabled ?? true,\n cooldownMs,\n };\n}\n\nfunction resolveProviderCatalogPolicyOptions(\n options: HostedProviderCatalogPolicyOptions | undefined,\n adapters: ProbeMeshAdapter[],\n): ResolvedHostedProviderCatalogPolicyOptions {\n if (!options || options.enabled === false) {\n return {\n enabled: false,\n status: options?.status ?? \"ready\",\n };\n }\n\n assertProviderCatalog(options.catalog);\n\n if (\n options.maxCostUsd !== undefined &&\n (typeof options.maxCostUsd !== \"number\" ||\n !Number.isFinite(options.maxCostUsd) ||\n options.maxCostUsd < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Hosted provider catalog policy maxCostUsd must be a non-negative finite number.\",\n });\n }\n\n validateStringArrayOption(\n options.providerIds,\n \"Hosted provider catalog policy providerIds\",\n );\n validateStringArrayOption(\n options.blockedProviderIds,\n \"Hosted provider catalog policy blockedProviderIds\",\n );\n\n if (\n options.requiredReceiptTypes !== undefined &&\n (!Array.isArray(options.requiredReceiptTypes) ||\n options.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Hosted provider catalog policy requiredReceiptTypes must contain known receipt types.\",\n });\n }\n\n if (\n options.status !== undefined &&\n options.status !== \"ready\" &&\n options.status !== \"rejected\"\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n 'Hosted provider catalog policy status must be \"ready\" or \"rejected\".',\n });\n }\n\n if (\n options.protocolMode !== undefined &&\n (typeof options.protocolMode !== \"string\" || options.protocolMode.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Hosted provider catalog policy protocolMode must be a non-empty string.\",\n });\n }\n\n validatePaymentPreferences(options.paymentPreferences, \"hosted catalog policy\");\n validatePaymentStrategy(options.paymentStrategy, \"hosted catalog policy\");\n\n const bundlePolicy = createBundlePolicyOptions(options);\n const bundleAdapterInventory = createAdapterInventory(adapters);\n const bundleQueries = options.bundle?.queries;\n const bundleVerification = options.bundle\n ? verifyProviderCatalogPolicyBundleRuntime({\n bundle: options.bundle,\n catalog: options.catalog,\n catalogPolicy: bundlePolicy,\n adapterInventory: bundleAdapterInventory,\n queries: bundleQueries,\n })\n : undefined;\n\n if (bundleVerification && !bundleVerification.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Hosted provider catalog policy bundle does not match runtime inputs: ${formatBundleVerificationErrors(\n bundleVerification.errors,\n )}`,\n });\n }\n\n return {\n enabled: true,\n catalog: options.catalog,\n status: options.status ?? \"ready\",\n protocolMode: options.protocolMode,\n paymentPreferences: options.paymentPreferences,\n paymentStrategy: options.paymentStrategy,\n maxCostUsd: options.maxCostUsd,\n requiredReceiptTypes: options.requiredReceiptTypes,\n providerIds: options.providerIds,\n blockedProviderIds: options.blockedProviderIds,\n bundle: options.bundle,\n bundlePolicy,\n bundleQueries,\n bundleAdapterInventory,\n bundleAttestation: bundleVerification?.attestation,\n };\n}\n\nfunction createBundlePolicyOptions(\n options: HostedProviderCatalogPolicyOptions,\n): ProviderCatalogPolicyOptions | undefined {\n const policy: ProviderCatalogPolicyOptions = {};\n\n if (options.enabled !== undefined) {\n policy.enabled = options.enabled;\n }\n\n if (options.status !== undefined) {\n policy.status = options.status;\n }\n\n if (options.protocolMode !== undefined) {\n policy.protocolMode = options.protocolMode;\n }\n\n if (options.paymentPreferences !== undefined) {\n policy.paymentPreferences = options.paymentPreferences;\n }\n\n if (options.paymentStrategy !== undefined) {\n policy.paymentStrategy = options.paymentStrategy;\n }\n\n if (options.maxCostUsd !== undefined) {\n policy.maxCostUsd = options.maxCostUsd;\n }\n\n if (options.requiredReceiptTypes !== undefined) {\n policy.requiredReceiptTypes = options.requiredReceiptTypes;\n }\n\n if (options.providerIds !== undefined) {\n policy.providerIds = options.providerIds;\n }\n\n if (options.blockedProviderIds !== undefined) {\n policy.blockedProviderIds = options.blockedProviderIds;\n }\n\n return Object.keys(policy).length > 0 ? policy : undefined;\n}\n\nfunction createAdapterInventory(\n adapters: ProbeMeshAdapter[],\n): ProviderCatalogPolicyAdapterInventory {\n return adapters.map((adapter) => ({\n id: adapter.id,\n capabilities: [...adapter.capabilities],\n ...(adapter.pricing !== undefined ? { pricing: adapter.pricing } : {}),\n ...(adapter.paymentOptions !== undefined\n ? { paymentOptions: adapter.paymentOptions }\n : {}),\n }));\n}\n\nfunction formatBundleVerificationErrors(\n errors: Array<{ path: string; message: string }>,\n) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction validateStringArrayOption(value: unknown, label: string) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${label} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\ntype HostedRoute =\n | {\n kind: \"call\";\n }\n | {\n kind: \"retry\";\n callId: string;\n };\n\nfunction parseHostedRoute(request: IncomingMessage): HostedRoute | undefined {\n if (request.method !== \"POST\" || !request.url) {\n return undefined;\n }\n\n const url = new URL(request.url, \"http://localhost\");\n\n if (url.pathname === \"/v1/calls\") {\n return {\n kind: \"call\",\n };\n }\n\n const retryMatch = url.pathname.match(/^\\/v1\\/calls\\/(.+)\\/retry$/);\n\n if (retryMatch) {\n return {\n kind: \"retry\",\n callId: decodeURIComponent(retryMatch[1]),\n };\n }\n\n return undefined;\n}\n\nasync function executeHostedCall(options: {\n options: HostedRouterOptions;\n response: ServerResponse;\n timeline: ProbeMeshCallTimeline;\n attemptStore: HostedAttemptStore;\n providerHealthStore: ProviderHealthStore;\n providerHealthOptions: ResolvedHostedProviderHealthOptions;\n catalogPolicyOptions: ResolvedHostedProviderCatalogPolicyOptions;\n originalRequest: ProbeMeshCallRequest;\n callRequest: ProbeMeshCallRequest;\n attempt: ProbeMeshAttemptMetadata;\n}) {\n const {\n options: routerOptions,\n response,\n timeline,\n attemptStore,\n providerHealthStore,\n providerHealthOptions,\n catalogPolicyOptions,\n originalRequest,\n callRequest,\n attempt,\n } = options;\n const executableRequest: ProbeMeshCallRequest = {\n ...callRequest,\n idempotencyKey: attempt.attemptId,\n };\n const routePlan = createRoutePlan(\n routerOptions.adapters,\n executableRequest,\n providerHealthStore,\n providerHealthOptions,\n catalogPolicyOptions,\n );\n\n emitTelemetry(routerOptions, timeline, {\n type: \"call.requested\",\n callId: attempt.attemptId,\n capability: executableRequest.capability,\n attempt,\n attestation: routePlan.attestation,\n });\n\n if (routePlan.eligibleAdapters.length === 0) {\n const error = createNoEligibleProviderError(executableRequest, routePlan);\n const retrySafety = retrySafetyForError(error);\n\n emitFailureTelemetry(\n routerOptions,\n timeline,\n error,\n attempt,\n routePlan.attestation,\n );\n await emitCallAuditArtifact(routerOptions, {\n request: executableRequest,\n error,\n timeline,\n retrySafety,\n attempt,\n route: createRouteMetadata(\n timeline.routeId,\n routePlan.explanation,\n undefined,\n routePlan.attestation,\n undefined,\n routePlan.paymentStrategy,\n ),\n });\n storeAttempt(attemptStore, {\n originalRequest,\n attempt,\n outcome: \"failed\",\n retrySafety,\n timeline,\n });\n writeHostedError(\n response,\n error,\n timeline,\n retrySafety,\n attempt,\n createRouteMetadata(\n timeline.routeId,\n routePlan.explanation,\n undefined,\n routePlan.attestation,\n undefined,\n routePlan.paymentStrategy,\n ),\n );\n return;\n }\n\n let lastError: ProbeMeshError | undefined;\n\n for (const [index, candidate] of routePlan.eligibleAdapters.entries()) {\n const { adapter, paymentSelection } = candidate;\n\n markRouteAttempt(routePlan.explanation, adapter.id, {\n status: \"attempted\",\n reason: \"eligible\",\n paymentSelection,\n paymentStrategy: routePlan.paymentStrategy,\n paymentOptionScore: paymentSelection.score,\n paymentOptionScoreReasons: paymentSelection.scoreReasons,\n });\n\n try {\n const client = createProbeMesh({\n adapters: createTimelineAdapters(\n {\n ...routerOptions,\n adapters: [adapter],\n },\n timeline,\n attempt,\n routePlan.attestation,\n ),\n });\n const result = await client.call({\n ...executableRequest,\n providerPreferences: {\n allowedProviders: [adapter.id],\n },\n });\n const selectedPayment =\n result.route?.paymentSelection ?? paymentSelection;\n\n clearProviderHealth(\n providerHealthStore,\n providerHealthOptions,\n result.capability,\n adapter.id,\n );\n markRouteAttempt(routePlan.explanation, adapter.id, {\n status: \"succeeded\",\n reason: \"selected\",\n paymentEvidence: hasPaymentEvidence(result.safety, result.receiptRefs),\n healthStatus: providerHealthOptions.enabled ? \"healthy\" : undefined,\n paymentSelection: selectedPayment,\n paymentStrategy: routePlan.paymentStrategy,\n paymentOptionScore: selectedPayment?.score,\n paymentOptionScoreReasons: selectedPayment?.scoreReasons,\n });\n routePlan.explanation.selectedProviderId = result.provider.id;\n routePlan.explanation.stopReason = \"stopped_completed\";\n routePlan.explanation.fallbackUsed =\n routePlan.explanation.fallbackCount > 0;\n\n emitTelemetry(routerOptions, timeline, {\n type: \"provider.selected\",\n callId: result.callId,\n capability: result.capability,\n provider: result.provider.id,\n attempt,\n attestation: routePlan.attestation,\n });\n emitPaymentAndReceiptTelemetry(routerOptions, timeline, {\n callId: result.callId,\n capability: result.capability,\n provider: result.provider.id,\n safety: result.safety,\n receiptRefs: result.receiptRefs,\n attempt,\n attestation: routePlan.attestation,\n });\n emitTelemetry(routerOptions, timeline, {\n type: \"call.completed\",\n callId: result.callId,\n capability: result.capability,\n provider: result.provider.id,\n status: \"completed\",\n safety: result.safety,\n attempt,\n attestation: routePlan.attestation,\n });\n\n const retrySafety = retrySafetyForCompletedCall();\n const hostedResult = addHostedRouteMetadata(\n result,\n timeline.routeId,\n timeline,\n retrySafety,\n attempt,\n routePlan.explanation,\n routePlan.attestation,\n selectedPayment,\n routePlan.paymentStrategy,\n );\n\n storeAttempt(attemptStore, {\n originalRequest,\n attempt,\n outcome: \"completed\",\n safety: hostedResult.safety,\n receiptRefs: hostedResult.receiptRefs,\n retrySafety,\n timeline,\n });\n await emitCallAuditArtifact(routerOptions, {\n request: executableRequest,\n response: hostedResult,\n timeline,\n retrySafety,\n attempt,\n route: hostedResult.route,\n });\n writeJson(response, 200, hostedResult);\n return;\n } catch (error) {\n const normalizedError = toHostedProbeMeshError(error);\n const paymentEvidence = moneyMayHaveMoved(\n normalizedError.safety,\n normalizedError.receiptRefs,\n );\n const retrySafety = retrySafetyForError(normalizedError);\n const healthRecord =\n shouldRememberProviderHealthFailure(\n normalizedError,\n paymentEvidence,\n retrySafety,\n )\n ? markProviderUnhealthy(\n providerHealthStore,\n providerHealthOptions,\n executableRequest.capability,\n adapter.id,\n )\n : undefined;\n\n lastError = normalizedError;\n markRouteAttempt(routePlan.explanation, adapter.id, {\n status: \"failed\",\n reason: paymentEvidence\n ? \"stopped_payment_evidence\"\n : \"fallback_after_failure\",\n errorCode: normalizedError.code,\n paymentEvidence,\n ...(healthRecord ?? {}),\n message: normalizedError.message,\n });\n\n const canFallback =\n !paymentEvidence &&\n retrySafety.safeToAutoRetry &&\n index < routePlan.eligibleAdapters.length - 1;\n\n if (canFallback) {\n routePlan.explanation.fallbackCount += 1;\n routePlan.explanation.fallbackUsed = true;\n continue;\n }\n\n routePlan.explanation.stopReason = paymentEvidence\n ? \"stopped_payment_evidence\"\n : retrySafety.safeToAutoRetry\n ? \"no_eligible_provider\"\n : \"stopped_not_retryable\";\n routePlan.explanation.fallbackUsed =\n routePlan.explanation.fallbackCount > 0;\n break;\n }\n }\n\n const normalizedError =\n lastError ??\n createNoEligibleProviderError(executableRequest, routePlan);\n const retrySafety = retrySafetyForError(normalizedError);\n\n emitPaymentAndReceiptTelemetry(routerOptions, timeline, {\n callId: normalizedError.callId,\n capability: normalizedError.capability,\n provider: normalizedError.provider,\n safety: normalizedError.safety,\n receiptRefs: normalizedError.receiptRefs,\n attempt,\n attestation: routePlan.attestation,\n });\n emitFailureTelemetry(\n routerOptions,\n timeline,\n normalizedError,\n attempt,\n routePlan.attestation,\n );\n await emitCallAuditArtifact(routerOptions, {\n request: executableRequest,\n error: normalizedError,\n timeline,\n retrySafety,\n attempt,\n route: createRouteMetadata(\n timeline.routeId,\n routePlan.explanation,\n undefined,\n routePlan.attestation,\n undefined,\n routePlan.paymentStrategy,\n ),\n });\n storeAttempt(attemptStore, {\n originalRequest,\n attempt,\n outcome: \"failed\",\n safety: normalizedError.safety,\n receiptRefs: normalizedError.receiptRefs,\n retrySafety,\n timeline,\n });\n writeHostedError(\n response,\n normalizedError,\n timeline,\n retrySafety,\n attempt,\n createRouteMetadata(\n timeline.routeId,\n routePlan.explanation,\n undefined,\n routePlan.attestation,\n undefined,\n routePlan.paymentStrategy,\n ),\n );\n}\n\ninterface HostedRoutePlan {\n eligibleAdapters: HostedRouteCandidate[];\n explanation: ProbeMeshRouteExplanation;\n catalogPolicyPlan: HostedCatalogPolicyPlan;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n attestation?: ProviderCatalogPolicyBundleAttestation;\n}\n\ninterface HostedRouteCandidate {\n adapter: ProbeMeshAdapter;\n paymentSelection: ProbeMeshPaymentSelection;\n}\n\nfunction createRoutePlan(\n adapters: ProbeMeshAdapter[],\n request: ProbeMeshCallRequest,\n providerHealthStore: ProviderHealthStore,\n providerHealthOptions: ResolvedHostedProviderHealthOptions,\n catalogPolicyOptions: ResolvedHostedProviderCatalogPolicyOptions,\n): HostedRoutePlan {\n const allowedProviders = request.providerPreferences?.allowedProviders;\n const blockedProviders = request.providerPreferences?.blockedProviders ?? [];\n const attempts: ProbeMeshProviderRouteAttempt[] = [];\n const eligibleAdapters: HostedRouteCandidate[] = [];\n const plannedAt = new Date();\n const effectiveMaxCostUsd = strictestMaxCostUsd(\n request.constraints?.maxCostUsd,\n catalogPolicyOptions.maxCostUsd,\n );\n const catalogPolicyPlan = createCatalogPolicyPlan(\n adapters,\n request,\n catalogPolicyOptions,\n effectiveMaxCostUsd,\n );\n const paymentStrategy =\n request.paymentStrategy ?? catalogPolicyOptions.paymentStrategy;\n const bundleVerification = verifyPolicyBundleCapability(\n catalogPolicyOptions,\n request.capability,\n );\n const attestation = bundleVerification?.attestation;\n const bundleBlocksCapability =\n attestation !== undefined && !bundleVerification?.valid;\n\n for (const adapter of adapters) {\n const pricing = getPricing(adapter, request.capability);\n const paymentPreferences = mergePaymentPreferences(\n catalogPolicyOptions.paymentPreferences,\n request.paymentPreferences,\n );\n const paymentResolution = resolveProviderPaymentOption({\n providerId: adapter.id,\n providerMode: adapter.mode ?? \"hosted\",\n capabilities: adapter.capabilities,\n capability: request.capability,\n pricing: adapter.pricing,\n paymentOptions: adapter.paymentOptions,\n paymentPreferences,\n paymentStrategy,\n });\n const paymentSelection = paymentResolution.selection;\n const cost = paymentSelectionToCost(paymentSelection) ?? pricingToCost(pricing);\n const catalogMatch = catalogPolicyPlan.matchesByProviderId.get(adapter.id);\n const catalogEntry = catalogPolicyPlan.catalogEntryByProviderId.get(adapter.id);\n const baseAttempt = {\n providerId: adapter.id,\n cost,\n paymentSelection,\n paymentStrategy,\n paymentOptionScore: paymentSelection?.score,\n paymentOptionScoreReasons: paymentSelection?.scoreReasons,\n ...catalogRouteMetadata(catalogMatch, catalogEntry),\n };\n const healthMetadata = getProviderHealthMetadata(\n providerHealthStore,\n providerHealthOptions,\n request.capability,\n adapter.id,\n plannedAt,\n );\n\n if (!adapter.capabilities.includes(request.capability)) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_capability_mismatch\",\n });\n continue;\n }\n\n if (bundleBlocksCapability) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_policy_bundle_uncovered\",\n attestation,\n catalogPolicyReason:\n attestation?.reason ??\n `Capability \"${request.capability}\" is not covered by the policy bundle.`,\n });\n continue;\n }\n\n if (allowedProviders && !allowedProviders.includes(adapter.id)) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_allowed_provider\",\n });\n continue;\n }\n\n if (blockedProviders.includes(adapter.id)) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_blocked_provider\",\n });\n continue;\n }\n\n if (!paymentSelection) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_payment_preferences\",\n paymentOptionReason: paymentResolution.reason,\n message: paymentResolution.reason,\n });\n continue;\n }\n\n if (\n effectiveMaxCostUsd !== undefined &&\n cost &&\n cost.amountUsd > effectiveMaxCostUsd\n ) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_budget_exceeded\",\n budgetExceeded: true,\n message: `Capability \"${request.capability}\" costs $${cost.amountUsd.toFixed(\n 2,\n )}, which exceeds maxCostUsd $${effectiveMaxCostUsd.toFixed(\n 2,\n )}.`,\n });\n continue;\n }\n\n if (catalogPolicyPlan.enabled && !catalogMatch) {\n attempts.push({\n ...baseAttempt,\n status: \"skipped\",\n reason: \"skipped_catalog_policy\",\n catalogPolicyReason: `Provider \"${adapter.id}\" does not match the hosted catalog policy for capability \"${request.capability}\".`,\n });\n continue;\n }\n\n if (healthMetadata.healthStatus === \"unhealthy\") {\n attempts.push({\n ...baseAttempt,\n ...healthMetadata,\n status: \"skipped\",\n reason: \"skipped_unhealthy_provider\",\n message: `Provider \"${adapter.id}\" is cooling down after a recent safe pre-payment failure.`,\n });\n continue;\n }\n\n attempts.push({\n ...baseAttempt,\n ...healthMetadata,\n status: \"considered\",\n reason: \"eligible\",\n });\n eligibleAdapters.push({\n adapter,\n paymentSelection,\n });\n }\n\n for (const match of bundleBlocksCapability\n ? []\n : catalogPolicyPlan.missingAdapterMatches) {\n attempts.push({\n providerId: match.providerId,\n cost: match.cost,\n status: \"skipped\",\n reason: \"skipped_catalog_adapter_missing\",\n catalogArtifactId: match.entry.artifactId,\n catalogStatus: match.entry.status,\n catalogMatchReasons: match.reasons,\n catalogPolicyReason: `Catalog provider \"${match.providerId}\" matched policy but has no registered adapter.`,\n });\n }\n\n return {\n eligibleAdapters,\n catalogPolicyPlan,\n paymentStrategy,\n attestation,\n explanation: {\n consideredProviders: attempts.map((attempt) => attempt.providerId),\n fallbackUsed: false,\n fallbackCount: 0,\n stopReason: eligibleAdapters.length > 0 ? \"eligible\" : \"no_eligible_provider\",\n attempts,\n },\n };\n}\n\nfunction verifyPolicyBundleCapability(\n catalogPolicyOptions: ResolvedHostedProviderCatalogPolicyOptions,\n capability: string,\n) {\n if (\n !catalogPolicyOptions.bundle ||\n !catalogPolicyOptions.catalog ||\n !catalogPolicyOptions.bundleAdapterInventory\n ) {\n return undefined;\n }\n\n return verifyProviderCatalogPolicyBundleRuntime({\n bundle: catalogPolicyOptions.bundle,\n catalog: catalogPolicyOptions.catalog,\n catalogPolicy: catalogPolicyOptions.bundlePolicy,\n adapterInventory: catalogPolicyOptions.bundleAdapterInventory,\n queries: catalogPolicyOptions.bundleQueries,\n capability,\n });\n}\n\nfunction createCatalogPolicyPlan(\n adapters: ProbeMeshAdapter[],\n request: ProbeMeshCallRequest,\n catalogPolicyOptions: ResolvedHostedProviderCatalogPolicyOptions,\n effectiveMaxCostUsd: number | undefined,\n): HostedCatalogPolicyPlan {\n const emptyPlan = {\n enabled: false,\n effectiveMaxCostUsd,\n matchesByProviderId: new Map<string, ProviderCatalogMatch>(),\n missingAdapterMatches: [],\n catalogEntryByProviderId: new Map<string, ProviderCatalogEntry>(),\n };\n\n if (!catalogPolicyOptions.enabled || !catalogPolicyOptions.catalog) {\n return emptyPlan;\n }\n\n const matches = findProviderCatalogMatches(catalogPolicyOptions.catalog, {\n capability: request.capability,\n protocolMode: catalogPolicyOptions.protocolMode,\n paymentPreferences: mergePaymentPreferences(\n catalogPolicyOptions.paymentPreferences,\n request.paymentPreferences,\n ),\n paymentStrategy:\n request.paymentStrategy ?? catalogPolicyOptions.paymentStrategy,\n maxCostUsd: effectiveMaxCostUsd,\n requiredReceiptTypes: catalogPolicyOptions.requiredReceiptTypes,\n providerIds: catalogPolicyOptions.providerIds,\n blockedProviderIds: catalogPolicyOptions.blockedProviderIds,\n status: catalogPolicyOptions.status,\n });\n const registeredAdapterIds = new Set(adapters.map((adapter) => adapter.id));\n const matchesByProviderId = new Map<string, ProviderCatalogMatch>();\n const missingAdapterMatches: ProviderCatalogMatch[] = [];\n\n for (const match of matches) {\n if (!matchesByProviderId.has(match.providerId)) {\n matchesByProviderId.set(match.providerId, match);\n }\n\n if (\n !registeredAdapterIds.has(match.providerId) &&\n requestAllowsProvider(request, match.providerId)\n ) {\n missingAdapterMatches.push(match);\n }\n }\n\n return {\n enabled: true,\n effectiveMaxCostUsd,\n matchesByProviderId,\n missingAdapterMatches,\n catalogEntryByProviderId: createCatalogEntryIndex(catalogPolicyOptions.catalog),\n };\n}\n\nfunction createCatalogEntryIndex(catalog: ProviderCatalog) {\n const entries = new Map<string, ProviderCatalogEntry>();\n\n for (const entry of catalog.entries) {\n if (!entries.has(entry.provider.id)) {\n entries.set(entry.provider.id, entry);\n }\n }\n\n return entries;\n}\n\nfunction requestAllowsProvider(\n request: ProbeMeshCallRequest,\n providerId: string,\n) {\n const allowedProviders = request.providerPreferences?.allowedProviders;\n const blockedProviders = request.providerPreferences?.blockedProviders ?? [];\n\n return (\n (!allowedProviders || allowedProviders.includes(providerId)) &&\n !blockedProviders.includes(providerId)\n );\n}\n\nfunction catalogRouteMetadata(\n match: ProviderCatalogMatch | undefined,\n entry: ProviderCatalogEntry | undefined,\n): Pick<\n ProbeMeshProviderRouteAttempt,\n | \"catalogArtifactId\"\n | \"catalogStatus\"\n | \"catalogMatchReasons\"\n | \"catalogPolicyReason\"\n> {\n if (match) {\n return {\n catalogArtifactId: match.entry.artifactId,\n catalogStatus: match.entry.status,\n catalogMatchReasons: match.reasons,\n };\n }\n\n if (entry) {\n return {\n catalogArtifactId: entry.artifactId,\n catalogStatus: entry.status,\n };\n }\n\n return {};\n}\n\nfunction strictestMaxCostUsd(\n requestMaxCostUsd: number | undefined,\n policyMaxCostUsd: number | undefined,\n) {\n if (requestMaxCostUsd === undefined) {\n return policyMaxCostUsd;\n }\n\n if (policyMaxCostUsd === undefined) {\n return requestMaxCostUsd;\n }\n\n return Math.min(requestMaxCostUsd, policyMaxCostUsd);\n}\n\nfunction createNoEligibleProviderError(\n request: ProbeMeshCallRequest,\n routePlan: HostedRoutePlan,\n) {\n const budgetAttempt = routePlan.explanation.attempts.find(\n (attempt) => attempt.reason === \"skipped_budget_exceeded\",\n );\n\n if (budgetAttempt) {\n return new ProbeMeshError({\n code: \"budget_exceeded\",\n message:\n budgetAttempt.message ??\n `No provider for capability \"${request.capability}\" fits maxCostUsd.`,\n capability: request.capability,\n provider: budgetAttempt.providerId,\n callId: request.idempotencyKey,\n });\n }\n\n const uncoveredAttempt = routePlan.explanation.attempts.find(\n (attempt) => attempt.reason === \"skipped_policy_bundle_uncovered\",\n );\n\n if (uncoveredAttempt) {\n return new ProbeMeshError({\n code: \"provider_unavailable\",\n message:\n uncoveredAttempt.catalogPolicyReason ??\n `Capability \"${request.capability}\" is not covered by the policy bundle.`,\n capability: request.capability,\n callId: request.idempotencyKey,\n });\n }\n\n const paymentAttempt = routePlan.explanation.attempts.find(\n (attempt) => attempt.reason === \"skipped_payment_preferences\",\n );\n\n if (paymentAttempt) {\n return new ProbeMeshError({\n code: \"provider_unavailable\",\n message:\n paymentAttempt.message ??\n `No provider for capability \"${request.capability}\" matches paymentPreferences.`,\n capability: request.capability,\n provider: paymentAttempt.providerId,\n callId: request.idempotencyKey,\n });\n }\n\n return new ProbeMeshError({\n code: \"provider_unavailable\",\n message: `No adapter is available for capability \"${request.capability}\".`,\n capability: request.capability,\n callId: request.idempotencyKey,\n });\n}\n\nfunction providerHealthKey(capability: string, providerId: string) {\n return `${capability}\\u0000${providerId}`;\n}\n\nfunction getProviderHealthMetadata(\n store: ProviderHealthStore,\n options: ResolvedHostedProviderHealthOptions,\n capability: string,\n providerId: string,\n now: Date,\n): Pick<\n ProbeMeshProviderRouteAttempt,\n \"healthStatus\" | \"lastFailureAt\" | \"cooldownUntil\" | \"consecutiveFailures\"\n> {\n if (!options.enabled) {\n return {};\n }\n\n const key = providerHealthKey(capability, providerId);\n const record = store.records.get(key);\n\n if (!record) {\n return {\n healthStatus: \"healthy\",\n };\n }\n\n if (Date.parse(record.cooldownUntil) <= now.getTime()) {\n store.records.delete(key);\n return {\n healthStatus: \"healthy\",\n };\n }\n\n return record;\n}\n\nfunction markProviderUnhealthy(\n store: ProviderHealthStore,\n options: ResolvedHostedProviderHealthOptions,\n capability: string,\n providerId: string,\n): ProviderHealthRecord | undefined {\n if (!options.enabled) {\n return undefined;\n }\n\n const key = providerHealthKey(capability, providerId);\n const previousRecord = store.records.get(key);\n const failedAt = new Date();\n const record: ProviderHealthRecord = {\n healthStatus: \"unhealthy\",\n lastFailureAt: failedAt.toISOString(),\n cooldownUntil: new Date(\n failedAt.getTime() + options.cooldownMs,\n ).toISOString(),\n consecutiveFailures: (previousRecord?.consecutiveFailures ?? 0) + 1,\n };\n\n store.records.set(key, record);\n return record;\n}\n\nfunction clearProviderHealth(\n store: ProviderHealthStore,\n options: ResolvedHostedProviderHealthOptions,\n capability: string,\n providerId: string,\n) {\n if (!options.enabled) {\n return;\n }\n\n store.records.delete(providerHealthKey(capability, providerId));\n}\n\nfunction shouldRememberProviderHealthFailure(\n error: ProbeMeshError,\n paymentEvidence: boolean,\n retrySafety: ProbeMeshRetrySafety,\n) {\n return (\n !paymentEvidence &&\n retrySafety.safeToAutoRetry &&\n (error.code === \"provider_unavailable\" ||\n error.code === \"provider_timeout\")\n );\n}\n\nfunction markRouteAttempt(\n explanation: ProbeMeshRouteExplanation,\n providerId: string,\n updates: Partial<ProbeMeshProviderRouteAttempt>,\n) {\n const routeAttempt = explanation.attempts.find(\n (attempt) => attempt.providerId === providerId,\n );\n\n if (!routeAttempt) {\n return;\n }\n\n Object.assign(routeAttempt, updates);\n}\n\nfunction createRouteMetadata(\n routeId: string,\n explanation: ProbeMeshRouteExplanation,\n selectedProviderId?: string,\n attestation?: ProviderCatalogPolicyBundleAttestation,\n paymentSelection?: ProbeMeshPaymentSelection,\n paymentStrategy?: ProbeMeshPaymentStrategy,\n): ProbeMeshRouteMetadata {\n return {\n routeId,\n mode: \"hosted\",\n selectedProviderId,\n paymentStrategy,\n paymentSelection,\n explanation,\n attestation,\n };\n}\n\nasync function executeHostedRetry(options: {\n options: HostedRouterOptions;\n response: ServerResponse;\n timeline: ProbeMeshCallTimeline;\n attemptStore: HostedAttemptStore;\n providerHealthStore: ProviderHealthStore;\n providerHealthOptions: ResolvedHostedProviderHealthOptions;\n catalogPolicyOptions: ResolvedHostedProviderCatalogPolicyOptions;\n retryRequest: ProbeMeshRetryRequest;\n}) {\n const {\n options: routerOptions,\n response,\n timeline,\n attemptStore,\n providerHealthStore,\n providerHealthOptions,\n catalogPolicyOptions,\n retryRequest,\n } = options;\n\n emitTelemetry(routerOptions, timeline, {\n type: \"retry.requested\",\n callId: retryRequest.callId,\n });\n\n const sourceAttempt = attemptStore.attempts.get(retryRequest.callId);\n\n if (!sourceAttempt) {\n const retrySafety = notRetryableSafety();\n const error = new ProbeMeshError({\n code: \"retry_not_available\",\n message: `No hosted attempt is available for callId \"${retryRequest.callId}\".`,\n callId: retryRequest.callId,\n retrySafety,\n });\n\n emitBlockedRetry(routerOptions, timeline, error);\n writeHostedError(response, error, timeline, retrySafety);\n return;\n }\n\n if (!sourceAttempt.retrySafety.safeToAutoRetry) {\n const error = new ProbeMeshError({\n code: \"retry_not_available\",\n message: `Hosted attempt \"${retryRequest.callId}\" is not safe to retry.`,\n callId: sourceAttempt.attempt.attemptId,\n receiptRefs: sourceAttempt.receiptRefs,\n safety: sourceAttempt.safety,\n retrySafety: sourceAttempt.retrySafety,\n attempt: sourceAttempt.attempt,\n });\n\n emitBlockedRetry(routerOptions, timeline, error);\n writeHostedError(\n response,\n error,\n timeline,\n sourceAttempt.retrySafety,\n sourceAttempt.attempt,\n );\n return;\n }\n\n const retryAttempt = createRetryAttempt(\n attemptStore,\n sourceAttempt,\n retryRequest.idempotencyKey,\n );\n const retryCallRequest: ProbeMeshCallRequest = {\n ...sourceAttempt.originalRequest,\n idempotencyKey: retryAttempt.attemptId,\n };\n\n await executeHostedCall({\n options: routerOptions,\n response,\n timeline,\n attemptStore,\n providerHealthStore,\n providerHealthOptions,\n catalogPolicyOptions,\n originalRequest: sourceAttempt.originalRequest,\n callRequest: retryCallRequest,\n attempt: retryAttempt,\n });\n}\n\nfunction emitBlockedRetry(\n options: HostedRouterOptions,\n timeline: ProbeMeshCallTimeline,\n error: ProbeMeshError,\n) {\n emitTelemetry(options, timeline, {\n type: \"retry.blocked\",\n callId: error.callId,\n errorCode: error.code,\n safety: error.safety,\n attempt: error.attempt,\n });\n emitFailureTelemetry(options, timeline, error, error.attempt);\n}\n\nfunction createInitialAttempt(\n callRequest: ProbeMeshCallRequest,\n): ProbeMeshAttemptMetadata {\n const attemptId = callRequest.idempotencyKey ?? generateCallId();\n\n return {\n originalCallId: attemptId,\n attemptId,\n attemptNumber: 1,\n isRetry: false,\n };\n}\n\nfunction createRetryAttempt(\n attemptStore: HostedAttemptStore,\n sourceAttempt: HostedAttemptRecord,\n idempotencyKey: string | undefined,\n): ProbeMeshAttemptMetadata {\n const originalCallId = sourceAttempt.attempt.originalCallId;\n const attemptNumber = (attemptStore.attemptCounts.get(originalCallId) ?? 1) + 1;\n const attemptId = idempotencyKey ?? `${originalCallId}:retry:${attemptNumber}`;\n\n return {\n originalCallId,\n attemptId,\n attemptNumber,\n isRetry: true,\n previousAttemptId: sourceAttempt.attempt.attemptId,\n };\n}\n\nfunction storeAttempt(\n attemptStore: HostedAttemptStore,\n record: HostedAttemptRecord,\n) {\n attemptStore.attempts.set(record.attempt.attemptId, record);\n attemptStore.attemptCounts.set(\n record.attempt.originalCallId,\n Math.max(\n attemptStore.attemptCounts.get(record.attempt.originalCallId) ?? 0,\n record.attempt.attemptNumber,\n ),\n );\n}\n\nfunction generateCallId() {\n return `call_${randomUUID()}`;\n}\n\nfunction createTimeline(routeId: string): ProbeMeshCallTimeline {\n return {\n routeId,\n events: [],\n };\n}\n\nfunction createTimelineAdapters(\n options: HostedRouterOptions,\n timeline: ProbeMeshCallTimeline,\n attempt: ProbeMeshAttemptMetadata,\n attestation?: ProviderCatalogPolicyBundleAttestation,\n): ProbeMeshAdapter[] {\n return options.adapters.map((adapter) => ({\n ...adapter,\n call(request: ProbeMeshAdapterCallRequest, context: ProbeMeshAdapterContext) {\n emitTelemetry(options, timeline, {\n type: \"provider.attempted\",\n callId: context.callId,\n capability: request.capability,\n provider: adapter.id,\n attempt,\n attestation,\n });\n\n return adapter.call(request, context);\n },\n }));\n}\n\nfunction assertAuthorized(request: IncomingMessage, apiKeys: string[] | undefined) {\n if (!apiKeys || apiKeys.length === 0) {\n return;\n }\n\n const authorization = request.headers.authorization;\n const token = authorization?.startsWith(\"Bearer \")\n ? authorization.slice(\"Bearer \".length)\n : undefined;\n\n if (!token || !apiKeys.includes(token)) {\n throw new ProbeMeshError({\n code: \"unauthorized\",\n message: \"Hosted router request requires a valid bearer token.\",\n });\n }\n}\n\nexport async function startHostedRouter(\n options: StartHostedRouterOptions,\n): Promise<StartedHostedRouter> {\n const router = createHostedRouter(options);\n const server = createServer((request, response) => {\n void router.handle(request, response);\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(options.port, options.host ?? \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n const address = server.address();\n const port = typeof address === \"object\" && address ? address.port : options.port;\n const host = options.host ?? \"127.0.0.1\";\n\n return {\n server,\n url: `http://${host}:${port}`,\n close() {\n return new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n },\n };\n}\n\nasync function readJsonBody(request: IncomingMessage): Promise<unknown> {\n const body = await readRawJsonBody(request);\n\n if (body === undefined) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Hosted call request body is required.\",\n });\n }\n\n return body;\n}\n\nasync function readOptionalJsonBody(request: IncomingMessage): Promise<unknown> {\n return (await readRawJsonBody(request)) ?? {};\n}\n\nasync function readRawJsonBody(request: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n const rawBody = Buffer.concat(chunks).toString(\"utf8\");\n\n if (rawBody.length === 0) {\n return undefined;\n }\n\n try {\n return JSON.parse(rawBody) as unknown;\n } catch (error) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Hosted call request body must be valid JSON.\",\n cause: error,\n });\n }\n}\n\nfunction validateRetryBody(\n callId: string,\n body: unknown,\n): ProbeMeshRetryRequest {\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Hosted retry request body must be an object when provided.\",\n callId,\n });\n }\n\n const candidate = body as Partial<ProbeMeshRetryRequest>;\n\n if (\n candidate.idempotencyKey !== undefined &&\n (typeof candidate.idempotencyKey !== \"string\" ||\n candidate.idempotencyKey.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Hosted retry idempotencyKey must be a non-empty string when provided.\",\n callId,\n });\n }\n\n return {\n callId,\n idempotencyKey: candidate.idempotencyKey,\n };\n}\n\nfunction addHostedRouteMetadata<Data>(\n response: ProbeMeshCallResponse<Data>,\n routeId: string,\n timeline: ProbeMeshCallTimeline,\n retrySafety: ProbeMeshRetrySafety,\n attempt: ProbeMeshAttemptMetadata,\n explanation?: ProbeMeshRouteExplanation,\n attestation?: ProviderCatalogPolicyBundleAttestation,\n paymentSelection?: ProbeMeshPaymentSelection,\n paymentStrategy?: ProbeMeshPaymentStrategy,\n): ProbeMeshCallResponse<Data> {\n return {\n ...response,\n timeline,\n retrySafety,\n attempt,\n route: createRouteMetadata(\n routeId,\n explanation ?? {\n consideredProviders: [response.provider.id],\n selectedProviderId: response.provider.id,\n fallbackUsed: false,\n fallbackCount: 0,\n stopReason: \"stopped_completed\",\n attempts: [\n {\n providerId: response.provider.id,\n status: \"succeeded\",\n reason: \"selected\",\n paymentEvidence: hasPaymentEvidence(\n response.safety,\n response.receiptRefs,\n ),\n },\n ],\n },\n response.provider.id,\n attestation,\n paymentSelection ?? response.route?.paymentSelection,\n paymentStrategy,\n ),\n };\n}\n\nfunction writeHostedError(\n response: ServerResponse,\n error: unknown,\n timeline: ProbeMeshCallTimeline,\n retrySafety: ProbeMeshRetrySafety,\n attempt?: ProbeMeshAttemptMetadata,\n route?: ProbeMeshRouteMetadata,\n) {\n const normalizedError = toHostedProbeMeshError(error);\n\n writeJson(response, statusCodeForError(normalizedError.code), {\n ...normalizedError.toJSON(),\n timeline,\n retrySafety,\n attempt: normalizedError.attempt ?? attempt,\n route: normalizedError.route ?? route,\n });\n}\n\nfunction toHostedProbeMeshError(error: unknown) {\n if (isProbeMeshError(error)) {\n return error;\n }\n\n return new ProbeMeshError({\n code: \"provider_unavailable\",\n message: \"Hosted router failed while handling the call.\",\n cause: error,\n });\n}\n\nfunction retrySafetyForCompletedCall(): ProbeMeshRetrySafety {\n return {\n retryable: false,\n safeToAutoRetry: false,\n reason: \"completed\",\n };\n}\n\nfunction notRetryableSafety(): ProbeMeshRetrySafety {\n return {\n retryable: false,\n safeToAutoRetry: false,\n reason: \"not_retryable\",\n };\n}\n\nfunction retrySafetyForError(error: unknown): ProbeMeshRetrySafety {\n if (!isProbeMeshError(error)) {\n return {\n retryable: true,\n safeToAutoRetry: true,\n reason: \"no_payment_attempted\",\n };\n }\n\n if (\n error.code === \"budget_exceeded\" ||\n error.code === \"unauthorized\" ||\n error.code === \"invalid_request\" ||\n error.code === \"retry_not_available\"\n ) {\n return {\n retryable: false,\n safeToAutoRetry: false,\n reason: \"not_retryable\",\n };\n }\n\n if (moneyMayHaveMoved(error.safety, error.receiptRefs)) {\n return {\n retryable: false,\n safeToAutoRetry: false,\n reason: \"money_may_have_moved\",\n };\n }\n\n if (\n error.code === \"payment_failed\" &&\n error.safety?.moneyMayHaveMoved === false\n ) {\n return {\n retryable: true,\n safeToAutoRetry: true,\n reason: \"payment_failed_no_charge\",\n };\n }\n\n if (\n (error.code === \"provider_unavailable\" ||\n error.code === \"provider_timeout\") &&\n !hasPaymentEvidence(error.safety, error.receiptRefs)\n ) {\n return {\n retryable: true,\n safeToAutoRetry: true,\n reason: \"no_payment_attempted\",\n };\n }\n\n return {\n retryable: true,\n safeToAutoRetry: false,\n reason: \"unknown_payment_state\",\n };\n}\n\nfunction moneyMayHaveMoved(\n safety: ProbeMeshCallSafety | undefined,\n receiptRefs: ReceiptRef[] | undefined,\n) {\n return (\n safety?.moneyMayHaveMoved === true ||\n receiptRefs?.some((receiptRef) => receiptRef.type === \"payment_proof\") ===\n true\n );\n}\n\nfunction hasPaymentEvidence(\n safety: ProbeMeshCallSafety | undefined,\n receiptRefs: ReceiptRef[] | undefined,\n) {\n return moneyMayHaveMoved(safety, receiptRefs);\n}\n\nfunction getPricing(adapter: ProbeMeshAdapter, capability: string) {\n if (!adapter.pricing) {\n return undefined;\n }\n\n const pricing = adapter.pricing as Partial<ProbeMeshPricing>;\n\n if (\n typeof pricing.amountUsd === \"number\" &&\n typeof pricing.unit === \"string\"\n ) {\n return pricing as ProbeMeshPricing;\n }\n\n return (adapter.pricing as Record<string, ProbeMeshPricing>)[capability];\n}\n\nfunction pricingToCost(pricing: ProbeMeshPricing | undefined): Cost | undefined {\n if (!pricing) {\n return undefined;\n }\n\n return {\n amountUsd: pricing.amountUsd,\n currency: pricing.currency ?? \"USD\",\n unit: pricing.unit,\n };\n}\n\nfunction emitFailureTelemetry(\n options: HostedRouterOptions,\n timeline: ProbeMeshCallTimeline,\n error: unknown,\n attempt?: ProbeMeshAttemptMetadata,\n attestation?: ProviderCatalogPolicyBundleAttestation,\n) {\n if (!isProbeMeshError(error)) {\n emitTelemetry(options, timeline, {\n type: \"call.failed\",\n status: \"failed\",\n errorCode: \"provider_unavailable\",\n attempt,\n attestation,\n });\n return;\n }\n\n emitTelemetry(options, timeline, {\n type: \"call.failed\",\n callId: error.callId,\n capability: error.capability,\n provider: error.provider,\n status: \"failed\",\n errorCode: error.code,\n safety: error.safety,\n attempt: error.attempt ?? attempt,\n attestation,\n });\n}\n\nasync function emitCallAuditArtifact(\n options: HostedRouterOptions,\n details: {\n request: ProbeMeshCallRequest;\n response?: ProbeMeshCallResponse;\n error?: ProbeMeshError;\n timeline: ProbeMeshCallTimeline;\n retrySafety: ProbeMeshRetrySafety;\n attempt: ProbeMeshAttemptMetadata;\n route?: ProbeMeshRouteMetadata;\n },\n) {\n if (\n !options.auditArtifacts ||\n options.auditArtifacts.enabled === false ||\n !options.auditArtifacts.onArtifact\n ) {\n return;\n }\n\n try {\n const artifact = createProbeMeshCallAuditArtifact({\n request: details.request,\n response: details.response,\n error: details.error,\n timeline: details.timeline,\n retrySafety: details.retrySafety,\n attempt: details.attempt,\n route: details.route,\n });\n\n await options.auditArtifacts.onArtifact(artifact);\n } catch {\n // Audit callbacks must never alter the hosted call result.\n }\n}\n\nfunction emitPaymentAndReceiptTelemetry(\n options: HostedRouterOptions,\n timeline: ProbeMeshCallTimeline,\n details: {\n callId?: string;\n capability?: string;\n provider?: string;\n safety?: ProbeMeshCallSafety;\n receiptRefs?: ReceiptRef[];\n attempt?: ProbeMeshAttemptMetadata;\n attestation?: ProviderCatalogPolicyBundleAttestation;\n },\n) {\n if (shouldEmitPaymentAttempted(details.safety, details.receiptRefs)) {\n emitTelemetry(options, timeline, {\n type: \"payment.attempted\",\n callId: details.callId,\n capability: details.capability,\n provider: details.provider,\n safety: details.safety,\n attempt: details.attempt,\n attestation: details.attestation,\n });\n }\n\n for (const receiptRef of details.receiptRefs ?? []) {\n emitTelemetry(options, timeline, {\n type: \"receipt.recorded\",\n callId: details.callId,\n capability: details.capability,\n provider: receiptRef.provider,\n receiptRef,\n safety: details.safety,\n attempt: details.attempt,\n attestation: details.attestation,\n });\n }\n}\n\nfunction shouldEmitPaymentAttempted(\n safety: ProbeMeshCallSafety | undefined,\n receiptRefs: ReceiptRef[] | undefined,\n) {\n return (\n safety?.paymentStatus === \"authorized\" ||\n safety?.paymentStatus === \"failed\" ||\n safety?.moneyMayHaveMoved === true ||\n receiptRefs?.some((receiptRef) => receiptRef.type === \"payment_proof\") ===\n true\n );\n}\n\nfunction emitTelemetry(\n options: HostedRouterOptions,\n timeline: ProbeMeshCallTimeline,\n event: Omit<HostedTelemetryEvent, \"routeId\" | \"timestamp\">,\n) {\n const timelineEvent: HostedTelemetryEvent = {\n ...event,\n routeId: timeline.routeId,\n timestamp: new Date().toISOString(),\n };\n\n timeline.events.push(timelineEvent);\n options.onTelemetryEvent?.(timelineEvent);\n}\n\nfunction statusCodeForError(code: ProbeMeshErrorCode) {\n switch (code) {\n case \"unauthorized\":\n return 401;\n case \"invalid_request\":\n return 400;\n case \"retry_not_available\":\n return 409;\n case \"budget_exceeded\":\n case \"receipt_missing\":\n case \"invalid_provider_response\":\n return 422;\n case \"provider_timeout\":\n case \"timeout_after_payment\":\n return 504;\n case \"provider_unavailable\":\n default:\n return 503;\n }\n}\n\nfunction writeJson(response: ServerResponse, statusCode: number, body: unknown) {\n response.statusCode = statusCode;\n response.setHeader(\"content-type\", \"application/json\");\n response.end(JSON.stringify(body));\n}\n","import { createHash } from \"node:crypto\";\n\nimport { ProbeMeshError, isProbeMeshError } from \"./errors\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport type {\n CallStatus,\n Cost,\n ProbeMeshAttemptMetadata,\n ProbeMeshCallRequest,\n ProbeMeshCallResponse,\n ProbeMeshCallSafety,\n ProbeMeshCallTimeline,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteMetadata,\n ProbeMeshTimelineEventType,\n ReceiptRef,\n} from \"./types\";\n\nexport const PROBEMESH_CALL_AUDIT_ARTIFACT_SCHEMA_VERSION =\n \"probemesh.call-audit.v1\" as const;\n\nexport type ProbeMeshCallAuditArtifactStatus = \"completed\" | \"failed\";\n\nexport type ProbeMeshCallAuditArtifactFormat = \"json\" | \"markdown\";\n\nexport interface ProbeMeshCallAuditArtifactOptions {\n request: ProbeMeshCallRequest;\n response?: ProbeMeshCallResponse;\n error?: ProbeMeshError;\n generatedAt?: string;\n artifactId?: string;\n forbiddenOutputValues?: string[];\n timeline?: ProbeMeshCallTimeline;\n retrySafety?: ProbeMeshRetrySafety;\n attempt?: ProbeMeshAttemptMetadata;\n route?: ProbeMeshRouteMetadata;\n}\n\nexport interface ProbeMeshCallAuditArtifactHashes {\n request: string;\n route: string;\n timeline: string;\n receipts: string;\n safety: string;\n retrySafety: string;\n artifact: string;\n}\n\nexport interface ProbeMeshCallAuditArtifactReceiptSummary {\n total: number;\n types: string[];\n providers: string[];\n byType: Record<string, number>;\n hasPaymentProof: boolean;\n hasSettlementConfirmation: boolean;\n hasProviderDelivery: boolean;\n}\n\nexport interface ProbeMeshCallAuditArtifactTimelineEvent {\n type: ProbeMeshTimelineEventType;\n timestamp: string;\n provider?: string;\n status?: CallStatus;\n errorCode?: ProbeMeshErrorCode;\n receiptType?: string;\n attestationBundleId?: string;\n}\n\nexport interface ProbeMeshCallAuditArtifactTimelineSummary {\n routeId?: string;\n eventTypes: ProbeMeshTimelineEventType[];\n events: ProbeMeshCallAuditArtifactTimelineEvent[];\n}\n\nexport interface ProbeMeshCallAuditArtifactCallSummary {\n callId?: string;\n capability: string;\n status: ProbeMeshCallAuditArtifactStatus;\n providerId?: string;\n errorCode?: ProbeMeshErrorCode;\n cost?: Cost;\n latencyMs?: number;\n attempt?: ProbeMeshAttemptMetadata;\n}\n\nexport interface ProbeMeshCallAuditArtifactRequestProof {\n requestHash: string;\n idempotencyKey?: string;\n}\n\nexport interface ProbeMeshCallAuditArtifactEvidence {\n receiptSummary: ProbeMeshCallAuditArtifactReceiptSummary;\n receiptRefs: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProbeMeshRouteMetadata;\n timeline: ProbeMeshCallAuditArtifactTimelineSummary;\n}\n\nexport interface ProbeMeshCallAuditArtifact {\n schemaVersion: typeof PROBEMESH_CALL_AUDIT_ARTIFACT_SCHEMA_VERSION;\n artifactId: string;\n generatedAt: string;\n status: ProbeMeshCallAuditArtifactStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProbeMeshCallAuditArtifactHashes;\n call: ProbeMeshCallAuditArtifactCallSummary;\n request: ProbeMeshCallAuditArtifactRequestProof;\n evidence: ProbeMeshCallAuditArtifactEvidence;\n}\n\nexport interface ProbeMeshCallAuditArtifactValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProbeMeshCallAuditArtifactValidationResult {\n valid: boolean;\n errors: ProbeMeshCallAuditArtifactValidationError[];\n}\n\nexport function createProbeMeshCallAuditArtifact(\n options: ProbeMeshCallAuditArtifactOptions,\n): ProbeMeshCallAuditArtifact {\n assertAuditArtifactOptions(options);\n\n const requestHash = hashStableJson(options.request);\n const status: ProbeMeshCallAuditArtifactStatus = options.response\n ? \"completed\"\n : \"failed\";\n const callId = options.response?.callId ?? options.error?.callId;\n const capability =\n options.response?.capability ?? options.error?.capability ?? options.request.capability;\n const receiptRefs = cloneSerializable(\n options.response?.receiptRefs ?? options.error?.receiptRefs ?? [],\n );\n const safety = cloneSerializable(\n options.response?.safety ?? options.error?.safety,\n );\n const retrySafety = cloneSerializable(\n options.retrySafety ??\n options.response?.retrySafety ??\n options.error?.retrySafety,\n );\n const attempt = cloneSerializable(\n options.attempt ?? options.response?.attempt ?? options.error?.attempt,\n );\n const route = cloneSerializable(\n options.route ?? options.response?.route ?? options.error?.route,\n );\n const timeline = cloneSerializable(\n options.timeline ?? options.response?.timeline ?? options.error?.timeline,\n );\n const timelineSummary = summarizeTimeline(timeline);\n const baseContent = sanitizeAuditOutput(\n {\n schemaVersion: PROBEMESH_CALL_AUDIT_ARTIFACT_SCHEMA_VERSION,\n artifactId:\n options.artifactId ??\n `call_audit_${callId ?? requestHash.slice(0, 16)}`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status,\n hashAlgorithm: \"sha256\" as const,\n call: {\n callId,\n capability,\n status,\n providerId: options.response?.provider.id ?? options.error?.provider,\n errorCode: options.error?.code,\n cost: cloneSerializable(options.response?.cost),\n latencyMs: options.response?.latencyMs,\n attempt,\n },\n request: {\n requestHash,\n idempotencyKey: options.request.idempotencyKey,\n },\n evidence: {\n receiptSummary: summarizeAuditReceipts(receiptRefs),\n receiptRefs,\n safety,\n retrySafety,\n route,\n timeline: timelineSummary,\n },\n },\n options.forbiddenOutputValues ?? [],\n );\n const hashesWithoutArtifact: ProbeMeshCallAuditArtifactHashes = {\n request: requestHash,\n route: hashStableJson(baseContent.evidence.route ?? null),\n timeline: hashStableJson(baseContent.evidence.timeline),\n receipts: hashStableJson(baseContent.evidence.receiptRefs),\n safety: hashStableJson(baseContent.evidence.safety ?? null),\n retrySafety: hashStableJson(baseContent.evidence.retrySafety ?? null),\n artifact: \"\",\n };\n const artifact: ProbeMeshCallAuditArtifact = {\n ...baseContent,\n hashes: {\n ...hashesWithoutArtifact,\n artifact: hashArtifactContent({\n ...baseContent,\n hashes: hashesWithoutArtifact,\n }),\n },\n };\n\n assertProbeMeshCallAuditArtifact(artifact);\n\n return artifact;\n}\n\nexport function validateProbeMeshCallAuditArtifact(\n artifact: unknown,\n): ProbeMeshCallAuditArtifactValidationResult {\n const errors: ProbeMeshCallAuditArtifactValidationError[] = [];\n\n if (!isRecord(artifact)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"ProbeMesh call audit artifact must be an object.\",\n },\n ],\n };\n }\n\n if (artifact.schemaVersion !== PROBEMESH_CALL_AUDIT_ARTIFACT_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROBEMESH_CALL_AUDIT_ARTIFACT_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(artifact.artifactId, \"artifactId\", errors);\n validateIsoTimestamp(artifact.generatedAt, \"generatedAt\", errors);\n\n if (artifact.status !== \"completed\" && artifact.status !== \"failed\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"completed\" or \"failed\".',\n });\n }\n\n if (artifact.hashAlgorithm !== \"sha256\") {\n errors.push({\n path: \"hashAlgorithm\",\n message: 'hashAlgorithm must be \"sha256\".',\n });\n }\n\n validateHashes(artifact.hashes, errors);\n validateCallSummary(artifact.call, artifact.status, errors);\n validateRequestProof(artifact.request, artifact.hashes, errors);\n validateEvidence(artifact.evidence, errors);\n\n if (errors.length === 0) {\n const typedArtifact = artifact as unknown as ProbeMeshCallAuditArtifact;\n\n pushHashMismatch(\n errors,\n \"hashes.route\",\n typedArtifact.hashes.route,\n hashStableJson(typedArtifact.evidence.route ?? null),\n );\n pushHashMismatch(\n errors,\n \"hashes.timeline\",\n typedArtifact.hashes.timeline,\n hashStableJson(typedArtifact.evidence.timeline),\n );\n pushHashMismatch(\n errors,\n \"hashes.receipts\",\n typedArtifact.hashes.receipts,\n hashStableJson(typedArtifact.evidence.receiptRefs),\n );\n pushHashMismatch(\n errors,\n \"hashes.safety\",\n typedArtifact.hashes.safety,\n hashStableJson(typedArtifact.evidence.safety ?? null),\n );\n pushHashMismatch(\n errors,\n \"hashes.retrySafety\",\n typedArtifact.hashes.retrySafety,\n hashStableJson(typedArtifact.evidence.retrySafety ?? null),\n );\n pushHashMismatch(\n errors,\n \"hashes.artifact\",\n typedArtifact.hashes.artifact,\n hashArtifactContent(typedArtifact),\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProbeMeshCallAuditArtifact(\n artifact: unknown,\n): asserts artifact is ProbeMeshCallAuditArtifact {\n const result = validateProbeMeshCallAuditArtifact(artifact);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid ProbeMesh call audit artifact: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProbeMeshCallAuditArtifact(\n artifact: ProbeMeshCallAuditArtifact,\n options: {\n format?: ProbeMeshCallAuditArtifactFormat;\n } = {},\n) {\n assertProbeMeshCallAuditArtifact(artifact);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatAuditArtifactMarkdown(artifact);\n }\n\n return JSON.stringify(artifact, null, 2);\n}\n\nfunction assertAuditArtifactOptions(\n options: ProbeMeshCallAuditArtifactOptions,\n): asserts options is ProbeMeshCallAuditArtifactOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact options must be an object.\",\n });\n }\n\n if (!isRecord(options.request)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact request must be an object.\",\n });\n }\n\n if (\n typeof options.request.capability !== \"string\" ||\n options.request.capability.length === 0\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact request capability is required.\",\n });\n }\n\n if (!(\"input\" in options.request)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact request input is required for hashing.\",\n });\n }\n\n if (\n (options.response === undefined && options.error === undefined) ||\n (options.response !== undefined && options.error !== undefined)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"ProbeMesh call audit artifact requires exactly one response or error.\",\n });\n }\n\n if (options.error !== undefined && !isProbeMeshError(options.error)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact error must be a ProbeMeshError.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact generatedAt must be an ISO timestamp.\",\n });\n }\n\n if (\n options.artifactId !== undefined &&\n (typeof options.artifactId !== \"string\" || options.artifactId.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call audit artifact artifactId must be a non-empty string.\",\n });\n }\n\n if (\n options.forbiddenOutputValues !== undefined &&\n (!Array.isArray(options.forbiddenOutputValues) ||\n options.forbiddenOutputValues.some((value) => typeof value !== \"string\"))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"ProbeMesh call audit artifact forbiddenOutputValues must be an array of strings.\",\n });\n }\n}\n\nfunction summarizeAuditReceipts(\n receiptRefs: ReceiptRef[],\n): ProbeMeshCallAuditArtifactReceiptSummary {\n const types: string[] = [];\n const providers: string[] = [];\n const byType: Record<string, number> = {};\n\n for (const receiptRef of receiptRefs) {\n if (!types.includes(receiptRef.type)) {\n types.push(receiptRef.type);\n }\n\n if (!providers.includes(receiptRef.provider)) {\n providers.push(receiptRef.provider);\n }\n\n byType[receiptRef.type] = (byType[receiptRef.type] ?? 0) + 1;\n }\n\n return {\n total: receiptRefs.length,\n types,\n providers,\n byType,\n hasPaymentProof: receiptRefs.some(\n (receiptRef) => receiptRef.type === \"payment_proof\",\n ),\n hasSettlementConfirmation: receiptRefs.some(\n (receiptRef) => receiptRef.type === \"settlement_confirmation\",\n ),\n hasProviderDelivery: receiptRefs.some(\n (receiptRef) => receiptRef.type === \"provider_delivery\",\n ),\n };\n}\n\nfunction summarizeTimeline(\n timeline: ProbeMeshCallTimeline | undefined,\n): ProbeMeshCallAuditArtifactTimelineSummary {\n if (!timeline) {\n return {\n eventTypes: [],\n events: [],\n };\n }\n\n return {\n routeId: timeline.routeId,\n eventTypes: timeline.events.map((event) => event.type),\n events: timeline.events.map((event) => ({\n type: event.type,\n timestamp: event.timestamp,\n provider: event.provider,\n status: event.status,\n errorCode: event.errorCode,\n receiptType: event.receiptRef?.type,\n attestationBundleId: event.attestation?.bundleId,\n })),\n };\n}\n\nfunction validateHashes(\n hashes: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!isRecord(hashes)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const key of [\n \"request\",\n \"route\",\n \"timeline\",\n \"receipts\",\n \"safety\",\n \"retrySafety\",\n \"artifact\",\n ]) {\n validateSha256String(hashes[key], `hashes.${key}`, errors);\n }\n}\n\nfunction validateCallSummary(\n call: unknown,\n status: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!isRecord(call)) {\n errors.push({\n path: \"call\",\n message: \"call must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(call.capability, \"call.capability\", errors);\n\n if (call.status !== status) {\n errors.push({\n path: \"call.status\",\n message: \"call.status must match artifact status.\",\n });\n }\n\n if (call.callId !== undefined) {\n validateNonEmptyString(call.callId, \"call.callId\", errors);\n }\n\n if (call.providerId !== undefined) {\n validateNonEmptyString(call.providerId, \"call.providerId\", errors);\n }\n\n if (\n call.errorCode !== undefined &&\n (typeof call.errorCode !== \"string\" || call.errorCode.length === 0)\n ) {\n errors.push({\n path: \"call.errorCode\",\n message: \"call.errorCode must be a non-empty string when provided.\",\n });\n }\n\n if (\n call.latencyMs !== undefined &&\n (typeof call.latencyMs !== \"number\" ||\n !Number.isFinite(call.latencyMs) ||\n call.latencyMs < 0)\n ) {\n errors.push({\n path: \"call.latencyMs\",\n message: \"call.latencyMs must be a non-negative finite number.\",\n });\n }\n}\n\nfunction validateRequestProof(\n request: unknown,\n hashes: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!isRecord(request)) {\n errors.push({\n path: \"request\",\n message: \"request must be an object.\",\n });\n return;\n }\n\n validateSha256String(request.requestHash, \"request.requestHash\", errors);\n\n if (isRecord(hashes) && hashes.request !== request.requestHash) {\n errors.push({\n path: \"hashes.request\",\n message: \"hashes.request must equal request.requestHash.\",\n });\n }\n\n if (request.idempotencyKey !== undefined) {\n validateNonEmptyString(\n request.idempotencyKey,\n \"request.idempotencyKey\",\n errors,\n );\n }\n}\n\nfunction validateEvidence(\n evidence: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!isRecord(evidence)) {\n errors.push({\n path: \"evidence\",\n message: \"evidence must be an object.\",\n });\n return;\n }\n\n validateReceiptSummary(evidence.receiptSummary, errors);\n validateReceiptRefs(evidence.receiptRefs, errors);\n validateTimelineSummary(evidence.timeline, errors);\n}\n\nfunction validateReceiptSummary(\n summary: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!isRecord(summary)) {\n errors.push({\n path: \"evidence.receiptSummary\",\n message: \"evidence.receiptSummary must be an object.\",\n });\n return;\n }\n\n if (typeof summary.total !== \"number\" || !Number.isFinite(summary.total)) {\n errors.push({\n path: \"evidence.receiptSummary.total\",\n message: \"evidence.receiptSummary.total must be a number.\",\n });\n }\n\n validateStringArray(summary.types, \"evidence.receiptSummary.types\", errors);\n validateStringArray(\n summary.providers,\n \"evidence.receiptSummary.providers\",\n errors,\n );\n\n if (!isRecord(summary.byType)) {\n errors.push({\n path: \"evidence.receiptSummary.byType\",\n message: \"evidence.receiptSummary.byType must be an object.\",\n });\n }\n\n for (const key of [\n \"hasPaymentProof\",\n \"hasSettlementConfirmation\",\n \"hasProviderDelivery\",\n ]) {\n if (typeof summary[key] !== \"boolean\") {\n errors.push({\n path: `evidence.receiptSummary.${key}`,\n message: `evidence.receiptSummary.${key} must be a boolean.`,\n });\n }\n }\n}\n\nfunction validateReceiptRefs(\n receiptRefs: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!Array.isArray(receiptRefs)) {\n errors.push({\n path: \"evidence.receiptRefs\",\n message: \"evidence.receiptRefs must be an array.\",\n });\n return;\n }\n\n receiptRefs.forEach((receiptRef, index) => {\n if (!isRecord(receiptRef)) {\n errors.push({\n path: `evidence.receiptRefs.${index}`,\n message: \"receipt ref must be an object.\",\n });\n return;\n }\n\n for (const key of [\"type\", \"provider\", \"status\", \"ref\", \"timestamp\"]) {\n validateNonEmptyString(\n receiptRef[key],\n `evidence.receiptRefs.${index}.${key}`,\n errors,\n );\n }\n });\n}\n\nfunction validateTimelineSummary(\n timeline: unknown,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (!isRecord(timeline)) {\n errors.push({\n path: \"evidence.timeline\",\n message: \"evidence.timeline must be an object.\",\n });\n return;\n }\n\n if (timeline.routeId !== undefined) {\n validateNonEmptyString(timeline.routeId, \"evidence.timeline.routeId\", errors);\n }\n\n validateStringArray(\n timeline.eventTypes,\n \"evidence.timeline.eventTypes\",\n errors,\n );\n\n if (!Array.isArray(timeline.events)) {\n errors.push({\n path: \"evidence.timeline.events\",\n message: \"evidence.timeline.events must be an array.\",\n });\n return;\n }\n\n timeline.events.forEach((event, index) => {\n if (!isRecord(event)) {\n errors.push({\n path: `evidence.timeline.events.${index}`,\n message: \"timeline event must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(\n event.type,\n `evidence.timeline.events.${index}.type`,\n errors,\n );\n validateIsoTimestamp(\n event.timestamp,\n `evidence.timeline.events.${index}.timestamp`,\n errors,\n );\n });\n}\n\nfunction hashArtifactContent(artifact: ProbeMeshCallAuditArtifact) {\n return hashStableJson({\n ...artifact,\n hashes: {\n ...artifact.hashes,\n artifact: \"\",\n },\n });\n}\n\nfunction pushHashMismatch(\n errors: ProbeMeshCallAuditArtifactValidationError[],\n path: string,\n expected: string,\n actual: string,\n) {\n if (expected === actual) {\n return;\n }\n\n errors.push({\n path,\n message: `${path} does not match artifact content.`,\n });\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortSerializable(value));\n}\n\nfunction sortSerializable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortSerializable);\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .filter((key) => value[key] !== undefined)\n .map((key) => [key, sortSerializable(value[key])]),\n );\n}\n\nfunction sanitizeAuditOutput<T>(value: T, forbiddenOutputValues: string[]) {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(cloneSerializable(value), forbiddenValues),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => replaceForbiddenValues(entry, forbiddenValues));\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues),\n ]),\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction formatAuditArtifactMarkdown(artifact: ProbeMeshCallAuditArtifact) {\n const attestation = artifact.evidence.route?.attestation;\n\n return [\n `# ProbeMesh Call Audit Artifact`,\n ``,\n `Status: ${artifact.status}`,\n `Schema: ${artifact.schemaVersion}`,\n `Artifact ID: ${artifact.artifactId}`,\n `Generated: ${artifact.generatedAt}`,\n ``,\n `## Call`,\n `- Call ID: ${artifact.call.callId ?? \"none\"}`,\n `- Capability: ${artifact.call.capability}`,\n `- Provider: ${artifact.call.providerId ?? \"none\"}`,\n `- Error code: ${artifact.call.errorCode ?? \"none\"}`,\n `- Cost USD: ${artifact.call.cost?.amountUsd ?? \"none\"}`,\n `- Request hash: ${artifact.request.requestHash}`,\n ``,\n `## Evidence`,\n `- Receipts: ${artifact.evidence.receiptSummary.total}`,\n `- Receipt types: ${formatInlineList(artifact.evidence.receiptSummary.types)}`,\n `- Payment proof: ${String(artifact.evidence.receiptSummary.hasPaymentProof)}`,\n `- Settlement confirmation: ${String(\n artifact.evidence.receiptSummary.hasSettlementConfirmation,\n )}`,\n `- Provider delivery: ${String(\n artifact.evidence.receiptSummary.hasProviderDelivery,\n )}`,\n `- Money may have moved: ${String(\n artifact.evidence.safety?.moneyMayHaveMoved ?? false,\n )}`,\n `- Retry safe: ${String(\n artifact.evidence.retrySafety?.safeToAutoRetry ?? false,\n )}`,\n `- Route stop: ${\n artifact.evidence.route?.explanation?.stopReason ?? \"none\"\n }`,\n `- Bundle: ${attestation?.bundleId ?? \"none\"}`,\n `- Bundle verified: ${String(attestation?.runtimeVerified ?? false)}`,\n `- Timeline events: ${formatInlineList(\n artifact.evidence.timeline.eventTypes,\n )}`,\n ``,\n `## Hashes`,\n `- Artifact: ${artifact.hashes.artifact}`,\n `- Route: ${artifact.hashes.route}`,\n `- Timeline: ${artifact.hashes.timeline}`,\n `- Receipts: ${artifact.hashes.receipts}`,\n ].join(\"\\n\");\n}\n\nfunction formatInlineList(values: string[]) {\n return values.length === 0 ? \"none\" : values.join(\", \");\n}\n\nfunction validateSha256String(\n value: unknown,\n path: string,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n errors.push({\n path,\n message: `${path} must be a sha256 hex string.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProbeMeshCallAuditArtifactValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction formatValidationErrors(errors: ProbeMeshCallAuditArtifactValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport { ProbeMeshError, isProbeMeshError } from \"./errors\";\nimport {\n paymentSelectionToCost,\n resolveProviderPaymentOption,\n validatePaymentPreferences,\n validatePaymentStrategy,\n} from \"./paymentOptions\";\nimport type {\n Cost,\n ProbeMeshAttemptMetadata,\n ProbeMeshAdapter,\n ProbeMeshAdapterCallResult,\n ProbeMeshCallRequest,\n ProbeMeshCallResponse,\n ProbeMeshCallSafety,\n ProbeMeshCallTimeline,\n ProbeMeshClient,\n ProbeMeshClientOptions,\n ProbeMeshConstraints,\n ProbeMeshErrorCode,\n ProbeMeshHostedClientOptions,\n ProbeMeshPricing,\n ProbeMeshRetryRequest,\n ProbeMeshRetrySafety,\n ProbeMeshRouteMetadata,\n ProbeMeshPaymentSelection,\n ReceiptRef,\n} from \"./types\";\n\nexport function createProbeMesh(options: ProbeMeshClientOptions): ProbeMeshClient {\n validateClientOptions(options);\n\n if (options.hosted) {\n return createHostedProbeMeshClient(options.hosted);\n }\n\n const adapters = [...options.adapters];\n\n return {\n async call<Input = unknown, Data = unknown>(\n request: ProbeMeshCallRequest<Input>,\n ): Promise<ProbeMeshCallResponse<Data>> {\n validateCallRequest(request);\n\n const callId = request.idempotencyKey ?? generateCallId();\n const startedAt = new Date();\n const startTimeMs = Date.now();\n const adapterSelection = selectAdapter(adapters, request);\n const adapter = adapterSelection?.adapter;\n const paymentSelection = adapterSelection?.paymentSelection;\n const abortController = new AbortController();\n\n if (!adapter) {\n throw new ProbeMeshError({\n code: \"provider_unavailable\",\n message: `No adapter is available for capability \"${request.capability}\".`,\n capability: request.capability,\n callId,\n });\n }\n\n enforceBudget(\n request.constraints,\n adapter,\n request.capability,\n callId,\n paymentSelection,\n );\n\n try {\n const result = await withLatencyLimit(\n adapter.call(\n {\n ...request,\n callId,\n },\n {\n callId,\n startedAt,\n signal: abortController.signal,\n constraints: request.constraints,\n providerPreferences: request.providerPreferences,\n paymentPreferences: request.paymentPreferences,\n paymentStrategy: request.paymentStrategy,\n paymentSelection,\n },\n ),\n request,\n adapter,\n callId,\n abortController,\n );\n\n const normalizedResult = validateAdapterResult(\n result,\n adapter,\n request.capability,\n callId,\n );\n const receiptRefs = normalizedResult.receiptRefs ?? [];\n\n if (request.constraints?.requireReceipt && receiptRefs.length === 0) {\n throw new ProbeMeshError({\n code: \"receipt_missing\",\n message: `Adapter \"${adapter.id}\" did not return a receipt for capability \"${request.capability}\".`,\n capability: request.capability,\n provider: adapter.id,\n callId,\n });\n }\n\n return {\n callId,\n capability: request.capability,\n data: normalizedResult.data as Data,\n provider: {\n id: normalizedResult.provider?.id ?? adapter.id,\n mode: normalizedResult.provider?.mode ?? adapter.mode ?? \"local\",\n displayName:\n normalizedResult.provider?.displayName ?? adapter.displayName,\n },\n cost:\n normalizedResult.cost ??\n paymentSelectionToCost(paymentSelection) ??\n pricingToCost(getPricing(adapter, request.capability)),\n latencyMs: Date.now() - startTimeMs,\n receiptRefs,\n safety: normalizedResult.safety,\n status: \"completed\",\n };\n } catch (error) {\n if (isProbeMeshError(error)) {\n throw error;\n }\n\n throw new ProbeMeshError({\n code: \"provider_unavailable\",\n message: `Adapter \"${adapter.id}\" failed while handling capability \"${request.capability}\".`,\n capability: request.capability,\n provider: adapter.id,\n callId,\n cause: error,\n });\n }\n },\n async retry() {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh retry is only available for hosted clients.\",\n });\n },\n };\n}\n\nfunction createHostedProbeMeshClient(\n options: ProbeMeshHostedClientOptions,\n): ProbeMeshClient {\n const endpoint = new URL(\"/v1/calls\", ensureTrailingSlash(options.baseUrl));\n\n return {\n async call<Input = unknown, Data = unknown>(\n request: ProbeMeshCallRequest<Input>,\n ): Promise<ProbeMeshCallResponse<Data>> {\n validateCallRequest(request);\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(options.apiKey\n ? {\n authorization: `Bearer ${options.apiKey}`,\n }\n : {}),\n },\n body: JSON.stringify(request),\n });\n const body = await readHostedJson(response);\n\n if (!response.ok) {\n throw hostedErrorToProbeMeshError(body, response.status);\n }\n\n return validateHostedResponse(body);\n },\n async retry<Data = unknown>(\n request: ProbeMeshRetryRequest,\n ): Promise<ProbeMeshCallResponse<Data>> {\n validateRetryRequest(request);\n\n const retryEndpoint = new URL(\n `/v1/calls/${encodeURIComponent(request.callId)}/retry`,\n ensureTrailingSlash(options.baseUrl),\n );\n const response = await fetch(retryEndpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(options.apiKey\n ? {\n authorization: `Bearer ${options.apiKey}`,\n }\n : {}),\n },\n body: JSON.stringify({\n idempotencyKey: request.idempotencyKey,\n }),\n });\n const body = await readHostedJson(response);\n\n if (!response.ok) {\n throw hostedErrorToProbeMeshError(body, response.status);\n }\n\n return validateHostedResponse(body);\n },\n };\n}\n\nfunction validateClientOptions(\n options: ProbeMeshClientOptions,\n): asserts options is\n | (ProbeMeshClientOptions & { adapters: ProbeMeshAdapter[]; hosted?: never })\n | (ProbeMeshClientOptions & { adapters?: never; hosted: ProbeMeshHostedClientOptions }) {\n if (!options || typeof options !== \"object\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh client options must be an object.\",\n });\n }\n\n const hasAdapters = options.adapters !== undefined;\n const hasHosted = options.hosted !== undefined;\n\n if (hasAdapters && hasHosted) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Use either adapters or hosted options, not both.\",\n });\n }\n\n if (!hasAdapters && !hasHosted) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh client requires adapters or hosted options.\",\n });\n }\n\n if (hasAdapters && !Array.isArray(options.adapters)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"adapters must be an array when provided.\",\n });\n }\n\n if (hasHosted) {\n validateHostedOptions(options.hosted);\n }\n}\n\nfunction validateHostedOptions(\n hosted: ProbeMeshHostedClientOptions | undefined,\n): asserts hosted is ProbeMeshHostedClientOptions {\n if (!hosted || typeof hosted !== \"object\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"hosted options must be an object.\",\n });\n }\n\n if (typeof hosted.baseUrl !== \"string\" || hosted.baseUrl.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"hosted.baseUrl must be a non-empty string.\",\n });\n }\n\n if (hosted.apiKey !== undefined && typeof hosted.apiKey !== \"string\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"hosted.apiKey must be a string when provided.\",\n });\n }\n}\n\nasync function readHostedJson(response: Response) {\n const text = await response.text();\n\n if (text.length === 0) {\n return undefined;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch (error) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: `Hosted router returned invalid JSON with status ${response.status}.`,\n cause: error,\n });\n }\n}\n\nfunction validateHostedResponse<Data = unknown>(\n body: unknown,\n): ProbeMeshCallResponse<Data> {\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router response must be an object.\",\n });\n }\n\n const response = body as Partial<ProbeMeshCallResponse<Data>>;\n\n if (\n typeof response.callId !== \"string\" ||\n typeof response.capability !== \"string\" ||\n !(\"data\" in response) ||\n !response.provider ||\n typeof response.provider !== \"object\" ||\n typeof response.latencyMs !== \"number\" ||\n !Array.isArray(response.receiptRefs) ||\n response.status !== \"completed\"\n ) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router response does not match ProbeMesh call response shape.\",\n });\n }\n\n if (response.safety !== undefined) {\n validateHostedSafety(response.safety);\n }\n\n if (response.attempt !== undefined) {\n validateHostedAttempt(response.attempt);\n }\n\n if (response.route !== undefined) {\n validateHostedRoute(response.route);\n }\n\n return response as ProbeMeshCallResponse<Data>;\n}\n\nfunction hostedErrorToProbeMeshError(body: unknown, statusCode: number) {\n if (!body || typeof body !== \"object\" || Array.isArray(body)) {\n return new ProbeMeshError({\n code: \"provider_unavailable\",\n message: `Hosted router returned HTTP ${statusCode}.`,\n });\n }\n\n const error = body as {\n code?: string;\n message?: string;\n capability?: string;\n provider?: string;\n callId?: string;\n receiptRefs?: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n timeline?: ProbeMeshCallTimeline;\n retrySafety?: ProbeMeshRetrySafety;\n attempt?: ProbeMeshAttemptMetadata;\n route?: ProbeMeshRouteMetadata;\n };\n\n return new ProbeMeshError({\n code: normalizeHostedErrorCode(error.code),\n message: error.message ?? `Hosted router returned HTTP ${statusCode}.`,\n capability: error.capability,\n provider: error.provider,\n callId: error.callId,\n receiptRefs: validateHostedReceiptRefs(error.receiptRefs),\n safety: validateHostedSafety(error.safety),\n timeline: validateHostedTimeline(error.timeline),\n retrySafety: validateHostedRetrySafety(error.retrySafety),\n attempt: validateHostedAttempt(error.attempt),\n route: validateHostedRoute(error.route),\n });\n}\n\nfunction normalizeHostedErrorCode(code: string | undefined): ProbeMeshErrorCode {\n const knownCodes = new Set<ProbeMeshErrorCode>([\n \"unauthorized\",\n \"invalid_request\",\n \"budget_exceeded\",\n \"provider_unavailable\",\n \"retry_not_available\",\n \"payment_failed\",\n \"receipt_missing\",\n \"timeout_after_payment\",\n \"charged_but_no_result\",\n \"provider_timeout\",\n \"invalid_provider_response\",\n ]);\n\n return code && knownCodes.has(code as ProbeMeshErrorCode)\n ? (code as ProbeMeshErrorCode)\n : \"provider_unavailable\";\n}\n\nfunction ensureTrailingSlash(value: string) {\n return value.endsWith(\"/\") ? value : `${value}/`;\n}\n\nfunction validateAdapterResult(\n result: unknown,\n adapter: ProbeMeshAdapter,\n capability: string,\n callId: string,\n): ProbeMeshAdapterCallResult {\n if (!result || typeof result !== \"object\") {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter result must be an object.\",\n );\n }\n\n const candidate = result as Partial<ProbeMeshAdapterCallResult>;\n\n if (!(\"data\" in candidate)) {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter result requires data.\",\n );\n }\n\n if (candidate.cost !== undefined) {\n validateCost(candidate.cost, adapter, capability, callId);\n }\n\n if (candidate.receiptRefs !== undefined) {\n validateReceiptRefs(candidate.receiptRefs, adapter, capability, callId);\n }\n\n if (candidate.safety !== undefined) {\n validateAdapterSafety(candidate.safety, adapter, capability, callId);\n }\n\n if (\n candidate.provider !== undefined &&\n (!candidate.provider || typeof candidate.provider !== \"object\")\n ) {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter provider metadata must be an object when provided.\",\n );\n }\n\n return {\n data: candidate.data,\n cost: candidate.cost,\n receiptRefs: candidate.receiptRefs,\n safety: candidate.safety,\n provider: candidate.provider,\n };\n}\n\nfunction validateCost(\n cost: Cost,\n adapter: ProbeMeshAdapter,\n capability: string,\n callId: string,\n) {\n if (!cost || typeof cost !== \"object\") {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter cost must be an object when provided.\",\n );\n }\n\n if (!Number.isFinite(cost.amountUsd) || cost.amountUsd < 0) {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter cost.amountUsd must be a non-negative number.\",\n );\n }\n}\n\nfunction validateAdapterSafety(\n safety: ProbeMeshCallSafety,\n adapter: ProbeMeshAdapter,\n capability: string,\n callId: string,\n) {\n if (!isValidSafety(safety)) {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter safety metadata must match ProbeMeshCallSafety.\",\n );\n }\n}\n\nfunction validateHostedSafety(\n safety: unknown,\n): ProbeMeshCallSafety | undefined {\n if (safety === undefined) {\n return undefined;\n }\n\n if (!isValidSafety(safety)) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router safety metadata does not match ProbeMeshCallSafety.\",\n });\n }\n\n return safety;\n}\n\nfunction validateHostedReceiptRefs(\n receiptRefs: unknown,\n): ReceiptRef[] | undefined {\n if (receiptRefs === undefined) {\n return undefined;\n }\n\n if (!isValidReceiptRefs(receiptRefs)) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router error receiptRefs do not match ReceiptRef[].\",\n });\n }\n\n return receiptRefs;\n}\n\nfunction validateHostedTimeline(\n timeline: unknown,\n): ProbeMeshCallTimeline | undefined {\n if (timeline === undefined) {\n return undefined;\n }\n\n if (\n !timeline ||\n typeof timeline !== \"object\" ||\n Array.isArray(timeline) ||\n typeof (timeline as Partial<ProbeMeshCallTimeline>).routeId !== \"string\" ||\n !Array.isArray((timeline as Partial<ProbeMeshCallTimeline>).events)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router timeline does not match ProbeMeshCallTimeline.\",\n });\n }\n\n return timeline as ProbeMeshCallTimeline;\n}\n\nfunction validateHostedRetrySafety(\n retrySafety: unknown,\n): ProbeMeshRetrySafety | undefined {\n if (retrySafety === undefined) {\n return undefined;\n }\n\n if (\n !retrySafety ||\n typeof retrySafety !== \"object\" ||\n Array.isArray(retrySafety) ||\n typeof (retrySafety as Partial<ProbeMeshRetrySafety>).retryable !==\n \"boolean\" ||\n typeof (retrySafety as Partial<ProbeMeshRetrySafety>).safeToAutoRetry !==\n \"boolean\" ||\n !isRetrySafetyReason(\n (retrySafety as Partial<ProbeMeshRetrySafety>).reason,\n )\n ) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router retrySafety does not match ProbeMeshRetrySafety.\",\n });\n }\n\n return retrySafety as ProbeMeshRetrySafety;\n}\n\nfunction validateHostedAttempt(\n attempt: unknown,\n): ProbeMeshAttemptMetadata | undefined {\n if (attempt === undefined) {\n return undefined;\n }\n\n if (!isValidAttempt(attempt)) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router attempt metadata does not match ProbeMeshAttemptMetadata.\",\n });\n }\n\n return attempt;\n}\n\nfunction validateHostedRoute(\n route: unknown,\n): ProbeMeshRouteMetadata | undefined {\n if (route === undefined) {\n return undefined;\n }\n\n if (\n !route ||\n typeof route !== \"object\" ||\n Array.isArray(route) ||\n typeof (route as Partial<ProbeMeshRouteMetadata>).routeId !== \"string\" ||\n typeof (route as Partial<ProbeMeshRouteMetadata>).mode !== \"string\" ||\n ((route as Partial<ProbeMeshRouteMetadata>).selectedProviderId !== undefined &&\n typeof (route as Partial<ProbeMeshRouteMetadata>).selectedProviderId !==\n \"string\") ||\n ((route as Partial<ProbeMeshRouteMetadata>).explanation !== undefined &&\n !isValidRouteExplanation(\n (route as Partial<ProbeMeshRouteMetadata>).explanation,\n ))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_provider_response\",\n message: \"Hosted router route metadata does not match ProbeMeshRouteMetadata.\",\n });\n }\n\n return route as ProbeMeshRouteMetadata;\n}\n\nfunction isValidRouteExplanation(explanation: unknown) {\n if (\n !explanation ||\n typeof explanation !== \"object\" ||\n Array.isArray(explanation)\n ) {\n return false;\n }\n\n const candidate = explanation as Partial<\n NonNullable<ProbeMeshRouteMetadata[\"explanation\"]>\n >;\n\n return (\n Array.isArray(candidate.consideredProviders) &&\n candidate.consideredProviders.every((provider) => typeof provider === \"string\") &&\n (candidate.selectedProviderId === undefined ||\n typeof candidate.selectedProviderId === \"string\") &&\n typeof candidate.fallbackUsed === \"boolean\" &&\n typeof candidate.fallbackCount === \"number\" &&\n typeof candidate.stopReason === \"string\" &&\n Array.isArray(candidate.attempts) &&\n candidate.attempts.every(\n (attempt) =>\n attempt &&\n typeof attempt === \"object\" &&\n !Array.isArray(attempt) &&\n typeof attempt.providerId === \"string\" &&\n typeof attempt.status === \"string\" &&\n typeof attempt.reason === \"string\",\n )\n );\n}\n\nfunction isValidAttempt(attempt: unknown): attempt is ProbeMeshAttemptMetadata {\n if (!attempt || typeof attempt !== \"object\" || Array.isArray(attempt)) {\n return false;\n }\n\n const candidate = attempt as Partial<ProbeMeshAttemptMetadata>;\n\n return (\n typeof candidate.originalCallId === \"string\" &&\n candidate.originalCallId.length > 0 &&\n typeof candidate.attemptId === \"string\" &&\n candidate.attemptId.length > 0 &&\n typeof candidate.attemptNumber === \"number\" &&\n Number.isInteger(candidate.attemptNumber) &&\n candidate.attemptNumber > 0 &&\n typeof candidate.isRetry === \"boolean\" &&\n (candidate.previousAttemptId === undefined ||\n typeof candidate.previousAttemptId === \"string\")\n );\n}\n\nfunction isValidSafety(safety: unknown): safety is ProbeMeshCallSafety {\n if (!safety || typeof safety !== \"object\" || Array.isArray(safety)) {\n return false;\n }\n\n const candidate = safety as Partial<ProbeMeshCallSafety>;\n\n return (\n (candidate.paymentAttemptId === undefined ||\n typeof candidate.paymentAttemptId === \"string\") &&\n isPaymentStatus(candidate.paymentStatus) &&\n isSettlementStatus(candidate.settlementStatus) &&\n isDeliveryStatus(candidate.deliveryStatus) &&\n typeof candidate.moneyMayHaveMoved === \"boolean\"\n );\n}\n\nfunction isValidReceiptRefs(receiptRefs: unknown): receiptRefs is ReceiptRef[] {\n return (\n Array.isArray(receiptRefs) &&\n receiptRefs.every(\n (receiptRef) =>\n receiptRef &&\n typeof receiptRef === \"object\" &&\n !Array.isArray(receiptRef) &&\n typeof receiptRef.type === \"string\" &&\n typeof receiptRef.provider === \"string\" &&\n typeof receiptRef.status === \"string\" &&\n typeof receiptRef.ref === \"string\" &&\n typeof receiptRef.timestamp === \"string\",\n )\n );\n}\n\nfunction isRetrySafetyReason(value: unknown) {\n return (\n value === \"completed\" ||\n value === \"not_retryable\" ||\n value === \"money_may_have_moved\" ||\n value === \"payment_failed_no_charge\" ||\n value === \"no_payment_attempted\" ||\n value === \"unknown_payment_state\"\n );\n}\n\nfunction isPaymentStatus(value: unknown) {\n return (\n value === \"not_attempted\" || value === \"authorized\" || value === \"failed\"\n );\n}\n\nfunction isSettlementStatus(value: unknown) {\n return (\n value === \"not_attempted\" || value === \"settled\" || value === \"failed\"\n );\n}\n\nfunction isDeliveryStatus(value: unknown) {\n return (\n value === \"not_attempted\" ||\n value === \"delivered\" ||\n value === \"failed\" ||\n value === \"missing\"\n );\n}\n\nfunction validateReceiptRefs(\n receiptRefs: ReceiptRef[],\n adapter: ProbeMeshAdapter,\n capability: string,\n callId: string,\n) {\n if (!Array.isArray(receiptRefs)) {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter receiptRefs must be an array when provided.\",\n );\n }\n\n for (const receiptRef of receiptRefs) {\n if (!receiptRef || typeof receiptRef !== \"object\") {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter receiptRefs entries must be objects.\",\n );\n }\n\n if (\n typeof receiptRef.type !== \"string\" ||\n typeof receiptRef.provider !== \"string\" ||\n typeof receiptRef.status !== \"string\" ||\n typeof receiptRef.ref !== \"string\" ||\n typeof receiptRef.timestamp !== \"string\"\n ) {\n throw invalidProviderResponse(\n adapter,\n capability,\n callId,\n \"Adapter receiptRefs entries require type, provider, status, ref, and timestamp strings.\",\n );\n }\n }\n}\n\nfunction invalidProviderResponse(\n adapter: ProbeMeshAdapter,\n capability: string,\n callId: string,\n message: string,\n) {\n return new ProbeMeshError({\n code: \"invalid_provider_response\",\n message,\n capability,\n provider: adapter.id,\n callId,\n });\n}\n\nasync function withLatencyLimit<Data>(\n operation: Data | Promise<Data>,\n request: ProbeMeshCallRequest,\n adapter: ProbeMeshAdapter,\n callId: string,\n abortController: AbortController,\n): Promise<Data> {\n const maxLatencyMs = request.constraints?.maxLatencyMs;\n\n if (maxLatencyMs === undefined) {\n return operation;\n }\n\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n try {\n return await Promise.race([\n operation,\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => {\n abortController.abort();\n reject(\n new ProbeMeshError({\n code: \"provider_timeout\",\n message: `Adapter \"${adapter.id}\" exceeded maxLatencyMs ${maxLatencyMs} for capability \"${request.capability}\".`,\n capability: request.capability,\n provider: adapter.id,\n callId,\n }),\n );\n }, maxLatencyMs);\n }),\n ]);\n } finally {\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n}\n\nfunction validateCallRequest(\n request: unknown,\n): asserts request is ProbeMeshCallRequest<unknown> {\n if (!request || typeof request !== \"object\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call request must be an object.\",\n });\n }\n\n const candidate = request as Partial<ProbeMeshCallRequest<unknown>>;\n\n if (\n typeof candidate.capability !== \"string\" ||\n candidate.capability.trim().length === 0\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh call request requires a non-empty capability.\",\n });\n }\n\n if (!(\"input\" in candidate)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `ProbeMesh call request for capability \"${candidate.capability}\" requires input.`,\n capability: candidate.capability,\n });\n }\n\n validateConstraints(candidate.constraints, candidate.capability);\n validateProviderPreferences(\n candidate.providerPreferences,\n candidate.capability,\n );\n validatePaymentPreferences(candidate.paymentPreferences, candidate.capability);\n validatePaymentStrategy(candidate.paymentStrategy, candidate.capability);\n}\n\nfunction validateRetryRequest(\n request: unknown,\n): asserts request is ProbeMeshRetryRequest {\n if (!request || typeof request !== \"object\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh retry request must be an object.\",\n });\n }\n\n const candidate = request as Partial<ProbeMeshRetryRequest>;\n\n if (typeof candidate.callId !== \"string\" || candidate.callId.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh retry request requires a non-empty callId.\",\n });\n }\n\n if (\n candidate.idempotencyKey !== undefined &&\n (typeof candidate.idempotencyKey !== \"string\" ||\n candidate.idempotencyKey.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh retry idempotencyKey must be a non-empty string when provided.\",\n callId: candidate.callId,\n });\n }\n}\n\nfunction validateConstraints(\n constraints: ProbeMeshConstraints | undefined,\n capability: string,\n) {\n if (constraints === undefined) {\n return;\n }\n\n if (!constraints || typeof constraints !== \"object\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"constraints must be an object when provided.\",\n capability,\n });\n }\n\n validatePositiveNumber(constraints.maxCostUsd, \"maxCostUsd\", capability);\n validatePositiveNumber(constraints.maxLatencyMs, \"maxLatencyMs\", capability);\n\n if (\n constraints.minConfidence !== undefined &&\n (!Number.isFinite(constraints.minConfidence) ||\n constraints.minConfidence < 0 ||\n constraints.minConfidence > 1)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"minConfidence must be a number between 0 and 1 when provided.\",\n capability,\n });\n }\n}\n\nfunction validateProviderPreferences(\n providerPreferences: ProbeMeshCallRequest[\"providerPreferences\"],\n capability: string,\n) {\n if (providerPreferences === undefined) {\n return;\n }\n\n if (!providerPreferences || typeof providerPreferences !== \"object\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"providerPreferences must be an object when provided.\",\n capability,\n });\n }\n\n validateStringArray(\n providerPreferences.allowedProviders,\n \"allowedProviders\",\n capability,\n );\n validateStringArray(\n providerPreferences.blockedProviders,\n \"blockedProviders\",\n capability,\n );\n}\n\nfunction validatePositiveNumber(\n value: number | undefined,\n field: string,\n capability: string,\n) {\n if (value === undefined) {\n return;\n }\n\n if (!Number.isFinite(value) || value <= 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${field} must be a positive number when provided.`,\n capability,\n });\n }\n}\n\nfunction validateStringArray(\n value: string[] | undefined,\n field: string,\n capability: string,\n) {\n if (value === undefined) {\n return;\n }\n\n if (\n !Array.isArray(value) ||\n value.some((provider) => typeof provider !== \"string\" || provider.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${field} must be an array of non-empty provider ids when provided.`,\n capability,\n });\n }\n}\n\nfunction selectAdapter(\n adapters: ProbeMeshAdapter[],\n request: ProbeMeshCallRequest,\n): { adapter: ProbeMeshAdapter; paymentSelection: ProbeMeshPaymentSelection } | undefined {\n const allowedProviders = request.providerPreferences?.allowedProviders;\n const blockedProviders = request.providerPreferences?.blockedProviders ?? [];\n\n for (const adapter of adapters) {\n if (!adapter.capabilities.includes(request.capability)) {\n continue;\n }\n\n if (allowedProviders && !allowedProviders.includes(adapter.id)) {\n continue;\n }\n\n if (blockedProviders.includes(adapter.id)) {\n continue;\n }\n\n const resolution = resolveProviderPaymentOption({\n providerId: adapter.id,\n providerMode: adapter.mode ?? \"local\",\n capabilities: adapter.capabilities,\n capability: request.capability,\n pricing: adapter.pricing,\n paymentOptions: adapter.paymentOptions,\n paymentPreferences: request.paymentPreferences,\n paymentStrategy: request.paymentStrategy,\n });\n\n if (resolution.selection) {\n return {\n adapter,\n paymentSelection: resolution.selection,\n };\n }\n }\n\n return undefined;\n}\n\nfunction enforceBudget(\n constraints: ProbeMeshConstraints | undefined,\n adapter: ProbeMeshAdapter,\n capability: string,\n callId: string,\n paymentSelection?: ProbeMeshPaymentSelection,\n) {\n if (constraints?.maxCostUsd === undefined) {\n return;\n }\n\n const paymentCost = paymentSelectionToCost(paymentSelection);\n\n if (paymentCost) {\n if (paymentCost.amountUsd <= constraints.maxCostUsd) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"budget_exceeded\",\n message: `Capability \"${capability}\" payment option \"${paymentSelection?.optionId}\" costs $${paymentCost.amountUsd.toFixed(\n 2,\n )}, which exceeds maxCostUsd $${constraints.maxCostUsd.toFixed(2)}.`,\n capability,\n provider: adapter.id,\n callId,\n });\n }\n\n const pricing = getPricing(adapter, capability);\n\n if (!pricing || pricing.amountUsd <= constraints.maxCostUsd) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"budget_exceeded\",\n message: `Capability \"${capability}\" costs $${pricing.amountUsd.toFixed(\n 2,\n )}, which exceeds maxCostUsd $${constraints.maxCostUsd.toFixed(2)}.`,\n capability,\n provider: adapter.id,\n callId,\n });\n}\n\nfunction getPricing(\n adapter: ProbeMeshAdapter,\n capability: string,\n): ProbeMeshPricing | undefined {\n if (!adapter.pricing) {\n return undefined;\n }\n\n if (isSinglePricing(adapter.pricing)) {\n return adapter.pricing;\n }\n\n return adapter.pricing[capability];\n}\n\nfunction isSinglePricing(\n pricing: ProbeMeshAdapter[\"pricing\"],\n): pricing is ProbeMeshPricing {\n return (\n typeof (pricing as ProbeMeshPricing | undefined)?.amountUsd === \"number\" &&\n typeof (pricing as ProbeMeshPricing | undefined)?.unit === \"string\"\n );\n}\n\nfunction pricingToCost(pricing: ProbeMeshPricing | undefined): Cost | undefined {\n if (!pricing) {\n return undefined;\n }\n\n return {\n amountUsd: pricing.amountUsd,\n currency: pricing.currency ?? \"USD\",\n unit: pricing.unit,\n };\n}\n\nfunction generateCallId(): string {\n return `call_${randomUUID()}`;\n}\n","import { ProbeMeshError } from \"./errors\";\nimport {\n mergePaymentPreferences,\n resolveProviderPaymentOption,\n validatePaymentPreferences,\n validatePaymentStrategy,\n validateProviderPaymentOptions,\n} from \"./paymentOptions\";\nimport {\n assertProviderCatalogArtifact,\n validateProviderCatalogArtifact,\n} from \"./providerCatalogArtifact\";\nimport type {\n ProviderCatalogArtifact,\n ProviderCatalogArtifactStatus,\n} from \"./providerCatalogArtifact\";\nimport type {\n ProviderLimits,\n ProviderManifest,\n ProviderProtocolMode,\n ProviderReceiptSupport,\n} from \"./providerKit/types\";\nimport type {\n Cost,\n ProbeMeshCallSafety,\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentSelection,\n ProbeMeshPaymentStrategy,\n ProbeMeshRetrySafety,\n ProbeMeshTimelineEventType,\n ProbeMeshPricing,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\nimport type { X402ProviderAcceptanceGate } from \"./protocols/x402Acceptance\";\n\nexport const PROVIDER_CATALOG_SCHEMA_VERSION =\n \"probemesh.provider-catalog.index.v1\" as const;\n\nexport interface ProviderCatalogOptions {\n artifacts: ProviderCatalogArtifact[];\n generatedAt?: string;\n}\n\nexport interface ProviderCatalog {\n schemaVersion: typeof PROVIDER_CATALOG_SCHEMA_VERSION;\n generatedAt: string;\n entries: ProviderCatalogEntry[];\n}\n\nexport interface ProviderCatalogEntry {\n artifactId: string;\n generatedAt: string;\n status: ProviderCatalogArtifactStatus;\n provider: {\n id: string;\n displayName: string;\n capabilities: string[];\n protocolMode: ProviderProtocolMode;\n paymentOptions?: ProviderPaymentOption[];\n pricing: ProviderManifest[\"pricing\"];\n receipts: ProviderReceiptSupport;\n limits?: ProviderLimits;\n };\n acceptance: {\n gate: X402ProviderAcceptanceGate;\n failedChecks: string[];\n receipts: ProviderCatalogArtifact[\"acceptance\"][\"receipts\"];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProviderCatalogArtifact[\"acceptance\"][\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n errorCode?: string;\n };\n}\n\nexport interface ProviderCatalogQuery {\n capability: string;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n status?: ProviderCatalogArtifactStatus;\n}\n\nexport interface ProviderCatalogMatch {\n entry: ProviderCatalogEntry;\n providerId: string;\n capability: string;\n status: ProviderCatalogArtifactStatus;\n cost?: Cost;\n paymentSelection?: ProbeMeshPaymentSelection;\n reasons: string[];\n}\n\nexport interface ProviderCatalogSummary {\n schemaVersion: typeof PROVIDER_CATALOG_SCHEMA_VERSION;\n generatedAt: string;\n totalEntries: number;\n readyEntries: number;\n rejectedEntries: number;\n providers: string[];\n capabilities: string[];\n protocolModes: string[];\n}\n\nexport interface ProviderCatalogValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderCatalogValidationResult {\n valid: boolean;\n errors: ProviderCatalogValidationError[];\n}\n\nexport function validateProviderCatalog(\n catalog: unknown,\n): ProviderCatalogValidationResult {\n const errors: ProviderCatalogValidationError[] = [];\n\n if (!isRecord(catalog)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider catalog must be an object.\",\n },\n ],\n };\n }\n\n if (catalog.schemaVersion !== PROVIDER_CATALOG_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CATALOG_SCHEMA_VERSION}\".`,\n });\n }\n\n validateIsoTimestamp(catalog.generatedAt, \"generatedAt\", errors);\n\n if (!Array.isArray(catalog.entries)) {\n errors.push({\n path: \"entries\",\n message: \"entries must be an array.\",\n });\n } else {\n catalog.entries.forEach((entry, index) =>\n validateProviderCatalogEntry(entry, `entries.${index}`, errors),\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderCatalog(\n catalog: unknown,\n): asserts catalog is ProviderCatalog {\n const result = validateProviderCatalog(catalog);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog: ${formatValidationErrors(result.errors)}`,\n });\n}\n\nexport function parseProviderCatalogArtifactJson(\n json: string,\n): ProviderCatalogArtifact {\n if (typeof json !== \"string\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog artifact JSON must be a string.\",\n });\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(json);\n } catch (cause) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog artifact JSON must be valid JSON.\",\n cause,\n });\n }\n\n assertProviderCatalogArtifact(parsed);\n\n return parsed;\n}\n\nexport function createProviderCatalog(\n options: ProviderCatalogOptions,\n): ProviderCatalog {\n assertProviderCatalogOptions(options);\n\n const entries = options.artifacts.map((artifact, index) => {\n const validation = validateProviderCatalogArtifact(artifact);\n\n if (!validation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog artifact at index ${index}: ${formatValidationErrors(\n validation.errors,\n )}`,\n });\n }\n\n return createCatalogEntryFromArtifact(artifact);\n });\n\n const catalog: ProviderCatalog = {\n schemaVersion: PROVIDER_CATALOG_SCHEMA_VERSION,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n entries,\n };\n\n assertProviderCatalog(catalog);\n\n return catalog;\n}\n\nexport function findProviderCatalogMatches(\n catalog: ProviderCatalog,\n query: ProviderCatalogQuery,\n): ProviderCatalogMatch[] {\n assertProviderCatalog(catalog);\n assertProviderCatalogQuery(query);\n\n const requiredStatus = query.status ?? \"ready\";\n const requiredReceiptTypes = query.requiredReceiptTypes ?? [];\n const providerIds = query.providerIds;\n const blockedProviderIds = new Set(query.blockedProviderIds ?? []);\n\n return catalog.entries.flatMap((entry) => {\n const providerId = entry.provider.id;\n\n if (entry.status !== requiredStatus) {\n return [];\n }\n\n if (!entry.provider.capabilities.includes(query.capability)) {\n return [];\n }\n\n if (query.protocolMode !== undefined && entry.provider.protocolMode !== query.protocolMode) {\n return [];\n }\n\n if (providerIds !== undefined && !providerIds.includes(providerId)) {\n return [];\n }\n\n if (blockedProviderIds.has(providerId)) {\n return [];\n }\n\n const paymentPreferences = mergePaymentPreferences(\n query.protocolMode\n ? {\n allowedProtocols: [query.protocolMode],\n }\n : undefined,\n query.paymentPreferences,\n );\n const paymentResolution = resolveProviderPaymentOption({\n providerId,\n providerMode: entry.provider.protocolMode,\n capabilities: entry.provider.capabilities,\n capability: query.capability,\n pricing: entry.provider.pricing,\n paymentOptions: entry.provider.paymentOptions,\n paymentPreferences,\n paymentStrategy: query.paymentStrategy,\n defaultReceiptTypes: entry.acceptance.receipts.types,\n });\n const cost =\n paymentSelectionCost(paymentResolution.selection) ??\n resolveCatalogCost(entry, query.capability);\n\n if (\n query.maxCostUsd !== undefined &&\n (cost === undefined || cost.amountUsd > query.maxCostUsd)\n ) {\n return [];\n }\n\n if (!hasRequiredReceiptTypes(entry, requiredReceiptTypes)) {\n return [];\n }\n\n if (!paymentResolution.selection) {\n return [];\n }\n\n return [\n {\n entry,\n providerId,\n capability: query.capability,\n status: entry.status,\n cost,\n paymentSelection: paymentResolution.selection,\n reasons: createMatchReasons(\n entry,\n query,\n cost,\n paymentResolution.selection,\n ),\n },\n ];\n });\n}\n\nexport function summarizeProviderCatalog(\n catalog: ProviderCatalog,\n): ProviderCatalogSummary {\n assertProviderCatalog(catalog);\n\n const providers = new Set<string>();\n const capabilities = new Set<string>();\n const protocolModes = new Set<string>();\n let readyEntries = 0;\n let rejectedEntries = 0;\n\n for (const entry of catalog.entries) {\n providers.add(entry.provider.id);\n protocolModes.add(entry.provider.protocolMode);\n\n for (const capability of entry.provider.capabilities) {\n capabilities.add(capability);\n }\n\n if (entry.status === \"ready\") {\n readyEntries += 1;\n } else {\n rejectedEntries += 1;\n }\n }\n\n return {\n schemaVersion: catalog.schemaVersion,\n generatedAt: catalog.generatedAt,\n totalEntries: catalog.entries.length,\n readyEntries,\n rejectedEntries,\n providers: [...providers],\n capabilities: [...capabilities],\n protocolModes: [...protocolModes],\n };\n}\n\nfunction assertProviderCatalogOptions(\n options: ProviderCatalogOptions,\n): asserts options is ProviderCatalogOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.artifacts)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog options require an artifacts array.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog generatedAt must be an ISO timestamp.\",\n });\n }\n}\n\nfunction assertProviderCatalogQuery(\n query: ProviderCatalogQuery,\n): asserts query is ProviderCatalogQuery {\n if (!isRecord(query)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query must be an object.\",\n });\n }\n\n if (typeof query.capability !== \"string\" || query.capability.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query capability must be a non-empty string.\",\n });\n }\n\n if (\n query.protocolMode !== undefined &&\n (typeof query.protocolMode !== \"string\" || query.protocolMode.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query protocolMode must be a non-empty string.\",\n });\n }\n\n validatePaymentPreferences(query.paymentPreferences, query.capability);\n validatePaymentStrategy(query.paymentStrategy, query.capability);\n\n if (\n query.maxCostUsd !== undefined &&\n (typeof query.maxCostUsd !== \"number\" ||\n !Number.isFinite(query.maxCostUsd) ||\n query.maxCostUsd < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query maxCostUsd must be a non-negative finite number.\",\n });\n }\n\n if (query.status !== undefined && query.status !== \"ready\" && query.status !== \"rejected\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: 'Provider catalog query status must be \"ready\" or \"rejected\".',\n });\n }\n\n validateQueryStringArray(query.providerIds, \"providerIds\");\n validateQueryStringArray(query.blockedProviderIds, \"blockedProviderIds\");\n\n if (\n query.requiredReceiptTypes !== undefined &&\n (!Array.isArray(query.requiredReceiptTypes) ||\n query.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query requiredReceiptTypes must contain known receipt types.\",\n });\n }\n}\n\nfunction createCatalogEntryFromArtifact(\n artifact: ProviderCatalogArtifact,\n): ProviderCatalogEntry {\n return {\n artifactId: artifact.artifactId,\n generatedAt: artifact.generatedAt,\n status: artifact.status,\n provider: {\n id: artifact.provider.id,\n displayName: artifact.provider.displayName,\n capabilities: [...artifact.provider.capabilities],\n protocolMode: artifact.provider.protocolMode,\n paymentOptions: cloneSerializable(artifact.provider.paymentOptions),\n pricing: cloneSerializable(artifact.provider.pricing),\n receipts: cloneSerializable(artifact.provider.receipts),\n limits: cloneSerializable(artifact.provider.limits),\n },\n acceptance: {\n gate: cloneSerializable(artifact.acceptance.gate),\n failedChecks: [...artifact.acceptance.failedChecks],\n receipts: cloneSerializable(artifact.acceptance.receipts),\n safety: cloneSerializable(artifact.acceptance.safety),\n retrySafety: cloneSerializable(artifact.acceptance.retrySafety),\n route: cloneSerializable(artifact.acceptance.route),\n timelineEventTypes: [...artifact.acceptance.timelineEventTypes],\n telemetryEventTypes: [...artifact.acceptance.telemetryEventTypes],\n errorCode: artifact.acceptance.errorCode,\n },\n };\n}\n\nfunction resolveCatalogCost(\n entry: ProviderCatalogEntry,\n capability: string,\n): Cost | undefined {\n const pricing = entry.provider.pricing;\n\n if (isProbeMeshPricing(pricing)) {\n return pricingToCost(pricing);\n }\n\n const capabilityPricing = pricing[capability];\n\n if (!isProbeMeshPricing(capabilityPricing)) {\n return undefined;\n }\n\n return pricingToCost(capabilityPricing);\n}\n\nfunction pricingToCost(pricing: ProbeMeshPricing): Cost {\n return {\n amountUsd: pricing.amountUsd,\n currency: pricing.currency,\n unit: pricing.unit,\n };\n}\n\nfunction hasRequiredReceiptTypes(\n entry: ProviderCatalogEntry,\n requiredReceiptTypes: ReceiptType[],\n) {\n const receiptTypes = new Set(entry.acceptance.receipts.types);\n\n return requiredReceiptTypes.every((receiptType) =>\n receiptTypes.has(receiptType),\n );\n}\n\nfunction createMatchReasons(\n entry: ProviderCatalogEntry,\n query: ProviderCatalogQuery,\n cost: Cost | undefined,\n paymentSelection: ProbeMeshPaymentSelection | undefined,\n) {\n const reasons = [\n `status:${entry.status}`,\n `capability:${query.capability}`,\n `protocol:${entry.provider.protocolMode}`,\n ];\n\n if (query.paymentPreferences !== undefined) {\n reasons.push(\"payment_preferences:matched\");\n }\n\n if (query.paymentStrategy !== undefined) {\n reasons.push(`payment_strategy:${query.paymentStrategy.mode}`);\n }\n\n if (paymentSelection?.score !== undefined) {\n reasons.push(`payment_score:${paymentSelection.score}`);\n }\n\n for (const scoreReason of paymentSelection?.scoreReasons ?? []) {\n reasons.push(`payment_score_reason:${scoreReason}`);\n }\n\n if (query.providerIds !== undefined) {\n reasons.push(\"provider:allowed\");\n }\n\n if (query.maxCostUsd !== undefined && cost !== undefined) {\n reasons.push(`cost:${cost.amountUsd}<=${query.maxCostUsd}`);\n }\n\n if ((query.requiredReceiptTypes ?? []).length > 0) {\n reasons.push(`receipts:${query.requiredReceiptTypes?.join(\",\")}`);\n }\n\n return reasons;\n}\n\nfunction paymentSelectionCost(\n selection: ProbeMeshPaymentSelection | undefined,\n): Cost | undefined {\n return selection?.cost;\n}\n\nfunction validateQueryStringArray(value: unknown, name: string) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Provider catalog query ${name} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isProbeMeshPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n typeof value.amountUsd === \"number\" &&\n Number.isFinite(value.amountUsd) &&\n value.amountUsd >= 0 &&\n (value.currency === undefined || typeof value.currency === \"string\")\n );\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction validateProviderCatalogEntry(\n entry: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(entry)) {\n errors.push({\n path,\n message: \"catalog entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(entry.artifactId, `${path}.artifactId`, errors);\n validateIsoTimestamp(entry.generatedAt, `${path}.generatedAt`, errors);\n\n if (entry.status !== \"ready\" && entry.status !== \"rejected\") {\n errors.push({\n path: `${path}.status`,\n message: 'status must be \"ready\" or \"rejected\".',\n });\n }\n\n validateEntryProvider(entry.provider, `${path}.provider`, errors);\n validateEntryAcceptance(entry.acceptance, `${path}.acceptance`, errors);\n}\n\nfunction validateEntryProvider(\n provider: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(provider)) {\n errors.push({\n path,\n message: \"provider must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(provider.id, `${path}.id`, errors);\n validateNonEmptyString(provider.displayName, `${path}.displayName`, errors);\n validateStringArray(provider.capabilities, `${path}.capabilities`, errors);\n validateNonEmptyString(provider.protocolMode, `${path}.protocolMode`, errors);\n validateProviderPaymentOptions(\n provider.paymentOptions,\n `${path}.paymentOptions`,\n Array.isArray(provider.capabilities) ? provider.capabilities : [],\n errors,\n );\n validatePricingDeclaration(provider.pricing, `${path}.pricing`, errors);\n validateReceiptSupport(provider.receipts, `${path}.receipts`, errors);\n\n if (provider.limits !== undefined && !isRecord(provider.limits)) {\n errors.push({\n path: `${path}.limits`,\n message: \"limits must be an object when provided.\",\n });\n }\n}\n\nfunction validateEntryAcceptance(\n acceptance: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(acceptance)) {\n errors.push({\n path,\n message: \"acceptance must be an object.\",\n });\n return;\n }\n\n if (!isRecord(acceptance.gate)) {\n errors.push({\n path: `${path}.gate`,\n message: \"gate must be an object.\",\n });\n } else {\n if (typeof acceptance.gate.accepted !== \"boolean\") {\n errors.push({\n path: `${path}.gate.accepted`,\n message: \"gate.accepted must be a boolean.\",\n });\n }\n\n if (\n acceptance.gate.status !== \"accepted\" &&\n acceptance.gate.status !== \"rejected\"\n ) {\n errors.push({\n path: `${path}.gate.status`,\n message: 'gate.status must be \"accepted\" or \"rejected\".',\n });\n }\n }\n\n validateStringArray(acceptance.failedChecks, `${path}.failedChecks`, errors);\n validateReceiptSummary(acceptance.receipts, `${path}.receipts`, errors);\n validateStringArray(\n acceptance.timelineEventTypes,\n `${path}.timelineEventTypes`,\n errors,\n );\n validateStringArray(\n acceptance.telemetryEventTypes,\n `${path}.telemetryEventTypes`,\n errors,\n );\n}\n\nfunction validatePricingDeclaration(\n pricing: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing must be an object.\",\n });\n return;\n }\n\n if (isPricingObject(pricing)) {\n validatePricingObject(pricing, path, errors);\n return;\n }\n\n for (const [capability, capabilityPricing] of Object.entries(pricing)) {\n validateNonEmptyString(capability, `${path}.${capability}`, errors);\n validatePricingObject(capabilityPricing, `${path}.${capability}`, errors);\n }\n}\n\nfunction validatePricingObject(\n pricing: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(pricing.unit, `${path}.unit`, errors);\n\n if (\n typeof pricing.amountUsd !== \"number\" ||\n !Number.isFinite(pricing.amountUsd) ||\n pricing.amountUsd < 0\n ) {\n errors.push({\n path: `${path}.amountUsd`,\n message: \"amountUsd must be a non-negative finite number.\",\n });\n }\n\n if (pricing.currency !== undefined && typeof pricing.currency !== \"string\") {\n errors.push({\n path: `${path}.currency`,\n message: \"currency must be a string when provided.\",\n });\n }\n}\n\nfunction validateReceiptSupport(\n receipts: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path,\n message: \"receipts must be an object.\",\n });\n return;\n }\n\n for (const key of [\"payment\", \"delivery\", \"responseEvidence\"]) {\n if (typeof receipts[key] !== \"boolean\") {\n errors.push({\n path: `${path}.${key}`,\n message: `${key} must be a boolean.`,\n });\n }\n }\n}\n\nfunction validateReceiptSummary(\n receipts: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path,\n message: \"receipts must be an object.\",\n });\n return;\n }\n\n if (typeof receipts.total !== \"number\" || !Number.isFinite(receipts.total)) {\n errors.push({\n path: `${path}.total`,\n message: \"total must be a finite number.\",\n });\n }\n\n validateStringArray(receipts.types, `${path}.types`, errors);\n validateStringArray(receipts.providers, `${path}.providers`, errors);\n\n for (const key of [\n \"hasPaymentProof\",\n \"hasSettlementConfirmation\",\n \"hasProviderDelivery\",\n ]) {\n if (typeof receipts[key] !== \"boolean\") {\n errors.push({\n path: `${path}.${key}`,\n message: `${key} must be a boolean.`,\n });\n }\n }\n}\n\nfunction isPricingObject(value: Record<string, unknown>) {\n return \"unit\" in value || \"amountUsd\" in value || \"currency\" in value;\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp string.`,\n });\n }\n}\n\nfunction formatValidationErrors(errors: ProviderCatalogValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { createHash } from \"node:crypto\";\n\nimport { ProbeMeshError } from \"./errors\";\nimport {\n assertProviderCatalog,\n summarizeProviderCatalog,\n type ProviderCatalog,\n type ProviderCatalogSummary,\n} from \"./providerCatalog\";\nimport {\n evaluateProviderCatalogPolicy,\n} from \"./providerCatalogPolicy\";\nimport type {\n ProviderCatalogPolicyAdapterInventory,\n ProviderCatalogPolicyCheck,\n ProviderCatalogPolicyEvaluationResult,\n ProviderCatalogPolicyExpectedQuery,\n ProviderCatalogPolicyOptions,\n ProviderCatalogPolicyQueryResult,\n} from \"./providerCatalogPolicy\";\nimport type {\n ProviderCatalogPolicyBundleAttestation,\n} from \"./types\";\n\nexport const PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION =\n \"probemesh.catalog-policy-bundle.v1\" as const;\n\nexport type ProviderCatalogPolicyBundleStatus = \"passed\" | \"failed\";\n\nexport type ProviderCatalogPolicyBundleFormat = \"json\" | \"markdown\";\n\nexport interface ProviderCatalogPolicyBundleOptions {\n catalog: ProviderCatalog;\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n evaluation?: ProviderCatalogPolicyEvaluationResult;\n generatedAt?: string;\n bundleId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderCatalogPolicyBundleHashes {\n catalog: string;\n catalogPolicy: string;\n adapterInventory: string;\n queries: string;\n evaluation: string;\n bundle: string;\n}\n\nexport interface ProviderCatalogPolicyBundleQueryCoverage {\n capability: string;\n minMatches: number;\n matches: number;\n routeableMatches: number;\n missingAdapterMatches: number;\n providerIds: string[];\n}\n\nexport interface ProviderCatalogPolicyBundle {\n schemaVersion: typeof PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION;\n bundleId: string;\n generatedAt: string;\n status: ProviderCatalogPolicyBundleStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProviderCatalogPolicyBundleHashes;\n catalogSummary: ProviderCatalogSummary;\n evaluationSummary: ProviderCatalogPolicyEvaluationResult[\"summary\"];\n queryCoverage: ProviderCatalogPolicyBundleQueryCoverage[];\n checks: ProviderCatalogPolicyCheck[];\n failedChecks: string[];\n queries: ProviderCatalogPolicyExpectedQuery[];\n}\n\nexport interface ProviderCatalogPolicyBundleValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderCatalogPolicyBundleValidationResult {\n valid: boolean;\n errors: ProviderCatalogPolicyBundleValidationError[];\n}\n\nexport interface ProviderCatalogPolicyBundleRuntimeVerificationOptions {\n bundle: ProviderCatalogPolicyBundle;\n catalog: ProviderCatalog;\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries?: ProviderCatalogPolicyExpectedQuery[];\n capability?: string;\n}\n\nexport interface ProviderCatalogPolicyBundleRuntimeVerificationResult {\n valid: boolean;\n attestation: ProviderCatalogPolicyBundleAttestation;\n errors: ProviderCatalogPolicyBundleValidationError[];\n coveredQuery?: ProviderCatalogPolicyExpectedQuery;\n}\n\nexport function createProviderCatalogPolicyBundle(\n options: ProviderCatalogPolicyBundleOptions,\n): ProviderCatalogPolicyBundle {\n assertBundleOptions(options);\n\n const evaluation =\n options.evaluation ??\n evaluateProviderCatalogPolicy({\n catalog: options.catalog,\n catalogPolicy: options.catalogPolicy,\n adapterInventory: options.adapterInventory,\n queries: options.queries,\n });\n const hashesWithoutBundle = {\n catalog: hashStableJson(options.catalog),\n catalogPolicy: hashStableJson(options.catalogPolicy ?? null),\n adapterInventory: hashStableJson(options.adapterInventory),\n queries: hashStableJson(options.queries),\n evaluation: hashStableJson(evaluation),\n bundle: \"\",\n };\n const bundleBase: ProviderCatalogPolicyBundle = {\n schemaVersion: PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION,\n bundleId:\n options.bundleId ??\n `catalog_policy_bundle_${hashStableJson({\n catalog: hashesWithoutBundle.catalog,\n catalogPolicy: hashesWithoutBundle.catalogPolicy,\n adapterInventory: hashesWithoutBundle.adapterInventory,\n queries: hashesWithoutBundle.queries,\n }).slice(0, 16)}`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: evaluation.status,\n hashAlgorithm: \"sha256\",\n hashes: hashesWithoutBundle,\n catalogSummary: summarizeProviderCatalog(options.catalog),\n evaluationSummary: cloneSerializable(evaluation.summary),\n queryCoverage: evaluation.queryResults.map(createQueryCoverage),\n checks: cloneSerializable(evaluation.checks),\n failedChecks: evaluation.checks\n .filter((check) => check.status === \"failed\")\n .map((check) => check.name),\n queries: cloneSerializable(options.queries),\n };\n const bundle: ProviderCatalogPolicyBundle = {\n ...bundleBase,\n hashes: {\n ...hashesWithoutBundle,\n bundle: hashBundleContent(bundleBase),\n },\n };\n const sanitizedBundle = sanitizeBundleOutput(\n bundle,\n options.forbiddenOutputValues ?? [],\n );\n\n assertProviderCatalogPolicyBundle(sanitizedBundle);\n\n return sanitizedBundle;\n}\n\nexport function validateProviderCatalogPolicyBundle(\n bundle: unknown,\n): ProviderCatalogPolicyBundleValidationResult {\n const errors: ProviderCatalogPolicyBundleValidationError[] = [];\n\n if (!isRecord(bundle)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider catalog policy bundle must be an object.\",\n },\n ],\n };\n }\n\n if (bundle.schemaVersion !== PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(bundle.bundleId, \"bundleId\", errors);\n validateIsoTimestamp(bundle.generatedAt, \"generatedAt\", errors);\n\n if (bundle.status !== \"passed\" && bundle.status !== \"failed\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"passed\" or \"failed\".',\n });\n }\n\n if (bundle.hashAlgorithm !== \"sha256\") {\n errors.push({\n path: \"hashAlgorithm\",\n message: 'hashAlgorithm must be \"sha256\".',\n });\n }\n\n validateHashes(bundle.hashes, errors);\n validateObject(bundle.catalogSummary, \"catalogSummary\", errors);\n validateObject(bundle.evaluationSummary, \"evaluationSummary\", errors);\n validateQueryCoverage(bundle.queryCoverage, errors);\n validateCheckArray(bundle.checks, \"checks\", errors);\n validateStringArray(bundle.failedChecks, \"failedChecks\", errors);\n\n if (!Array.isArray(bundle.queries) || bundle.queries.length === 0) {\n errors.push({\n path: \"queries\",\n message: \"queries must be a non-empty array.\",\n });\n }\n\n if (errors.length === 0) {\n const expectedBundleHash = hashBundleContent(\n bundle as unknown as ProviderCatalogPolicyBundle,\n );\n\n if (\n (bundle.hashes as ProviderCatalogPolicyBundleHashes).bundle !==\n expectedBundleHash\n ) {\n errors.push({\n path: \"hashes.bundle\",\n message: \"bundle hash does not match bundle content.\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderCatalogPolicyBundle(\n bundle: unknown,\n): asserts bundle is ProviderCatalogPolicyBundle {\n const result = validateProviderCatalogPolicyBundle(bundle);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog policy bundle: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProviderCatalogPolicyBundle(\n bundle: ProviderCatalogPolicyBundle,\n options: {\n format?: ProviderCatalogPolicyBundleFormat;\n } = {},\n) {\n assertProviderCatalogPolicyBundle(bundle);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatBundleMarkdown(bundle);\n }\n\n return JSON.stringify(bundle, null, 2);\n}\n\nexport function verifyProviderCatalogPolicyBundleRuntime(\n options: ProviderCatalogPolicyBundleRuntimeVerificationOptions,\n): ProviderCatalogPolicyBundleRuntimeVerificationResult {\n assertRuntimeVerificationOptions(options);\n\n const errors: ProviderCatalogPolicyBundleValidationError[] = [];\n const bundleValidation = validateProviderCatalogPolicyBundle(options.bundle);\n\n errors.push(...bundleValidation.errors);\n\n if (options.bundle.status !== \"passed\") {\n errors.push({\n path: \"status\",\n message: \"Provider catalog policy bundle must have passed evaluation.\",\n });\n }\n\n const queries = options.queries ?? options.bundle.queries;\n const evaluation = evaluateProviderCatalogPolicy({\n catalog: options.catalog,\n catalogPolicy: options.catalogPolicy,\n adapterInventory: options.adapterInventory,\n queries,\n });\n const runtimeHashes = {\n catalog: hashStableJson(options.catalog),\n catalogPolicy: hashStableJson(options.catalogPolicy ?? null),\n adapterInventory: hashStableJson(options.adapterInventory),\n queries: hashStableJson(queries),\n evaluation: hashStableJson(evaluation),\n };\n\n pushHashMismatch(\n errors,\n \"catalog\",\n options.bundle.hashes.catalog,\n runtimeHashes.catalog,\n );\n pushHashMismatch(\n errors,\n \"catalogPolicy\",\n options.bundle.hashes.catalogPolicy,\n runtimeHashes.catalogPolicy,\n );\n pushHashMismatch(\n errors,\n \"adapterInventory\",\n options.bundle.hashes.adapterInventory,\n runtimeHashes.adapterInventory,\n );\n pushHashMismatch(\n errors,\n \"queries\",\n options.bundle.hashes.queries,\n runtimeHashes.queries,\n );\n pushHashMismatch(\n errors,\n \"evaluation\",\n options.bundle.hashes.evaluation,\n runtimeHashes.evaluation,\n );\n\n const queryIndex =\n options.capability === undefined\n ? undefined\n : options.bundle.queries.findIndex(\n (query) => query.capability === options.capability,\n );\n const covered =\n options.capability === undefined ? true : queryIndex !== undefined && queryIndex >= 0;\n\n if (!covered) {\n errors.push({\n path: \"queries\",\n message: `Capability \"${options.capability}\" is not covered by the policy bundle queries.`,\n });\n }\n\n const valid = errors.length === 0;\n const attestation: ProviderCatalogPolicyBundleAttestation = {\n schemaVersion: PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION,\n bundleId: options.bundle.bundleId,\n status: options.bundle.status,\n hashAlgorithm: options.bundle.hashAlgorithm,\n bundleHash: options.bundle.hashes.bundle,\n catalogHash: options.bundle.hashes.catalog,\n catalogPolicyHash: options.bundle.hashes.catalogPolicy,\n adapterInventoryHash: options.bundle.hashes.adapterInventory,\n queriesHash: options.bundle.hashes.queries,\n evaluationHash: options.bundle.hashes.evaluation,\n runtimeVerified: valid,\n covered,\n capability: options.capability,\n queryIndex: queryIndex !== undefined && queryIndex >= 0 ? queryIndex : undefined,\n reason: valid ? \"runtime_verified\" : errors[0]?.message,\n };\n\n return {\n valid,\n attestation,\n errors,\n coveredQuery:\n queryIndex !== undefined && queryIndex >= 0\n ? options.bundle.queries[queryIndex]\n : undefined,\n };\n}\n\nfunction assertBundleOptions(\n options: ProviderCatalogPolicyBundleOptions,\n): asserts options is ProviderCatalogPolicyBundleOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle options must be an object.\",\n });\n }\n\n assertProviderCatalog(options.catalog);\n\n if (!Array.isArray(options.adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle adapterInventory must be an array.\",\n });\n }\n\n if (!Array.isArray(options.queries) || options.queries.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle requires at least one query.\",\n });\n }\n\n if (\n options.bundleId !== undefined &&\n (typeof options.bundleId !== \"string\" || options.bundleId.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundleId must be a non-empty string.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle generatedAt must be an ISO timestamp.\",\n });\n }\n}\n\nfunction assertRuntimeVerificationOptions(\n options: ProviderCatalogPolicyBundleRuntimeVerificationOptions,\n): asserts options is ProviderCatalogPolicyBundleRuntimeVerificationOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle runtime options must be an object.\",\n });\n }\n\n assertProviderCatalogPolicyBundle(options.bundle);\n assertProviderCatalog(options.catalog);\n\n if (!Array.isArray(options.adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Provider catalog policy bundle runtime adapterInventory must be an array.\",\n });\n }\n\n if (options.queries !== undefined && !Array.isArray(options.queries)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle runtime queries must be an array.\",\n });\n }\n\n if (\n options.capability !== undefined &&\n (typeof options.capability !== \"string\" || options.capability.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle runtime capability must be a string.\",\n });\n }\n}\n\nfunction createQueryCoverage(\n result: ProviderCatalogPolicyQueryResult,\n): ProviderCatalogPolicyBundleQueryCoverage {\n return {\n capability: result.query.capability,\n minMatches: result.query.minMatches ?? 1,\n matches: result.matches.length,\n routeableMatches: result.routeableMatches.length,\n missingAdapterMatches: result.missingAdapterMatches.length,\n providerIds: result.routeableMatches.map((match) => match.providerId),\n };\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction hashBundleContent(bundle: ProviderCatalogPolicyBundle) {\n return hashStableJson({\n ...bundle,\n hashes: {\n ...bundle.hashes,\n bundle: \"\",\n },\n });\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortSerializable(value));\n}\n\nfunction sortSerializable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortSerializable);\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .filter((key) => value[key] !== undefined)\n .map((key) => [key, sortSerializable(value[key])]),\n );\n}\n\nfunction pushHashMismatch(\n errors: ProviderCatalogPolicyBundleValidationError[],\n name: keyof Omit<ProviderCatalogPolicyBundleHashes, \"bundle\">,\n expected: string,\n actual: string,\n) {\n if (expected !== actual) {\n errors.push({\n path: `hashes.${name}`,\n message: `${name} hash does not match runtime input.`,\n });\n }\n}\n\nfunction formatBundleMarkdown(bundle: ProviderCatalogPolicyBundle) {\n const lines = [\n `# Provider Catalog Policy Bundle ${bundle.bundleId}`,\n \"\",\n `Status: ${bundle.status}`,\n `Generated: ${bundle.generatedAt}`,\n `Bundle hash: ${bundle.hashes.bundle}`,\n \"\",\n \"## Summary\",\n `- Catalog entries: ${bundle.catalogSummary.totalEntries}`,\n `- Ready entries: ${bundle.catalogSummary.readyEntries}`,\n `- Queries: ${bundle.queryCoverage.length}`,\n `- Routeable matches: ${bundle.evaluationSummary.routeableMatches}`,\n `- Failed checks: ${bundle.evaluationSummary.failedChecks}`,\n \"\",\n \"## Query Coverage\",\n ...bundle.queryCoverage.map(\n (coverage) =>\n `- ${coverage.capability}: ${coverage.routeableMatches}/${coverage.minMatches} routeable (${formatInlineList(\n coverage.providerIds,\n )})`,\n ),\n \"\",\n \"## Checks\",\n ...bundle.checks.map(\n (check) =>\n `- ${check.status === \"passed\" ? \"[x]\" : \"[ ]\"} ${check.name}: ${check.message}`,\n ),\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction validateHashes(\n value: unknown,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!isRecord(value)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const key of [\n \"catalog\",\n \"catalogPolicy\",\n \"adapterInventory\",\n \"queries\",\n \"evaluation\",\n \"bundle\",\n ]) {\n validateSha256(value[key], `hashes.${key}`, errors);\n }\n}\n\nfunction validateQueryCoverage(\n value: unknown,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!Array.isArray(value)) {\n errors.push({\n path: \"queryCoverage\",\n message: \"queryCoverage must be an array.\",\n });\n return;\n }\n\n value.forEach((coverage, index) => {\n if (!isRecord(coverage)) {\n errors.push({\n path: `queryCoverage.${index}`,\n message: \"query coverage entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(coverage.capability, `queryCoverage.${index}.capability`, errors);\n validateNonNegativeInteger(\n coverage.minMatches,\n `queryCoverage.${index}.minMatches`,\n errors,\n );\n validateNonNegativeInteger(\n coverage.matches,\n `queryCoverage.${index}.matches`,\n errors,\n );\n validateNonNegativeInteger(\n coverage.routeableMatches,\n `queryCoverage.${index}.routeableMatches`,\n errors,\n );\n validateNonNegativeInteger(\n coverage.missingAdapterMatches,\n `queryCoverage.${index}.missingAdapterMatches`,\n errors,\n );\n validateStringArray(coverage.providerIds, `queryCoverage.${index}.providerIds`, errors);\n });\n}\n\nfunction validateCheckArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!Array.isArray(value)) {\n errors.push({\n path,\n message: `${path} must be an array.`,\n });\n return;\n }\n\n value.forEach((check, index) => {\n if (!isRecord(check)) {\n errors.push({\n path: `${path}.${index}`,\n message: \"check must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(check.name, `${path}.${index}.name`, errors);\n\n if (check.status !== \"passed\" && check.status !== \"failed\") {\n errors.push({\n path: `${path}.${index}.status`,\n message: 'check status must be \"passed\" or \"failed\".',\n });\n }\n\n validateNonEmptyString(check.message, `${path}.${index}.message`, errors);\n });\n}\n\nfunction validateObject(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!isRecord(value)) {\n errors.push({\n path,\n message: `${path} must be an object.`,\n });\n }\n}\n\nfunction validateSha256(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n errors.push({\n path,\n message: `${path} must be a sha256 hex string.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction validateNonNegativeInteger(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n errors.push({\n path,\n message: `${path} must be a non-negative integer.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction sanitizeBundleOutput<T>(value: T, forbiddenOutputValues: string[]) {\n return replaceForbiddenValues(\n cloneSerializable(value),\n forbiddenOutputValues.filter((entry) => entry.length > 0),\n ) as T;\n}\n\nfunction replaceForbiddenValues(value: unknown, forbiddenValues: string[]): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => replaceForbiddenValues(entry, forbiddenValues));\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues),\n ]),\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction formatValidationErrors(errors: ProviderCatalogPolicyBundleValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction formatInlineList(values: string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { ProbeMeshError } from \"./errors\";\nimport {\n mergePaymentPreferences,\n validatePaymentPreferences,\n validatePaymentStrategy,\n} from \"./paymentOptions\";\nimport {\n assertProviderCatalog,\n findProviderCatalogMatches,\n summarizeProviderCatalog,\n} from \"./providerCatalog\";\nimport type {\n ProviderCatalog,\n ProviderCatalogEntry,\n ProviderCatalogMatch,\n ProviderCatalogQuery,\n ProviderCatalogSummary,\n} from \"./providerCatalog\";\nimport type { ProviderCatalogArtifactStatus } from \"./providerCatalogArtifact\";\nimport type { ProviderProtocolMode } from \"./providerKit/types\";\nimport type {\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentStrategy,\n ProbeMeshPricing,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\n\nexport type ProviderCatalogPolicyEvaluationStatus = \"passed\" | \"failed\";\n\nexport type ProviderCatalogPolicyCheckStatus = \"passed\" | \"failed\";\n\nexport type ProviderCatalogPolicyReportFormat = \"json\" | \"markdown\";\n\nexport interface ProviderCatalogPolicyAdapterInventoryEntry {\n id: string;\n capabilities: string[];\n pricing?: ProbeMeshPricing | Record<string, ProbeMeshPricing>;\n paymentOptions?: ProviderPaymentOption[];\n}\n\nexport type ProviderCatalogPolicyAdapterInventory =\n ProviderCatalogPolicyAdapterInventoryEntry[];\n\nexport interface ProviderCatalogPolicyOptions {\n enabled?: boolean;\n status?: ProviderCatalogArtifactStatus;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n}\n\nexport interface ProviderCatalogPolicyExpectedQuery\n extends ProviderCatalogPolicyOptions {\n capability: string;\n minMatches?: number;\n}\n\nexport interface ProviderCatalogPolicyEvaluationOptions {\n catalog: ProviderCatalog;\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n}\n\nexport interface ProviderCatalogPolicyCheck {\n name: string;\n status: ProviderCatalogPolicyCheckStatus;\n message: string;\n capability?: string;\n providerId?: string;\n}\n\nexport interface ProviderCatalogPolicySkippedProvider {\n providerId: string;\n capability: string;\n reasons: string[];\n catalogArtifactId?: string;\n catalogStatus?: ProviderCatalogArtifactStatus;\n inventoryOnly?: boolean;\n}\n\nexport interface ProviderCatalogPolicyMissingAdapterMatch {\n providerId: string;\n capability: string;\n catalogArtifactId: string;\n catalogStatus: ProviderCatalogArtifactStatus;\n reasons: string[];\n}\n\nexport interface ProviderCatalogPolicyQueryResult {\n query: ProviderCatalogPolicyExpectedQuery;\n matches: ProviderCatalogMatch[];\n routeableMatches: ProviderCatalogMatch[];\n missingAdapterMatches: ProviderCatalogPolicyMissingAdapterMatch[];\n skippedProviders: ProviderCatalogPolicySkippedProvider[];\n}\n\nexport interface ProviderCatalogPolicyEvaluationResult {\n status: ProviderCatalogPolicyEvaluationStatus;\n checks: ProviderCatalogPolicyCheck[];\n summary: ProviderCatalogSummary & {\n totalQueries: number;\n passedChecks: number;\n failedChecks: number;\n routeableMatches: number;\n missingAdapterMatches: number;\n };\n queryResults: ProviderCatalogPolicyQueryResult[];\n}\n\nexport interface ProviderCatalogPolicyReportOptions {\n title?: string;\n generatedAt?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderCatalogPolicyReport {\n title: string;\n generatedAt: string;\n status: ProviderCatalogPolicyEvaluationStatus;\n summary: ProviderCatalogPolicyEvaluationResult[\"summary\"];\n checks: ProviderCatalogPolicyCheck[];\n queryResults: ProviderCatalogPolicyQueryResult[];\n}\n\nexport function evaluateProviderCatalogPolicy(\n options: ProviderCatalogPolicyEvaluationOptions,\n): ProviderCatalogPolicyEvaluationResult {\n assertEvaluationOptions(options);\n\n const catalogPolicy = resolveCatalogPolicy(options.catalogPolicy);\n const adapterInventory = options.adapterInventory;\n const adapterIds = new Set(adapterInventory.map((adapter) => adapter.id));\n const catalogSummary = summarizeProviderCatalog(options.catalog);\n const checks: ProviderCatalogPolicyCheck[] = [\n {\n name: \"catalog_valid\",\n status: \"passed\",\n message: \"Provider catalog is valid.\",\n },\n {\n name: \"adapter_inventory_valid\",\n status: \"passed\",\n message: \"Adapter inventory is valid.\",\n },\n ];\n const queryResults = options.queries.map((query) =>\n evaluateQuery({\n catalog: options.catalog,\n catalogPolicy,\n query,\n adapterInventory,\n adapterIds,\n checks,\n }),\n );\n\n const failedChecks = checks.filter((check) => check.status === \"failed\").length;\n const routeableMatches = queryResults.reduce(\n (total, result) => total + result.routeableMatches.length,\n 0,\n );\n const missingAdapterMatches = queryResults.reduce(\n (total, result) => total + result.missingAdapterMatches.length,\n 0,\n );\n\n return {\n status: failedChecks === 0 ? \"passed\" : \"failed\",\n checks,\n summary: {\n ...catalogSummary,\n totalQueries: options.queries.length,\n passedChecks: checks.length - failedChecks,\n failedChecks,\n routeableMatches,\n missingAdapterMatches,\n },\n queryResults,\n };\n}\n\nexport function createProviderCatalogPolicyReport(\n result: ProviderCatalogPolicyEvaluationResult,\n options: ProviderCatalogPolicyReportOptions = {},\n): ProviderCatalogPolicyReport {\n const report: ProviderCatalogPolicyReport = {\n title: options.title ?? \"ProbeMesh Catalog Policy Report\",\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: result.status,\n summary: cloneSerializable(result.summary),\n checks: cloneSerializable(result.checks),\n queryResults: cloneSerializable(result.queryResults),\n };\n\n return sanitizeReport(report, options.forbiddenOutputValues ?? []);\n}\n\nexport function formatProviderCatalogPolicyReport(\n report: ProviderCatalogPolicyReport,\n options: {\n format?: ProviderCatalogPolicyReportFormat;\n } = {},\n) {\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatMarkdownReport(report);\n }\n\n return JSON.stringify(report, null, 2);\n}\n\nfunction assertEvaluationOptions(\n options: ProviderCatalogPolicyEvaluationOptions,\n): asserts options is ProviderCatalogPolicyEvaluationOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy evaluation options must be an object.\",\n });\n }\n\n assertProviderCatalog(options.catalog);\n assertAdapterInventory(options.adapterInventory);\n\n if (!Array.isArray(options.queries) || options.queries.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy evaluation requires at least one query.\",\n });\n }\n\n options.queries.forEach((query, index) =>\n assertExpectedQuery(query, `queries.${index}`),\n );\n assertCatalogPolicyOptions(options.catalogPolicy, \"catalogPolicy\");\n}\n\nfunction assertAdapterInventory(\n adapterInventory: unknown,\n): asserts adapterInventory is ProviderCatalogPolicyAdapterInventory {\n if (!Array.isArray(adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy adapterInventory must be an array.\",\n });\n }\n\n const seen = new Set<string>();\n\n adapterInventory.forEach((adapter, index) => {\n const path = `adapterInventory.${index}`;\n\n if (!isRecord(adapter)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an object.`,\n });\n }\n\n if (typeof adapter.id !== \"string\" || adapter.id.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.id must be a non-empty string.`,\n });\n }\n\n if (seen.has(adapter.id)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.id duplicates adapter \"${adapter.id}\".`,\n });\n }\n\n seen.add(adapter.id);\n\n if (\n !Array.isArray(adapter.capabilities) ||\n adapter.capabilities.some(\n (capability) => typeof capability !== \"string\" || capability.length === 0,\n )\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.capabilities must be an array of non-empty strings.`,\n });\n }\n\n if (\n adapter.paymentOptions !== undefined &&\n (!Array.isArray(adapter.paymentOptions) ||\n adapter.paymentOptions.some(\n (option) =>\n !isRecord(option) ||\n typeof option.id !== \"string\" ||\n option.id.length === 0 ||\n typeof option.protocolMode !== \"string\" ||\n option.protocolMode.length === 0,\n ))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.paymentOptions must be an array of payment option objects when provided.`,\n });\n }\n });\n}\n\nfunction assertExpectedQuery(\n query: unknown,\n path: string,\n): asserts query is ProviderCatalogPolicyExpectedQuery {\n if (!isRecord(query)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an object.`,\n });\n }\n\n if (typeof query.capability !== \"string\" || query.capability.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.capability must be a non-empty string.`,\n });\n }\n\n const minMatches = query.minMatches;\n\n if (\n minMatches !== undefined &&\n (typeof minMatches !== \"number\" ||\n !Number.isInteger(minMatches) ||\n minMatches < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.minMatches must be a non-negative integer.`,\n });\n }\n\n assertCatalogPolicyOptions(query, path);\n}\n\nfunction assertCatalogPolicyOptions(\n policy: unknown,\n path: string,\n): asserts policy is ProviderCatalogPolicyOptions | undefined {\n if (policy === undefined) {\n return;\n }\n\n if (!isRecord(policy)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an object when provided.`,\n });\n }\n\n if (\n policy.status !== undefined &&\n policy.status !== \"ready\" &&\n policy.status !== \"rejected\"\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.status must be \"ready\" or \"rejected\".`,\n });\n }\n\n if (\n policy.protocolMode !== undefined &&\n (typeof policy.protocolMode !== \"string\" || policy.protocolMode.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.protocolMode must be a non-empty string.`,\n });\n }\n\n validatePaymentPreferences(policy.paymentPreferences, `${path}.paymentPreferences`);\n validatePaymentStrategy(policy.paymentStrategy, `${path}.paymentStrategy`);\n\n if (\n policy.maxCostUsd !== undefined &&\n (typeof policy.maxCostUsd !== \"number\" ||\n !Number.isFinite(policy.maxCostUsd) ||\n policy.maxCostUsd < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.maxCostUsd must be a non-negative finite number.`,\n });\n }\n\n validateStringArray(policy.providerIds, `${path}.providerIds`);\n validateStringArray(policy.blockedProviderIds, `${path}.blockedProviderIds`);\n\n if (\n policy.requiredReceiptTypes !== undefined &&\n (!Array.isArray(policy.requiredReceiptTypes) ||\n policy.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.requiredReceiptTypes must contain known receipt types.`,\n });\n }\n}\n\nfunction evaluateQuery(options: {\n catalog: ProviderCatalog;\n catalogPolicy: ResolvedPolicy;\n query: ProviderCatalogPolicyExpectedQuery;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n adapterIds: Set<string>;\n checks: ProviderCatalogPolicyCheck[];\n}): ProviderCatalogPolicyQueryResult {\n const resolvedQuery = resolveQuery(options.catalogPolicy, options.query);\n const matches = findProviderCatalogMatches(options.catalog, resolvedQuery);\n const routeableMatches = matches.filter((match) =>\n hasRouteableAdapter(match, options.adapterInventory),\n );\n const missingAdapterMatches = matches\n .filter((match) => !options.adapterIds.has(match.providerId))\n .map((match) => ({\n providerId: match.providerId,\n capability: match.capability,\n catalogArtifactId: match.entry.artifactId,\n catalogStatus: match.entry.status,\n reasons: [\n ...match.reasons,\n `missing_adapter:${match.providerId}`,\n ],\n }));\n const skippedProviders = createSkippedProviders(\n options.catalog.entries,\n options.query.capability,\n matches,\n resolvedQuery,\n options.adapterInventory,\n );\n const minMatches = options.query.minMatches ?? 1;\n\n pushCheck(options.checks, {\n name: \"ready_matches\",\n status: matches.length >= minMatches ? \"passed\" : \"failed\",\n capability: options.query.capability,\n message:\n matches.length >= minMatches\n ? `Found ${matches.length} catalog match(es) for \"${options.query.capability}\".`\n : `Expected at least ${minMatches} catalog match(es) for \"${options.query.capability}\", found ${matches.length}.`,\n });\n pushCheck(options.checks, {\n name: \"routeable_matches\",\n status: routeableMatches.length >= minMatches ? \"passed\" : \"failed\",\n capability: options.query.capability,\n message:\n routeableMatches.length >= minMatches\n ? `Found ${routeableMatches.length} routeable adapter-backed match(es) for \"${options.query.capability}\".`\n : `Expected at least ${minMatches} routeable adapter-backed match(es) for \"${options.query.capability}\", found ${routeableMatches.length}.`,\n });\n\n for (const missingMatch of missingAdapterMatches) {\n pushCheck(options.checks, {\n name: \"missing_adapter\",\n status: routeableMatches.length >= minMatches ? \"passed\" : \"failed\",\n capability: missingMatch.capability,\n providerId: missingMatch.providerId,\n message:\n routeableMatches.length >= minMatches\n ? `Catalog provider \"${missingMatch.providerId}\" matches policy but is missing from adapter inventory; minimum routeable matches are still satisfied.`\n : `Catalog provider \"${missingMatch.providerId}\" matches policy but is missing from adapter inventory.`,\n });\n }\n\n return {\n query: options.query,\n matches,\n routeableMatches,\n missingAdapterMatches,\n skippedProviders,\n };\n}\n\ninterface ResolvedPolicy {\n enabled: boolean;\n status: ProviderCatalogArtifactStatus;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n}\n\nfunction resolveCatalogPolicy(\n policy: ProviderCatalogPolicyOptions | undefined,\n): ResolvedPolicy {\n return {\n enabled: policy?.enabled ?? true,\n status: policy?.status ?? \"ready\",\n protocolMode: policy?.protocolMode,\n paymentPreferences: policy?.paymentPreferences,\n paymentStrategy: policy?.paymentStrategy,\n maxCostUsd: policy?.maxCostUsd,\n requiredReceiptTypes: policy?.requiredReceiptTypes,\n providerIds: policy?.providerIds,\n blockedProviderIds: policy?.blockedProviderIds,\n };\n}\n\nfunction resolveQuery(\n policy: ResolvedPolicy,\n query: ProviderCatalogPolicyExpectedQuery,\n): ProviderCatalogQuery {\n const queryPolicy = resolveCatalogPolicy(query);\n const activePolicy = policy.enabled ? policy : resolveCatalogPolicy(undefined);\n\n return {\n capability: query.capability,\n protocolMode: queryPolicy.protocolMode ?? activePolicy.protocolMode,\n paymentPreferences: mergePaymentPreferences(\n activePolicy.paymentPreferences,\n queryPolicy.paymentPreferences,\n ),\n paymentStrategy: queryPolicy.paymentStrategy ?? activePolicy.paymentStrategy,\n maxCostUsd: strictestMaxCostUsd(\n queryPolicy.maxCostUsd,\n activePolicy.maxCostUsd,\n ),\n requiredReceiptTypes: unionProviderIds(\n queryPolicy.requiredReceiptTypes,\n activePolicy.requiredReceiptTypes,\n ) as ReceiptType[],\n providerIds: intersectProviderIds(\n queryPolicy.providerIds,\n activePolicy.providerIds,\n ),\n blockedProviderIds: unionProviderIds(\n queryPolicy.blockedProviderIds,\n activePolicy.blockedProviderIds,\n ),\n status: queryPolicy.status ?? activePolicy.status,\n };\n}\n\nfunction hasRouteableAdapter(\n match: ProviderCatalogMatch,\n adapterInventory: ProviderCatalogPolicyAdapterInventory,\n) {\n return adapterInventory.some(\n (adapter) =>\n adapter.id === match.providerId &&\n adapter.capabilities.includes(match.capability) &&\n (adapter.paymentOptions === undefined ||\n match.paymentSelection === undefined ||\n adapter.paymentOptions.some(\n (option) => option.id === match.paymentSelection?.optionId,\n )),\n );\n}\n\nfunction createSkippedProviders(\n entries: ProviderCatalogEntry[],\n capability: string,\n matches: ProviderCatalogMatch[],\n query: ProviderCatalogQuery,\n adapterInventory: ProviderCatalogPolicyAdapterInventory,\n) {\n const matchIds = new Set(matches.map((match) => match.providerId));\n const adapterIds = new Set(adapterInventory.map((adapter) => adapter.id));\n const catalogProviderIds = new Set(entries.map((entry) => entry.provider.id));\n const skippedCatalogEntries = entries\n .filter((entry) => entry.provider.capabilities.includes(capability))\n .filter((entry) => !matchIds.has(entry.provider.id))\n .map((entry) => ({\n providerId: entry.provider.id,\n capability,\n catalogArtifactId: entry.artifactId,\n catalogStatus: entry.status,\n reasons: explainSkippedEntry(entry, query, adapterIds),\n }));\n const inventoryOnlyAdapters = adapterInventory\n .filter((adapter) => adapter.capabilities.includes(capability))\n .filter((adapter) => !catalogProviderIds.has(adapter.id))\n .map((adapter) => ({\n providerId: adapter.id,\n capability,\n inventoryOnly: true,\n reasons: [\"adapter:not_in_catalog\"],\n }));\n\n return [...skippedCatalogEntries, ...inventoryOnlyAdapters];\n}\n\nfunction explainSkippedEntry(\n entry: ProviderCatalogEntry,\n query: ProviderCatalogQuery,\n adapterIds: Set<string>,\n) {\n const reasons: string[] = [];\n const providerId = entry.provider.id;\n\n if (entry.status !== (query.status ?? \"ready\")) {\n reasons.push(`status:${entry.status}`);\n }\n\n if (query.protocolMode && entry.provider.protocolMode !== query.protocolMode) {\n reasons.push(`protocol:${entry.provider.protocolMode}`);\n }\n\n if (query.paymentPreferences) {\n const paymentMatch = findProviderCatalogMatches(\n {\n schemaVersion: \"probemesh.provider-catalog.index.v1\",\n generatedAt: \"1970-01-01T00:00:00.000Z\",\n entries: [entry],\n },\n {\n capability: query.capability,\n paymentPreferences: query.paymentPreferences,\n status: entry.status,\n },\n );\n\n if (paymentMatch.length === 0) {\n reasons.push(\"payment_preferences:not_matched\");\n }\n }\n\n if (query.providerIds && !query.providerIds.includes(providerId)) {\n reasons.push(\"provider:not_allowed\");\n }\n\n if (query.blockedProviderIds?.includes(providerId)) {\n reasons.push(\"provider:blocked\");\n }\n\n const cost = resolveCatalogCost(entry, query.capability);\n\n if (\n query.maxCostUsd !== undefined &&\n (cost === undefined || cost.amountUsd > query.maxCostUsd)\n ) {\n reasons.push(`cost:${cost?.amountUsd ?? \"unknown\"}>${query.maxCostUsd}`);\n }\n\n const receiptTypes = new Set(entry.acceptance.receipts.types);\n\n for (const receiptType of query.requiredReceiptTypes ?? []) {\n if (!receiptTypes.has(receiptType)) {\n reasons.push(`missing_receipt:${receiptType}`);\n }\n }\n\n if (!adapterIds.has(providerId)) {\n reasons.push(`missing_adapter:${providerId}`);\n }\n\n return reasons.length > 0 ? reasons : [\"not_matched\"];\n}\n\nfunction resolveCatalogCost(\n entry: ProviderCatalogEntry,\n capability: string,\n) {\n const pricing = entry.provider.pricing;\n\n if (isPricing(pricing)) {\n return pricing;\n }\n\n const capabilityPricing = pricing[capability];\n return isPricing(capabilityPricing) ? capabilityPricing : undefined;\n}\n\nfunction pushCheck(\n checks: ProviderCatalogPolicyCheck[],\n check: ProviderCatalogPolicyCheck,\n) {\n checks.push(check);\n}\n\nfunction strictestMaxCostUsd(\n first: number | undefined,\n second: number | undefined,\n) {\n if (first === undefined) {\n return second;\n }\n\n if (second === undefined) {\n return first;\n }\n\n return Math.min(first, second);\n}\n\nfunction intersectProviderIds(\n first: string[] | undefined,\n second: string[] | undefined,\n) {\n if (!first) {\n return second;\n }\n\n if (!second) {\n return first;\n }\n\n return first.filter((providerId) => second.includes(providerId));\n}\n\nfunction unionProviderIds(first: string[] | undefined, second: string[] | undefined) {\n return [...new Set([...(first ?? []), ...(second ?? [])])];\n}\n\nfunction formatMarkdownReport(report: ProviderCatalogPolicyReport) {\n const lines = [\n `# ${report.title}`,\n \"\",\n `Status: ${report.status}`,\n `Generated: ${report.generatedAt}`,\n \"\",\n \"## Summary\",\n `- Total entries: ${report.summary.totalEntries}`,\n `- Ready entries: ${report.summary.readyEntries}`,\n `- Rejected entries: ${report.summary.rejectedEntries}`,\n `- Queries: ${report.summary.totalQueries}`,\n `- Routeable matches: ${report.summary.routeableMatches}`,\n `- Missing adapter matches: ${report.summary.missingAdapterMatches}`,\n `- Failed checks: ${report.summary.failedChecks}`,\n \"\",\n \"## Checks\",\n ...report.checks.map(\n (check) =>\n `- ${check.status === \"passed\" ? \"[x]\" : \"[ ]\"} ${check.name}: ${check.message}`,\n ),\n \"\",\n \"## Queries\",\n ...report.queryResults.flatMap((result) => [\n `### ${result.query.capability}`,\n `- Matches: ${formatProviderIds(result.matches.map((match) => match.providerId))}`,\n `- Payment options: ${formatMatchPaymentOptions(result.routeableMatches)}`,\n `- Routeable: ${formatProviderIds(\n result.routeableMatches.map((match) => match.providerId),\n )}`,\n `- Missing adapters: ${formatProviderIds(\n result.missingAdapterMatches.map((match) => match.providerId),\n )}`,\n `- Skipped: ${formatProviderIds(\n result.skippedProviders.map((provider) => provider.providerId),\n )}`,\n \"\",\n ]),\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatProviderIds(providerIds: string[]) {\n return providerIds.length > 0 ? providerIds.join(\", \") : \"none\";\n}\n\nfunction formatMatchPaymentOptions(matches: ProviderCatalogMatch[]) {\n if (matches.length === 0) {\n return \"none\";\n }\n\n return matches\n .map((match) => {\n const selection = match.paymentSelection;\n\n if (!selection) {\n return `${match.providerId}: none`;\n }\n\n const score =\n selection.score !== undefined ? ` score=${selection.score}` : \"\";\n const reasons =\n selection.scoreReasons && selection.scoreReasons.length > 0\n ? ` (${selection.scoreReasons.join(\"; \")})`\n : \"\";\n\n return `${match.providerId}: ${selection.optionId}/${selection.protocolMode}${score}${reasons}`;\n })\n .join(\", \");\n}\n\nfunction sanitizeReport<T>(value: T, forbiddenOutputValues: string[]) {\n return replaceForbiddenValues(\n cloneSerializable(value),\n forbiddenOutputValues.filter((entry) => entry.length > 0),\n ) as T;\n}\n\nfunction replaceForbiddenValues(value: unknown, forbiddenValues: string[]): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => replaceForbiddenValues(entry, forbiddenValues));\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues),\n ]),\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction validateStringArray(value: unknown, path: string) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n typeof value.amountUsd === \"number\" &&\n Number.isFinite(value.amountUsd) &&\n value.amountUsd >= 0 &&\n (value.currency === undefined || typeof value.currency === \"string\")\n );\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { ProbeMeshError } from \"./errors\";\nimport type { JsonSchemaLike } from \"./providerKit/types\";\n\nexport interface JsonSchemaLikeValidationError {\n path: string;\n message: string;\n}\n\nexport interface JsonSchemaLikeValidationResult {\n valid: boolean;\n errors: JsonSchemaLikeValidationError[];\n}\n\nexport interface JsonSchemaLikeValidationOptions {\n path?: string;\n}\n\nexport function validateJsonSchemaLikeValue(\n value: unknown,\n schema: JsonSchemaLike,\n options: JsonSchemaLikeValidationOptions = {},\n): JsonSchemaLikeValidationResult {\n const errors: JsonSchemaLikeValidationError[] = [];\n\n validateValue(value, schema, options.path ?? \"$\", errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertJsonSchemaLikeValue(\n value: unknown,\n schema: JsonSchemaLike,\n options: JsonSchemaLikeValidationOptions = {},\n): void {\n const result = validateJsonSchemaLikeValue(value, schema, options);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `JSON schema-lite validation failed: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nfunction validateValue(\n value: unknown,\n schema: JsonSchemaLike,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (!isRecord(schema)) {\n errors.push({\n path,\n message: \"schema must be an object.\",\n });\n return;\n }\n\n if (schema.enum !== undefined) {\n if (!Array.isArray(schema.enum)) {\n errors.push({\n path,\n message: \"schema enum must be an array.\",\n });\n } else if (!schema.enum.some((candidate) => deepEqual(candidate, value))) {\n errors.push({\n path,\n message: \"value must match one of the schema enum values.\",\n });\n }\n }\n\n if (schema.type !== undefined) {\n validateType(value, schema.type, path, errors);\n }\n\n if (isRecord(value)) {\n validateObjectValue(value, schema, path, errors);\n }\n\n if (Array.isArray(value)) {\n validateArrayValue(value, schema, path, errors);\n }\n}\n\nfunction validateType(\n value: unknown,\n type: unknown,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (typeof type !== \"string\") {\n errors.push({\n path,\n message: \"schema type must be a string.\",\n });\n return;\n }\n\n const valid =\n type === \"object\"\n ? isRecord(value)\n : type === \"array\"\n ? Array.isArray(value)\n : type === \"string\"\n ? typeof value === \"string\"\n : type === \"number\"\n ? typeof value === \"number\" && Number.isFinite(value)\n : type === \"integer\"\n ? Number.isInteger(value)\n : type === \"boolean\"\n ? typeof value === \"boolean\"\n : type === \"null\"\n ? value === null\n : true;\n\n if (!valid) {\n errors.push({\n path,\n message: `value must be ${type}.`,\n });\n }\n}\n\nfunction validateObjectValue(\n value: Record<string, unknown>,\n schema: JsonSchemaLike,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (schema.required !== undefined) {\n if (!Array.isArray(schema.required)) {\n errors.push({\n path,\n message: \"schema required must be an array.\",\n });\n } else {\n for (const requiredKey of schema.required) {\n if (typeof requiredKey !== \"string\") {\n errors.push({\n path,\n message: \"schema required entries must be strings.\",\n });\n continue;\n }\n\n if (!(requiredKey in value)) {\n errors.push({\n path: `${path}.${requiredKey}`,\n message: \"required property is missing.\",\n });\n }\n }\n }\n }\n\n const properties = isRecord(schema.properties) ? schema.properties : undefined;\n\n if (properties) {\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (key in value) {\n validateValue(\n value[key],\n propertySchema as JsonSchemaLike,\n `${path}.${key}`,\n errors,\n );\n }\n }\n }\n\n if (schema.additionalProperties === false && properties) {\n for (const key of Object.keys(value)) {\n if (!(key in properties)) {\n errors.push({\n path: `${path}.${key}`,\n message: \"additional property is not allowed.\",\n });\n }\n }\n } else if (isRecord(schema.additionalProperties)) {\n const additionalSchema = schema.additionalProperties as JsonSchemaLike;\n\n for (const key of Object.keys(value)) {\n if (!properties || !(key in properties)) {\n validateValue(value[key], additionalSchema, `${path}.${key}`, errors);\n }\n }\n }\n}\n\nfunction validateArrayValue(\n value: unknown[],\n schema: JsonSchemaLike,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (schema.items === undefined) {\n return;\n }\n\n if (!isRecord(schema.items)) {\n errors.push({\n path,\n message: \"schema items must be an object.\",\n });\n return;\n }\n\n value.forEach((item, index) => {\n validateValue(item, schema.items as JsonSchemaLike, `${path}.${index}`, errors);\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction deepEqual(left: unknown, right: unknown) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction formatValidationErrors(errors: JsonSchemaLikeValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","import type { HostedTelemetryEvent } from \"./hostedRouter\";\nimport { startHostedRouter } from \"./hostedRouter\";\nimport { createProbeMesh } from \"./client\";\nimport { ProbeMeshError, isProbeMeshError } from \"./errors\";\nimport {\n isSharedJsonSchemaLike,\n validateProviderManifest,\n} from \"./providerKit/manifest\";\nimport type { JsonSchemaLike, ProviderManifest } from \"./providerKit/types\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport {\n validateJsonSchemaLikeValue,\n type JsonSchemaLikeValidationError,\n} from \"./schemaValidation\";\nimport type {\n ProbeMeshAdapter,\n ProbeMeshCallRequest,\n ProbeMeshCallResponse,\n ProbeMeshCallSafety,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteDecisionReason,\n ProbeMeshRouteMetadata,\n ProbeMeshTimelineEventType,\n ReceiptRef,\n ReceiptType,\n} from \"./types\";\n\nexport type ProviderConformanceStatus = \"passed\" | \"failed\";\n\nexport interface ProviderConformanceCheck {\n name: string;\n status: ProviderConformanceStatus;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface ProviderConformanceSchemaValidationMode {\n input?: boolean;\n output?: boolean;\n}\n\nexport interface ProviderConformanceOptions<Input = unknown> {\n manifest: ProviderManifest;\n adapters: ProbeMeshAdapter[];\n request: ProbeMeshCallRequest<Input>;\n apiKey?: string;\n expectedProviderId?: string;\n requiredReceiptTypes?: ReceiptType[];\n schemaValidation?: ProviderConformanceSchemaValidationMode;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderConformanceError {\n name: \"ProbeMeshError\";\n code: ProbeMeshErrorCode;\n message: string;\n status: \"failed\";\n capability?: string;\n provider?: string;\n callId?: string;\n receiptRefs?: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n timeline?: ProbeMeshCallResponse[\"timeline\"];\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProbeMeshRouteMetadata;\n}\n\nexport interface ProviderConformanceSummary {\n status: ProviderConformanceStatus;\n totalChecks: number;\n passedChecks: number;\n failedChecks: number;\n failedCheckNames: string[];\n callId?: string;\n providerId?: string;\n errorCode?: ProbeMeshErrorCode;\n receiptTypes: ReceiptType[];\n requiredReceiptTypes: ReceiptType[];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: {\n routeId?: string;\n selectedProviderId?: string;\n fallbackUsed?: boolean;\n fallbackCount?: number;\n stopReason?: ProbeMeshRouteDecisionReason;\n };\n}\n\nexport interface ProviderConformanceResult<Data = unknown> {\n status: ProviderConformanceStatus;\n checks: ProviderConformanceCheck[];\n response?: ProbeMeshCallResponse<Data>;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n summary: ProviderConformanceSummary;\n}\n\nexport type ProviderConformanceReportFormat = \"json\" | \"markdown\";\n\nexport interface ProviderConformanceReportOptions {\n title?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderConformanceReport {\n title: string;\n status: ProviderConformanceStatus;\n summary: ProviderConformanceSummary;\n checks: ProviderConformanceCheck[];\n receipts: {\n total: number;\n types: ReceiptType[];\n providers: string[];\n byType: Partial<Record<ReceiptType, number>>;\n hasPaymentProof: boolean;\n hasSettlementConfirmation: boolean;\n hasProviderDelivery: boolean;\n };\n route?: ProviderConformanceSummary[\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n error?: ProviderConformanceError;\n}\n\nconst DEFAULT_REQUIRED_RECEIPT_TYPES: ReceiptType[] = [\"provider_delivery\"];\n\nexport async function runProviderConformance<\n Input = unknown,\n Data = unknown,\n>(\n options: ProviderConformanceOptions<Input>,\n): Promise<ProviderConformanceResult<Data>> {\n assertConformanceOptions(options);\n\n const requiredReceiptTypes =\n options.requiredReceiptTypes ?? DEFAULT_REQUIRED_RECEIPT_TYPES;\n const schemaValidation = options.schemaValidation ?? {};\n const forbiddenOutputValues = options.forbiddenOutputValues ?? [];\n const manifestValidation = validateProviderManifest(options.manifest);\n const setupChecks: ProviderConformanceCheck[] = [\n manifestValidation.valid\n ? pass(\"manifest_valid\", \"Provider manifest is valid.\")\n : fail(\"manifest_valid\", \"Provider manifest is invalid.\", {\n errors: manifestValidation.errors,\n }),\n ];\n const inputSchema = schemaValidation.input\n ? schemaForCapability(options.manifest.inputSchema, options.request.capability)\n : undefined;\n\n if (inputSchema) {\n const inputValidation = validateJsonSchemaLikeValue(\n options.request.input,\n inputSchema,\n {\n path: \"$.input\",\n },\n );\n\n setupChecks.push(\n inputValidation.valid\n ? pass(\"input_schema_valid\", \"Request input matches the declared schema.\")\n : fail(\"input_schema_valid\", \"Request input does not match the declared schema.\", {\n errors: inputValidation.errors,\n }),\n );\n } else if (schemaValidation.input) {\n setupChecks.push(\n fail(\"input_schema_valid\", \"No input schema is declared for this capability.\"),\n );\n }\n\n if (setupChecks.some((check) => check.status === \"failed\")) {\n const checks = [\n ...setupChecks,\n createSecretSafeOutputCheck({\n checks: setupChecks,\n requiredReceiptTypes,\n telemetryEvents: [],\n forbiddenOutputValues,\n }),\n ];\n const status = statusFromChecks(checks);\n const sanitizedChecks = sanitizeConformanceOutput(checks, forbiddenOutputValues);\n\n return {\n status,\n checks: sanitizedChecks,\n telemetryEvents: [],\n summary: createSummary({\n status,\n checks: sanitizedChecks,\n telemetryEvents: [],\n requiredReceiptTypes,\n }),\n };\n }\n\n const telemetryEvents: HostedTelemetryEvent[] = [];\n const hostedRouter = await startHostedRouter({\n port: 0,\n adapters: options.adapters,\n apiKeys: options.apiKey ? [options.apiKey] : undefined,\n onTelemetryEvent(event) {\n telemetryEvents.push(event);\n },\n });\n\n let response: ProbeMeshCallResponse<Data> | undefined;\n let error: ProviderConformanceError | undefined;\n\n try {\n const probemesh = createProbeMesh({\n hosted: {\n baseUrl: hostedRouter.url,\n apiKey: options.apiKey,\n },\n });\n\n try {\n response = await probemesh.call<Input, Data>(options.request);\n } catch (caught) {\n error = toConformanceError(caught);\n }\n } finally {\n await hostedRouter.close();\n }\n\n const baseChecks = [\n ...setupChecks,\n ...createExecutionChecks({\n response,\n error,\n telemetryEvents,\n expectedProviderId: options.expectedProviderId ?? options.manifest.id,\n requiredReceiptTypes,\n }),\n ];\n const outputSchema = schemaValidation.output\n ? schemaForCapability(options.manifest.outputSchema, options.request.capability)\n : undefined;\n\n if (outputSchema) {\n baseChecks.push(outputSchemaCheck(response, outputSchema));\n } else if (schemaValidation.output) {\n baseChecks.push(\n fail(\"output_schema_valid\", \"No output schema is declared for this capability.\"),\n );\n }\n\n const checks = [\n ...baseChecks,\n createSecretSafeOutputCheck({\n response,\n error,\n telemetryEvents,\n checks: baseChecks,\n requiredReceiptTypes,\n forbiddenOutputValues,\n }),\n ];\n const status = statusFromChecks(checks);\n const sanitizedChecks = sanitizeConformanceOutput(checks, forbiddenOutputValues);\n const sanitizedResponse = sanitizeConformanceOutput(response, forbiddenOutputValues);\n const sanitizedError = sanitizeConformanceOutput(error, forbiddenOutputValues);\n const sanitizedTelemetryEvents = sanitizeConformanceOutput(\n telemetryEvents,\n forbiddenOutputValues,\n );\n\n return {\n status,\n checks: sanitizedChecks,\n response: sanitizedResponse,\n error: sanitizedError,\n telemetryEvents: sanitizedTelemetryEvents,\n summary: createSummary({\n status,\n checks: sanitizedChecks,\n response: sanitizedResponse,\n error: sanitizedError,\n telemetryEvents: sanitizedTelemetryEvents,\n requiredReceiptTypes,\n }),\n };\n}\n\nexport function createProviderConformanceReport(\n result: ProviderConformanceResult,\n options: ProviderConformanceReportOptions = {},\n): ProviderConformanceReport {\n const receiptRefs = result.response?.receiptRefs ?? result.error?.receiptRefs;\n const report: ProviderConformanceReport = {\n title: options.title ?? \"ProbeMesh Provider Conformance Report\",\n status: result.status,\n summary: result.summary,\n checks: result.checks,\n receipts: summarizeReceipts(receiptRefs),\n route: result.summary.route,\n timelineEventTypes: result.summary.timelineEventTypes,\n telemetryEventTypes: result.summary.telemetryEventTypes,\n safety: result.summary.safety,\n retrySafety: result.summary.retrySafety,\n error: result.error,\n };\n\n return sanitizeConformanceOutput(report, options.forbiddenOutputValues ?? []);\n}\n\nexport function formatProviderConformanceReport(\n report: ProviderConformanceReport,\n options: {\n format?: ProviderConformanceReportFormat;\n } = {},\n) {\n const sanitizedReport = sanitizeConformanceOutput(report, []);\n\n if ((options.format ?? \"markdown\") === \"json\") {\n return JSON.stringify(sanitizedReport, null, 2);\n }\n\n return formatConformanceReportMarkdown(sanitizedReport);\n}\n\nfunction createExecutionChecks(options: {\n response?: ProbeMeshCallResponse;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n expectedProviderId?: string;\n requiredReceiptTypes: ReceiptType[];\n}): ProviderConformanceCheck[] {\n return [\n completedResponseCheck(options.response, options.error),\n selectedProviderCheck(\n options.response,\n options.error,\n options.expectedProviderId,\n ),\n routeMetadataCheck(options.response, options.error),\n timelineEventsCheck(options.response, options.error),\n requiredReceiptsCheck(options.response, options.error, options.requiredReceiptTypes),\n safetyMetadataCheck(options.response, options.error, options.requiredReceiptTypes),\n retrySafetyCheck(options.response, options.error),\n telemetryMatchesTimelineCheck(options.response, options.telemetryEvents),\n ];\n}\n\nfunction completedResponseCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n if (response?.status === \"completed\") {\n return pass(\"completed_response\", \"Hosted provider call completed.\");\n }\n\n return fail(\n \"completed_response\",\n error\n ? `Hosted provider call failed with ${error.code}.`\n : \"Hosted provider call did not return a completed response.\",\n {\n errorCode: error?.code,\n errorMessage: error?.message,\n },\n );\n}\n\nfunction selectedProviderCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n expectedProviderId: string | undefined,\n) {\n const providerId = response?.provider.id;\n\n if (\n providerId &&\n (!expectedProviderId || providerId === expectedProviderId)\n ) {\n return pass(\"selected_provider\", \"Hosted route selected the expected provider.\", {\n providerId,\n });\n }\n\n return fail(\"selected_provider\", \"Hosted route did not select the expected provider.\", {\n expectedProviderId,\n providerId,\n errorProvider: error?.provider,\n });\n}\n\nfunction routeMetadataCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n if (\n response?.route?.mode === \"hosted\" &&\n typeof response.route.routeId === \"string\" &&\n response.route.routeId.length > 0\n ) {\n return pass(\"route_metadata\", \"Hosted route metadata is present.\", {\n routeId: response.route.routeId,\n selectedProviderId: response.route.selectedProviderId,\n });\n }\n\n return fail(\"route_metadata\", \"Hosted route metadata is missing.\", {\n errorRouteId: error?.route?.routeId,\n });\n}\n\nfunction timelineEventsCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n const timelineEventTypes =\n response?.timeline?.events.map((event) => event.type) ?? [];\n const requiredEvents: ProbeMeshTimelineEventType[] = [\n \"call.requested\",\n \"provider.attempted\",\n \"provider.selected\",\n \"call.completed\",\n ];\n const missingEvents = requiredEvents.filter(\n (eventType) => !timelineEventTypes.includes(eventType),\n );\n\n if (missingEvents.length === 0) {\n return pass(\"timeline_events\", \"Hosted timeline contains the provider conformance events.\", {\n timelineEventTypes,\n });\n }\n\n return fail(\"timeline_events\", \"Hosted timeline is missing required events.\", {\n missingEvents,\n timelineEventTypes,\n errorTimelineEventTypes: error?.timeline?.events.map((event) => event.type),\n });\n}\n\nfunction requiredReceiptsCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n requiredReceiptTypes: ReceiptType[],\n) {\n const receiptTypes = getReceiptTypes(response?.receiptRefs);\n const missingReceiptTypes = requiredReceiptTypes.filter(\n (receiptType) => !receiptTypes.includes(receiptType),\n );\n\n if (missingReceiptTypes.length === 0) {\n return pass(\"required_receipts\", \"Required receipts are present.\", {\n receiptTypes,\n });\n }\n\n return fail(\"required_receipts\", \"Required receipts are missing.\", {\n missingReceiptTypes,\n receiptTypes,\n errorReceiptTypes: getReceiptTypes(error?.receiptRefs),\n });\n}\n\nfunction safetyMetadataCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n requiredReceiptTypes: ReceiptType[],\n) {\n const requiresPaymentSafety = requiredReceiptTypes.some((receiptType) =>\n [\"payment_proof\", \"settlement_confirmation\"].includes(receiptType),\n );\n\n if (!requiresPaymentSafety) {\n return pass(\"safety_metadata\", \"Payment safety metadata is not required for this conformance run.\");\n }\n\n if (response?.safety) {\n return pass(\"safety_metadata\", \"Safety metadata is present for paid conformance.\", {\n safety: response.safety,\n });\n }\n\n return fail(\"safety_metadata\", \"Safety metadata is missing for paid conformance.\", {\n errorSafety: error?.safety,\n });\n}\n\nfunction retrySafetyCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n if (response?.retrySafety) {\n return pass(\"retry_safety\", \"Hosted response includes retry safety metadata.\", {\n retrySafety: response.retrySafety,\n });\n }\n\n return fail(\"retry_safety\", \"Hosted response retry safety metadata is missing.\", {\n errorRetrySafety: error?.retrySafety,\n });\n}\n\nfunction telemetryMatchesTimelineCheck(\n response: ProbeMeshCallResponse | undefined,\n telemetryEvents: HostedTelemetryEvent[],\n) {\n const timelineEventTypes =\n response?.timeline?.events.map((event) => event.type) ?? [];\n const telemetryEventTypes = telemetryEvents.map((event) => event.type);\n const matches =\n timelineEventTypes.length > 0 &&\n timelineEventTypes.length === telemetryEventTypes.length &&\n timelineEventTypes.every(\n (eventType, index) => eventType === telemetryEventTypes[index],\n );\n\n if (matches) {\n return pass(\"telemetry_matches_timeline\", \"Telemetry mirrors the hosted timeline.\", {\n telemetryEventTypes,\n });\n }\n\n return fail(\"telemetry_matches_timeline\", \"Telemetry does not mirror the hosted timeline.\", {\n timelineEventTypes,\n telemetryEventTypes,\n });\n}\n\nfunction outputSchemaCheck(\n response: ProbeMeshCallResponse | undefined,\n schema: JsonSchemaLike,\n) {\n if (!response) {\n return fail(\"output_schema_valid\", \"Cannot validate output schema without a response.\");\n }\n\n const result = validateJsonSchemaLikeValue(response.data, schema, {\n path: \"$.data\",\n });\n\n if (result.valid) {\n return pass(\"output_schema_valid\", \"Provider response data matches the declared schema.\");\n }\n\n return fail(\"output_schema_valid\", \"Provider response data does not match the declared schema.\", {\n errors: result.errors,\n });\n}\n\nfunction createSecretSafeOutputCheck(options: {\n response?: ProbeMeshCallResponse;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n checks: ProviderConformanceCheck[];\n requiredReceiptTypes: ReceiptType[];\n forbiddenOutputValues: string[];\n}) {\n const forbiddenOutputValues = options.forbiddenOutputValues.filter(\n (value) => value.length > 0,\n );\n const candidate = {\n response: options.response,\n error: options.error,\n telemetryEvents: options.telemetryEvents,\n checks: options.checks,\n summary: createSummary({\n status: statusFromChecks(options.checks),\n checks: options.checks,\n response: options.response,\n error: options.error,\n telemetryEvents: options.telemetryEvents,\n requiredReceiptTypes: options.requiredReceiptTypes,\n }),\n };\n const serialized = JSON.stringify(candidate);\n const leakedValues = forbiddenOutputValues.filter((value) =>\n serialized.includes(value),\n );\n\n if (leakedValues.length === 0) {\n return pass(\"secret_safe_output\", \"Serialized conformance output contains no forbidden values.\", {\n checkedForbiddenValueCount: forbiddenOutputValues.length,\n });\n }\n\n return fail(\"secret_safe_output\", \"Serialized conformance output contains forbidden values.\", {\n leakedValueCount: leakedValues.length,\n });\n}\n\nfunction createSummary(options: {\n status: ProviderConformanceStatus;\n checks: ProviderConformanceCheck[];\n response?: ProbeMeshCallResponse;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n requiredReceiptTypes: ReceiptType[];\n}): ProviderConformanceSummary {\n const receiptRefs = options.response?.receiptRefs ?? options.error?.receiptRefs;\n const timeline = options.response?.timeline ?? options.error?.timeline;\n const route = options.response?.route ?? options.error?.route;\n const failedCheckNames = options.checks\n .filter((check) => check.status === \"failed\")\n .map((check) => check.name);\n\n return {\n status: options.status,\n totalChecks: options.checks.length,\n passedChecks: options.checks.length - failedCheckNames.length,\n failedChecks: failedCheckNames.length,\n failedCheckNames,\n callId: options.response?.callId ?? options.error?.callId,\n providerId: options.response?.provider.id ?? options.error?.provider,\n errorCode: options.error?.code,\n receiptTypes: getReceiptTypes(receiptRefs),\n requiredReceiptTypes: [...options.requiredReceiptTypes],\n timelineEventTypes: timeline?.events.map((event) => event.type) ?? [],\n telemetryEventTypes: options.telemetryEvents.map((event) => event.type),\n safety: options.response?.safety ?? options.error?.safety,\n retrySafety: options.response?.retrySafety ?? options.error?.retrySafety,\n route: route\n ? {\n routeId: route.routeId,\n selectedProviderId: route.selectedProviderId,\n fallbackUsed: route.explanation?.fallbackUsed,\n fallbackCount: route.explanation?.fallbackCount,\n stopReason: route.explanation?.stopReason,\n }\n : undefined,\n };\n}\n\nfunction summarizeReceipts(receiptRefs: ReceiptRef[] | undefined) {\n const receipts = receiptRefs ?? [];\n const byType: Partial<Record<ReceiptType, number>> = {};\n\n for (const receiptRef of receipts) {\n byType[receiptRef.type] = (byType[receiptRef.type] ?? 0) + 1;\n }\n\n return {\n total: receipts.length,\n types: getReceiptTypes(receipts),\n providers: [\n ...new Set(receipts.map((receiptRef) => receiptRef.provider)),\n ],\n byType,\n hasPaymentProof: receipts.some(\n (receiptRef) => receiptRef.type === \"payment_proof\",\n ),\n hasSettlementConfirmation: receipts.some(\n (receiptRef) => receiptRef.type === \"settlement_confirmation\",\n ),\n hasProviderDelivery: receipts.some(\n (receiptRef) => receiptRef.type === \"provider_delivery\",\n ),\n };\n}\n\nfunction formatConformanceReportMarkdown(report: ProviderConformanceReport) {\n const lines = [\n `# ${report.title}`,\n \"\",\n `Conformance: ${report.status}`,\n `Provider: ${report.summary.providerId ?? \"unknown\"}`,\n `Call: ${report.summary.callId ?? \"unknown\"}`,\n `Error: ${report.summary.errorCode ?? \"none\"}`,\n \"\",\n \"## Checks\",\n ...report.checks.map(\n (check) =>\n `- [${check.status === \"passed\" ? \"x\" : \" \"}] ${check.name}: ${check.message}`,\n ),\n \"\",\n \"## Receipts\",\n `- Total: ${report.receipts.total}`,\n `- Types: ${formatInlineList(report.receipts.types)}`,\n `- Providers: ${formatInlineList(report.receipts.providers)}`,\n \"\",\n \"## Route\",\n `- Route ID: ${report.route?.routeId ?? \"none\"}`,\n `- Selected provider: ${report.route?.selectedProviderId ?? \"none\"}`,\n `- Stop reason: ${report.route?.stopReason ?? \"none\"}`,\n \"\",\n \"## Safety\",\n `- Payment: ${report.safety?.paymentStatus ?? \"unknown\"}`,\n `- Settlement: ${report.safety?.settlementStatus ?? \"unknown\"}`,\n `- Delivery: ${report.safety?.deliveryStatus ?? \"unknown\"}`,\n `- Money may have moved: ${String(\n report.safety?.moneyMayHaveMoved ?? false,\n )}`,\n \"\",\n \"## Retry Safety\",\n `- Retryable: ${String(report.retrySafety?.retryable ?? false)}`,\n `- Safe to auto retry: ${String(\n report.retrySafety?.safeToAutoRetry ?? false,\n )}`,\n `- Reason: ${report.retrySafety?.reason ?? \"unknown\"}`,\n \"\",\n \"## Timeline\",\n `- Events: ${formatInlineList(report.timelineEventTypes)}`,\n `- Telemetry: ${formatInlineList(report.telemetryEventTypes)}`,\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction schemaForCapability(\n declaration: JsonSchemaLike | Record<string, JsonSchemaLike>,\n capability: string,\n): JsonSchemaLike | undefined {\n if (isSharedJsonSchemaLike(declaration)) {\n return declaration;\n }\n\n return declaration[capability];\n}\n\nfunction toConformanceError(error: unknown): ProviderConformanceError {\n if (isProbeMeshError(error)) {\n return {\n name: \"ProbeMeshError\",\n code: error.code,\n message: error.message,\n status: \"failed\",\n capability: error.capability,\n provider: error.provider,\n callId: error.callId,\n receiptRefs: error.receiptRefs,\n safety: error.safety,\n timeline: error.timeline,\n retrySafety: error.retrySafety,\n route: error.route,\n };\n }\n\n return {\n name: \"ProbeMeshError\",\n code: \"provider_unavailable\",\n message:\n error instanceof Error\n ? error.message\n : \"provider conformance call failed.\",\n status: \"failed\",\n };\n}\n\nfunction sanitizeConformanceOutput<T>(\n value: T,\n forbiddenOutputValues: string[],\n): T {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(value, forbiddenValues, new WeakSet<object>()),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n seen: WeakSet<object>,\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n replaceForbiddenValues(entry, forbiddenValues, seen),\n );\n\n seen.delete(value);\n return entries;\n }\n\n const entries = Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues, seen),\n ]),\n );\n\n seen.delete(value);\n return entries;\n}\n\nfunction assertConformanceOptions(\n options: ProviderConformanceOptions,\n): asserts options is ProviderConformanceOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.adapters)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance adapters must be an array.\",\n });\n }\n\n if (\n !options.request ||\n typeof options.request !== \"object\" ||\n Array.isArray(options.request)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance request must be an object.\",\n });\n }\n}\n\nfunction getReceiptTypes(receiptRefs: ReceiptRef[] | undefined) {\n return [...new Set((receiptRefs ?? []).map((receiptRef) => receiptRef.type))];\n}\n\nfunction statusFromChecks(checks: ProviderConformanceCheck[]) {\n return checks.every((check) => check.status === \"passed\")\n ? \"passed\"\n : \"failed\";\n}\n\nfunction formatInlineList(values: readonly string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction pass(\n name: string,\n message: string,\n details?: Record<string, unknown>,\n): ProviderConformanceCheck {\n return {\n name,\n status: \"passed\",\n message,\n details,\n };\n}\n\nfunction fail(\n name: string,\n message: string,\n details?: Record<string, unknown>,\n): ProviderConformanceCheck {\n return {\n name,\n status: \"failed\",\n message,\n details,\n };\n}\n","#!/usr/bin/env node\nimport { runProviderConformanceCli } from \"./providerConformanceCli\";\n\nvoid main();\n\nasync function main() {\n const result = await runProviderConformanceCli({\n argv: process.argv.slice(2),\n cwd: process.cwd(),\n });\n\n if (result.stdout) {\n process.stdout.write(result.stdout);\n }\n\n if (result.stderr) {\n process.stderr.write(result.stderr);\n }\n\n process.exitCode = result.exitCode;\n}\n"],"mappings":"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","names":["import_promises","import_node_path","isRecord","validateNonEmptyString","validatePricingDeclaration","isRecord","validatePricingDeclaration","validatePricing","validateNonEmptyString","cloneSerializable","isRecord","validateNonEmptyString","entries","import_node_crypto","import_node_crypto","hashStableJson","cloneSerializable","hashArtifactContent","isRecord","validateNonEmptyString","validateIsoTimestamp","validateHashes","formatValidationErrors","isRecord","validateHashes","validateNonEmptyString","validateStringArray","validateIsoTimestamp","hashArtifactContent","hashStableJson","stableStringify","replaceForbiddenValues","cloneSerializable","validateNonEmptyString","validateIsoTimestamp","validateStringArray","isRecord","formatValidationErrors","import_node_crypto","pricingToCost","validateReceiptRefs","validateStringArray","isRecord","validateIsoTimestamp","formatValidationErrors","isRecord","isReceiptType","pricingToCost","isRecord","isReceiptType","isRecord","validateNonEmptyString","validateIsoTimestamp","validateStringArray","validatePricingDeclaration","validateReceiptSummary","formatValidationErrors","import_node_crypto","isRecord","validateStringArray","isReceiptType","resolveCatalogCost","isPricing","validateStringArray","isPricing","isRecord","isReceiptType","isRecord","validateNonEmptyString","validateIsoTimestamp","validateHashes","validateStringArray","formatValidationErrors","hashStableJson","pushHashMismatch","isRecord","hashStableJson","stableStringify","sortSerializable","isRecord","pushHashMismatch","validateHashes","isRecord","validateNonEmptyString","validateStringArray","validateIsoTimestamp","formatValidationErrors","isRecord","body","isReceiptType","retrySafety","normalizedError","strictestMaxCostUsd","getPricing","pricingToCost","generateCallId","resolve","isRecord","checks","status","sanitizedChecks","formatInlineList","replaceForbiddenValues","entries","isRecord"]}