@probemesh/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +160 -0
  3. package/dist/chunk-257Y7LN2.js +827 -0
  4. package/dist/chunk-257Y7LN2.js.map +1 -0
  5. package/dist/chunk-2ASMVLG4.js +56 -0
  6. package/dist/chunk-2ASMVLG4.js.map +1 -0
  7. package/dist/chunk-2KWGHJYP.js +285 -0
  8. package/dist/chunk-2KWGHJYP.js.map +1 -0
  9. package/dist/chunk-3H7UGVI6.js +1117 -0
  10. package/dist/chunk-3H7UGVI6.js.map +1 -0
  11. package/dist/chunk-5Q3PDYIA.js +657 -0
  12. package/dist/chunk-5Q3PDYIA.js.map +1 -0
  13. package/dist/chunk-CXZOO3U4.js +550 -0
  14. package/dist/chunk-CXZOO3U4.js.map +1 -0
  15. package/dist/chunk-FRFBK4SY.js +270 -0
  16. package/dist/chunk-FRFBK4SY.js.map +1 -0
  17. package/dist/chunk-HJK52QJF.js +994 -0
  18. package/dist/chunk-HJK52QJF.js.map +1 -0
  19. package/dist/chunk-HNBDX7IU.js +705 -0
  20. package/dist/chunk-HNBDX7IU.js.map +1 -0
  21. package/dist/chunk-NYTV263W.js +116 -0
  22. package/dist/chunk-NYTV263W.js.map +1 -0
  23. package/dist/chunk-PXG54XOG.js +595 -0
  24. package/dist/chunk-PXG54XOG.js.map +1 -0
  25. package/dist/chunk-TDOBAMYM.js +607 -0
  26. package/dist/chunk-TDOBAMYM.js.map +1 -0
  27. package/dist/chunk-TV42EZSI.js +2157 -0
  28. package/dist/chunk-TV42EZSI.js.map +1 -0
  29. package/dist/chunk-UU2ZG7P7.js +408 -0
  30. package/dist/chunk-UU2ZG7P7.js.map +1 -0
  31. package/dist/chunk-WKN7QOCA.js +977 -0
  32. package/dist/chunk-WKN7QOCA.js.map +1 -0
  33. package/dist/chunk-ZJOLPBJJ.js +1091 -0
  34. package/dist/chunk-ZJOLPBJJ.js.map +1 -0
  35. package/dist/cli/audit-trail-export.cjs +1193 -0
  36. package/dist/cli/audit-trail-export.cjs.map +1 -0
  37. package/dist/cli/audit-trail-export.d.cts +1 -0
  38. package/dist/cli/audit-trail-export.d.ts +1 -0
  39. package/dist/cli/audit-trail-export.js +24 -0
  40. package/dist/cli/audit-trail-export.js.map +1 -0
  41. package/dist/cli/catalog-check.cjs +2687 -0
  42. package/dist/cli/catalog-check.cjs.map +1 -0
  43. package/dist/cli/catalog-check.d.cts +1 -0
  44. package/dist/cli/catalog-check.d.ts +1 -0
  45. package/dist/cli/catalog-check.js +26 -0
  46. package/dist/cli/catalog-check.js.map +1 -0
  47. package/dist/cli/probemesh-init.cjs +1049 -0
  48. package/dist/cli/probemesh-init.cjs.map +1 -0
  49. package/dist/cli/probemesh-init.d.cts +1 -0
  50. package/dist/cli/probemesh-init.d.ts +1 -0
  51. package/dist/cli/probemesh-init.js +22 -0
  52. package/dist/cli/probemesh-init.js.map +1 -0
  53. package/dist/cli/provider-conformance.cjs +6180 -0
  54. package/dist/cli/provider-conformance.cjs.map +1 -0
  55. package/dist/cli/provider-conformance.d.cts +1 -0
  56. package/dist/cli/provider-conformance.d.ts +1 -0
  57. package/dist/cli/provider-conformance.js +29 -0
  58. package/dist/cli/provider-conformance.js.map +1 -0
  59. package/dist/cli/provider-dossier-check.cjs +2978 -0
  60. package/dist/cli/provider-dossier-check.cjs.map +1 -0
  61. package/dist/cli/provider-dossier-check.d.cts +1 -0
  62. package/dist/cli/provider-dossier-check.d.ts +1 -0
  63. package/dist/cli/provider-dossier-check.js +27 -0
  64. package/dist/cli/provider-dossier-check.js.map +1 -0
  65. package/dist/cli/provider-dossier.cjs +1753 -0
  66. package/dist/cli/provider-dossier.cjs.map +1 -0
  67. package/dist/cli/provider-dossier.d.cts +1 -0
  68. package/dist/cli/provider-dossier.d.ts +1 -0
  69. package/dist/cli/provider-dossier.js +26 -0
  70. package/dist/cli/provider-dossier.js.map +1 -0
  71. package/dist/cli/x402-accept.cjs +6009 -0
  72. package/dist/cli/x402-accept.cjs.map +1 -0
  73. package/dist/cli/x402-accept.d.cts +1 -0
  74. package/dist/cli/x402-accept.d.ts +1 -0
  75. package/dist/cli/x402-accept.js +28 -0
  76. package/dist/cli/x402-accept.js.map +1 -0
  77. package/dist/index.cjs +13671 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.cts +2026 -0
  80. package/dist/index.d.ts +2026 -0
  81. package/dist/index.js +2560 -0
  82. package/dist/index.js.map +1 -0
  83. package/package.json +111 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providerCatalog.ts","../src/providerCatalogPolicy.ts"],"sourcesContent":["import { ProbeMeshError } from \"./errors\";\nimport {\n mergePaymentPreferences,\n resolveProviderPaymentOption,\n validatePaymentPreferences,\n validatePaymentStrategy,\n validateProviderPaymentOptions,\n} from \"./paymentOptions\";\nimport {\n assertProviderCatalogArtifact,\n validateProviderCatalogArtifact,\n} from \"./providerCatalogArtifact\";\nimport type {\n ProviderCatalogArtifact,\n ProviderCatalogArtifactStatus,\n} from \"./providerCatalogArtifact\";\nimport type {\n ProviderLimits,\n ProviderManifest,\n ProviderProtocolMode,\n ProviderReceiptSupport,\n} from \"./providerKit/types\";\nimport type {\n Cost,\n ProbeMeshCallSafety,\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentSelection,\n ProbeMeshPaymentStrategy,\n ProbeMeshRetrySafety,\n ProbeMeshTimelineEventType,\n ProbeMeshPricing,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\nimport type { X402ProviderAcceptanceGate } from \"./protocols/x402Acceptance\";\n\nexport const PROVIDER_CATALOG_SCHEMA_VERSION =\n \"probemesh.provider-catalog.index.v1\" as const;\n\nexport interface ProviderCatalogOptions {\n artifacts: ProviderCatalogArtifact[];\n generatedAt?: string;\n}\n\nexport interface ProviderCatalog {\n schemaVersion: typeof PROVIDER_CATALOG_SCHEMA_VERSION;\n generatedAt: string;\n entries: ProviderCatalogEntry[];\n}\n\nexport interface ProviderCatalogEntry {\n artifactId: string;\n generatedAt: string;\n status: ProviderCatalogArtifactStatus;\n provider: {\n id: string;\n displayName: string;\n capabilities: string[];\n protocolMode: ProviderProtocolMode;\n paymentOptions?: ProviderPaymentOption[];\n pricing: ProviderManifest[\"pricing\"];\n receipts: ProviderReceiptSupport;\n limits?: ProviderLimits;\n };\n acceptance: {\n gate: X402ProviderAcceptanceGate;\n failedChecks: string[];\n receipts: ProviderCatalogArtifact[\"acceptance\"][\"receipts\"];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProviderCatalogArtifact[\"acceptance\"][\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n errorCode?: string;\n };\n}\n\nexport interface ProviderCatalogQuery {\n capability: string;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n status?: ProviderCatalogArtifactStatus;\n}\n\nexport interface ProviderCatalogMatch {\n entry: ProviderCatalogEntry;\n providerId: string;\n capability: string;\n status: ProviderCatalogArtifactStatus;\n cost?: Cost;\n paymentSelection?: ProbeMeshPaymentSelection;\n reasons: string[];\n}\n\nexport interface ProviderCatalogSummary {\n schemaVersion: typeof PROVIDER_CATALOG_SCHEMA_VERSION;\n generatedAt: string;\n totalEntries: number;\n readyEntries: number;\n rejectedEntries: number;\n providers: string[];\n capabilities: string[];\n protocolModes: string[];\n}\n\nexport interface ProviderCatalogValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderCatalogValidationResult {\n valid: boolean;\n errors: ProviderCatalogValidationError[];\n}\n\nexport function validateProviderCatalog(\n catalog: unknown,\n): ProviderCatalogValidationResult {\n const errors: ProviderCatalogValidationError[] = [];\n\n if (!isRecord(catalog)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider catalog must be an object.\",\n },\n ],\n };\n }\n\n if (catalog.schemaVersion !== PROVIDER_CATALOG_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CATALOG_SCHEMA_VERSION}\".`,\n });\n }\n\n validateIsoTimestamp(catalog.generatedAt, \"generatedAt\", errors);\n\n if (!Array.isArray(catalog.entries)) {\n errors.push({\n path: \"entries\",\n message: \"entries must be an array.\",\n });\n } else {\n catalog.entries.forEach((entry, index) =>\n validateProviderCatalogEntry(entry, `entries.${index}`, errors),\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderCatalog(\n catalog: unknown,\n): asserts catalog is ProviderCatalog {\n const result = validateProviderCatalog(catalog);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog: ${formatValidationErrors(result.errors)}`,\n });\n}\n\nexport function parseProviderCatalogArtifactJson(\n json: string,\n): ProviderCatalogArtifact {\n if (typeof json !== \"string\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog artifact JSON must be a string.\",\n });\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(json);\n } catch (cause) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog artifact JSON must be valid JSON.\",\n cause,\n });\n }\n\n assertProviderCatalogArtifact(parsed);\n\n return parsed;\n}\n\nexport function createProviderCatalog(\n options: ProviderCatalogOptions,\n): ProviderCatalog {\n assertProviderCatalogOptions(options);\n\n const entries = options.artifacts.map((artifact, index) => {\n const validation = validateProviderCatalogArtifact(artifact);\n\n if (!validation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog artifact at index ${index}: ${formatValidationErrors(\n validation.errors,\n )}`,\n });\n }\n\n return createCatalogEntryFromArtifact(artifact);\n });\n\n const catalog: ProviderCatalog = {\n schemaVersion: PROVIDER_CATALOG_SCHEMA_VERSION,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n entries,\n };\n\n assertProviderCatalog(catalog);\n\n return catalog;\n}\n\nexport function findProviderCatalogMatches(\n catalog: ProviderCatalog,\n query: ProviderCatalogQuery,\n): ProviderCatalogMatch[] {\n assertProviderCatalog(catalog);\n assertProviderCatalogQuery(query);\n\n const requiredStatus = query.status ?? \"ready\";\n const requiredReceiptTypes = query.requiredReceiptTypes ?? [];\n const providerIds = query.providerIds;\n const blockedProviderIds = new Set(query.blockedProviderIds ?? []);\n\n return catalog.entries.flatMap((entry) => {\n const providerId = entry.provider.id;\n\n if (entry.status !== requiredStatus) {\n return [];\n }\n\n if (!entry.provider.capabilities.includes(query.capability)) {\n return [];\n }\n\n if (query.protocolMode !== undefined && entry.provider.protocolMode !== query.protocolMode) {\n return [];\n }\n\n if (providerIds !== undefined && !providerIds.includes(providerId)) {\n return [];\n }\n\n if (blockedProviderIds.has(providerId)) {\n return [];\n }\n\n const paymentPreferences = mergePaymentPreferences(\n query.protocolMode\n ? {\n allowedProtocols: [query.protocolMode],\n }\n : undefined,\n query.paymentPreferences,\n );\n const paymentResolution = resolveProviderPaymentOption({\n providerId,\n providerMode: entry.provider.protocolMode,\n capabilities: entry.provider.capabilities,\n capability: query.capability,\n pricing: entry.provider.pricing,\n paymentOptions: entry.provider.paymentOptions,\n paymentPreferences,\n paymentStrategy: query.paymentStrategy,\n defaultReceiptTypes: entry.acceptance.receipts.types,\n });\n const cost =\n paymentSelectionCost(paymentResolution.selection) ??\n resolveCatalogCost(entry, query.capability);\n\n if (\n query.maxCostUsd !== undefined &&\n (cost === undefined || cost.amountUsd > query.maxCostUsd)\n ) {\n return [];\n }\n\n if (!hasRequiredReceiptTypes(entry, requiredReceiptTypes)) {\n return [];\n }\n\n if (!paymentResolution.selection) {\n return [];\n }\n\n return [\n {\n entry,\n providerId,\n capability: query.capability,\n status: entry.status,\n cost,\n paymentSelection: paymentResolution.selection,\n reasons: createMatchReasons(\n entry,\n query,\n cost,\n paymentResolution.selection,\n ),\n },\n ];\n });\n}\n\nexport function summarizeProviderCatalog(\n catalog: ProviderCatalog,\n): ProviderCatalogSummary {\n assertProviderCatalog(catalog);\n\n const providers = new Set<string>();\n const capabilities = new Set<string>();\n const protocolModes = new Set<string>();\n let readyEntries = 0;\n let rejectedEntries = 0;\n\n for (const entry of catalog.entries) {\n providers.add(entry.provider.id);\n protocolModes.add(entry.provider.protocolMode);\n\n for (const capability of entry.provider.capabilities) {\n capabilities.add(capability);\n }\n\n if (entry.status === \"ready\") {\n readyEntries += 1;\n } else {\n rejectedEntries += 1;\n }\n }\n\n return {\n schemaVersion: catalog.schemaVersion,\n generatedAt: catalog.generatedAt,\n totalEntries: catalog.entries.length,\n readyEntries,\n rejectedEntries,\n providers: [...providers],\n capabilities: [...capabilities],\n protocolModes: [...protocolModes],\n };\n}\n\nfunction assertProviderCatalogOptions(\n options: ProviderCatalogOptions,\n): asserts options is ProviderCatalogOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.artifacts)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog options require an artifacts array.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog generatedAt must be an ISO timestamp.\",\n });\n }\n}\n\nfunction assertProviderCatalogQuery(\n query: ProviderCatalogQuery,\n): asserts query is ProviderCatalogQuery {\n if (!isRecord(query)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query must be an object.\",\n });\n }\n\n if (typeof query.capability !== \"string\" || query.capability.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query capability must be a non-empty string.\",\n });\n }\n\n if (\n query.protocolMode !== undefined &&\n (typeof query.protocolMode !== \"string\" || query.protocolMode.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query protocolMode must be a non-empty string.\",\n });\n }\n\n validatePaymentPreferences(query.paymentPreferences, query.capability);\n validatePaymentStrategy(query.paymentStrategy, query.capability);\n\n if (\n query.maxCostUsd !== undefined &&\n (typeof query.maxCostUsd !== \"number\" ||\n !Number.isFinite(query.maxCostUsd) ||\n query.maxCostUsd < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query maxCostUsd must be a non-negative finite number.\",\n });\n }\n\n if (query.status !== undefined && query.status !== \"ready\" && query.status !== \"rejected\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: 'Provider catalog query status must be \"ready\" or \"rejected\".',\n });\n }\n\n validateQueryStringArray(query.providerIds, \"providerIds\");\n validateQueryStringArray(query.blockedProviderIds, \"blockedProviderIds\");\n\n if (\n query.requiredReceiptTypes !== undefined &&\n (!Array.isArray(query.requiredReceiptTypes) ||\n query.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog query requiredReceiptTypes must contain known receipt types.\",\n });\n }\n}\n\nfunction createCatalogEntryFromArtifact(\n artifact: ProviderCatalogArtifact,\n): ProviderCatalogEntry {\n return {\n artifactId: artifact.artifactId,\n generatedAt: artifact.generatedAt,\n status: artifact.status,\n provider: {\n id: artifact.provider.id,\n displayName: artifact.provider.displayName,\n capabilities: [...artifact.provider.capabilities],\n protocolMode: artifact.provider.protocolMode,\n paymentOptions: cloneSerializable(artifact.provider.paymentOptions),\n pricing: cloneSerializable(artifact.provider.pricing),\n receipts: cloneSerializable(artifact.provider.receipts),\n limits: cloneSerializable(artifact.provider.limits),\n },\n acceptance: {\n gate: cloneSerializable(artifact.acceptance.gate),\n failedChecks: [...artifact.acceptance.failedChecks],\n receipts: cloneSerializable(artifact.acceptance.receipts),\n safety: cloneSerializable(artifact.acceptance.safety),\n retrySafety: cloneSerializable(artifact.acceptance.retrySafety),\n route: cloneSerializable(artifact.acceptance.route),\n timelineEventTypes: [...artifact.acceptance.timelineEventTypes],\n telemetryEventTypes: [...artifact.acceptance.telemetryEventTypes],\n errorCode: artifact.acceptance.errorCode,\n },\n };\n}\n\nfunction resolveCatalogCost(\n entry: ProviderCatalogEntry,\n capability: string,\n): Cost | undefined {\n const pricing = entry.provider.pricing;\n\n if (isProbeMeshPricing(pricing)) {\n return pricingToCost(pricing);\n }\n\n const capabilityPricing = pricing[capability];\n\n if (!isProbeMeshPricing(capabilityPricing)) {\n return undefined;\n }\n\n return pricingToCost(capabilityPricing);\n}\n\nfunction pricingToCost(pricing: ProbeMeshPricing): Cost {\n return {\n amountUsd: pricing.amountUsd,\n currency: pricing.currency,\n unit: pricing.unit,\n };\n}\n\nfunction hasRequiredReceiptTypes(\n entry: ProviderCatalogEntry,\n requiredReceiptTypes: ReceiptType[],\n) {\n const receiptTypes = new Set(entry.acceptance.receipts.types);\n\n return requiredReceiptTypes.every((receiptType) =>\n receiptTypes.has(receiptType),\n );\n}\n\nfunction createMatchReasons(\n entry: ProviderCatalogEntry,\n query: ProviderCatalogQuery,\n cost: Cost | undefined,\n paymentSelection: ProbeMeshPaymentSelection | undefined,\n) {\n const reasons = [\n `status:${entry.status}`,\n `capability:${query.capability}`,\n `protocol:${entry.provider.protocolMode}`,\n ];\n\n if (query.paymentPreferences !== undefined) {\n reasons.push(\"payment_preferences:matched\");\n }\n\n if (query.paymentStrategy !== undefined) {\n reasons.push(`payment_strategy:${query.paymentStrategy.mode}`);\n }\n\n if (paymentSelection?.score !== undefined) {\n reasons.push(`payment_score:${paymentSelection.score}`);\n }\n\n for (const scoreReason of paymentSelection?.scoreReasons ?? []) {\n reasons.push(`payment_score_reason:${scoreReason}`);\n }\n\n if (query.providerIds !== undefined) {\n reasons.push(\"provider:allowed\");\n }\n\n if (query.maxCostUsd !== undefined && cost !== undefined) {\n reasons.push(`cost:${cost.amountUsd}<=${query.maxCostUsd}`);\n }\n\n if ((query.requiredReceiptTypes ?? []).length > 0) {\n reasons.push(`receipts:${query.requiredReceiptTypes?.join(\",\")}`);\n }\n\n return reasons;\n}\n\nfunction paymentSelectionCost(\n selection: ProbeMeshPaymentSelection | undefined,\n): Cost | undefined {\n return selection?.cost;\n}\n\nfunction validateQueryStringArray(value: unknown, name: string) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Provider catalog query ${name} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isProbeMeshPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n typeof value.amountUsd === \"number\" &&\n Number.isFinite(value.amountUsd) &&\n value.amountUsd >= 0 &&\n (value.currency === undefined || typeof value.currency === \"string\")\n );\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction validateProviderCatalogEntry(\n entry: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(entry)) {\n errors.push({\n path,\n message: \"catalog entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(entry.artifactId, `${path}.artifactId`, errors);\n validateIsoTimestamp(entry.generatedAt, `${path}.generatedAt`, errors);\n\n if (entry.status !== \"ready\" && entry.status !== \"rejected\") {\n errors.push({\n path: `${path}.status`,\n message: 'status must be \"ready\" or \"rejected\".',\n });\n }\n\n validateEntryProvider(entry.provider, `${path}.provider`, errors);\n validateEntryAcceptance(entry.acceptance, `${path}.acceptance`, errors);\n}\n\nfunction validateEntryProvider(\n provider: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(provider)) {\n errors.push({\n path,\n message: \"provider must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(provider.id, `${path}.id`, errors);\n validateNonEmptyString(provider.displayName, `${path}.displayName`, errors);\n validateStringArray(provider.capabilities, `${path}.capabilities`, errors);\n validateNonEmptyString(provider.protocolMode, `${path}.protocolMode`, errors);\n validateProviderPaymentOptions(\n provider.paymentOptions,\n `${path}.paymentOptions`,\n Array.isArray(provider.capabilities) ? provider.capabilities : [],\n errors,\n );\n validatePricingDeclaration(provider.pricing, `${path}.pricing`, errors);\n validateReceiptSupport(provider.receipts, `${path}.receipts`, errors);\n\n if (provider.limits !== undefined && !isRecord(provider.limits)) {\n errors.push({\n path: `${path}.limits`,\n message: \"limits must be an object when provided.\",\n });\n }\n}\n\nfunction validateEntryAcceptance(\n acceptance: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(acceptance)) {\n errors.push({\n path,\n message: \"acceptance must be an object.\",\n });\n return;\n }\n\n if (!isRecord(acceptance.gate)) {\n errors.push({\n path: `${path}.gate`,\n message: \"gate must be an object.\",\n });\n } else {\n if (typeof acceptance.gate.accepted !== \"boolean\") {\n errors.push({\n path: `${path}.gate.accepted`,\n message: \"gate.accepted must be a boolean.\",\n });\n }\n\n if (\n acceptance.gate.status !== \"accepted\" &&\n acceptance.gate.status !== \"rejected\"\n ) {\n errors.push({\n path: `${path}.gate.status`,\n message: 'gate.status must be \"accepted\" or \"rejected\".',\n });\n }\n }\n\n validateStringArray(acceptance.failedChecks, `${path}.failedChecks`, errors);\n validateReceiptSummary(acceptance.receipts, `${path}.receipts`, errors);\n validateStringArray(\n acceptance.timelineEventTypes,\n `${path}.timelineEventTypes`,\n errors,\n );\n validateStringArray(\n acceptance.telemetryEventTypes,\n `${path}.telemetryEventTypes`,\n errors,\n );\n}\n\nfunction validatePricingDeclaration(\n pricing: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing must be an object.\",\n });\n return;\n }\n\n if (isPricingObject(pricing)) {\n validatePricingObject(pricing, path, errors);\n return;\n }\n\n for (const [capability, capabilityPricing] of Object.entries(pricing)) {\n validateNonEmptyString(capability, `${path}.${capability}`, errors);\n validatePricingObject(capabilityPricing, `${path}.${capability}`, errors);\n }\n}\n\nfunction validatePricingObject(\n pricing: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(pricing)) {\n errors.push({\n path,\n message: \"pricing entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(pricing.unit, `${path}.unit`, errors);\n\n if (\n typeof pricing.amountUsd !== \"number\" ||\n !Number.isFinite(pricing.amountUsd) ||\n pricing.amountUsd < 0\n ) {\n errors.push({\n path: `${path}.amountUsd`,\n message: \"amountUsd must be a non-negative finite number.\",\n });\n }\n\n if (pricing.currency !== undefined && typeof pricing.currency !== \"string\") {\n errors.push({\n path: `${path}.currency`,\n message: \"currency must be a string when provided.\",\n });\n }\n}\n\nfunction validateReceiptSupport(\n receipts: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path,\n message: \"receipts must be an object.\",\n });\n return;\n }\n\n for (const key of [\"payment\", \"delivery\", \"responseEvidence\"]) {\n if (typeof receipts[key] !== \"boolean\") {\n errors.push({\n path: `${path}.${key}`,\n message: `${key} must be a boolean.`,\n });\n }\n }\n}\n\nfunction validateReceiptSummary(\n receipts: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (!isRecord(receipts)) {\n errors.push({\n path,\n message: \"receipts must be an object.\",\n });\n return;\n }\n\n if (typeof receipts.total !== \"number\" || !Number.isFinite(receipts.total)) {\n errors.push({\n path: `${path}.total`,\n message: \"total must be a finite number.\",\n });\n }\n\n validateStringArray(receipts.types, `${path}.types`, errors);\n validateStringArray(receipts.providers, `${path}.providers`, errors);\n\n for (const key of [\n \"hasPaymentProof\",\n \"hasSettlementConfirmation\",\n \"hasProviderDelivery\",\n ]) {\n if (typeof receipts[key] !== \"boolean\") {\n errors.push({\n path: `${path}.${key}`,\n message: `${key} must be a boolean.`,\n });\n }\n }\n}\n\nfunction isPricingObject(value: Record<string, unknown>) {\n return \"unit\" in value || \"amountUsd\" in value || \"currency\" in value;\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProviderCatalogValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp string.`,\n });\n }\n}\n\nfunction formatValidationErrors(errors: ProviderCatalogValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n","import { ProbeMeshError } from \"./errors\";\nimport {\n mergePaymentPreferences,\n validatePaymentPreferences,\n validatePaymentStrategy,\n} from \"./paymentOptions\";\nimport {\n assertProviderCatalog,\n findProviderCatalogMatches,\n summarizeProviderCatalog,\n} from \"./providerCatalog\";\nimport type {\n ProviderCatalog,\n ProviderCatalogEntry,\n ProviderCatalogMatch,\n ProviderCatalogQuery,\n ProviderCatalogSummary,\n} from \"./providerCatalog\";\nimport type { ProviderCatalogArtifactStatus } from \"./providerCatalogArtifact\";\nimport type { ProviderProtocolMode } from \"./providerKit/types\";\nimport type {\n ProbeMeshPaymentPreferences,\n ProbeMeshPaymentStrategy,\n ProbeMeshPricing,\n ProviderPaymentOption,\n ReceiptType,\n} from \"./types\";\n\nexport type ProviderCatalogPolicyEvaluationStatus = \"passed\" | \"failed\";\n\nexport type ProviderCatalogPolicyCheckStatus = \"passed\" | \"failed\";\n\nexport type ProviderCatalogPolicyReportFormat = \"json\" | \"markdown\";\n\nexport interface ProviderCatalogPolicyAdapterInventoryEntry {\n id: string;\n capabilities: string[];\n pricing?: ProbeMeshPricing | Record<string, ProbeMeshPricing>;\n paymentOptions?: ProviderPaymentOption[];\n}\n\nexport type ProviderCatalogPolicyAdapterInventory =\n ProviderCatalogPolicyAdapterInventoryEntry[];\n\nexport interface ProviderCatalogPolicyOptions {\n enabled?: boolean;\n status?: ProviderCatalogArtifactStatus;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n}\n\nexport interface ProviderCatalogPolicyExpectedQuery\n extends ProviderCatalogPolicyOptions {\n capability: string;\n minMatches?: number;\n}\n\nexport interface ProviderCatalogPolicyEvaluationOptions {\n catalog: ProviderCatalog;\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n}\n\nexport interface ProviderCatalogPolicyCheck {\n name: string;\n status: ProviderCatalogPolicyCheckStatus;\n message: string;\n capability?: string;\n providerId?: string;\n}\n\nexport interface ProviderCatalogPolicySkippedProvider {\n providerId: string;\n capability: string;\n reasons: string[];\n catalogArtifactId?: string;\n catalogStatus?: ProviderCatalogArtifactStatus;\n inventoryOnly?: boolean;\n}\n\nexport interface ProviderCatalogPolicyMissingAdapterMatch {\n providerId: string;\n capability: string;\n catalogArtifactId: string;\n catalogStatus: ProviderCatalogArtifactStatus;\n reasons: string[];\n}\n\nexport interface ProviderCatalogPolicyQueryResult {\n query: ProviderCatalogPolicyExpectedQuery;\n matches: ProviderCatalogMatch[];\n routeableMatches: ProviderCatalogMatch[];\n missingAdapterMatches: ProviderCatalogPolicyMissingAdapterMatch[];\n skippedProviders: ProviderCatalogPolicySkippedProvider[];\n}\n\nexport interface ProviderCatalogPolicyEvaluationResult {\n status: ProviderCatalogPolicyEvaluationStatus;\n checks: ProviderCatalogPolicyCheck[];\n summary: ProviderCatalogSummary & {\n totalQueries: number;\n passedChecks: number;\n failedChecks: number;\n routeableMatches: number;\n missingAdapterMatches: number;\n };\n queryResults: ProviderCatalogPolicyQueryResult[];\n}\n\nexport interface ProviderCatalogPolicyReportOptions {\n title?: string;\n generatedAt?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderCatalogPolicyReport {\n title: string;\n generatedAt: string;\n status: ProviderCatalogPolicyEvaluationStatus;\n summary: ProviderCatalogPolicyEvaluationResult[\"summary\"];\n checks: ProviderCatalogPolicyCheck[];\n queryResults: ProviderCatalogPolicyQueryResult[];\n}\n\nexport function evaluateProviderCatalogPolicy(\n options: ProviderCatalogPolicyEvaluationOptions,\n): ProviderCatalogPolicyEvaluationResult {\n assertEvaluationOptions(options);\n\n const catalogPolicy = resolveCatalogPolicy(options.catalogPolicy);\n const adapterInventory = options.adapterInventory;\n const adapterIds = new Set(adapterInventory.map((adapter) => adapter.id));\n const catalogSummary = summarizeProviderCatalog(options.catalog);\n const checks: ProviderCatalogPolicyCheck[] = [\n {\n name: \"catalog_valid\",\n status: \"passed\",\n message: \"Provider catalog is valid.\",\n },\n {\n name: \"adapter_inventory_valid\",\n status: \"passed\",\n message: \"Adapter inventory is valid.\",\n },\n ];\n const queryResults = options.queries.map((query) =>\n evaluateQuery({\n catalog: options.catalog,\n catalogPolicy,\n query,\n adapterInventory,\n adapterIds,\n checks,\n }),\n );\n\n const failedChecks = checks.filter((check) => check.status === \"failed\").length;\n const routeableMatches = queryResults.reduce(\n (total, result) => total + result.routeableMatches.length,\n 0,\n );\n const missingAdapterMatches = queryResults.reduce(\n (total, result) => total + result.missingAdapterMatches.length,\n 0,\n );\n\n return {\n status: failedChecks === 0 ? \"passed\" : \"failed\",\n checks,\n summary: {\n ...catalogSummary,\n totalQueries: options.queries.length,\n passedChecks: checks.length - failedChecks,\n failedChecks,\n routeableMatches,\n missingAdapterMatches,\n },\n queryResults,\n };\n}\n\nexport function createProviderCatalogPolicyReport(\n result: ProviderCatalogPolicyEvaluationResult,\n options: ProviderCatalogPolicyReportOptions = {},\n): ProviderCatalogPolicyReport {\n const report: ProviderCatalogPolicyReport = {\n title: options.title ?? \"ProbeMesh Catalog Policy Report\",\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: result.status,\n summary: cloneSerializable(result.summary),\n checks: cloneSerializable(result.checks),\n queryResults: cloneSerializable(result.queryResults),\n };\n\n return sanitizeReport(report, options.forbiddenOutputValues ?? []);\n}\n\nexport function formatProviderCatalogPolicyReport(\n report: ProviderCatalogPolicyReport,\n options: {\n format?: ProviderCatalogPolicyReportFormat;\n } = {},\n) {\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatMarkdownReport(report);\n }\n\n return JSON.stringify(report, null, 2);\n}\n\nfunction assertEvaluationOptions(\n options: ProviderCatalogPolicyEvaluationOptions,\n): asserts options is ProviderCatalogPolicyEvaluationOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy evaluation options must be an object.\",\n });\n }\n\n assertProviderCatalog(options.catalog);\n assertAdapterInventory(options.adapterInventory);\n\n if (!Array.isArray(options.queries) || options.queries.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy evaluation requires at least one query.\",\n });\n }\n\n options.queries.forEach((query, index) =>\n assertExpectedQuery(query, `queries.${index}`),\n );\n assertCatalogPolicyOptions(options.catalogPolicy, \"catalogPolicy\");\n}\n\nfunction assertAdapterInventory(\n adapterInventory: unknown,\n): asserts adapterInventory is ProviderCatalogPolicyAdapterInventory {\n if (!Array.isArray(adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy adapterInventory must be an array.\",\n });\n }\n\n const seen = new Set<string>();\n\n adapterInventory.forEach((adapter, index) => {\n const path = `adapterInventory.${index}`;\n\n if (!isRecord(adapter)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an object.`,\n });\n }\n\n if (typeof adapter.id !== \"string\" || adapter.id.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.id must be a non-empty string.`,\n });\n }\n\n if (seen.has(adapter.id)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.id duplicates adapter \"${adapter.id}\".`,\n });\n }\n\n seen.add(adapter.id);\n\n if (\n !Array.isArray(adapter.capabilities) ||\n adapter.capabilities.some(\n (capability) => typeof capability !== \"string\" || capability.length === 0,\n )\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.capabilities must be an array of non-empty strings.`,\n });\n }\n\n if (\n adapter.paymentOptions !== undefined &&\n (!Array.isArray(adapter.paymentOptions) ||\n adapter.paymentOptions.some(\n (option) =>\n !isRecord(option) ||\n typeof option.id !== \"string\" ||\n option.id.length === 0 ||\n typeof option.protocolMode !== \"string\" ||\n option.protocolMode.length === 0,\n ))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.paymentOptions must be an array of payment option objects when provided.`,\n });\n }\n });\n}\n\nfunction assertExpectedQuery(\n query: unknown,\n path: string,\n): asserts query is ProviderCatalogPolicyExpectedQuery {\n if (!isRecord(query)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an object.`,\n });\n }\n\n if (typeof query.capability !== \"string\" || query.capability.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.capability must be a non-empty string.`,\n });\n }\n\n const minMatches = query.minMatches;\n\n if (\n minMatches !== undefined &&\n (typeof minMatches !== \"number\" ||\n !Number.isInteger(minMatches) ||\n minMatches < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.minMatches must be a non-negative integer.`,\n });\n }\n\n assertCatalogPolicyOptions(query, path);\n}\n\nfunction assertCatalogPolicyOptions(\n policy: unknown,\n path: string,\n): asserts policy is ProviderCatalogPolicyOptions | undefined {\n if (policy === undefined) {\n return;\n }\n\n if (!isRecord(policy)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an object when provided.`,\n });\n }\n\n if (\n policy.status !== undefined &&\n policy.status !== \"ready\" &&\n policy.status !== \"rejected\"\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.status must be \"ready\" or \"rejected\".`,\n });\n }\n\n if (\n policy.protocolMode !== undefined &&\n (typeof policy.protocolMode !== \"string\" || policy.protocolMode.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.protocolMode must be a non-empty string.`,\n });\n }\n\n validatePaymentPreferences(policy.paymentPreferences, `${path}.paymentPreferences`);\n validatePaymentStrategy(policy.paymentStrategy, `${path}.paymentStrategy`);\n\n if (\n policy.maxCostUsd !== undefined &&\n (typeof policy.maxCostUsd !== \"number\" ||\n !Number.isFinite(policy.maxCostUsd) ||\n policy.maxCostUsd < 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.maxCostUsd must be a non-negative finite number.`,\n });\n }\n\n validateStringArray(policy.providerIds, `${path}.providerIds`);\n validateStringArray(policy.blockedProviderIds, `${path}.blockedProviderIds`);\n\n if (\n policy.requiredReceiptTypes !== undefined &&\n (!Array.isArray(policy.requiredReceiptTypes) ||\n policy.requiredReceiptTypes.some((receiptType) => !isReceiptType(receiptType)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path}.requiredReceiptTypes must contain known receipt types.`,\n });\n }\n}\n\nfunction evaluateQuery(options: {\n catalog: ProviderCatalog;\n catalogPolicy: ResolvedPolicy;\n query: ProviderCatalogPolicyExpectedQuery;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n adapterIds: Set<string>;\n checks: ProviderCatalogPolicyCheck[];\n}): ProviderCatalogPolicyQueryResult {\n const resolvedQuery = resolveQuery(options.catalogPolicy, options.query);\n const matches = findProviderCatalogMatches(options.catalog, resolvedQuery);\n const routeableMatches = matches.filter((match) =>\n hasRouteableAdapter(match, options.adapterInventory),\n );\n const missingAdapterMatches = matches\n .filter((match) => !options.adapterIds.has(match.providerId))\n .map((match) => ({\n providerId: match.providerId,\n capability: match.capability,\n catalogArtifactId: match.entry.artifactId,\n catalogStatus: match.entry.status,\n reasons: [\n ...match.reasons,\n `missing_adapter:${match.providerId}`,\n ],\n }));\n const skippedProviders = createSkippedProviders(\n options.catalog.entries,\n options.query.capability,\n matches,\n resolvedQuery,\n options.adapterInventory,\n );\n const minMatches = options.query.minMatches ?? 1;\n\n pushCheck(options.checks, {\n name: \"ready_matches\",\n status: matches.length >= minMatches ? \"passed\" : \"failed\",\n capability: options.query.capability,\n message:\n matches.length >= minMatches\n ? `Found ${matches.length} catalog match(es) for \"${options.query.capability}\".`\n : `Expected at least ${minMatches} catalog match(es) for \"${options.query.capability}\", found ${matches.length}.`,\n });\n pushCheck(options.checks, {\n name: \"routeable_matches\",\n status: routeableMatches.length >= minMatches ? \"passed\" : \"failed\",\n capability: options.query.capability,\n message:\n routeableMatches.length >= minMatches\n ? `Found ${routeableMatches.length} routeable adapter-backed match(es) for \"${options.query.capability}\".`\n : `Expected at least ${minMatches} routeable adapter-backed match(es) for \"${options.query.capability}\", found ${routeableMatches.length}.`,\n });\n\n for (const missingMatch of missingAdapterMatches) {\n pushCheck(options.checks, {\n name: \"missing_adapter\",\n status: routeableMatches.length >= minMatches ? \"passed\" : \"failed\",\n capability: missingMatch.capability,\n providerId: missingMatch.providerId,\n message:\n routeableMatches.length >= minMatches\n ? `Catalog provider \"${missingMatch.providerId}\" matches policy but is missing from adapter inventory; minimum routeable matches are still satisfied.`\n : `Catalog provider \"${missingMatch.providerId}\" matches policy but is missing from adapter inventory.`,\n });\n }\n\n return {\n query: options.query,\n matches,\n routeableMatches,\n missingAdapterMatches,\n skippedProviders,\n };\n}\n\ninterface ResolvedPolicy {\n enabled: boolean;\n status: ProviderCatalogArtifactStatus;\n protocolMode?: ProviderProtocolMode;\n paymentPreferences?: ProbeMeshPaymentPreferences;\n paymentStrategy?: ProbeMeshPaymentStrategy;\n maxCostUsd?: number;\n requiredReceiptTypes?: ReceiptType[];\n providerIds?: string[];\n blockedProviderIds?: string[];\n}\n\nfunction resolveCatalogPolicy(\n policy: ProviderCatalogPolicyOptions | undefined,\n): ResolvedPolicy {\n return {\n enabled: policy?.enabled ?? true,\n status: policy?.status ?? \"ready\",\n protocolMode: policy?.protocolMode,\n paymentPreferences: policy?.paymentPreferences,\n paymentStrategy: policy?.paymentStrategy,\n maxCostUsd: policy?.maxCostUsd,\n requiredReceiptTypes: policy?.requiredReceiptTypes,\n providerIds: policy?.providerIds,\n blockedProviderIds: policy?.blockedProviderIds,\n };\n}\n\nfunction resolveQuery(\n policy: ResolvedPolicy,\n query: ProviderCatalogPolicyExpectedQuery,\n): ProviderCatalogQuery {\n const queryPolicy = resolveCatalogPolicy(query);\n const activePolicy = policy.enabled ? policy : resolveCatalogPolicy(undefined);\n\n return {\n capability: query.capability,\n protocolMode: queryPolicy.protocolMode ?? activePolicy.protocolMode,\n paymentPreferences: mergePaymentPreferences(\n activePolicy.paymentPreferences,\n queryPolicy.paymentPreferences,\n ),\n paymentStrategy: queryPolicy.paymentStrategy ?? activePolicy.paymentStrategy,\n maxCostUsd: strictestMaxCostUsd(\n queryPolicy.maxCostUsd,\n activePolicy.maxCostUsd,\n ),\n requiredReceiptTypes: unionProviderIds(\n queryPolicy.requiredReceiptTypes,\n activePolicy.requiredReceiptTypes,\n ) as ReceiptType[],\n providerIds: intersectProviderIds(\n queryPolicy.providerIds,\n activePolicy.providerIds,\n ),\n blockedProviderIds: unionProviderIds(\n queryPolicy.blockedProviderIds,\n activePolicy.blockedProviderIds,\n ),\n status: queryPolicy.status ?? activePolicy.status,\n };\n}\n\nfunction hasRouteableAdapter(\n match: ProviderCatalogMatch,\n adapterInventory: ProviderCatalogPolicyAdapterInventory,\n) {\n return adapterInventory.some(\n (adapter) =>\n adapter.id === match.providerId &&\n adapter.capabilities.includes(match.capability) &&\n (adapter.paymentOptions === undefined ||\n match.paymentSelection === undefined ||\n adapter.paymentOptions.some(\n (option) => option.id === match.paymentSelection?.optionId,\n )),\n );\n}\n\nfunction createSkippedProviders(\n entries: ProviderCatalogEntry[],\n capability: string,\n matches: ProviderCatalogMatch[],\n query: ProviderCatalogQuery,\n adapterInventory: ProviderCatalogPolicyAdapterInventory,\n) {\n const matchIds = new Set(matches.map((match) => match.providerId));\n const adapterIds = new Set(adapterInventory.map((adapter) => adapter.id));\n const catalogProviderIds = new Set(entries.map((entry) => entry.provider.id));\n const skippedCatalogEntries = entries\n .filter((entry) => entry.provider.capabilities.includes(capability))\n .filter((entry) => !matchIds.has(entry.provider.id))\n .map((entry) => ({\n providerId: entry.provider.id,\n capability,\n catalogArtifactId: entry.artifactId,\n catalogStatus: entry.status,\n reasons: explainSkippedEntry(entry, query, adapterIds),\n }));\n const inventoryOnlyAdapters = adapterInventory\n .filter((adapter) => adapter.capabilities.includes(capability))\n .filter((adapter) => !catalogProviderIds.has(adapter.id))\n .map((adapter) => ({\n providerId: adapter.id,\n capability,\n inventoryOnly: true,\n reasons: [\"adapter:not_in_catalog\"],\n }));\n\n return [...skippedCatalogEntries, ...inventoryOnlyAdapters];\n}\n\nfunction explainSkippedEntry(\n entry: ProviderCatalogEntry,\n query: ProviderCatalogQuery,\n adapterIds: Set<string>,\n) {\n const reasons: string[] = [];\n const providerId = entry.provider.id;\n\n if (entry.status !== (query.status ?? \"ready\")) {\n reasons.push(`status:${entry.status}`);\n }\n\n if (query.protocolMode && entry.provider.protocolMode !== query.protocolMode) {\n reasons.push(`protocol:${entry.provider.protocolMode}`);\n }\n\n if (query.paymentPreferences) {\n const paymentMatch = findProviderCatalogMatches(\n {\n schemaVersion: \"probemesh.provider-catalog.index.v1\",\n generatedAt: \"1970-01-01T00:00:00.000Z\",\n entries: [entry],\n },\n {\n capability: query.capability,\n paymentPreferences: query.paymentPreferences,\n status: entry.status,\n },\n );\n\n if (paymentMatch.length === 0) {\n reasons.push(\"payment_preferences:not_matched\");\n }\n }\n\n if (query.providerIds && !query.providerIds.includes(providerId)) {\n reasons.push(\"provider:not_allowed\");\n }\n\n if (query.blockedProviderIds?.includes(providerId)) {\n reasons.push(\"provider:blocked\");\n }\n\n const cost = resolveCatalogCost(entry, query.capability);\n\n if (\n query.maxCostUsd !== undefined &&\n (cost === undefined || cost.amountUsd > query.maxCostUsd)\n ) {\n reasons.push(`cost:${cost?.amountUsd ?? \"unknown\"}>${query.maxCostUsd}`);\n }\n\n const receiptTypes = new Set(entry.acceptance.receipts.types);\n\n for (const receiptType of query.requiredReceiptTypes ?? []) {\n if (!receiptTypes.has(receiptType)) {\n reasons.push(`missing_receipt:${receiptType}`);\n }\n }\n\n if (!adapterIds.has(providerId)) {\n reasons.push(`missing_adapter:${providerId}`);\n }\n\n return reasons.length > 0 ? reasons : [\"not_matched\"];\n}\n\nfunction resolveCatalogCost(\n entry: ProviderCatalogEntry,\n capability: string,\n) {\n const pricing = entry.provider.pricing;\n\n if (isPricing(pricing)) {\n return pricing;\n }\n\n const capabilityPricing = pricing[capability];\n return isPricing(capabilityPricing) ? capabilityPricing : undefined;\n}\n\nfunction pushCheck(\n checks: ProviderCatalogPolicyCheck[],\n check: ProviderCatalogPolicyCheck,\n) {\n checks.push(check);\n}\n\nfunction strictestMaxCostUsd(\n first: number | undefined,\n second: number | undefined,\n) {\n if (first === undefined) {\n return second;\n }\n\n if (second === undefined) {\n return first;\n }\n\n return Math.min(first, second);\n}\n\nfunction intersectProviderIds(\n first: string[] | undefined,\n second: string[] | undefined,\n) {\n if (!first) {\n return second;\n }\n\n if (!second) {\n return first;\n }\n\n return first.filter((providerId) => second.includes(providerId));\n}\n\nfunction unionProviderIds(first: string[] | undefined, second: string[] | undefined) {\n return [...new Set([...(first ?? []), ...(second ?? [])])];\n}\n\nfunction formatMarkdownReport(report: ProviderCatalogPolicyReport) {\n const lines = [\n `# ${report.title}`,\n \"\",\n `Status: ${report.status}`,\n `Generated: ${report.generatedAt}`,\n \"\",\n \"## Summary\",\n `- Total entries: ${report.summary.totalEntries}`,\n `- Ready entries: ${report.summary.readyEntries}`,\n `- Rejected entries: ${report.summary.rejectedEntries}`,\n `- Queries: ${report.summary.totalQueries}`,\n `- Routeable matches: ${report.summary.routeableMatches}`,\n `- Missing adapter matches: ${report.summary.missingAdapterMatches}`,\n `- Failed checks: ${report.summary.failedChecks}`,\n \"\",\n \"## Checks\",\n ...report.checks.map(\n (check) =>\n `- ${check.status === \"passed\" ? \"[x]\" : \"[ ]\"} ${check.name}: ${check.message}`,\n ),\n \"\",\n \"## Queries\",\n ...report.queryResults.flatMap((result) => [\n `### ${result.query.capability}`,\n `- Matches: ${formatProviderIds(result.matches.map((match) => match.providerId))}`,\n `- Payment options: ${formatMatchPaymentOptions(result.routeableMatches)}`,\n `- Routeable: ${formatProviderIds(\n result.routeableMatches.map((match) => match.providerId),\n )}`,\n `- Missing adapters: ${formatProviderIds(\n result.missingAdapterMatches.map((match) => match.providerId),\n )}`,\n `- Skipped: ${formatProviderIds(\n result.skippedProviders.map((provider) => provider.providerId),\n )}`,\n \"\",\n ]),\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatProviderIds(providerIds: string[]) {\n return providerIds.length > 0 ? providerIds.join(\", \") : \"none\";\n}\n\nfunction formatMatchPaymentOptions(matches: ProviderCatalogMatch[]) {\n if (matches.length === 0) {\n return \"none\";\n }\n\n return matches\n .map((match) => {\n const selection = match.paymentSelection;\n\n if (!selection) {\n return `${match.providerId}: none`;\n }\n\n const score =\n selection.score !== undefined ? ` score=${selection.score}` : \"\";\n const reasons =\n selection.scoreReasons && selection.scoreReasons.length > 0\n ? ` (${selection.scoreReasons.join(\"; \")})`\n : \"\";\n\n return `${match.providerId}: ${selection.optionId}/${selection.protocolMode}${score}${reasons}`;\n })\n .join(\", \");\n}\n\nfunction sanitizeReport<T>(value: T, forbiddenOutputValues: string[]) {\n return replaceForbiddenValues(\n cloneSerializable(value),\n forbiddenOutputValues.filter((entry) => entry.length > 0),\n ) as T;\n}\n\nfunction replaceForbiddenValues(value: unknown, forbiddenValues: string[]): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => replaceForbiddenValues(entry, forbiddenValues));\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues),\n ]),\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction validateStringArray(value: unknown, path: string) {\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isPricing(value: unknown): value is ProbeMeshPricing {\n return (\n isRecord(value) &&\n typeof value.unit === \"string\" &&\n typeof value.amountUsd === \"number\" &&\n Number.isFinite(value.amountUsd) &&\n value.amountUsd >= 0 &&\n (value.currency === undefined || typeof value.currency === \"string\")\n );\n}\n\nfunction isReceiptType(value: unknown): value is ReceiptType {\n return (\n value === \"payment_proof\" ||\n value === \"settlement_confirmation\" ||\n value === \"provider_delivery\" ||\n value === \"provider_response_evidence\" ||\n value === \"authorization_decision\"\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"mappings":"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","names":["cloneSerializable","isRecord","validateStringArray","isReceiptType","resolveCatalogCost"]}