@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.
- package/LICENSE +22 -0
- package/README.md +160 -0
- package/dist/chunk-257Y7LN2.js +827 -0
- package/dist/chunk-257Y7LN2.js.map +1 -0
- package/dist/chunk-2ASMVLG4.js +56 -0
- package/dist/chunk-2ASMVLG4.js.map +1 -0
- package/dist/chunk-2KWGHJYP.js +285 -0
- package/dist/chunk-2KWGHJYP.js.map +1 -0
- package/dist/chunk-3H7UGVI6.js +1117 -0
- package/dist/chunk-3H7UGVI6.js.map +1 -0
- package/dist/chunk-5Q3PDYIA.js +657 -0
- package/dist/chunk-5Q3PDYIA.js.map +1 -0
- package/dist/chunk-CXZOO3U4.js +550 -0
- package/dist/chunk-CXZOO3U4.js.map +1 -0
- package/dist/chunk-FRFBK4SY.js +270 -0
- package/dist/chunk-FRFBK4SY.js.map +1 -0
- package/dist/chunk-HJK52QJF.js +994 -0
- package/dist/chunk-HJK52QJF.js.map +1 -0
- package/dist/chunk-HNBDX7IU.js +705 -0
- package/dist/chunk-HNBDX7IU.js.map +1 -0
- package/dist/chunk-NYTV263W.js +116 -0
- package/dist/chunk-NYTV263W.js.map +1 -0
- package/dist/chunk-PXG54XOG.js +595 -0
- package/dist/chunk-PXG54XOG.js.map +1 -0
- package/dist/chunk-TDOBAMYM.js +607 -0
- package/dist/chunk-TDOBAMYM.js.map +1 -0
- package/dist/chunk-TV42EZSI.js +2157 -0
- package/dist/chunk-TV42EZSI.js.map +1 -0
- package/dist/chunk-UU2ZG7P7.js +408 -0
- package/dist/chunk-UU2ZG7P7.js.map +1 -0
- package/dist/chunk-WKN7QOCA.js +977 -0
- package/dist/chunk-WKN7QOCA.js.map +1 -0
- package/dist/chunk-ZJOLPBJJ.js +1091 -0
- package/dist/chunk-ZJOLPBJJ.js.map +1 -0
- package/dist/cli/audit-trail-export.cjs +1193 -0
- package/dist/cli/audit-trail-export.cjs.map +1 -0
- package/dist/cli/audit-trail-export.d.cts +1 -0
- package/dist/cli/audit-trail-export.d.ts +1 -0
- package/dist/cli/audit-trail-export.js +24 -0
- package/dist/cli/audit-trail-export.js.map +1 -0
- package/dist/cli/catalog-check.cjs +2687 -0
- package/dist/cli/catalog-check.cjs.map +1 -0
- package/dist/cli/catalog-check.d.cts +1 -0
- package/dist/cli/catalog-check.d.ts +1 -0
- package/dist/cli/catalog-check.js +26 -0
- package/dist/cli/catalog-check.js.map +1 -0
- package/dist/cli/probemesh-init.cjs +1049 -0
- package/dist/cli/probemesh-init.cjs.map +1 -0
- package/dist/cli/probemesh-init.d.cts +1 -0
- package/dist/cli/probemesh-init.d.ts +1 -0
- package/dist/cli/probemesh-init.js +22 -0
- package/dist/cli/probemesh-init.js.map +1 -0
- package/dist/cli/provider-conformance.cjs +6180 -0
- package/dist/cli/provider-conformance.cjs.map +1 -0
- package/dist/cli/provider-conformance.d.cts +1 -0
- package/dist/cli/provider-conformance.d.ts +1 -0
- package/dist/cli/provider-conformance.js +29 -0
- package/dist/cli/provider-conformance.js.map +1 -0
- package/dist/cli/provider-dossier-check.cjs +2978 -0
- package/dist/cli/provider-dossier-check.cjs.map +1 -0
- package/dist/cli/provider-dossier-check.d.cts +1 -0
- package/dist/cli/provider-dossier-check.d.ts +1 -0
- package/dist/cli/provider-dossier-check.js +27 -0
- package/dist/cli/provider-dossier-check.js.map +1 -0
- package/dist/cli/provider-dossier.cjs +1753 -0
- package/dist/cli/provider-dossier.cjs.map +1 -0
- package/dist/cli/provider-dossier.d.cts +1 -0
- package/dist/cli/provider-dossier.d.ts +1 -0
- package/dist/cli/provider-dossier.js +26 -0
- package/dist/cli/provider-dossier.js.map +1 -0
- package/dist/cli/x402-accept.cjs +6009 -0
- package/dist/cli/x402-accept.cjs.map +1 -0
- package/dist/cli/x402-accept.d.cts +1 -0
- package/dist/cli/x402-accept.d.ts +1 -0
- package/dist/cli/x402-accept.js +28 -0
- package/dist/cli/x402-accept.js.map +1 -0
- package/dist/index.cjs +13671 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2026 -0
- package/dist/index.d.ts +2026 -0
- package/dist/index.js +2560 -0
- package/dist/index.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/providerCatalogPolicyCli.ts","../../src/cli/configLoader.ts","../../src/errors.ts","../../src/paymentOptions.ts","../../src/providerKit/manifest.ts","../../src/providerCatalogArtifact.ts","../../src/providerCatalog.ts","../../src/providerCatalogPolicy.ts","../../src/providerCatalogPolicyBundle.ts","../../src/cli/catalog-check.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProviderCatalog,\n} from \"../providerCatalog\";\nimport type {\n ProviderCatalog,\n} from \"../providerCatalog\";\nimport type {\n ProviderCatalogArtifact,\n} from \"../providerCatalogArtifact\";\nimport {\n createProviderCatalogPolicyReport,\n evaluateProviderCatalogPolicy,\n formatProviderCatalogPolicyReport,\n} from \"../providerCatalogPolicy\";\nimport {\n createProviderCatalogPolicyBundle,\n formatProviderCatalogPolicyBundle,\n} from \"../providerCatalogPolicyBundle\";\nimport type {\n ProviderCatalogPolicyAdapterInventory,\n ProviderCatalogPolicyEvaluationResult,\n ProviderCatalogPolicyExpectedQuery,\n ProviderCatalogPolicyOptions,\n ProviderCatalogPolicyReport,\n ProviderCatalogPolicyReportFormat,\n ProviderCatalogPolicyReportOptions,\n} from \"../providerCatalogPolicy\";\nimport type {\n ProviderCatalogPolicyBundle,\n} from \"../providerCatalogPolicyBundle\";\n\nexport interface ProviderCatalogPolicyCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderCatalogPolicyCliOutputs {\n json?: string;\n markdown?: string;\n bundle?: string;\n}\n\nexport interface ProviderCatalogPolicyCliBundle {\n bundleId?: string;\n generatedAt?: string;\n}\n\nexport interface ProviderCatalogPolicyCliConfig {\n catalog?: ProviderCatalog;\n artifacts?: ProviderCatalogArtifact[];\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n report?: ProviderCatalogPolicyReportOptions & {\n format?: ProviderCatalogPolicyReportFormat;\n };\n bundle?: ProviderCatalogPolicyCliBundle;\n outputs?: ProviderCatalogPolicyCliOutputs;\n}\n\nexport type ProviderCatalogPolicyCliConfigExport =\n | ProviderCatalogPolicyCliConfig\n | ProviderCatalogPolicyCliSkip;\n\nexport type ProviderCatalogPolicyCliConfigFactory = (\n context: ProviderCatalogPolicyCliConfigContext,\n) =>\n | ProviderCatalogPolicyCliConfigExport\n | Promise<ProviderCatalogPolicyCliConfigExport>;\n\nexport interface ProviderCatalogPolicyCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderCatalogPolicyCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderCatalogPolicyCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderCatalogPolicyCliSkip;\n evaluation?: ProviderCatalogPolicyEvaluationResult;\n report?: ProviderCatalogPolicyReport;\n bundle?: ProviderCatalogPolicyBundle;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderCatalogPolicyCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderCatalogPolicyReportFormat;\n outJson?: string;\n outMarkdown?: string;\n outBundle?: string;\n title?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-catalog-check --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-bundle <path>] [--title <text>]\";\n\nexport async function runProviderCatalogPolicyCli(\n options: ProviderCatalogPolicyCliOptions = {},\n): Promise<ProviderCatalogPolicyCliResult> {\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 catalog policy check skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const catalog = resolveCatalog(configExport);\n const evaluation = evaluateProviderCatalogPolicy({\n catalog,\n catalogPolicy: configExport.catalogPolicy,\n adapterInventory: configExport.adapterInventory,\n queries: configExport.queries,\n });\n const report = createProviderCatalogPolicyReport(evaluation, {\n ...(configExport.report ?? {}),\n title: parsedArgs.title ?? configExport.report?.title,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.report?.format ?? \"markdown\";\n const stdout = formatProviderCatalogPolicyReport(report, {\n format: selectedFormat,\n });\n const bundle = createOptionalBundle({\n catalog,\n config: configExport,\n evaluation,\n requestedBundleOutput: parsedArgs.outBundle,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n report,\n bundle,\n outputs: {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n bundle: parsedArgs.outBundle ?? configExport.outputs?.bundle,\n },\n });\n\n return {\n exitCode: evaluation.status === \"passed\" ? 0 : 1,\n skipped: false,\n evaluation,\n report,\n bundle,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error ? error.message : \"Unknown catalog policy 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-bundle\") {\n parsedArgs.outBundle = 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 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: ProviderCatalogPolicyCliConfigContext,\n): Promise<ProviderCatalogPolicyCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderCatalogPolicyCliConfigFactory)(context);\n }\n\n return configExport as ProviderCatalogPolicyCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderCatalogPolicyCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderCatalogPolicyCliSkip>).skip === true &&\n typeof (value as Partial<ProviderCatalogPolicyCliSkip>).reason === \"string\"\n );\n}\n\nfunction assertCliConfig(\n value: unknown,\n): asserts value is ProviderCatalogPolicyCliConfig {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Catalog policy CLI config must export an object.\");\n }\n\n const config = value as Partial<ProviderCatalogPolicyCliConfig>;\n\n if (!config.catalog && !config.artifacts) {\n throw new Error(\"Catalog policy CLI config requires catalog or artifacts.\");\n }\n\n if (config.catalog && config.artifacts) {\n throw new Error(\"Catalog policy CLI config must not provide both catalog and artifacts.\");\n }\n\n if (config.artifacts !== undefined && !Array.isArray(config.artifacts)) {\n throw new Error(\"Catalog policy CLI artifacts must be an array.\");\n }\n\n if (!Array.isArray(config.adapterInventory)) {\n throw new Error(\"Catalog policy CLI config requires adapterInventory array.\");\n }\n\n if (!Array.isArray(config.queries) || config.queries.length === 0) {\n throw new Error(\"Catalog policy CLI config requires at least one query.\");\n }\n\n const outputs = config.outputs;\n\n if (\n outputs !== undefined &&\n (!outputs ||\n typeof outputs !== \"object\" ||\n Array.isArray(outputs) ||\n (outputs.json !== undefined && typeof outputs.json !== \"string\") ||\n (outputs.markdown !== undefined && typeof outputs.markdown !== \"string\") ||\n (outputs.bundle !== undefined && typeof outputs.bundle !== \"string\"))\n ) {\n throw new Error(\"Catalog policy CLI outputs must contain string paths.\");\n }\n\n const bundle = config.bundle;\n\n if (\n bundle !== undefined &&\n (!bundle ||\n typeof bundle !== \"object\" ||\n Array.isArray(bundle) ||\n (bundle.bundleId !== undefined && typeof bundle.bundleId !== \"string\") ||\n (bundle.generatedAt !== undefined && typeof bundle.generatedAt !== \"string\"))\n ) {\n throw new Error(\"Catalog policy CLI bundle config must contain string values.\");\n }\n}\n\nfunction resolveCatalog(config: ProviderCatalogPolicyCliConfig) {\n if (config.catalog) {\n return config.catalog;\n }\n\n return createProviderCatalog({\n artifacts: config.artifacts ?? [],\n });\n}\n\nfunction createOptionalBundle(options: {\n catalog: ProviderCatalog;\n config: ProviderCatalogPolicyCliConfig;\n evaluation: ProviderCatalogPolicyEvaluationResult;\n requestedBundleOutput?: string;\n}) {\n if (!options.config.bundle && !options.requestedBundleOutput && !options.config.outputs?.bundle) {\n return undefined;\n }\n\n return createProviderCatalogPolicyBundle({\n catalog: options.catalog,\n catalogPolicy: options.config.catalogPolicy,\n adapterInventory: options.config.adapterInventory,\n queries: options.config.queries,\n evaluation: options.evaluation,\n bundleId: options.config.bundle?.bundleId,\n generatedAt: options.config.bundle?.generatedAt,\n forbiddenOutputValues: options.config.report?.forbiddenOutputValues,\n });\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n report: ProviderCatalogPolicyReport;\n bundle?: ProviderCatalogPolicyBundle;\n outputs: ProviderCatalogPolicyCliOutputs;\n}) {\n const artifactPaths: ProviderCatalogPolicyCliOutputs = {};\n\n if (options.outputs.json) {\n const outputPath = resolve(options.cwd, options.outputs.json);\n await writeArtifact(\n outputPath,\n formatProviderCatalogPolicyReport(options.report, {\n format: \"json\",\n }),\n );\n artifactPaths.json = outputPath;\n }\n\n if (options.outputs.markdown) {\n const outputPath = resolve(options.cwd, options.outputs.markdown);\n await writeArtifact(\n outputPath,\n formatProviderCatalogPolicyReport(options.report, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = outputPath;\n }\n\n if (options.outputs.bundle) {\n if (!options.bundle) {\n throw new Error(\"Catalog policy CLI bundle output requires bundle config.\");\n }\n\n const outputPath = resolve(options.cwd, options.outputs.bundle);\n await writeArtifact(\n outputPath,\n formatProviderCatalogPolicyBundle(options.bundle, {\n format: \"json\",\n }),\n );\n artifactPaths.bundle = outputPath;\n }\n\n return artifactPaths;\n}\n\nasync function writeArtifact(outputPath: string, body: string) {\n await mkdir(dirname(outputPath), {\n recursive: true,\n });\n await writeFile(outputPath, body, \"utf8\");\n}\n\nfunction cliFailure(message: string): ProviderCatalogPolicyCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `${message}\\n${USAGE}\\n`,\n };\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 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","import { ProbeMeshError } from \"./errors\";\nimport { validateProviderManifest } from \"./providerKit/manifest\";\nimport type { ProviderManifest } from \"./providerKit/types\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport type {\n ProbeMeshCallSafety,\n ProbeMeshRetrySafety,\n ProbeMeshTimelineEventType,\n} from \"./types\";\nimport type {\n X402ProviderAcceptanceGate,\n X402ProviderAcceptanceReport,\n X402ProviderAcceptanceStatus,\n X402ProviderAcceptanceSummary,\n} from \"./protocols/x402Acceptance\";\n\nexport const PROVIDER_CATALOG_ARTIFACT_SCHEMA_VERSION =\n \"probemesh.provider-catalog.v1\" as const;\n\nexport type ProviderCatalogArtifactStatus = \"ready\" | \"rejected\";\n\nexport type ProviderCatalogArtifactFormat = \"json\" | \"markdown\";\n\nexport interface ProviderCatalogArtifactOptions {\n manifest: ProviderManifest;\n acceptanceReport: X402ProviderAcceptanceReport;\n generatedAt?: string;\n artifactId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderCatalogArtifact {\n schemaVersion: typeof PROVIDER_CATALOG_ARTIFACT_SCHEMA_VERSION;\n artifactId: string;\n generatedAt: string;\n status: ProviderCatalogArtifactStatus;\n provider: ProviderManifest;\n acceptance: {\n title: string;\n status: X402ProviderAcceptanceStatus;\n gate: X402ProviderAcceptanceGate;\n failedChecks: string[];\n receipts: X402ProviderAcceptanceReport[\"receipts\"];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: X402ProviderAcceptanceSummary[\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n errorCode?: string;\n };\n}\n\nexport interface ProviderCatalogArtifactValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderCatalogArtifactValidationResult {\n valid: boolean;\n errors: ProviderCatalogArtifactValidationError[];\n}\n\nexport function createProviderCatalogArtifact(\n options: ProviderCatalogArtifactOptions,\n): ProviderCatalogArtifact {\n assertProviderCatalogArtifactOptions(options);\n\n const artifact: ProviderCatalogArtifact = {\n schemaVersion: PROVIDER_CATALOG_ARTIFACT_SCHEMA_VERSION,\n artifactId:\n options.artifactId ??\n `${options.manifest.id}:${options.acceptanceReport.summary.callId ?? \"unknown\"}:catalog`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: options.acceptanceReport.gate.accepted ? \"ready\" : \"rejected\",\n provider: cloneSerializable(options.manifest),\n acceptance: {\n title: options.acceptanceReport.title,\n status: options.acceptanceReport.status,\n gate: cloneSerializable(options.acceptanceReport.gate),\n failedChecks: [\n ...options.acceptanceReport.summary.failedCheckNames,\n ],\n receipts: cloneSerializable(options.acceptanceReport.receipts),\n safety: cloneSerializable(options.acceptanceReport.safety),\n retrySafety: cloneSerializable(options.acceptanceReport.retrySafety),\n route: cloneSerializable(options.acceptanceReport.route),\n timelineEventTypes: [\n ...options.acceptanceReport.timelineEventTypes,\n ],\n telemetryEventTypes: [\n ...options.acceptanceReport.telemetryEventTypes,\n ],\n errorCode: options.acceptanceReport.summary.errorCode,\n },\n };\n const sanitizedArtifact = sanitizeCatalogOutput(\n artifact,\n options.forbiddenOutputValues ?? [],\n );\n\n assertProviderCatalogArtifact(sanitizedArtifact);\n\n return sanitizedArtifact;\n}\n\nexport function formatProviderCatalogArtifact(\n artifact: ProviderCatalogArtifact,\n options: {\n format?: ProviderCatalogArtifactFormat;\n } = {},\n) {\n assertProviderCatalogArtifact(artifact);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatCatalogArtifactMarkdown(artifact);\n }\n\n return JSON.stringify(artifact, null, 2);\n}\n\nexport function validateProviderCatalogArtifact(\n artifact: unknown,\n): ProviderCatalogArtifactValidationResult {\n const errors: ProviderCatalogArtifactValidationError[] = [];\n\n if (!isRecord(artifact)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider catalog artifact must be an object.\",\n },\n ],\n };\n }\n\n if (artifact.schemaVersion !== PROVIDER_CATALOG_ARTIFACT_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CATALOG_ARTIFACT_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(artifact.artifactId, \"artifactId\", errors);\n validateIsoTimestamp(artifact.generatedAt, \"generatedAt\", errors);\n\n if (artifact.status !== \"ready\" && artifact.status !== \"rejected\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"ready\" or \"rejected\".',\n });\n }\n\n const manifestValidation = validateProviderManifest(artifact.provider);\n\n for (const manifestError of manifestValidation.errors) {\n errors.push({\n path: `provider.${manifestError.path}`,\n message: manifestError.message,\n });\n }\n\n validateAcceptanceArtifact(artifact.acceptance, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderCatalogArtifact(\n artifact: unknown,\n): asserts artifact is ProviderCatalogArtifact {\n const result = validateProviderCatalogArtifact(artifact);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog artifact: ${formatValidationErrors(result.errors)}`,\n });\n}\n\nfunction assertProviderCatalogArtifactOptions(\n options: ProviderCatalogArtifactOptions,\n): asserts options is ProviderCatalogArtifactOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog 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 catalog artifact manifest: ${formatValidationErrors(\n manifestValidation.errors,\n )}`,\n });\n }\n\n if (\n !options.acceptanceReport ||\n typeof options.acceptanceReport !== \"object\" ||\n Array.isArray(options.acceptanceReport)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog artifact requires an acceptance 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 catalog 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 catalog 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 catalog artifact forbiddenOutputValues must be an array of strings.\",\n });\n }\n}\n\nfunction formatCatalogArtifactMarkdown(artifact: ProviderCatalogArtifact) {\n const lines = [\n `# ${artifact.provider.displayName} Provider Catalog Artifact`,\n \"\",\n `Status: ${artifact.status}`,\n `Schema: ${artifact.schemaVersion}`,\n `Artifact ID: ${artifact.artifactId}`,\n `Generated: ${artifact.generatedAt}`,\n \"\",\n \"## Provider\",\n `- ID: ${artifact.provider.id}`,\n `- Display name: ${artifact.provider.displayName}`,\n `- Protocol: ${artifact.provider.protocolMode}`,\n `- Capabilities: ${formatInlineList(artifact.provider.capabilities)}`,\n \"\",\n \"## Acceptance\",\n `- Gate: ${artifact.acceptance.gate.status}`,\n `- Result: ${artifact.acceptance.status}`,\n `- Failed checks: ${formatInlineList(artifact.acceptance.failedChecks)}`,\n `- Gate reasons: ${formatInlineList(artifact.acceptance.gate.reasons)}`,\n \"\",\n \"## Receipts\",\n `- Total: ${artifact.acceptance.receipts.total}`,\n `- Types: ${formatInlineList(artifact.acceptance.receipts.types)}`,\n `- Providers: ${formatInlineList(artifact.acceptance.receipts.providers)}`,\n `- Payment proof: ${String(artifact.acceptance.receipts.hasPaymentProof)}`,\n `- Settlement confirmation: ${String(\n artifact.acceptance.receipts.hasSettlementConfirmation,\n )}`,\n `- Provider delivery: ${String(\n artifact.acceptance.receipts.hasProviderDelivery,\n )}`,\n \"\",\n \"## Safety\",\n `- Payment: ${artifact.acceptance.safety?.paymentStatus ?? \"unknown\"}`,\n `- Settlement: ${artifact.acceptance.safety?.settlementStatus ?? \"unknown\"}`,\n `- Delivery: ${artifact.acceptance.safety?.deliveryStatus ?? \"unknown\"}`,\n `- Money may have moved: ${String(\n artifact.acceptance.safety?.moneyMayHaveMoved ?? false,\n )}`,\n \"\",\n \"## Retry Safety\",\n `- Retryable: ${String(artifact.acceptance.retrySafety?.retryable ?? false)}`,\n `- Safe to auto retry: ${String(\n artifact.acceptance.retrySafety?.safeToAutoRetry ?? false,\n )}`,\n `- Reason: ${artifact.acceptance.retrySafety?.reason ?? \"unknown\"}`,\n \"\",\n \"## Route And Timeline\",\n `- Selected provider: ${artifact.acceptance.route?.selectedProviderId ?? \"none\"}`,\n `- Stop reason: ${artifact.acceptance.route?.stopReason ?? \"none\"}`,\n `- Timeline events: ${formatInlineList(artifact.acceptance.timelineEventTypes)}`,\n `- Telemetry events: ${formatInlineList(artifact.acceptance.telemetryEventTypes)}`,\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatInlineList(values: readonly string[] | undefined) {\n return values && values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction sanitizeCatalogOutput<T>(value: T, forbiddenOutputValues: string[]) {\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 validateAcceptanceArtifact(\n acceptance: unknown,\n errors: ProviderCatalogArtifactValidationError[],\n) {\n if (!isRecord(acceptance)) {\n errors.push({\n path: \"acceptance\",\n message: \"acceptance must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(acceptance.title, \"acceptance.title\", errors);\n\n if (acceptance.status !== \"passed\" && acceptance.status !== \"failed\") {\n errors.push({\n path: \"acceptance.status\",\n message: 'acceptance.status must be \"passed\" or \"failed\".',\n });\n }\n\n if (!isRecord(acceptance.gate)) {\n errors.push({\n path: \"acceptance.gate\",\n message: \"acceptance.gate must be an object.\",\n });\n } else {\n if (typeof acceptance.gate.accepted !== \"boolean\") {\n errors.push({\n path: \"acceptance.gate.accepted\",\n message: \"acceptance.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: \"acceptance.gate.status\",\n message: 'acceptance.gate.status must be \"accepted\" or \"rejected\".',\n });\n }\n }\n\n validateStringArray(\n acceptance.failedChecks,\n \"acceptance.failedChecks\",\n errors,\n );\n validateReceiptSummary(acceptance.receipts, errors);\n validateStringArray(\n acceptance.timelineEventTypes,\n \"acceptance.timelineEventTypes\",\n errors,\n );\n validateStringArray(\n acceptance.telemetryEventTypes,\n \"acceptance.telemetryEventTypes\",\n errors,\n );\n}\n\nfunction validateReceiptSummary(\n receipts: unknown,\n errors: ProviderCatalogArtifactValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path: \"acceptance.receipts\",\n message: \"acceptance.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: \"acceptance.receipts.total\",\n message: \"acceptance.receipts.total must be a number.\",\n });\n }\n\n validateStringArray(receipts.types, \"acceptance.receipts.types\", errors);\n validateStringArray(\n receipts.providers,\n \"acceptance.receipts.providers\",\n errors,\n );\n\n for (const key of [\n \"hasPaymentProof\",\n \"hasSettlementConfirmation\",\n \"hasProviderDelivery\",\n ]) {\n if (typeof receipts[key] !== \"boolean\") {\n errors.push({\n path: `acceptance.receipts.${key}`,\n message: `acceptance.receipts.${key} must be a boolean.`,\n });\n }\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogArtifactValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\")\n ) {\n errors.push({\n path,\n message: `${path} must be an array of strings.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderCatalogArtifactValidationError[],\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: ProviderCatalogArtifactValidationError[],\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(\n errors: ProviderCatalogArtifactValidationError[],\n) {\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 { 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 { 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 { 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","#!/usr/bin/env node\nimport { runProviderCatalogPolicyCli } from \"./providerCatalogPolicyCli\";\n\nvoid main();\n\nasync function main() {\n const result = await runProviderCatalogPolicyCli({\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","isRecord","validateNonEmptyString","isRecord","validateNonEmptyString","validateStringArray","isRecord","isRecord","validateIsoTimestamp","isRecord","isReceiptType","cloneSerializable","pricingToCost","validateNonEmptyString","validateIsoTimestamp","validateStringArray","validatePricingDeclaration","validateReceiptSummary","cloneSerializable","isRecord","validateStringArray","isReceiptType","resolveCatalogCost","isPricing","cloneSerializable","isRecord","validateNonEmptyString","validateIsoTimestamp","validateStringArray","formatValidationErrors","isRecord","isRecord","isRecord","validateNonEmptyString","validateStringArray","validateIsoTimestamp","replaceForbiddenValues","cloneSerializable","formatValidationErrors"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
runProviderCatalogPolicyCli
|
|
4
|
+
} from "../chunk-FRFBK4SY.js";
|
|
5
|
+
import "../chunk-CXZOO3U4.js";
|
|
6
|
+
import "../chunk-ZJOLPBJJ.js";
|
|
7
|
+
import "../chunk-3H7UGVI6.js";
|
|
8
|
+
import "../chunk-NYTV263W.js";
|
|
9
|
+
import "../chunk-2ASMVLG4.js";
|
|
10
|
+
|
|
11
|
+
// src/cli/catalog-check.ts
|
|
12
|
+
void main();
|
|
13
|
+
async function main() {
|
|
14
|
+
const result = await runProviderCatalogPolicyCli({
|
|
15
|
+
argv: process.argv.slice(2),
|
|
16
|
+
cwd: process.cwd()
|
|
17
|
+
});
|
|
18
|
+
if (result.stdout) {
|
|
19
|
+
process.stdout.write(result.stdout);
|
|
20
|
+
}
|
|
21
|
+
if (result.stderr) {
|
|
22
|
+
process.stderr.write(result.stderr);
|
|
23
|
+
}
|
|
24
|
+
process.exitCode = result.exitCode;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=catalog-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/catalog-check.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { runProviderCatalogPolicyCli } from \"./providerCatalogPolicyCli\";\n\nvoid main();\n\nasync function main() {\n const result = await runProviderCatalogPolicyCli({\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":";;;;;;;;;;;AAGA,KAAK,KAAK;AAEV,eAAe,OAAO;AACpB,QAAM,SAAS,MAAM,4BAA4B;AAAA,IAC/C,MAAM,QAAQ,KAAK,MAAM,CAAC;AAAA,IAC1B,KAAK,QAAQ,IAAI;AAAA,EACnB,CAAC;AAED,MAAI,OAAO,QAAQ;AACjB,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC;AAEA,MAAI,OAAO,QAAQ;AACjB,YAAQ,OAAO,MAAM,OAAO,MAAM;AAAA,EACpC;AAEA,UAAQ,WAAW,OAAO;AAC5B;","names":[]}
|