@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/providerOnboardingDossierCli.ts","../../src/cli/configLoader.ts","../../src/errors.ts","../../src/paymentOptions.ts","../../src/providerKit/manifest.ts","../../src/protocols/x402Redaction.ts","../../src/providerCatalogArtifact.ts","../../src/providerConformanceArtifact.ts","../../src/providerOnboardingDossier.ts","../../src/cli/provider-dossier.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n assertProviderCatalogArtifact,\n type ProviderCatalogArtifact,\n} from \"../providerCatalogArtifact\";\nimport {\n assertProviderConformanceArtifact,\n type ProviderConformanceArtifact,\n} from \"../providerConformanceArtifact\";\nimport {\n createProviderOnboardingDossier,\n formatProviderOnboardingDossier,\n} from \"../providerOnboardingDossier\";\nimport type {\n ProviderOnboardingDossier,\n ProviderOnboardingDossierFormat,\n ProviderOnboardingDossierOptions,\n} from \"../providerOnboardingDossier\";\n\nexport interface ProviderOnboardingDossierCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderOnboardingDossierCliOutputs {\n json?: string;\n markdown?: string;\n}\n\nexport interface ProviderOnboardingDossierCliDossier\n extends Omit<\n ProviderOnboardingDossierOptions,\n \"catalogArtifact\" | \"conformanceArtifact\"\n > {\n format?: ProviderOnboardingDossierFormat;\n title?: string;\n}\n\nexport interface ProviderOnboardingDossierCliConfig {\n catalogArtifact?: ProviderCatalogArtifact;\n catalogArtifactFile?: string;\n conformanceArtifact?: ProviderConformanceArtifact;\n conformanceArtifactFile?: string;\n dossier?: ProviderOnboardingDossierCliDossier;\n outputs?: ProviderOnboardingDossierCliOutputs;\n}\n\nexport type ProviderOnboardingDossierCliConfigExport =\n | ProviderOnboardingDossierCliConfig\n | ProviderOnboardingDossierCliSkip;\n\nexport type ProviderOnboardingDossierCliConfigFactory = (\n context: ProviderOnboardingDossierCliConfigContext,\n) =>\n | ProviderOnboardingDossierCliConfigExport\n | Promise<ProviderOnboardingDossierCliConfigExport>;\n\nexport interface ProviderOnboardingDossierCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderOnboardingDossierCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderOnboardingDossierCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderOnboardingDossierCliSkip;\n dossier?: ProviderOnboardingDossier;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderOnboardingDossierCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderOnboardingDossierFormat;\n outJson?: string;\n outMarkdown?: string;\n dossierId?: string;\n generatedAt?: string;\n title?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-dossier --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--dossier-id <text>] [--generated-at <iso>] [--title <text>]\";\n\nexport async function runProviderOnboardingDossierCli(\n options: ProviderOnboardingDossierCliOptions = {},\n): Promise<ProviderOnboardingDossierCliResult> {\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 onboarding dossier skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const catalogArtifact = await resolveCatalogArtifact(configExport, cwd);\n const conformanceArtifact = await resolveConformanceArtifact(\n configExport,\n cwd,\n );\n const dossier = createProviderOnboardingDossier({\n catalogArtifact,\n conformanceArtifact,\n dossierId: parsedArgs.dossierId ?? configExport.dossier?.dossierId,\n generatedAt: parsedArgs.generatedAt ?? configExport.dossier?.generatedAt,\n forbiddenOutputValues: configExport.dossier?.forbiddenOutputValues,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.dossier?.format ?? \"markdown\";\n const title = parsedArgs.title ?? configExport.dossier?.title;\n const stdout = formatProviderOnboardingDossier(dossier, {\n format: selectedFormat,\n title,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n dossier,\n title,\n outputs: {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n },\n });\n\n return {\n exitCode: dossier.status === \"ready\" ? 0 : 1,\n skipped: false,\n dossier,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error\n ? error.message\n : \"Unknown provider onboarding dossier 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 === \"--dossier-id\") {\n parsedArgs.dossierId = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--generated-at\") {\n parsedArgs.generatedAt = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n 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: ProviderOnboardingDossierCliConfigContext,\n): Promise<ProviderOnboardingDossierCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderOnboardingDossierCliConfigFactory)(context);\n }\n\n return configExport as ProviderOnboardingDossierCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderOnboardingDossierCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderOnboardingDossierCliSkip>).skip === true &&\n typeof (value as Partial<ProviderOnboardingDossierCliSkip>).reason ===\n \"string\"\n );\n}\n\nfunction assertCliConfig(\n config: unknown,\n): asserts config is ProviderOnboardingDossierCliConfig {\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new Error(\"Provider onboarding dossier CLI config must be an object.\");\n }\n\n const candidate = config as Partial<ProviderOnboardingDossierCliConfig>;\n\n if (\n candidate.catalogArtifact !== undefined &&\n candidate.catalogArtifactFile !== undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config may not provide both catalogArtifact and catalogArtifactFile.\",\n );\n }\n\n if (\n candidate.conformanceArtifact !== undefined &&\n candidate.conformanceArtifactFile !== undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config may not provide both conformanceArtifact and conformanceArtifactFile.\",\n );\n }\n\n if (\n candidate.catalogArtifact === undefined &&\n candidate.catalogArtifactFile === undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config requires catalogArtifact or catalogArtifactFile.\",\n );\n }\n\n if (\n candidate.conformanceArtifact === undefined &&\n candidate.conformanceArtifactFile === undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config requires conformanceArtifact or conformanceArtifactFile.\",\n );\n }\n\n if (\n candidate.catalogArtifactFile !== undefined &&\n typeof candidate.catalogArtifactFile !== \"string\"\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI catalogArtifactFile must be a string.\",\n );\n }\n\n if (\n candidate.conformanceArtifactFile !== undefined &&\n typeof candidate.conformanceArtifactFile !== \"string\"\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI conformanceArtifactFile must be a string.\",\n );\n }\n\n if (candidate.dossier !== undefined && !isRecord(candidate.dossier)) {\n throw new Error(\"Provider onboarding dossier CLI dossier config must be an object.\");\n }\n\n if (candidate.outputs !== undefined) {\n assertOutputs(candidate.outputs);\n }\n}\n\nfunction assertOutputs(outputs: unknown) {\n if (!isRecord(outputs)) {\n throw new Error(\"Provider onboarding dossier CLI outputs must be an object.\");\n }\n\n for (const [key, value] of Object.entries(outputs)) {\n if (\n ![\"json\", \"markdown\"].includes(key) ||\n (value !== undefined && typeof value !== \"string\")\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI outputs may only include json and markdown string paths.\",\n );\n }\n }\n}\n\nasync function resolveCatalogArtifact(\n config: ProviderOnboardingDossierCliConfig,\n cwd: string,\n) {\n if (config.catalogArtifact !== undefined) {\n assertProviderCatalogArtifact(config.catalogArtifact);\n return config.catalogArtifact;\n }\n\n const artifact = JSON.parse(\n await readFile(resolve(cwd, config.catalogArtifactFile!), \"utf8\"),\n );\n assertProviderCatalogArtifact(artifact);\n return artifact;\n}\n\nasync function resolveConformanceArtifact(\n config: ProviderOnboardingDossierCliConfig,\n cwd: string,\n) {\n if (config.conformanceArtifact !== undefined) {\n assertProviderConformanceArtifact(config.conformanceArtifact);\n return config.conformanceArtifact;\n }\n\n const artifact = JSON.parse(\n await readFile(resolve(cwd, config.conformanceArtifactFile!), \"utf8\"),\n );\n assertProviderConformanceArtifact(artifact);\n return artifact;\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n dossier: ProviderOnboardingDossier;\n title?: string;\n outputs: ProviderOnboardingDossierCliOutputs;\n}) {\n const artifactPaths: ProviderOnboardingDossierCliOutputs = {};\n\n if (options.outputs.json) {\n const path = resolve(options.cwd, options.outputs.json);\n await writeTextFile(\n path,\n formatProviderOnboardingDossier(options.dossier, {\n format: \"json\",\n title: options.title,\n }),\n );\n artifactPaths.json = path;\n }\n\n if (options.outputs.markdown) {\n const path = resolve(options.cwd, options.outputs.markdown);\n await writeTextFile(\n path,\n formatProviderOnboardingDossier(options.dossier, {\n format: \"markdown\",\n title: options.title,\n }),\n );\n artifactPaths.markdown = path;\n }\n\n return artifactPaths;\n}\n\nasync function writeTextFile(path: string, body: string) {\n await mkdir(dirname(path), {\n recursive: true,\n });\n await writeFile(path, body, \"utf8\");\n}\n\nfunction cliFailure(message: string): ProviderOnboardingDossierCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `Provider onboarding dossier CLI failed: ${message}\\n${USAGE}\\n`,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport async function loadCliConfigDefault(\n configPath: string,\n cwd: string,\n): Promise<unknown> {\n const resolvedPath = resolve(cwd, configPath);\n const moduleUrl = pathToFileURL(resolvedPath);\n\n try {\n const loadedModule = await import(/* @vite-ignore */ moduleUrl.href);\n return loadedModule.default;\n } catch (error) {\n return loadSelfContainedConfigFallback(resolvedPath, error);\n }\n}\n\nasync function loadSelfContainedConfigFallback(\n resolvedPath: string,\n importError: unknown,\n): Promise<unknown> {\n const source = await readFile(resolvedPath, \"utf8\");\n\n if (/\\bimport\\s/.test(source) || !/\\bexport\\s+default\\b/.test(source)) {\n throw importError;\n }\n\n const transformedSource = source.replace(\n /\\bexport\\s+default\\b/,\n \"const __probemeshDefault =\",\n );\n\n try {\n const factory = new Function(\n `${transformedSource}\\nreturn __probemeshDefault;`,\n ) as () => unknown;\n return factory();\n } catch {\n throw importError;\n }\n}\n","import type {\n CallStatus,\n ProbeMeshAttemptMetadata,\n ProbeMeshCallTimeline,\n ProbeMeshCallSafety,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteMetadata,\n ReceiptRef,\n} from \"./types\";\n\nexport interface ProbeMeshErrorOptions {\n code: ProbeMeshErrorCode;\n message: string;\n capability?: string;\n provider?: string;\n callId?: string;\n receiptRefs?: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n timeline?: ProbeMeshCallTimeline;\n retrySafety?: ProbeMeshRetrySafety;\n attempt?: ProbeMeshAttemptMetadata;\n route?: ProbeMeshRouteMetadata;\n cause?: unknown;\n}\n\nexport class ProbeMeshError extends Error {\n readonly code: ProbeMeshErrorCode;\n readonly status: CallStatus = \"failed\";\n readonly capability?: string;\n readonly provider?: string;\n readonly callId?: string;\n readonly receiptRefs?: ReceiptRef[];\n readonly safety?: ProbeMeshCallSafety;\n readonly timeline?: ProbeMeshCallTimeline;\n readonly retrySafety?: ProbeMeshRetrySafety;\n readonly attempt?: ProbeMeshAttemptMetadata;\n readonly route?: ProbeMeshRouteMetadata;\n readonly cause?: unknown;\n\n constructor(options: ProbeMeshErrorOptions) {\n super(options.message);\n this.name = \"ProbeMeshError\";\n this.code = options.code;\n this.capability = options.capability;\n this.provider = options.provider;\n this.callId = options.callId;\n this.receiptRefs = options.receiptRefs;\n this.safety = options.safety;\n this.timeline = options.timeline;\n this.retrySafety = options.retrySafety;\n this.attempt = options.attempt;\n this.route = options.route;\n this.cause = options.cause;\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n capability: this.capability,\n provider: this.provider,\n callId: this.callId,\n receiptRefs: this.receiptRefs,\n safety: this.safety,\n timeline: this.timeline,\n retrySafety: this.retrySafety,\n attempt: this.attempt,\n route: this.route,\n };\n }\n}\n\nexport function isProbeMeshError(error: unknown): error is ProbeMeshError {\n return error instanceof ProbeMeshError;\n}\n","import { ProbeMeshError } from \"./errors\";\nimport type {\n Cost,\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentSelection,\n ProbeMeshPaymentStrategy,\n ProbeMeshPaymentStrategyMode,\n ProbeMeshPricing,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\n\nexport interface PaymentOptionResolutionInput {\n providerId: string;\n providerMode?: string;\n capabilities: string[];\n capability: string;\n pricing?: ProbeMeshPricing | Record<string, ProbeMeshPricing>;\n paymentOptions?: ProviderPaymentOption[];\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n defaultReceiptTypes?: ReceiptType[];\n}\n\nexport interface PaymentOptionResolution {\n selection?: ProbeMeshPaymentSelection;\n reason?: string;\n options: ProviderPaymentOption[];\n}\n\ninterface PaymentOptionCandidate {\n option: ProviderPaymentOption;\n index: number;\n cost?: Cost;\n receiptTypes: ReceiptType[];\n}\n\ninterface RankedPaymentOptionCandidate extends PaymentOptionCandidate {\n score: number;\n scoreReasons: string[];\n}\n\nexport function resolveProviderPaymentOption(\n input: PaymentOptionResolutionInput,\n): PaymentOptionResolution {\n const options = getProviderPaymentOptions(input);\n const candidates = options\n .filter((option) => optionSupportsCapability(option, input.capability))\n .map((option, index) => ({\n option,\n index,\n cost: pricingToCost(resolvePaymentOptionPricing(option, input.capability) ?? resolvePricing(input.pricing, input.capability)),\n receiptTypes: option.receiptTypes ?? [],\n }));\n const filtered = candidates.filter(({ option, receiptTypes }) =>\n optionMatchesPaymentPreferences(option, receiptTypes, input.paymentPreferences),\n );\n\n if (filtered.length === 0) {\n return {\n options,\n reason: createNoPaymentOptionReason(input, candidates.length),\n };\n }\n\n const selected = choosePaymentOption(\n filtered,\n input.paymentPreferences,\n input.paymentStrategy,\n );\n\n return {\n options,\n selection: {\n providerId: input.providerId,\n optionId: selected.option.id,\n protocolMode: selected.option.protocolMode,\n cost: selected.cost,\n receiptTypes: [...selected.receiptTypes],\n score: selected.score,\n scoreReasons: [...selected.scoreReasons],\n metadata: cloneSerializable(selected.option.metadata),\n },\n };\n}\n\nexport function getProviderPaymentOptions(\n input: Omit<PaymentOptionResolutionInput, \"capability\" | \"paymentPreferences\">,\n): ProviderPaymentOption[] {\n if (input.paymentOptions && input.paymentOptions.length > 0) {\n return cloneSerializable(input.paymentOptions);\n }\n\n return [\n {\n id: \"default\",\n protocolMode: input.providerMode ?? \"local\",\n capabilities: [...input.capabilities],\n ...(input.pricing !== undefined ? { pricing: cloneSerializable(input.pricing) } : {}),\n receiptTypes: [...(input.defaultReceiptTypes ?? [])],\n },\n ];\n}\n\nexport function validateProviderPaymentOptions(\n paymentOptions: unknown,\n path: string,\n capabilities: readonly string[],\n errors: Array<{ path: string; message: string }>,\n) {\n if (paymentOptions === undefined) {\n return;\n }\n\n if (!Array.isArray(paymentOptions) || paymentOptions.length === 0) {\n errors.push({\n path,\n message: \"paymentOptions must be a non-empty array when provided.\",\n });\n return;\n }\n\n const seen = new Set<string>();\n\n paymentOptions.forEach((option, index) => {\n const optionPath = `${path}.${index}`;\n\n if (!isRecord(option)) {\n errors.push({\n path: optionPath,\n message: \"payment option must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(option.id, `${optionPath}.id`, errors);\n validateNonEmptyString(option.protocolMode, `${optionPath}.protocolMode`, errors);\n\n if (typeof option.id === \"string\") {\n if (seen.has(option.id)) {\n errors.push({\n path: `${optionPath}.id`,\n message: `duplicate payment option \"${option.id}\".`,\n });\n }\n\n seen.add(option.id);\n }\n\n if (option.capabilities !== undefined) {\n validateStringArray(option.capabilities, `${optionPath}.capabilities`, errors);\n\n if (Array.isArray(option.capabilities)) {\n for (const capability of option.capabilities) {\n if (\n typeof capability === \"string\" &&\n capability.length > 0 &&\n !capabilities.includes(capability)\n ) {\n errors.push({\n path: `${optionPath}.capabilities`,\n message: `payment option capability \"${capability}\" is not declared by the provider.`,\n });\n }\n }\n }\n }\n\n if (option.pricing !== undefined) {\n validatePricingDeclaration(option.pricing, `${optionPath}.pricing`, errors);\n }\n\n if (option.receiptTypes !== undefined) {\n if (\n !Array.isArray(option.receiptTypes) ||\n option.receiptTypes.some((receiptType) => !isReceiptType(receiptType))\n ) {\n errors.push({\n path: `${optionPath}.receiptTypes`,\n message: \"payment option receiptTypes must contain known receipt types.\",\n });\n }\n }\n\n if (option.metadata !== undefined && !isRecord(option.metadata)) {\n errors.push({\n path: `${optionPath}.metadata`,\n message: \"payment option metadata must be an object when provided.\",\n });\n }\n });\n}\n\nexport function validatePaymentPreferences(\n paymentPreferences: unknown,\n capability: string,\n) {\n if (paymentPreferences === undefined) {\n return;\n }\n\n if (!isRecord(paymentPreferences)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"paymentPreferences must be an object when provided.\",\n capability,\n });\n }\n\n validatePreferenceStringArray(\n paymentPreferences.allowedProtocols,\n \"allowedProtocols\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.preferredProtocols,\n \"preferredProtocols\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.blockedProtocols,\n \"blockedProtocols\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.allowedPaymentOptions,\n \"allowedPaymentOptions\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.preferredPaymentOptions,\n \"preferredPaymentOptions\",\n capability,\n );\n validatePreferenceStringArray(\n paymentPreferences.blockedPaymentOptions,\n \"blockedPaymentOptions\",\n capability,\n );\n\n if (\n paymentPreferences.requiredReceiptTypes !== undefined &&\n (!Array.isArray(paymentPreferences.requiredReceiptTypes) ||\n paymentPreferences.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"paymentPreferences.requiredReceiptTypes must contain known receipt types.\",\n capability,\n });\n }\n}\n\nexport function validatePaymentStrategy(\n paymentStrategy: unknown,\n capability: string,\n) {\n if (paymentStrategy === undefined) {\n return;\n }\n\n if (!isRecord(paymentStrategy)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"paymentStrategy must be an object when provided.\",\n capability,\n });\n }\n\n if (!isPaymentStrategyMode(paymentStrategy.mode)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n 'paymentStrategy.mode must be one of \"provider_order\", \"lowest_cost\", \"preferred_protocol\", or \"receipt_coverage\".',\n capability,\n });\n }\n\n if (\n paymentStrategy.preferredReceiptTypes !== undefined &&\n (!Array.isArray(paymentStrategy.preferredReceiptTypes) ||\n paymentStrategy.preferredReceiptTypes.some(\n (receiptType) => !isReceiptType(receiptType),\n ))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"paymentStrategy.preferredReceiptTypes must contain known receipt types.\",\n capability,\n });\n }\n}\n\nexport function mergePaymentPreferences(\n first?: ProbeMeshPaymentPreferences,\n second?: ProbeMeshPaymentPreferences,\n): ProbeMeshPaymentPreferences | undefined {\n if (!first && !second) {\n return undefined;\n }\n\n return compactPaymentPreferences({\n allowedProtocols: intersectArrays(first?.allowedProtocols, second?.allowedProtocols),\n preferredProtocols: second?.preferredProtocols ?? first?.preferredProtocols,\n blockedProtocols: unionArrays(first?.blockedProtocols, second?.blockedProtocols),\n allowedPaymentOptions: intersectArrays(\n first?.allowedPaymentOptions,\n second?.allowedPaymentOptions,\n ),\n preferredPaymentOptions:\n second?.preferredPaymentOptions ?? first?.preferredPaymentOptions,\n blockedPaymentOptions: unionArrays(\n first?.blockedPaymentOptions,\n second?.blockedPaymentOptions,\n ),\n requiredReceiptTypes: unionArrays(\n first?.requiredReceiptTypes,\n second?.requiredReceiptTypes,\n ) as ReceiptType[] | undefined,\n });\n}\n\nexport function paymentSelectionToCost(\n selection: ProbeMeshPaymentSelection | undefined,\n): Cost | undefined {\n return selection?.cost;\n}\n\nfunction optionSupportsCapability(\n option: ProviderPaymentOption,\n capability: string,\n) {\n return !option.capabilities || option.capabilities.includes(capability);\n}\n\nfunction optionMatchesPaymentPreferences(\n option: ProviderPaymentOption,\n receiptTypes: ReceiptType[],\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n if (!preferences) {\n return true;\n }\n\n if (\n preferences.allowedProtocols &&\n !preferences.allowedProtocols.includes(option.protocolMode)\n ) {\n return false;\n }\n\n if (preferences.blockedProtocols?.includes(option.protocolMode)) {\n return false;\n }\n\n if (\n preferences.allowedPaymentOptions &&\n !preferences.allowedPaymentOptions.includes(option.id)\n ) {\n return false;\n }\n\n if (preferences.blockedPaymentOptions?.includes(option.id)) {\n return false;\n }\n\n const receiptSet = new Set(receiptTypes);\n\n return (preferences.requiredReceiptTypes ?? []).every((receiptType) =>\n receiptSet.has(receiptType),\n );\n}\n\nfunction choosePaymentOption(\n candidates: PaymentOptionCandidate[],\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n const mode = strategy?.mode ?? \"provider_order\";\n const ranked = [...candidates].sort((left, right) =>\n comparePaymentOptions(left, right, preferences, strategy),\n );\n\n return ranked.map((candidate, rank) => ({\n ...candidate,\n score: rank,\n scoreReasons: createScoreReasons(candidate, preferences, strategy, mode),\n }))[0];\n}\n\nfunction preferenceIndex(preferences: string[], value: string) {\n const index = preferences.indexOf(value);\n return index === -1 ? Number.MAX_SAFE_INTEGER : index;\n}\n\nfunction comparePaymentOptions(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n switch (strategy?.mode ?? \"provider_order\") {\n case \"lowest_cost\":\n return compareCost(left, right) || left.index - right.index;\n\n case \"preferred_protocol\":\n return (\n comparePreferredProtocol(left, right, preferences) ||\n compareCost(left, right) ||\n left.index - right.index\n );\n\n case \"receipt_coverage\":\n return (\n compareReceiptCoverage(left, right, preferences, strategy) ||\n comparePreferredProtocol(left, right, preferences) ||\n compareCost(left, right) ||\n left.index - right.index\n );\n\n case \"provider_order\":\n return compareProviderOrder(left, right, preferences);\n }\n}\n\nfunction compareProviderOrder(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n const optionPreference = preferences?.preferredPaymentOptions ?? [];\n const protocolPreference = preferences?.preferredProtocols ?? [];\n const optionPreferenceDelta =\n preferenceIndex(optionPreference, left.option.id) -\n preferenceIndex(optionPreference, right.option.id);\n\n if (optionPreferenceDelta !== 0) {\n return optionPreferenceDelta;\n }\n\n const protocolPreferenceDelta =\n preferenceIndex(protocolPreference, left.option.protocolMode) -\n preferenceIndex(protocolPreference, right.option.protocolMode);\n\n if (protocolPreferenceDelta !== 0) {\n return protocolPreferenceDelta;\n }\n\n return left.index - right.index;\n}\n\nfunction comparePreferredProtocol(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n const protocolPreference = preferences?.preferredProtocols ?? [];\n\n return (\n preferenceIndex(protocolPreference, left.option.protocolMode) -\n preferenceIndex(protocolPreference, right.option.protocolMode)\n );\n}\n\nfunction compareCost(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n) {\n const leftCost = costSortValue(left.cost);\n const rightCost = costSortValue(right.cost);\n\n if (leftCost === rightCost) {\n return 0;\n }\n\n return leftCost < rightCost ? -1 : 1;\n}\n\nfunction compareReceiptCoverage(\n left: PaymentOptionCandidate,\n right: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n return (\n receiptCoverage(right, preferences, strategy) -\n receiptCoverage(left, preferences, strategy)\n );\n}\n\nfunction receiptCoverage(\n candidate: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n) {\n const desiredReceiptTypes =\n strategy?.preferredReceiptTypes ?? preferences?.requiredReceiptTypes ?? [];\n const receiptSet = new Set(candidate.receiptTypes);\n\n if (desiredReceiptTypes.length > 0) {\n return desiredReceiptTypes.filter((receiptType) => receiptSet.has(receiptType))\n .length;\n }\n\n return receiptSet.size;\n}\n\nfunction costSortValue(cost: Cost | undefined) {\n return cost?.amountUsd ?? Number.POSITIVE_INFINITY;\n}\n\nfunction createScoreReasons(\n candidate: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n strategy: ProbeMeshPaymentStrategy | undefined,\n mode: ProbeMeshPaymentStrategy[\"mode\"],\n) {\n const reasons = [`strategy:${mode}`];\n\n if (mode === \"provider_order\") {\n const preferredOptionIndex = preferenceIndex(\n preferences?.preferredPaymentOptions ?? [],\n candidate.option.id,\n );\n const preferredProtocolIndex = preferenceIndex(\n preferences?.preferredProtocols ?? [],\n candidate.option.protocolMode,\n );\n\n if (preferredOptionIndex !== Number.MAX_SAFE_INTEGER) {\n reasons.push(`preferred_option:${candidate.option.id}`);\n } else if (preferredProtocolIndex !== Number.MAX_SAFE_INTEGER) {\n reasons.push(`preferred_protocol:${candidate.option.protocolMode}`);\n } else {\n reasons.push(`provider_order:${candidate.index}`);\n }\n }\n\n if (mode === \"lowest_cost\" || mode === \"preferred_protocol\" || mode === \"receipt_coverage\") {\n reasons.push(\n candidate.cost\n ? `cost:${candidate.cost.amountUsd}`\n : \"cost:unknown\",\n );\n }\n\n if (mode === \"preferred_protocol\") {\n reasons.push(\n isPreferredProtocol(candidate, preferences)\n ? `preferred_protocol:${candidate.option.protocolMode}`\n : `protocol:${candidate.option.protocolMode}`,\n );\n }\n\n if (mode === \"receipt_coverage\") {\n const desiredReceiptTypes =\n strategy?.preferredReceiptTypes ?? preferences?.requiredReceiptTypes ?? [];\n reasons.push(\n desiredReceiptTypes.length > 0\n ? `receipt_coverage:${receiptCoverage(candidate, preferences, strategy)}/${desiredReceiptTypes.length}`\n : `receipt_coverage:${candidate.receiptTypes.length}`,\n );\n\n if (isPreferredProtocol(candidate, preferences)) {\n reasons.push(`preferred_protocol:${candidate.option.protocolMode}`);\n }\n }\n\n return reasons;\n}\n\nfunction isPreferredProtocol(\n candidate: PaymentOptionCandidate,\n preferences: ProbeMeshPaymentPreferences | undefined,\n) {\n return (\n preferences?.preferredProtocols?.includes(candidate.option.protocolMode) ??\n false\n );\n}\n\nfunction createNoPaymentOptionReason(\n input: PaymentOptionResolutionInput,\n capabilityCandidateCount: number,\n) {\n if (capabilityCandidateCount === 0) {\n return `Provider \"${input.providerId}\" has no payment option for capability \"${input.capability}\".`;\n }\n\n return `Provider \"${input.providerId}\" has no payment option matching paymentPreferences for capability \"${input.capability}\".`;\n}\n\nfunction resolvePaymentOptionPricing(\n option: ProviderPaymentOption,\n capability: string,\n) {\n return resolvePricing(option.pricing, capability);\n}\n\nfunction resolvePricing(\n pricing: ProbeMeshPricing | Record<string, ProbeMeshPricing> | undefined,\n capability: string,\n): ProbeMeshPricing | undefined {\n if (!pricing) {\n return undefined;\n }\n\n if (isPricing(pricing)) {\n return pricing;\n }\n\n const capabilityPricing = pricing[capability];\n return isPricing(capabilityPricing) ? capabilityPricing : undefined;\n}\n\nfunction pricingToCost(pricing: ProbeMeshPricing | undefined): Cost | undefined {\n if (!pricing) {\n return undefined;\n }\n\n return {\n amountUsd: pricing.amountUsd,\n currency: pricing.currency ?? \"USD\",\n unit: pricing.unit,\n };\n}\n\nfunction validatePreferenceStringArray(\n value: unknown,\n field: string,\n capability: string,\n) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `paymentPreferences.${field} must be an array of non-empty strings when provided.`,\n capability,\n });\n }\n}\n\nfunction validatePricingDeclaration(\n pricing: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"payment option pricing must be an object.\",\n });\n return;\n }\n\n if (isPricing(pricing)) {\n validatePricing(pricing, path, errors);\n return;\n }\n\n for (const [capability, capabilityPricing] of Object.entries(pricing)) {\n validatePricing(capabilityPricing, `${path}.${capability}`, errors);\n }\n}\n\nfunction validatePricing(\n pricing: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"payment option pricing entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(pricing.unit, `${path}.unit`, errors);\n\n if (\n typeof pricing.amountUsd !== \"number\" ||\n !Number.isFinite(pricing.amountUsd) ||\n pricing.amountUsd < 0\n ) {\n errors.push({\n path: `${path}.amountUsd`,\n message: \"amountUsd must be a non-negative number.\",\n });\n }\n\n if (pricing.currency !== undefined && typeof pricing.currency !== \"string\") {\n errors.push({\n path: `${path}.currency`,\n message: \"currency must be a string when provided.\",\n });\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: Array<{ path: string; message: string }>,\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction isPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n value.unit.length > 0 &&\n typeof value.amountUsd === \"number\" &&\n Number.isFinite(value.amountUsd) &&\n value.amountUsd >= 0 &&\n (value.currency === undefined || typeof value.currency === \"string\")\n );\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\nfunction isPaymentStrategyMode(\n value: unknown,\n): value is ProbeMeshPaymentStrategyMode {\n return (\n value === \"provider_order\" ||\n value === \"lowest_cost\" ||\n value === \"preferred_protocol\" ||\n value === \"receipt_coverage\"\n );\n}\n\nfunction compactPaymentPreferences(\n preferences: ProbeMeshPaymentPreferences,\n): ProbeMeshPaymentPreferences | undefined {\n const entries = Object.entries(preferences).filter(\n ([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0),\n );\n\n return entries.length > 0\n ? (Object.fromEntries(entries) as ProbeMeshPaymentPreferences)\n : undefined;\n}\n\nfunction intersectArrays<T>(first?: T[], second?: T[]) {\n if (first === undefined) {\n return second === undefined ? undefined : [...second];\n }\n\n if (second === undefined) {\n return [...first];\n }\n\n const secondValues = new Set(second);\n return first.filter((value) => secondValues.has(value));\n}\n\nfunction unionArrays<T>(first?: T[], second?: T[]) {\n const values = [...(first ?? []), ...(second ?? [])];\n return values.length > 0 ? [...new Set(values)] : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n","import { ProbeMeshError } from \"../errors\";\nimport { validateProviderPaymentOptions } from \"../paymentOptions\";\nimport type { ProbeMeshPricing } from \"../types\";\nimport type {\n JsonSchemaLike,\n ProviderLimits,\n ProviderManifest,\n ProviderManifestValidationError,\n ProviderManifestValidationResult,\n ProviderReceiptSupport,\n} from \"./types\";\n\nconst JSON_SCHEMA_HINT_KEYS = new Set([\n \"$schema\",\n \"$id\",\n \"type\",\n \"properties\",\n \"required\",\n \"items\",\n \"enum\",\n \"description\",\n \"additionalProperties\",\n \"oneOf\",\n \"anyOf\",\n \"allOf\",\n]);\n\nexport function validateProviderManifest(\n manifest: unknown,\n): ProviderManifestValidationResult {\n const errors: ProviderManifestValidationError[] = [];\n\n if (!isRecord(manifest)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider manifest must be an object.\",\n },\n ],\n };\n }\n\n validateNonEmptyString(manifest.id, \"id\", errors);\n validateNonEmptyString(manifest.displayName, \"displayName\", errors);\n validateCapabilityList(manifest.capabilities, errors);\n validateNonEmptyString(manifest.protocolMode, \"protocolMode\", errors);\n validateProviderPaymentOptions(\n manifest.paymentOptions,\n \"paymentOptions\",\n Array.isArray(manifest.capabilities) ? manifest.capabilities : [],\n errors,\n );\n validatePricingDeclaration(\n manifest.pricing,\n \"pricing\",\n manifest.capabilities,\n errors,\n );\n validateSchemaDeclaration(\n manifest.inputSchema,\n \"inputSchema\",\n manifest.capabilities,\n errors,\n );\n validateSchemaDeclaration(\n manifest.outputSchema,\n \"outputSchema\",\n manifest.capabilities,\n errors,\n );\n validateReceipts(manifest.receipts, errors);\n\n if (manifest.limits !== undefined) {\n validateLimits(manifest.limits, errors);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderManifest(\n manifest: unknown,\n): asserts manifest is ProviderManifest {\n const result = validateProviderManifest(manifest);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider manifest: ${formatValidationErrors(result.errors)}`,\n });\n}\n\nexport function isSharedJsonSchemaLike(value: unknown): value is JsonSchemaLike {\n if (!isRecord(value)) {\n return false;\n }\n\n return Object.keys(value).some((key) => JSON_SCHEMA_HINT_KEYS.has(key));\n}\n\nexport function isSharedPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n value.unit.length > 0 &&\n typeof value.amountUsd === \"number\"\n );\n}\n\nfunction validateCapabilityList(\n capabilities: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!Array.isArray(capabilities) || capabilities.length === 0) {\n errors.push({\n path: \"capabilities\",\n message: \"capabilities must be a non-empty array.\",\n });\n return;\n }\n\n const seen = new Set<string>();\n\n capabilities.forEach((capability, index) => {\n if (typeof capability !== \"string\" || capability.length === 0) {\n errors.push({\n path: `capabilities.${index}`,\n message: \"capability ids must be non-empty strings.\",\n });\n return;\n }\n\n if (seen.has(capability)) {\n errors.push({\n path: `capabilities.${index}`,\n message: `duplicate capability \"${capability}\".`,\n });\n }\n\n seen.add(capability);\n });\n}\n\nfunction validatePricingDeclaration(\n pricing: unknown,\n path: string,\n capabilities: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing must be an object.\",\n });\n return;\n }\n\n if (isSharedPricing(pricing)) {\n validatePricing(pricing, path, errors);\n return;\n }\n\n if (!Array.isArray(capabilities)) {\n return;\n }\n\n for (const capability of capabilities) {\n if (typeof capability !== \"string\" || capability.length === 0) {\n continue;\n }\n\n validatePricing(pricing[capability], `${path}.${capability}`, errors);\n }\n}\n\nfunction validatePricing(\n pricing: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(pricing.unit, `${path}.unit`, errors);\n\n if (\n typeof pricing.amountUsd !== \"number\" ||\n !Number.isFinite(pricing.amountUsd) ||\n pricing.amountUsd < 0\n ) {\n errors.push({\n path: `${path}.amountUsd`,\n message: \"amountUsd must be a non-negative number.\",\n });\n }\n\n if (pricing.currency !== undefined && typeof pricing.currency !== \"string\") {\n errors.push({\n path: `${path}.currency`,\n message: \"currency must be a string when provided.\",\n });\n }\n}\n\nfunction validateSchemaDeclaration(\n schema: unknown,\n path: string,\n capabilities: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(schema)) {\n errors.push({\n path,\n message: `${path} must be an object.`,\n });\n return;\n }\n\n if (isSharedJsonSchemaLike(schema)) {\n validateSchemaLike(schema, path, errors);\n return;\n }\n\n if (!Array.isArray(capabilities)) {\n return;\n }\n\n for (const capability of capabilities) {\n if (typeof capability !== \"string\" || capability.length === 0) {\n continue;\n }\n\n validateSchemaLike(schema[capability], `${path}.${capability}`, errors);\n }\n}\n\nfunction validateSchemaLike(\n schema: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(schema)) {\n errors.push({\n path,\n message: \"schema entry must be an object.\",\n });\n return;\n }\n\n if (schema.type !== undefined && typeof schema.type !== \"string\") {\n errors.push({\n path: `${path}.type`,\n message: \"schema type must be a string when provided.\",\n });\n }\n\n if (\n schema.properties !== undefined &&\n !isRecord(schema.properties)\n ) {\n errors.push({\n path: `${path}.properties`,\n message: \"schema properties must be an object when provided.\",\n });\n }\n\n if (\n schema.required !== undefined &&\n (!Array.isArray(schema.required) ||\n schema.required.some((field) => typeof field !== \"string\"))\n ) {\n errors.push({\n path: `${path}.required`,\n message: \"schema required must be an array of strings when provided.\",\n });\n }\n}\n\nfunction validateReceipts(\n receipts: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path: \"receipts\",\n message: \"receipts must be an object.\",\n });\n return;\n }\n\n validateBoolean(receipts.payment, \"receipts.payment\", errors);\n validateBoolean(receipts.delivery, \"receipts.delivery\", errors);\n validateBoolean(\n receipts.responseEvidence,\n \"receipts.responseEvidence\",\n errors,\n );\n}\n\nfunction validateLimits(\n limits: unknown,\n errors: ProviderManifestValidationError[],\n) {\n if (!isRecord(limits)) {\n errors.push({\n path: \"limits\",\n message: \"limits must be an object when provided.\",\n });\n return;\n }\n\n const typedLimits = limits as ProviderLimits;\n\n if (\n typedLimits.maxRequestsPerMinute !== undefined &&\n (!Number.isFinite(typedLimits.maxRequestsPerMinute) ||\n typedLimits.maxRequestsPerMinute <= 0)\n ) {\n errors.push({\n path: \"limits.maxRequestsPerMinute\",\n message: \"maxRequestsPerMinute must be a positive number when provided.\",\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateBoolean(\n value: unknown,\n path: string,\n errors: ProviderManifestValidationError[],\n) {\n if (typeof value !== \"boolean\") {\n errors.push({\n path,\n message: `${path} must be a boolean.`,\n });\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction formatValidationErrors(errors: ProviderManifestValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","export interface X402SecretRedactionOptions {\n replacement?: string;\n maxDepth?: number;\n}\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst DEFAULT_MAX_DEPTH = 12;\nconst PRIVATE_KEY_PATTERN = /\\b0x[a-fA-F0-9]{64}\\b/g;\nconst HEX_SIGNATURE_PATTERN = /\\b0x[a-fA-F0-9]{130}\\b/g;\nconst SECRET_FIELD_NAMES = new Set([\n \"api-key\",\n \"apikey\",\n \"authorization\",\n \"bearer\",\n \"payment-required\",\n \"payment-response\",\n \"payment-signature\",\n \"privatekey\",\n \"signature\",\n \"x-api-key\",\n]);\n\nexport function redactX402Secrets<T>(\n value: T,\n options: X402SecretRedactionOptions = {},\n): T {\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n const seen = new WeakSet<object>();\n\n return redactValue(value, {\n replacement,\n maxDepth,\n depth: 0,\n seen,\n key: undefined,\n }) as T;\n}\n\nfunction redactValue(\n value: unknown,\n context: {\n replacement: string;\n maxDepth: number;\n depth: number;\n seen: WeakSet<object>;\n key: string | undefined;\n },\n): unknown {\n if (context.key && shouldRedactKey(context.key)) {\n return context.replacement;\n }\n\n if (typeof value === \"string\") {\n return redactString(value, context.replacement);\n }\n\n if (\n value === null ||\n typeof value !== \"object\" ||\n value instanceof Date\n ) {\n return value;\n }\n\n if (context.depth >= context.maxDepth) {\n return \"[MaxDepth]\";\n }\n\n if (context.seen.has(value)) {\n return \"[Circular]\";\n }\n\n context.seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((entry) =>\n redactValue(entry, {\n ...context,\n depth: context.depth + 1,\n key: undefined,\n }),\n );\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactValue(entry, {\n ...context,\n depth: context.depth + 1,\n key,\n }),\n ]),\n );\n}\n\nfunction shouldRedactKey(key: string) {\n const normalized = key.toLowerCase().replace(/_/g, \"-\");\n\n return (\n SECRET_FIELD_NAMES.has(normalized) ||\n normalized.includes(\"private-key\") ||\n normalized.includes(\"privatekey\") ||\n normalized.includes(\"payment-signature\") ||\n normalized.includes(\"payment-response\") ||\n normalized.includes(\"payment-required\") ||\n normalized.includes(\"api-key\")\n );\n}\n\nfunction redactString(value: string, replacement: string) {\n return value\n .replace(PRIVATE_KEY_PATTERN, replacement)\n .replace(HEX_SIGNATURE_PATTERN, replacement);\n}\n","import { 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 { createHash } from \"node:crypto\";\n\nimport { ProbeMeshError } from \"./errors\";\nimport { validateProviderManifest } from \"./providerKit/manifest\";\nimport type {\n JsonSchemaLike,\n ProviderLimits,\n ProviderManifest,\n ProviderReceiptSupport,\n} from \"./providerKit/types\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport type {\n Cost,\n ProbeMeshCallSafety,\n ProbeMeshRetrySafety,\n ProbeMeshTimelineEventType,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\nimport type {\n ProviderConformanceCheck,\n ProviderConformanceReport,\n ProviderConformanceStatus,\n ProviderConformanceSummary,\n} from \"./providerConformance\";\n\nexport const PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION =\n \"probemesh.provider-conformance.v1\" as const;\n\nexport type ProviderConformanceArtifactStatus = \"verified\" | \"failed\";\n\nexport type ProviderConformanceArtifactFormat = \"json\" | \"markdown\";\n\nexport interface ProviderConformanceArtifactOptions {\n manifest: ProviderManifest;\n report: ProviderConformanceReport;\n generatedAt?: string;\n artifactId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderConformanceArtifactManifestSummary {\n id: string;\n displayName: string;\n capabilities: string[];\n protocolMode: string;\n pricing?: Cost | Record<string, Cost>;\n receipts: ProviderReceiptSupport;\n limits?: ProviderLimits;\n paymentOptions?: ProviderPaymentOption[];\n schemas: {\n inputDeclared: boolean;\n outputDeclared: boolean;\n };\n}\n\nexport interface ProviderConformanceArtifactReceiptSummary {\n total: number;\n types: ReceiptType[];\n providers: string[];\n byType: Partial<Record<ReceiptType, number>>;\n hasPaymentProof: boolean;\n hasSettlementConfirmation: boolean;\n hasProviderDelivery: boolean;\n}\n\nexport interface ProviderConformanceArtifactHashes {\n manifest: string;\n report: string;\n checks: string;\n artifact: string;\n}\n\nexport interface ProviderConformanceArtifact {\n schemaVersion: typeof PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION;\n artifactId: string;\n generatedAt: string;\n status: ProviderConformanceArtifactStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProviderConformanceArtifactHashes;\n provider: ProviderConformanceArtifactManifestSummary;\n conformance: {\n title: string;\n status: ProviderConformanceStatus;\n summary: ProviderConformanceSummary;\n checks: ProviderConformanceCheck[];\n failedChecks: string[];\n receipts: ProviderConformanceArtifactReceiptSummary;\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProviderConformanceSummary[\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n errorCode?: string;\n };\n}\n\nexport interface ProviderConformanceArtifactValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderConformanceArtifactValidationResult {\n valid: boolean;\n errors: ProviderConformanceArtifactValidationError[];\n}\n\nexport function createProviderConformanceArtifact(\n options: ProviderConformanceArtifactOptions,\n): ProviderConformanceArtifact {\n assertProviderConformanceArtifactOptions(options);\n\n const status: ProviderConformanceArtifactStatus =\n options.report.status === \"passed\" &&\n options.report.checks.every((check) => check.status === \"passed\")\n ? \"verified\"\n : \"failed\";\n const provider = summarizeManifest(options.manifest);\n const conformance = {\n title: options.report.title,\n status: options.report.status,\n summary: cloneSerializable(options.report.summary),\n checks: cloneSerializable(options.report.checks),\n failedChecks: [...options.report.summary.failedCheckNames],\n receipts: cloneSerializable(options.report.receipts),\n safety: cloneSerializable(options.report.safety),\n retrySafety: cloneSerializable(options.report.retrySafety),\n route: cloneSerializable(options.report.route),\n timelineEventTypes: [...options.report.timelineEventTypes],\n telemetryEventTypes: [...options.report.telemetryEventTypes],\n errorCode: options.report.summary.errorCode,\n };\n const baseContent = sanitizeConformanceArtifactOutput(\n {\n schemaVersion: PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION,\n artifactId:\n options.artifactId ??\n `${options.manifest.id}:${options.report.summary.callId ?? \"unknown\"}:conformance`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status,\n hashAlgorithm: \"sha256\" as const,\n provider,\n conformance,\n },\n options.forbiddenOutputValues ?? [],\n );\n const hashesWithoutArtifact: ProviderConformanceArtifactHashes = {\n manifest: hashStableJson(baseContent.provider),\n report: hashStableJson(baseContent.conformance.summary),\n checks: hashStableJson(baseContent.conformance.checks),\n artifact: \"\",\n };\n const artifact: ProviderConformanceArtifact = {\n ...baseContent,\n hashes: {\n ...hashesWithoutArtifact,\n artifact: hashArtifactContent({\n ...baseContent,\n hashes: hashesWithoutArtifact,\n }),\n },\n };\n\n assertProviderConformanceArtifact(artifact);\n\n return artifact;\n}\n\nexport function validateProviderConformanceArtifact(\n artifact: unknown,\n): ProviderConformanceArtifactValidationResult {\n const errors: ProviderConformanceArtifactValidationError[] = [];\n\n if (!isRecord(artifact)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider conformance artifact must be an object.\",\n },\n ],\n };\n }\n\n if (artifact.schemaVersion !== PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CONFORMANCE_ARTIFACT_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(artifact.artifactId, \"artifactId\", errors);\n validateIsoTimestamp(artifact.generatedAt, \"generatedAt\", errors);\n\n if (artifact.status !== \"verified\" && artifact.status !== \"failed\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"verified\" or \"failed\".',\n });\n }\n\n if (artifact.hashAlgorithm !== \"sha256\") {\n errors.push({\n path: \"hashAlgorithm\",\n message: 'hashAlgorithm must be \"sha256\".',\n });\n }\n\n validateHashes(artifact.hashes, errors);\n validateManifestSummary(artifact.provider, errors);\n validateConformanceSummary(artifact.conformance, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderConformanceArtifact(\n artifact: unknown,\n): asserts artifact is ProviderConformanceArtifact {\n const result = validateProviderConformanceArtifact(artifact);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider conformance artifact: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProviderConformanceArtifact(\n artifact: ProviderConformanceArtifact,\n options: {\n format?: ProviderConformanceArtifactFormat;\n } = {},\n) {\n assertProviderConformanceArtifact(artifact);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatConformanceArtifactMarkdown(artifact);\n }\n\n return JSON.stringify(artifact, null, 2);\n}\n\nfunction assertProviderConformanceArtifactOptions(\n options: ProviderConformanceArtifactOptions,\n): asserts options is ProviderConformanceArtifactOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact options must be an object.\",\n });\n }\n\n const manifestValidation = validateProviderManifest(options.manifest);\n\n if (!manifestValidation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider conformance artifact manifest: ${formatValidationErrors(\n manifestValidation.errors,\n )}`,\n });\n }\n\n if (\n !options.report ||\n typeof options.report !== \"object\" ||\n Array.isArray(options.report)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact requires a conformance report.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact generatedAt must be an ISO timestamp.\",\n });\n }\n\n if (\n options.artifactId !== undefined &&\n (typeof options.artifactId !== \"string\" || options.artifactId.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance artifact artifactId must be a non-empty string.\",\n });\n }\n\n if (\n options.forbiddenOutputValues !== undefined &&\n (!Array.isArray(options.forbiddenOutputValues) ||\n options.forbiddenOutputValues.some((value) => typeof value !== \"string\"))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Provider conformance artifact forbiddenOutputValues must be an array of strings.\",\n });\n }\n}\n\nfunction summarizeManifest(\n manifest: ProviderManifest,\n): ProviderConformanceArtifactManifestSummary {\n return {\n id: manifest.id,\n displayName: manifest.displayName,\n capabilities: [...manifest.capabilities],\n protocolMode: manifest.protocolMode,\n pricing: cloneSerializable(manifest.pricing),\n receipts: cloneSerializable(manifest.receipts),\n limits: cloneSerializable(manifest.limits),\n paymentOptions: cloneSerializable(manifest.paymentOptions),\n schemas: {\n inputDeclared: hasSchemaDeclaration(manifest.inputSchema),\n outputDeclared: hasSchemaDeclaration(manifest.outputSchema),\n },\n };\n}\n\nfunction hasSchemaDeclaration(\n declaration: JsonSchemaLike | Record<string, JsonSchemaLike>,\n) {\n return Object.keys(declaration).length > 0;\n}\n\nfunction formatConformanceArtifactMarkdown(\n artifact: ProviderConformanceArtifact,\n) {\n const lines = [\n `# ${artifact.provider.displayName} Conformance Artifact`,\n \"\",\n `Status: ${artifact.status}`,\n `Schema: ${artifact.schemaVersion}`,\n `Artifact ID: ${artifact.artifactId}`,\n `Generated: ${artifact.generatedAt}`,\n `Provider: ${artifact.provider.id}`,\n `Capabilities: ${formatInlineList(artifact.provider.capabilities)}`,\n \"\",\n \"## Conformance\",\n `- Result: ${artifact.conformance.status}`,\n `- Failed checks: ${formatInlineList(artifact.conformance.failedChecks)}`,\n `- Receipts: ${formatInlineList(artifact.conformance.receipts.types)}`,\n `- Timeline: ${formatInlineList(artifact.conformance.timelineEventTypes)}`,\n \"\",\n \"## Safety\",\n `- Payment: ${artifact.conformance.safety?.paymentStatus ?? \"unknown\"}`,\n `- Settlement: ${\n artifact.conformance.safety?.settlementStatus ?? \"unknown\"\n }`,\n `- Delivery: ${artifact.conformance.safety?.deliveryStatus ?? \"unknown\"}`,\n `- Money may have moved: ${String(\n artifact.conformance.safety?.moneyMayHaveMoved ?? false,\n )}`,\n \"\",\n \"## Hashes\",\n `- Manifest: ${artifact.hashes.manifest}`,\n `- Report: ${artifact.hashes.report}`,\n `- Checks: ${artifact.hashes.checks}`,\n `- Artifact: ${artifact.hashes.artifact}`,\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction validateManifestSummary(\n provider: unknown,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (!isRecord(provider)) {\n errors.push({\n path: \"provider\",\n message: \"provider must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(provider.id, \"provider.id\", errors);\n validateNonEmptyString(provider.displayName, \"provider.displayName\", errors);\n\n if (\n !Array.isArray(provider.capabilities) ||\n provider.capabilities.some((capability) => typeof capability !== \"string\")\n ) {\n errors.push({\n path: \"provider.capabilities\",\n message: \"provider.capabilities must be an array of strings.\",\n });\n }\n\n validateNonEmptyString(provider.protocolMode, \"provider.protocolMode\", errors);\n\n if (!isRecord(provider.receipts)) {\n errors.push({\n path: \"provider.receipts\",\n message: \"provider.receipts must be an object.\",\n });\n }\n\n if (\n !isRecord(provider.schemas) ||\n typeof provider.schemas.inputDeclared !== \"boolean\" ||\n typeof provider.schemas.outputDeclared !== \"boolean\"\n ) {\n errors.push({\n path: \"provider.schemas\",\n message: \"provider.schemas must include inputDeclared and outputDeclared booleans.\",\n });\n }\n}\n\nfunction validateConformanceSummary(\n conformance: unknown,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (!isRecord(conformance)) {\n errors.push({\n path: \"conformance\",\n message: \"conformance must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(conformance.title, \"conformance.title\", errors);\n\n if (conformance.status !== \"passed\" && conformance.status !== \"failed\") {\n errors.push({\n path: \"conformance.status\",\n message: 'conformance.status must be \"passed\" or \"failed\".',\n });\n }\n\n if (!isRecord(conformance.summary)) {\n errors.push({\n path: \"conformance.summary\",\n message: \"conformance.summary must be an object.\",\n });\n }\n\n if (\n !Array.isArray(conformance.checks) ||\n conformance.checks.some((check) => !isRecord(check))\n ) {\n errors.push({\n path: \"conformance.checks\",\n message: \"conformance.checks must be an array of check objects.\",\n });\n }\n\n if (\n !Array.isArray(conformance.failedChecks) ||\n conformance.failedChecks.some((checkName) => typeof checkName !== \"string\")\n ) {\n errors.push({\n path: \"conformance.failedChecks\",\n message: \"conformance.failedChecks must be an array of strings.\",\n });\n }\n\n if (!isRecord(conformance.receipts)) {\n errors.push({\n path: \"conformance.receipts\",\n message: \"conformance.receipts must be an object.\",\n });\n }\n\n if (\n !Array.isArray(conformance.timelineEventTypes) ||\n conformance.timelineEventTypes.some((eventType) => typeof eventType !== \"string\")\n ) {\n errors.push({\n path: \"conformance.timelineEventTypes\",\n message: \"conformance.timelineEventTypes must be an array of strings.\",\n });\n }\n\n if (\n !Array.isArray(conformance.telemetryEventTypes) ||\n conformance.telemetryEventTypes.some((eventType) => typeof eventType !== \"string\")\n ) {\n errors.push({\n path: \"conformance.telemetryEventTypes\",\n message: \"conformance.telemetryEventTypes must be an array of strings.\",\n });\n }\n}\n\nfunction validateHashes(\n hashes: unknown,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (!isRecord(hashes)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const field of [\"manifest\", \"report\", \"checks\", \"artifact\"]) {\n const value = hashes[field];\n\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n errors.push({\n path: `hashes.${field}`,\n message: `${field} hash must be a sha256 hex string.`,\n });\n }\n }\n}\n\nfunction sanitizeConformanceArtifactOutput<T>(\n value: T,\n forbiddenOutputValues: string[],\n): T {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(value, forbiddenValues, new WeakSet<object>()),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n seen: WeakSet<object>,\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n replaceForbiddenValues(entry, forbiddenValues, seen),\n );\n\n seen.delete(value);\n return entries;\n }\n\n const entries = Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues, seen),\n ]),\n );\n\n seen.delete(value);\n return entries;\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction hashArtifactContent(\n artifact: Omit<ProviderConformanceArtifact, \"hashes\"> & {\n hashes: ProviderConformanceArtifactHashes;\n },\n) {\n return hashStableJson(artifact);\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n\n return `{${entries\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`)\n .join(\",\")}}`;\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProviderConformanceArtifactValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction formatValidationErrors(\n errors: Array<{\n path: string;\n message: string;\n }>,\n) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction formatInlineList(values: readonly string[] | undefined) {\n return values && values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { createHash } from \"node:crypto\";\n\nimport { ProbeMeshError } from \"./errors\";\nimport {\n validateProviderCatalogArtifact,\n type ProviderCatalogArtifact,\n type ProviderCatalogArtifactStatus,\n} from \"./providerCatalogArtifact\";\nimport {\n validateProviderConformanceArtifact,\n type ProviderConformanceArtifact,\n type ProviderConformanceArtifactReceiptSummary,\n type ProviderConformanceArtifactStatus,\n} from \"./providerConformanceArtifact\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport type {\n Cost,\n ProbeMeshCallSafety,\n ProbeMeshRetrySafety,\n ProbeMeshTimelineEventType,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\n\nexport const PROVIDER_ONBOARDING_DOSSIER_SCHEMA_VERSION =\n \"probemesh.provider-onboarding-dossier.v1\" as const;\n\nexport type ProviderOnboardingDossierStatus = \"ready\" | \"failed\";\n\nexport type ProviderOnboardingDossierFormat = \"json\" | \"markdown\";\n\nexport interface ProviderOnboardingDossierOptions {\n catalogArtifact: ProviderCatalogArtifact;\n conformanceArtifact: ProviderConformanceArtifact;\n generatedAt?: string;\n dossierId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderOnboardingDossierProviderSummary {\n id: string;\n displayName: string;\n capabilities: string[];\n protocolMode: string;\n pricing?: Cost | Record<string, Cost>;\n paymentOptions?: ProviderPaymentOption[];\n}\n\nexport interface ProviderOnboardingDossierReadiness {\n ready: boolean;\n status: ProviderOnboardingDossierStatus;\n reasons: string[];\n failedChecks: string[];\n}\n\nexport interface ProviderOnboardingDossierReceiptSummary\n extends ProviderConformanceArtifactReceiptSummary {}\n\nexport interface ProviderOnboardingDossierEvidence {\n catalog: {\n artifactId: string;\n status: ProviderCatalogArtifactStatus;\n acceptanceStatus: ProviderCatalogArtifact[\"acceptance\"][\"status\"];\n gateStatus: ProviderCatalogArtifact[\"acceptance\"][\"gate\"][\"status\"];\n accepted: boolean;\n failedChecks: string[];\n };\n conformance: {\n artifactId: string;\n status: ProviderConformanceArtifactStatus;\n conformanceStatus: ProviderConformanceArtifact[\"conformance\"][\"status\"];\n failedChecks: string[];\n };\n receipts: ProviderOnboardingDossierReceiptSummary;\n safety: {\n acceptance?: ProbeMeshCallSafety;\n conformance?: ProbeMeshCallSafety;\n };\n retrySafety: {\n acceptance?: ProbeMeshRetrySafety;\n conformance?: ProbeMeshRetrySafety;\n };\n route: {\n acceptance?: ProviderCatalogArtifact[\"acceptance\"][\"route\"];\n conformance?: ProviderConformanceArtifact[\"conformance\"][\"route\"];\n };\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n}\n\nexport interface ProviderOnboardingDossierHashes {\n catalogArtifact: string;\n conformanceArtifact: string;\n readiness: string;\n dossier: string;\n}\n\nexport interface ProviderOnboardingDossier {\n schemaVersion: typeof PROVIDER_ONBOARDING_DOSSIER_SCHEMA_VERSION;\n dossierId: string;\n generatedAt: string;\n status: ProviderOnboardingDossierStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProviderOnboardingDossierHashes;\n provider: ProviderOnboardingDossierProviderSummary;\n readiness: ProviderOnboardingDossierReadiness;\n evidence: ProviderOnboardingDossierEvidence;\n artifacts: {\n catalog: ProviderCatalogArtifact;\n conformance: ProviderConformanceArtifact;\n };\n}\n\nexport interface ProviderOnboardingDossierValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderOnboardingDossierValidationResult {\n valid: boolean;\n errors: ProviderOnboardingDossierValidationError[];\n}\n\nexport function createProviderOnboardingDossier(\n options: ProviderOnboardingDossierOptions,\n): ProviderOnboardingDossier {\n assertProviderOnboardingDossierOptions(options);\n\n const status: ProviderOnboardingDossierStatus =\n options.catalogArtifact.status === \"ready\" &&\n options.conformanceArtifact.status === \"verified\"\n ? \"ready\"\n : \"failed\";\n const readiness = summarizeReadiness(\n options.catalogArtifact,\n options.conformanceArtifact,\n status,\n );\n const baseContent = sanitizeDossierOutput(\n {\n schemaVersion: PROVIDER_ONBOARDING_DOSSIER_SCHEMA_VERSION,\n dossierId:\n options.dossierId ??\n `${options.catalogArtifact.provider.id}:${options.catalogArtifact.artifactId}:${options.conformanceArtifact.artifactId}:dossier`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status,\n hashAlgorithm: \"sha256\" as const,\n provider: summarizeProvider(options.catalogArtifact),\n readiness,\n evidence: summarizeEvidence(\n options.catalogArtifact,\n options.conformanceArtifact,\n ),\n artifacts: {\n catalog: cloneSerializable(options.catalogArtifact),\n conformance: cloneSerializable(options.conformanceArtifact),\n },\n },\n options.forbiddenOutputValues ?? [],\n );\n const hashesWithoutDossier: ProviderOnboardingDossierHashes = {\n catalogArtifact: hashStableJson(baseContent.artifacts.catalog),\n conformanceArtifact: hashStableJson(baseContent.artifacts.conformance),\n readiness: hashStableJson(baseContent.readiness),\n dossier: \"\",\n };\n const dossier: ProviderOnboardingDossier = {\n ...baseContent,\n hashes: {\n ...hashesWithoutDossier,\n dossier: hashDossierContent({\n ...baseContent,\n hashes: hashesWithoutDossier,\n }),\n },\n };\n\n assertProviderOnboardingDossier(dossier);\n\n return dossier;\n}\n\nexport function validateProviderOnboardingDossier(\n dossier: unknown,\n): ProviderOnboardingDossierValidationResult {\n const errors: ProviderOnboardingDossierValidationError[] = [];\n\n if (!isRecord(dossier)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider onboarding dossier must be an object.\",\n },\n ],\n };\n }\n\n if (dossier.schemaVersion !== PROVIDER_ONBOARDING_DOSSIER_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_ONBOARDING_DOSSIER_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(dossier.dossierId, \"dossierId\", errors);\n validateIsoTimestamp(dossier.generatedAt, \"generatedAt\", errors);\n\n if (dossier.status !== \"ready\" && dossier.status !== \"failed\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"ready\" or \"failed\".',\n });\n }\n\n if (dossier.hashAlgorithm !== \"sha256\") {\n errors.push({\n path: \"hashAlgorithm\",\n message: 'hashAlgorithm must be \"sha256\".',\n });\n }\n\n validateProviderSummary(dossier.provider, errors);\n validateReadiness(dossier.readiness, errors);\n validateEvidence(dossier.evidence, errors);\n validateNestedArtifacts(dossier.artifacts, errors);\n validateHashes(dossier, errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderOnboardingDossier(\n dossier: unknown,\n): asserts dossier is ProviderOnboardingDossier {\n const result = validateProviderOnboardingDossier(dossier);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider onboarding dossier: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProviderOnboardingDossier(\n dossier: ProviderOnboardingDossier,\n options: {\n format?: ProviderOnboardingDossierFormat;\n title?: string;\n } = {},\n) {\n assertProviderOnboardingDossier(dossier);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatDossierMarkdown(dossier, options.title);\n }\n\n return JSON.stringify(dossier, null, 2);\n}\n\nfunction assertProviderOnboardingDossierOptions(\n options: ProviderOnboardingDossierOptions,\n): asserts options is ProviderOnboardingDossierOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier options must be an object.\",\n });\n }\n\n const catalogValidation = validateProviderCatalogArtifact(\n options.catalogArtifact,\n );\n\n if (!catalogValidation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider onboarding catalog artifact: ${formatValidationErrors(\n catalogValidation.errors,\n )}`,\n });\n }\n\n const conformanceValidation = validateProviderConformanceArtifact(\n options.conformanceArtifact,\n );\n\n if (!conformanceValidation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider onboarding conformance artifact: ${formatValidationErrors(\n conformanceValidation.errors,\n )}`,\n });\n }\n\n if (\n options.catalogArtifact.provider.id !== options.conformanceArtifact.provider.id\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Provider onboarding dossier requires catalog and conformance artifacts for the same provider id.\",\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 onboarding dossier generatedAt must be an ISO timestamp.\",\n });\n }\n\n if (\n options.dossierId !== undefined &&\n (typeof options.dossierId !== \"string\" || options.dossierId.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier dossierId 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 onboarding dossier forbiddenOutputValues must be an array of strings.\",\n });\n }\n}\n\nfunction summarizeProvider(\n catalogArtifact: ProviderCatalogArtifact,\n): ProviderOnboardingDossierProviderSummary {\n return {\n id: catalogArtifact.provider.id,\n displayName: catalogArtifact.provider.displayName,\n capabilities: [...catalogArtifact.provider.capabilities],\n protocolMode: catalogArtifact.provider.protocolMode,\n pricing: cloneSerializable(catalogArtifact.provider.pricing),\n paymentOptions: cloneSerializable(catalogArtifact.provider.paymentOptions),\n };\n}\n\nfunction summarizeReadiness(\n catalogArtifact: ProviderCatalogArtifact,\n conformanceArtifact: ProviderConformanceArtifact,\n status: ProviderOnboardingDossierStatus,\n): ProviderOnboardingDossierReadiness {\n const reasons: string[] = [];\n const failedChecks: string[] = [];\n\n if (catalogArtifact.status === \"ready\") {\n reasons.push(\"Catalog artifact is ready.\");\n } else {\n reasons.push(\"Catalog artifact is rejected.\");\n failedChecks.push(\"catalog_not_ready\");\n }\n\n if (conformanceArtifact.status === \"verified\") {\n reasons.push(\"Conformance artifact is verified.\");\n } else {\n reasons.push(\"Conformance artifact failed.\");\n failedChecks.push(\"conformance_not_verified\");\n }\n\n for (const check of catalogArtifact.acceptance.failedChecks) {\n failedChecks.push(`catalog:${check}`);\n }\n\n for (const check of conformanceArtifact.conformance.failedChecks) {\n failedChecks.push(`conformance:${check}`);\n }\n\n return {\n ready: status === \"ready\",\n status,\n reasons,\n failedChecks: uniqueStrings(failedChecks),\n };\n}\n\nfunction summarizeEvidence(\n catalogArtifact: ProviderCatalogArtifact,\n conformanceArtifact: ProviderConformanceArtifact,\n): ProviderOnboardingDossierEvidence {\n return {\n catalog: {\n artifactId: catalogArtifact.artifactId,\n status: catalogArtifact.status,\n acceptanceStatus: catalogArtifact.acceptance.status,\n gateStatus: catalogArtifact.acceptance.gate.status,\n accepted: catalogArtifact.acceptance.gate.accepted,\n failedChecks: [...catalogArtifact.acceptance.failedChecks],\n },\n conformance: {\n artifactId: conformanceArtifact.artifactId,\n status: conformanceArtifact.status,\n conformanceStatus: conformanceArtifact.conformance.status,\n failedChecks: [...conformanceArtifact.conformance.failedChecks],\n },\n receipts: combineReceiptSummaries(\n catalogArtifact.acceptance.receipts,\n conformanceArtifact.conformance.receipts,\n ),\n safety: {\n acceptance: cloneSerializable(catalogArtifact.acceptance.safety),\n conformance: cloneSerializable(conformanceArtifact.conformance.safety),\n },\n retrySafety: {\n acceptance: cloneSerializable(catalogArtifact.acceptance.retrySafety),\n conformance: cloneSerializable(conformanceArtifact.conformance.retrySafety),\n },\n route: {\n acceptance: cloneSerializable(catalogArtifact.acceptance.route),\n conformance: cloneSerializable(conformanceArtifact.conformance.route),\n },\n timelineEventTypes: uniqueStrings([\n ...catalogArtifact.acceptance.timelineEventTypes,\n ...conformanceArtifact.conformance.timelineEventTypes,\n ]) as ProbeMeshTimelineEventType[],\n telemetryEventTypes: uniqueStrings([\n ...catalogArtifact.acceptance.telemetryEventTypes,\n ...conformanceArtifact.conformance.telemetryEventTypes,\n ]) as ProbeMeshTimelineEventType[],\n };\n}\n\nfunction combineReceiptSummaries(\n left: ProviderCatalogArtifact[\"acceptance\"][\"receipts\"],\n right: ProviderConformanceArtifactReceiptSummary,\n): ProviderOnboardingDossierReceiptSummary {\n const byType: Partial<Record<ReceiptType, number>> = {};\n\n for (const [type, count] of Object.entries(left.byType)) {\n byType[type as ReceiptType] = (byType[type as ReceiptType] ?? 0) + Number(count);\n }\n\n for (const [type, count] of Object.entries(right.byType)) {\n byType[type as ReceiptType] = (byType[type as ReceiptType] ?? 0) + Number(count);\n }\n\n return {\n total: left.total + right.total,\n types: uniqueStrings([...left.types, ...right.types]) as ReceiptType[],\n providers: uniqueStrings([...left.providers, ...right.providers]),\n byType,\n hasPaymentProof: left.hasPaymentProof || right.hasPaymentProof,\n hasSettlementConfirmation:\n left.hasSettlementConfirmation || right.hasSettlementConfirmation,\n hasProviderDelivery: left.hasProviderDelivery || right.hasProviderDelivery,\n };\n}\n\nfunction formatDossierMarkdown(\n dossier: ProviderOnboardingDossier,\n title?: string,\n) {\n const lines = [\n `# ${title ?? `${dossier.provider.displayName} Onboarding Dossier`}`,\n \"\",\n `Status: ${dossier.status}`,\n `Schema: ${dossier.schemaVersion}`,\n `Dossier ID: ${dossier.dossierId}`,\n `Generated: ${dossier.generatedAt}`,\n `Provider: ${dossier.provider.id}`,\n `Capabilities: ${formatInlineList(dossier.provider.capabilities)}`,\n \"\",\n \"## Readiness\",\n `- Ready: ${String(dossier.readiness.ready)}`,\n `- Reasons: ${formatInlineList(dossier.readiness.reasons)}`,\n `- Failed checks: ${formatInlineList(dossier.readiness.failedChecks)}`,\n \"\",\n \"## Evidence\",\n `- Catalog artifact: ${dossier.evidence.catalog.artifactId} (${dossier.evidence.catalog.status})`,\n `- Conformance artifact: ${dossier.evidence.conformance.artifactId} (${dossier.evidence.conformance.status})`,\n `- Receipts: ${formatInlineList(dossier.evidence.receipts.types)}`,\n `- Timeline: ${formatInlineList(dossier.evidence.timelineEventTypes)}`,\n \"\",\n \"## Safety\",\n `- Acceptance payment: ${\n dossier.evidence.safety.acceptance?.paymentStatus ?? \"unknown\"\n }`,\n `- Conformance payment: ${\n dossier.evidence.safety.conformance?.paymentStatus ?? \"unknown\"\n }`,\n `- Acceptance delivery: ${\n dossier.evidence.safety.acceptance?.deliveryStatus ?? \"unknown\"\n }`,\n `- Conformance delivery: ${\n dossier.evidence.safety.conformance?.deliveryStatus ?? \"unknown\"\n }`,\n \"\",\n \"## Hashes\",\n `- Catalog artifact: ${dossier.hashes.catalogArtifact}`,\n `- Conformance artifact: ${dossier.hashes.conformanceArtifact}`,\n `- Readiness: ${dossier.hashes.readiness}`,\n `- Dossier: ${dossier.hashes.dossier}`,\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction validateProviderSummary(\n provider: unknown,\n errors: ProviderOnboardingDossierValidationError[],\n) {\n if (!isRecord(provider)) {\n errors.push({\n path: \"provider\",\n message: \"provider must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(provider.id, \"provider.id\", errors);\n validateNonEmptyString(provider.displayName, \"provider.displayName\", errors);\n validateNonEmptyString(provider.protocolMode, \"provider.protocolMode\", errors);\n\n if (\n !Array.isArray(provider.capabilities) ||\n provider.capabilities.some((capability) => typeof capability !== \"string\")\n ) {\n errors.push({\n path: \"provider.capabilities\",\n message: \"provider.capabilities must be an array of strings.\",\n });\n }\n}\n\nfunction validateReadiness(\n readiness: unknown,\n errors: ProviderOnboardingDossierValidationError[],\n) {\n if (!isRecord(readiness)) {\n errors.push({\n path: \"readiness\",\n message: \"readiness must be an object.\",\n });\n return;\n }\n\n if (typeof readiness.ready !== \"boolean\") {\n errors.push({\n path: \"readiness.ready\",\n message: \"readiness.ready must be a boolean.\",\n });\n }\n\n if (readiness.status !== \"ready\" && readiness.status !== \"failed\") {\n errors.push({\n path: \"readiness.status\",\n message: 'readiness.status must be \"ready\" or \"failed\".',\n });\n }\n\n if (\n !Array.isArray(readiness.reasons) ||\n readiness.reasons.some((reason) => typeof reason !== \"string\")\n ) {\n errors.push({\n path: \"readiness.reasons\",\n message: \"readiness.reasons must be an array of strings.\",\n });\n }\n\n if (\n !Array.isArray(readiness.failedChecks) ||\n readiness.failedChecks.some((check) => typeof check !== \"string\")\n ) {\n errors.push({\n path: \"readiness.failedChecks\",\n message: \"readiness.failedChecks must be an array of strings.\",\n });\n }\n}\n\nfunction validateEvidence(\n evidence: unknown,\n errors: ProviderOnboardingDossierValidationError[],\n) {\n if (!isRecord(evidence)) {\n errors.push({\n path: \"evidence\",\n message: \"evidence must be an object.\",\n });\n return;\n }\n\n if (!isRecord(evidence.catalog)) {\n errors.push({\n path: \"evidence.catalog\",\n message: \"evidence.catalog must be an object.\",\n });\n } else {\n validateNonEmptyString(\n evidence.catalog.artifactId,\n \"evidence.catalog.artifactId\",\n errors,\n );\n\n if (\n evidence.catalog.status !== \"ready\" &&\n evidence.catalog.status !== \"rejected\"\n ) {\n errors.push({\n path: \"evidence.catalog.status\",\n message: 'evidence.catalog.status must be \"ready\" or \"rejected\".',\n });\n }\n\n if (typeof evidence.catalog.accepted !== \"boolean\") {\n errors.push({\n path: \"evidence.catalog.accepted\",\n message: \"evidence.catalog.accepted must be a boolean.\",\n });\n }\n }\n\n if (!isRecord(evidence.conformance)) {\n errors.push({\n path: \"evidence.conformance\",\n message: \"evidence.conformance must be an object.\",\n });\n } else {\n validateNonEmptyString(\n evidence.conformance.artifactId,\n \"evidence.conformance.artifactId\",\n errors,\n );\n\n if (\n evidence.conformance.status !== \"verified\" &&\n evidence.conformance.status !== \"failed\"\n ) {\n errors.push({\n path: \"evidence.conformance.status\",\n message: 'evidence.conformance.status must be \"verified\" or \"failed\".',\n });\n }\n }\n\n if (!isRecord(evidence.receipts)) {\n errors.push({\n path: \"evidence.receipts\",\n message: \"evidence.receipts must be an object.\",\n });\n }\n\n if (\n !Array.isArray(evidence.timelineEventTypes) ||\n evidence.timelineEventTypes.some((type) => typeof type !== \"string\")\n ) {\n errors.push({\n path: \"evidence.timelineEventTypes\",\n message: \"evidence.timelineEventTypes must be an array of strings.\",\n });\n }\n\n if (\n !Array.isArray(evidence.telemetryEventTypes) ||\n evidence.telemetryEventTypes.some((type) => typeof type !== \"string\")\n ) {\n errors.push({\n path: \"evidence.telemetryEventTypes\",\n message: \"evidence.telemetryEventTypes must be an array of strings.\",\n });\n }\n}\n\nfunction validateNestedArtifacts(\n artifacts: unknown,\n errors: ProviderOnboardingDossierValidationError[],\n) {\n if (!isRecord(artifacts)) {\n errors.push({\n path: \"artifacts\",\n message: \"artifacts must be an object.\",\n });\n return;\n }\n\n const catalogValidation = validateProviderCatalogArtifact(artifacts.catalog);\n\n for (const error of catalogValidation.errors) {\n errors.push({\n path: `artifacts.catalog.${error.path}`,\n message: error.message,\n });\n }\n\n const conformanceValidation = validateProviderConformanceArtifact(\n artifacts.conformance,\n );\n\n for (const error of conformanceValidation.errors) {\n errors.push({\n path: `artifacts.conformance.${error.path}`,\n message: error.message,\n });\n }\n\n if (\n isRecord(artifacts.catalog) &&\n isRecord(artifacts.conformance) &&\n isRecord(artifacts.catalog.provider) &&\n isRecord(artifacts.conformance.provider) &&\n artifacts.catalog.provider.id !== artifacts.conformance.provider.id\n ) {\n errors.push({\n path: \"artifacts\",\n message: \"catalog and conformance artifacts must reference the same provider id.\",\n });\n }\n}\n\nfunction validateHashes(\n dossier: Record<string, unknown>,\n errors: ProviderOnboardingDossierValidationError[],\n) {\n if (!isRecord(dossier.hashes)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const field of [\n \"catalogArtifact\",\n \"conformanceArtifact\",\n \"readiness\",\n \"dossier\",\n ]) {\n const value = dossier.hashes[field];\n\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n errors.push({\n path: `hashes.${field}`,\n message: `${field} hash must be a sha256 hex string.`,\n });\n }\n }\n\n if (\n !isRecord(dossier.artifacts) ||\n !isRecord(dossier.readiness) ||\n errors.some((error) => error.path.startsWith(\"hashes.\"))\n ) {\n return;\n }\n\n const expectedHashes: ProviderOnboardingDossierHashes = {\n catalogArtifact: hashStableJson(dossier.artifacts.catalog),\n conformanceArtifact: hashStableJson(dossier.artifacts.conformance),\n readiness: hashStableJson(dossier.readiness),\n dossier: \"\",\n };\n const expectedDossierHash = hashDossierContent({\n ...(dossier as Omit<ProviderOnboardingDossier, \"hashes\">),\n hashes: expectedHashes,\n });\n\n for (const [field, expected] of Object.entries({\n ...expectedHashes,\n dossier: expectedDossierHash,\n })) {\n if (dossier.hashes[field] !== expected) {\n errors.push({\n path: `hashes.${field}`,\n message: `${field} hash does not match dossier content.`,\n });\n }\n }\n}\n\nfunction sanitizeDossierOutput<T>(\n value: T,\n forbiddenOutputValues: string[],\n): T {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(value, forbiddenValues, new WeakSet<object>()),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n seen: WeakSet<object>,\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n replaceForbiddenValues(entry, forbiddenValues, seen),\n );\n\n seen.delete(value);\n return entries;\n }\n\n const entries = Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues, seen),\n ]),\n );\n\n seen.delete(value);\n return entries;\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction hashDossierContent(\n dossier: Omit<ProviderOnboardingDossier, \"hashes\"> & {\n hashes: ProviderOnboardingDossierHashes;\n },\n) {\n return hashStableJson(dossier);\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((entry) => stableStringify(entry)).join(\",\")}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n\n return `{${entries\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableStringify(entry)}`)\n .join(\",\")}}`;\n}\n\nfunction uniqueStrings(values: string[]) {\n return [...new Set(values)].sort((left, right) => left.localeCompare(right));\n}\n\nfunction formatInlineList(values: readonly string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderOnboardingDossierValidationError[],\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: ProviderOnboardingDossierValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction formatValidationErrors(\n errors: { path: string; message: string }[],\n) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","#!/usr/bin/env node\nimport { runProviderOnboardingDossierCli } from \"./providerOnboardingDossierCli\";\n\nvoid main();\n\nasync function main() {\n const result = await runProviderOnboardingDossierCli({\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","validateNonEmptyString","validateIsoTimestamp","formatValidationErrors","isRecord","validateNonEmptyString","validateNonEmptyString","validateIsoTimestamp","formatValidationErrors","isRecord","import_node_crypto","isRecord","validateNonEmptyString","validateIsoTimestamp","validateHashes","formatValidationErrors","entries","isRecord"]}
|
|
@@ -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
|
+
runProviderOnboardingDossierCli
|
|
4
|
+
} from "../chunk-2KWGHJYP.js";
|
|
5
|
+
import "../chunk-TDOBAMYM.js";
|
|
6
|
+
import "../chunk-UU2ZG7P7.js";
|
|
7
|
+
import "../chunk-3H7UGVI6.js";
|
|
8
|
+
import "../chunk-NYTV263W.js";
|
|
9
|
+
import "../chunk-2ASMVLG4.js";
|
|
10
|
+
|
|
11
|
+
// src/cli/provider-dossier.ts
|
|
12
|
+
void main();
|
|
13
|
+
async function main() {
|
|
14
|
+
const result = await runProviderOnboardingDossierCli({
|
|
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=provider-dossier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/provider-dossier.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { runProviderOnboardingDossierCli } from \"./providerOnboardingDossierCli\";\n\nvoid main();\n\nasync function main() {\n const result = await runProviderOnboardingDossierCli({\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,gCAAgC;AAAA,IACnD,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":[]}
|