@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/providerCatalogPolicyBundle.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport { ProbeMeshError } from \"./errors\";\nimport {\n assertProviderCatalog,\n summarizeProviderCatalog,\n type ProviderCatalog,\n type ProviderCatalogSummary,\n} from \"./providerCatalog\";\nimport {\n evaluateProviderCatalogPolicy,\n} from \"./providerCatalogPolicy\";\nimport type {\n ProviderCatalogPolicyAdapterInventory,\n ProviderCatalogPolicyCheck,\n ProviderCatalogPolicyEvaluationResult,\n ProviderCatalogPolicyExpectedQuery,\n ProviderCatalogPolicyOptions,\n ProviderCatalogPolicyQueryResult,\n} from \"./providerCatalogPolicy\";\nimport type {\n ProviderCatalogPolicyBundleAttestation,\n} from \"./types\";\n\nexport const PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION =\n \"probemesh.catalog-policy-bundle.v1\" as const;\n\nexport type ProviderCatalogPolicyBundleStatus = \"passed\" | \"failed\";\n\nexport type ProviderCatalogPolicyBundleFormat = \"json\" | \"markdown\";\n\nexport interface ProviderCatalogPolicyBundleOptions {\n catalog: ProviderCatalog;\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n evaluation?: ProviderCatalogPolicyEvaluationResult;\n generatedAt?: string;\n bundleId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderCatalogPolicyBundleHashes {\n catalog: string;\n catalogPolicy: string;\n adapterInventory: string;\n queries: string;\n evaluation: string;\n bundle: string;\n}\n\nexport interface ProviderCatalogPolicyBundleQueryCoverage {\n capability: string;\n minMatches: number;\n matches: number;\n routeableMatches: number;\n missingAdapterMatches: number;\n providerIds: string[];\n}\n\nexport interface ProviderCatalogPolicyBundle {\n schemaVersion: typeof PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION;\n bundleId: string;\n generatedAt: string;\n status: ProviderCatalogPolicyBundleStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProviderCatalogPolicyBundleHashes;\n catalogSummary: ProviderCatalogSummary;\n evaluationSummary: ProviderCatalogPolicyEvaluationResult[\"summary\"];\n queryCoverage: ProviderCatalogPolicyBundleQueryCoverage[];\n checks: ProviderCatalogPolicyCheck[];\n failedChecks: string[];\n queries: ProviderCatalogPolicyExpectedQuery[];\n}\n\nexport interface ProviderCatalogPolicyBundleValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProviderCatalogPolicyBundleValidationResult {\n valid: boolean;\n errors: ProviderCatalogPolicyBundleValidationError[];\n}\n\nexport interface ProviderCatalogPolicyBundleRuntimeVerificationOptions {\n bundle: ProviderCatalogPolicyBundle;\n catalog: ProviderCatalog;\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries?: ProviderCatalogPolicyExpectedQuery[];\n capability?: string;\n}\n\nexport interface ProviderCatalogPolicyBundleRuntimeVerificationResult {\n valid: boolean;\n attestation: ProviderCatalogPolicyBundleAttestation;\n errors: ProviderCatalogPolicyBundleValidationError[];\n coveredQuery?: ProviderCatalogPolicyExpectedQuery;\n}\n\nexport function createProviderCatalogPolicyBundle(\n options: ProviderCatalogPolicyBundleOptions,\n): ProviderCatalogPolicyBundle {\n assertBundleOptions(options);\n\n const evaluation =\n options.evaluation ??\n evaluateProviderCatalogPolicy({\n catalog: options.catalog,\n catalogPolicy: options.catalogPolicy,\n adapterInventory: options.adapterInventory,\n queries: options.queries,\n });\n const hashesWithoutBundle = {\n catalog: hashStableJson(options.catalog),\n catalogPolicy: hashStableJson(options.catalogPolicy ?? null),\n adapterInventory: hashStableJson(options.adapterInventory),\n queries: hashStableJson(options.queries),\n evaluation: hashStableJson(evaluation),\n bundle: \"\",\n };\n const bundleBase: ProviderCatalogPolicyBundle = {\n schemaVersion: PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION,\n bundleId:\n options.bundleId ??\n `catalog_policy_bundle_${hashStableJson({\n catalog: hashesWithoutBundle.catalog,\n catalogPolicy: hashesWithoutBundle.catalogPolicy,\n adapterInventory: hashesWithoutBundle.adapterInventory,\n queries: hashesWithoutBundle.queries,\n }).slice(0, 16)}`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: evaluation.status,\n hashAlgorithm: \"sha256\",\n hashes: hashesWithoutBundle,\n catalogSummary: summarizeProviderCatalog(options.catalog),\n evaluationSummary: cloneSerializable(evaluation.summary),\n queryCoverage: evaluation.queryResults.map(createQueryCoverage),\n checks: cloneSerializable(evaluation.checks),\n failedChecks: evaluation.checks\n .filter((check) => check.status === \"failed\")\n .map((check) => check.name),\n queries: cloneSerializable(options.queries),\n };\n const bundle: ProviderCatalogPolicyBundle = {\n ...bundleBase,\n hashes: {\n ...hashesWithoutBundle,\n bundle: hashBundleContent(bundleBase),\n },\n };\n const sanitizedBundle = sanitizeBundleOutput(\n bundle,\n options.forbiddenOutputValues ?? [],\n );\n\n assertProviderCatalogPolicyBundle(sanitizedBundle);\n\n return sanitizedBundle;\n}\n\nexport function validateProviderCatalogPolicyBundle(\n bundle: unknown,\n): ProviderCatalogPolicyBundleValidationResult {\n const errors: ProviderCatalogPolicyBundleValidationError[] = [];\n\n if (!isRecord(bundle)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"Provider catalog policy bundle must be an object.\",\n },\n ],\n };\n }\n\n if (bundle.schemaVersion !== PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(bundle.bundleId, \"bundleId\", errors);\n validateIsoTimestamp(bundle.generatedAt, \"generatedAt\", errors);\n\n if (bundle.status !== \"passed\" && bundle.status !== \"failed\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"passed\" or \"failed\".',\n });\n }\n\n if (bundle.hashAlgorithm !== \"sha256\") {\n errors.push({\n path: \"hashAlgorithm\",\n message: 'hashAlgorithm must be \"sha256\".',\n });\n }\n\n validateHashes(bundle.hashes, errors);\n validateObject(bundle.catalogSummary, \"catalogSummary\", errors);\n validateObject(bundle.evaluationSummary, \"evaluationSummary\", errors);\n validateQueryCoverage(bundle.queryCoverage, errors);\n validateCheckArray(bundle.checks, \"checks\", errors);\n validateStringArray(bundle.failedChecks, \"failedChecks\", errors);\n\n if (!Array.isArray(bundle.queries) || bundle.queries.length === 0) {\n errors.push({\n path: \"queries\",\n message: \"queries must be a non-empty array.\",\n });\n }\n\n if (errors.length === 0) {\n const expectedBundleHash = hashBundleContent(\n bundle as unknown as ProviderCatalogPolicyBundle,\n );\n\n if (\n (bundle.hashes as ProviderCatalogPolicyBundleHashes).bundle !==\n expectedBundleHash\n ) {\n errors.push({\n path: \"hashes.bundle\",\n message: \"bundle hash does not match bundle content.\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProviderCatalogPolicyBundle(\n bundle: unknown,\n): asserts bundle is ProviderCatalogPolicyBundle {\n const result = validateProviderCatalogPolicyBundle(bundle);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider catalog policy bundle: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProviderCatalogPolicyBundle(\n bundle: ProviderCatalogPolicyBundle,\n options: {\n format?: ProviderCatalogPolicyBundleFormat;\n } = {},\n) {\n assertProviderCatalogPolicyBundle(bundle);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatBundleMarkdown(bundle);\n }\n\n return JSON.stringify(bundle, null, 2);\n}\n\nexport function verifyProviderCatalogPolicyBundleRuntime(\n options: ProviderCatalogPolicyBundleRuntimeVerificationOptions,\n): ProviderCatalogPolicyBundleRuntimeVerificationResult {\n assertRuntimeVerificationOptions(options);\n\n const errors: ProviderCatalogPolicyBundleValidationError[] = [];\n const bundleValidation = validateProviderCatalogPolicyBundle(options.bundle);\n\n errors.push(...bundleValidation.errors);\n\n if (options.bundle.status !== \"passed\") {\n errors.push({\n path: \"status\",\n message: \"Provider catalog policy bundle must have passed evaluation.\",\n });\n }\n\n const queries = options.queries ?? options.bundle.queries;\n const evaluation = evaluateProviderCatalogPolicy({\n catalog: options.catalog,\n catalogPolicy: options.catalogPolicy,\n adapterInventory: options.adapterInventory,\n queries,\n });\n const runtimeHashes = {\n catalog: hashStableJson(options.catalog),\n catalogPolicy: hashStableJson(options.catalogPolicy ?? null),\n adapterInventory: hashStableJson(options.adapterInventory),\n queries: hashStableJson(queries),\n evaluation: hashStableJson(evaluation),\n };\n\n pushHashMismatch(\n errors,\n \"catalog\",\n options.bundle.hashes.catalog,\n runtimeHashes.catalog,\n );\n pushHashMismatch(\n errors,\n \"catalogPolicy\",\n options.bundle.hashes.catalogPolicy,\n runtimeHashes.catalogPolicy,\n );\n pushHashMismatch(\n errors,\n \"adapterInventory\",\n options.bundle.hashes.adapterInventory,\n runtimeHashes.adapterInventory,\n );\n pushHashMismatch(\n errors,\n \"queries\",\n options.bundle.hashes.queries,\n runtimeHashes.queries,\n );\n pushHashMismatch(\n errors,\n \"evaluation\",\n options.bundle.hashes.evaluation,\n runtimeHashes.evaluation,\n );\n\n const queryIndex =\n options.capability === undefined\n ? undefined\n : options.bundle.queries.findIndex(\n (query) => query.capability === options.capability,\n );\n const covered =\n options.capability === undefined ? true : queryIndex !== undefined && queryIndex >= 0;\n\n if (!covered) {\n errors.push({\n path: \"queries\",\n message: `Capability \"${options.capability}\" is not covered by the policy bundle queries.`,\n });\n }\n\n const valid = errors.length === 0;\n const attestation: ProviderCatalogPolicyBundleAttestation = {\n schemaVersion: PROVIDER_CATALOG_POLICY_BUNDLE_SCHEMA_VERSION,\n bundleId: options.bundle.bundleId,\n status: options.bundle.status,\n hashAlgorithm: options.bundle.hashAlgorithm,\n bundleHash: options.bundle.hashes.bundle,\n catalogHash: options.bundle.hashes.catalog,\n catalogPolicyHash: options.bundle.hashes.catalogPolicy,\n adapterInventoryHash: options.bundle.hashes.adapterInventory,\n queriesHash: options.bundle.hashes.queries,\n evaluationHash: options.bundle.hashes.evaluation,\n runtimeVerified: valid,\n covered,\n capability: options.capability,\n queryIndex: queryIndex !== undefined && queryIndex >= 0 ? queryIndex : undefined,\n reason: valid ? \"runtime_verified\" : errors[0]?.message,\n };\n\n return {\n valid,\n attestation,\n errors,\n coveredQuery:\n queryIndex !== undefined && queryIndex >= 0\n ? options.bundle.queries[queryIndex]\n : undefined,\n };\n}\n\nfunction assertBundleOptions(\n options: ProviderCatalogPolicyBundleOptions,\n): asserts options is ProviderCatalogPolicyBundleOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle options must be an object.\",\n });\n }\n\n assertProviderCatalog(options.catalog);\n\n if (!Array.isArray(options.adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle adapterInventory must be an array.\",\n });\n }\n\n if (!Array.isArray(options.queries) || options.queries.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle requires at least one query.\",\n });\n }\n\n if (\n options.bundleId !== undefined &&\n (typeof options.bundleId !== \"string\" || options.bundleId.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundleId must be a non-empty string.\",\n });\n }\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle generatedAt must be an ISO timestamp.\",\n });\n }\n}\n\nfunction assertRuntimeVerificationOptions(\n options: ProviderCatalogPolicyBundleRuntimeVerificationOptions,\n): asserts options is ProviderCatalogPolicyBundleRuntimeVerificationOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle runtime options must be an object.\",\n });\n }\n\n assertProviderCatalogPolicyBundle(options.bundle);\n assertProviderCatalog(options.catalog);\n\n if (!Array.isArray(options.adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"Provider catalog policy bundle runtime adapterInventory must be an array.\",\n });\n }\n\n if (options.queries !== undefined && !Array.isArray(options.queries)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle runtime queries must be an array.\",\n });\n }\n\n if (\n options.capability !== undefined &&\n (typeof options.capability !== \"string\" || options.capability.length === 0)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider catalog policy bundle runtime capability must be a string.\",\n });\n }\n}\n\nfunction createQueryCoverage(\n result: ProviderCatalogPolicyQueryResult,\n): ProviderCatalogPolicyBundleQueryCoverage {\n return {\n capability: result.query.capability,\n minMatches: result.query.minMatches ?? 1,\n matches: result.matches.length,\n routeableMatches: result.routeableMatches.length,\n missingAdapterMatches: result.missingAdapterMatches.length,\n providerIds: result.routeableMatches.map((match) => match.providerId),\n };\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction hashBundleContent(bundle: ProviderCatalogPolicyBundle) {\n return hashStableJson({\n ...bundle,\n hashes: {\n ...bundle.hashes,\n bundle: \"\",\n },\n });\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortSerializable(value));\n}\n\nfunction sortSerializable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortSerializable);\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .filter((key) => value[key] !== undefined)\n .map((key) => [key, sortSerializable(value[key])]),\n );\n}\n\nfunction pushHashMismatch(\n errors: ProviderCatalogPolicyBundleValidationError[],\n name: keyof Omit<ProviderCatalogPolicyBundleHashes, \"bundle\">,\n expected: string,\n actual: string,\n) {\n if (expected !== actual) {\n errors.push({\n path: `hashes.${name}`,\n message: `${name} hash does not match runtime input.`,\n });\n }\n}\n\nfunction formatBundleMarkdown(bundle: ProviderCatalogPolicyBundle) {\n const lines = [\n `# Provider Catalog Policy Bundle ${bundle.bundleId}`,\n \"\",\n `Status: ${bundle.status}`,\n `Generated: ${bundle.generatedAt}`,\n `Bundle hash: ${bundle.hashes.bundle}`,\n \"\",\n \"## Summary\",\n `- Catalog entries: ${bundle.catalogSummary.totalEntries}`,\n `- Ready entries: ${bundle.catalogSummary.readyEntries}`,\n `- Queries: ${bundle.queryCoverage.length}`,\n `- Routeable matches: ${bundle.evaluationSummary.routeableMatches}`,\n `- Failed checks: ${bundle.evaluationSummary.failedChecks}`,\n \"\",\n \"## Query Coverage\",\n ...bundle.queryCoverage.map(\n (coverage) =>\n `- ${coverage.capability}: ${coverage.routeableMatches}/${coverage.minMatches} routeable (${formatInlineList(\n coverage.providerIds,\n )})`,\n ),\n \"\",\n \"## Checks\",\n ...bundle.checks.map(\n (check) =>\n `- ${check.status === \"passed\" ? \"[x]\" : \"[ ]\"} ${check.name}: ${check.message}`,\n ),\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction validateHashes(\n value: unknown,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!isRecord(value)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const key of [\n \"catalog\",\n \"catalogPolicy\",\n \"adapterInventory\",\n \"queries\",\n \"evaluation\",\n \"bundle\",\n ]) {\n validateSha256(value[key], `hashes.${key}`, errors);\n }\n}\n\nfunction validateQueryCoverage(\n value: unknown,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!Array.isArray(value)) {\n errors.push({\n path: \"queryCoverage\",\n message: \"queryCoverage must be an array.\",\n });\n return;\n }\n\n value.forEach((coverage, index) => {\n if (!isRecord(coverage)) {\n errors.push({\n path: `queryCoverage.${index}`,\n message: \"query coverage entry must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(coverage.capability, `queryCoverage.${index}.capability`, errors);\n validateNonNegativeInteger(\n coverage.minMatches,\n `queryCoverage.${index}.minMatches`,\n errors,\n );\n validateNonNegativeInteger(\n coverage.matches,\n `queryCoverage.${index}.matches`,\n errors,\n );\n validateNonNegativeInteger(\n coverage.routeableMatches,\n `queryCoverage.${index}.routeableMatches`,\n errors,\n );\n validateNonNegativeInteger(\n coverage.missingAdapterMatches,\n `queryCoverage.${index}.missingAdapterMatches`,\n errors,\n );\n validateStringArray(coverage.providerIds, `queryCoverage.${index}.providerIds`, errors);\n });\n}\n\nfunction validateCheckArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!Array.isArray(value)) {\n errors.push({\n path,\n message: `${path} must be an array.`,\n });\n return;\n }\n\n value.forEach((check, index) => {\n if (!isRecord(check)) {\n errors.push({\n path: `${path}.${index}`,\n message: \"check must be an object.\",\n });\n return;\n }\n\n validateNonEmptyString(check.name, `${path}.${index}.name`, errors);\n\n if (check.status !== \"passed\" && check.status !== \"failed\") {\n errors.push({\n path: `${path}.${index}.status`,\n message: 'check status must be \"passed\" or \"failed\".',\n });\n }\n\n validateNonEmptyString(check.message, `${path}.${index}.message`, errors);\n });\n}\n\nfunction validateObject(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (!isRecord(value)) {\n errors.push({\n path,\n message: `${path} must be an object.`,\n });\n }\n}\n\nfunction validateSha256(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n errors.push({\n path,\n message: `${path} must be a sha256 hex string.`,\n });\n }\n}\n\nfunction validateNonEmptyString(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"string\" || value.length === 0) {\n errors.push({\n path,\n message: `${path} must be a non-empty string.`,\n });\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction validateNonNegativeInteger(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n errors.push({\n path,\n message: `${path} must be a non-negative integer.`,\n });\n }\n}\n\nfunction validateIsoTimestamp(\n value: unknown,\n path: string,\n errors: ProviderCatalogPolicyBundleValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction sanitizeBundleOutput<T>(value: T, forbiddenOutputValues: string[]) {\n return replaceForbiddenValues(\n cloneSerializable(value),\n forbiddenOutputValues.filter((entry) => entry.length > 0),\n ) as T;\n}\n\nfunction replaceForbiddenValues(value: unknown, forbiddenValues: string[]): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => replaceForbiddenValues(entry, forbiddenValues));\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues),\n ]),\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction formatValidationErrors(errors: ProviderCatalogPolicyBundleValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction formatInlineList(values: string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"mappings":";;;;;;;;;;AAAA,SAAS,kBAAkB;AAwBpB,IAAM,gDACX;AA4EK,SAAS,kCACd,SAC6B;AAC7B,sBAAoB,OAAO;AAE3B,QAAM,aACJ,QAAQ,cACR,8BAA8B;AAAA,IAC5B,SAAS,QAAQ;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,IAC1B,SAAS,QAAQ;AAAA,EACnB,CAAC;AACH,QAAM,sBAAsB;AAAA,IAC1B,SAAS,eAAe,QAAQ,OAAO;AAAA,IACvC,eAAe,eAAe,QAAQ,iBAAiB,IAAI;AAAA,IAC3D,kBAAkB,eAAe,QAAQ,gBAAgB;AAAA,IACzD,SAAS,eAAe,QAAQ,OAAO;AAAA,IACvC,YAAY,eAAe,UAAU;AAAA,IACrC,QAAQ;AAAA,EACV;AACA,QAAM,aAA0C;AAAA,IAC9C,eAAe;AAAA,IACf,UACE,QAAQ,YACR,yBAAyB,eAAe;AAAA,MACtC,SAAS,oBAAoB;AAAA,MAC7B,eAAe,oBAAoB;AAAA,MACnC,kBAAkB,oBAAoB;AAAA,MACtC,SAAS,oBAAoB;AAAA,IAC/B,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IACjB,aAAa,QAAQ,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3D,QAAQ,WAAW;AAAA,IACnB,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,gBAAgB,yBAAyB,QAAQ,OAAO;AAAA,IACxD,mBAAmB,kBAAkB,WAAW,OAAO;AAAA,IACvD,eAAe,WAAW,aAAa,IAAI,mBAAmB;AAAA,IAC9D,QAAQ,kBAAkB,WAAW,MAAM;AAAA,IAC3C,cAAc,WAAW,OACtB,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ,EAC3C,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,IAC5B,SAAS,kBAAkB,QAAQ,OAAO;AAAA,EAC5C;AACA,QAAM,SAAsC;AAAA,IAC1C,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,QAAQ,kBAAkB,UAAU;AAAA,IACtC;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,QAAQ,yBAAyB,CAAC;AAAA,EACpC;AAEA,oCAAkC,eAAe;AAEjD,SAAO;AACT;AAEO,SAAS,oCACd,QAC6C;AAC7C,QAAM,SAAuD,CAAC;AAE9D,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,kBAAkB,+CAA+C;AAC1E,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,0BAA0B,6CAA6C;AAAA,IAClF,CAAC;AAAA,EACH;AAEA,yBAAuB,OAAO,UAAU,YAAY,MAAM;AAC1D,uBAAqB,OAAO,aAAa,eAAe,MAAM;AAE9D,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,kBAAkB,UAAU;AACrC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,iBAAe,OAAO,QAAQ,MAAM;AACpC,iBAAe,OAAO,gBAAgB,kBAAkB,MAAM;AAC9D,iBAAe,OAAO,mBAAmB,qBAAqB,MAAM;AACpE,wBAAsB,OAAO,eAAe,MAAM;AAClD,qBAAmB,OAAO,QAAQ,UAAU,MAAM;AAClD,sBAAoB,OAAO,cAAc,gBAAgB,MAAM;AAE/D,MAAI,CAAC,MAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AACjE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,qBAAqB;AAAA,MACzB;AAAA,IACF;AAEA,QACG,OAAO,OAA6C,WACrD,oBACA;AACA,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AACF;AAEO,SAAS,kCACd,QAC+C;AAC/C,QAAM,SAAS,oCAAoC,MAAM;AAEzD,MAAI,OAAO,OAAO;AAChB;AAAA,EACF;AAEA,QAAM,IAAI,eAAe;AAAA,IACvB,MAAM;AAAA,IACN,SAAS,2CAA2C;AAAA,MAClD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,kCACd,QACA,UAEI,CAAC,GACL;AACA,oCAAkC,MAAM;AAExC,OAAK,QAAQ,UAAU,YAAY,YAAY;AAC7C,WAAO,qBAAqB,MAAM;AAAA,EACpC;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAEO,SAAS,yCACd,SACsD;AACtD,mCAAiC,OAAO;AAExC,QAAM,SAAuD,CAAC;AAC9D,QAAM,mBAAmB,oCAAoC,QAAQ,MAAM;AAE3E,SAAO,KAAK,GAAG,iBAAiB,MAAM;AAEtC,MAAI,QAAQ,OAAO,WAAW,UAAU;AACtC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,QAAQ,WAAW,QAAQ,OAAO;AAClD,QAAM,aAAa,8BAA8B;AAAA,IAC/C,SAAS,QAAQ;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,QAAM,gBAAgB;AAAA,IACpB,SAAS,eAAe,QAAQ,OAAO;AAAA,IACvC,eAAe,eAAe,QAAQ,iBAAiB,IAAI;AAAA,IAC3D,kBAAkB,eAAe,QAAQ,gBAAgB;AAAA,IACzD,SAAS,eAAe,OAAO;AAAA,IAC/B,YAAY,eAAe,UAAU;AAAA,EACvC;AAEA;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,IACtB,cAAc;AAAA,EAChB;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,IACtB,cAAc;AAAA,EAChB;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,IACtB,cAAc;AAAA,EAChB;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,IACtB,cAAc;AAAA,EAChB;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,IACtB,cAAc;AAAA,EAChB;AAEA,QAAM,aACJ,QAAQ,eAAe,SACnB,SACA,QAAQ,OAAO,QAAQ;AAAA,IACrB,CAAC,UAAU,MAAM,eAAe,QAAQ;AAAA,EAC1C;AACN,QAAM,UACJ,QAAQ,eAAe,SAAY,OAAO,eAAe,UAAa,cAAc;AAEtF,MAAI,CAAC,SAAS;AACZ,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,eAAe,QAAQ,UAAU;AAAA,IAC5C,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,OAAO,WAAW;AAChC,QAAM,cAAsD;AAAA,IAC1D,eAAe;AAAA,IACf,UAAU,QAAQ,OAAO;AAAA,IACzB,QAAQ,QAAQ,OAAO;AAAA,IACvB,eAAe,QAAQ,OAAO;AAAA,IAC9B,YAAY,QAAQ,OAAO,OAAO;AAAA,IAClC,aAAa,QAAQ,OAAO,OAAO;AAAA,IACnC,mBAAmB,QAAQ,OAAO,OAAO;AAAA,IACzC,sBAAsB,QAAQ,OAAO,OAAO;AAAA,IAC5C,aAAa,QAAQ,OAAO,OAAO;AAAA,IACnC,gBAAgB,QAAQ,OAAO,OAAO;AAAA,IACtC,iBAAiB;AAAA,IACjB;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,YAAY,eAAe,UAAa,cAAc,IAAI,aAAa;AAAA,IACvE,QAAQ,QAAQ,qBAAqB,OAAO,CAAC,GAAG;AAAA,EAClD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,cACE,eAAe,UAAa,cAAc,IACtC,QAAQ,OAAO,QAAQ,UAAU,IACjC;AAAA,EACR;AACF;AAEA,SAAS,oBACP,SACuD;AACvD,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,wBAAsB,QAAQ,OAAO;AAErC,MAAI,CAAC,MAAM,QAAQ,QAAQ,gBAAgB,GAAG;AAC5C,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,WAAW,GAAG;AACnE,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MACE,QAAQ,aAAa,WACpB,OAAO,QAAQ,aAAa,YAAY,QAAQ,SAAS,WAAW,IACrE;AACA,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MACE,QAAQ,gBAAgB,WACvB,OAAO,QAAQ,gBAAgB,YAC9B,OAAO,MAAM,KAAK,MAAM,QAAQ,WAAW,CAAC,IAC9C;AACA,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iCACP,SAC0E;AAC1E,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,oCAAkC,QAAQ,MAAM;AAChD,wBAAsB,QAAQ,OAAO;AAErC,MAAI,CAAC,MAAM,QAAQ,QAAQ,gBAAgB,GAAG;AAC5C,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,YAAY,UAAa,CAAC,MAAM,QAAQ,QAAQ,OAAO,GAAG;AACpE,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MACE,QAAQ,eAAe,WACtB,OAAO,QAAQ,eAAe,YAAY,QAAQ,WAAW,WAAW,IACzE;AACA,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,QAC0C;AAC1C,SAAO;AAAA,IACL,YAAY,OAAO,MAAM;AAAA,IACzB,YAAY,OAAO,MAAM,cAAc;AAAA,IACvC,SAAS,OAAO,QAAQ;AAAA,IACxB,kBAAkB,OAAO,iBAAiB;AAAA,IAC1C,uBAAuB,OAAO,sBAAsB;AAAA,IACpD,aAAa,OAAO,iBAAiB,IAAI,CAAC,UAAU,MAAM,UAAU;AAAA,EACtE;AACF;AAEA,SAAS,eAAe,OAAgB;AACtC,SAAO,WAAW,QAAQ,EAAE,OAAO,gBAAgB,KAAK,CAAC,EAAE,OAAO,KAAK;AACzE;AAEA,SAAS,kBAAkB,QAAqC;AAC9D,SAAO,eAAe;AAAA,IACpB,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,KAAK,UAAU,iBAAiB,KAAK,CAAC;AAC/C;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,gBAAgB;AAAA,EACnC;AAEA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,KAAK,KAAK,EACd,KAAK,EACL,OAAO,CAAC,QAAQ,MAAM,GAAG,MAAM,MAAS,EACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,iBAAiB,MAAM,GAAG,CAAC,CAAC,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,iBACP,QACA,MACA,UACA,QACA;AACA,MAAI,aAAa,QAAQ;AACvB,WAAO,KAAK;AAAA,MACV,MAAM,UAAU,IAAI;AAAA,MACpB,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,QAAqC;AACjE,QAAM,QAAQ;AAAA,IACZ,oCAAoC,OAAO,QAAQ;AAAA,IACnD;AAAA,IACA,WAAW,OAAO,MAAM;AAAA,IACxB,cAAc,OAAO,WAAW;AAAA,IAChC,gBAAgB,OAAO,OAAO,MAAM;AAAA,IACpC;AAAA,IACA;AAAA,IACA,sBAAsB,OAAO,eAAe,YAAY;AAAA,IACxD,oBAAoB,OAAO,eAAe,YAAY;AAAA,IACtD,cAAc,OAAO,cAAc,MAAM;AAAA,IACzC,wBAAwB,OAAO,kBAAkB,gBAAgB;AAAA,IACjE,oBAAoB,OAAO,kBAAkB,YAAY;AAAA,IACzD;AAAA,IACA;AAAA,IACA,GAAG,OAAO,cAAc;AAAA,MACtB,CAAC,aACC,KAAK,SAAS,UAAU,KAAK,SAAS,gBAAgB,IAAI,SAAS,UAAU,eAAe;AAAA,QAC1F,SAAS;AAAA,MACX,CAAC;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,OAAO;AAAA,MACf,CAAC,UACC,KAAK,MAAM,WAAW,WAAW,QAAQ,KAAK,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,IAClF;AAAA,EACF;AAEA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEA,SAAS,eACP,OACA,QACA;AACA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAEA,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,mBAAe,MAAM,GAAG,GAAG,UAAU,GAAG,IAAI,MAAM;AAAA,EACpD;AACF;AAEA,SAAS,sBACP,OACA,QACA;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,UAAU,UAAU;AACjC,QAAI,CAAC,SAAS,QAAQ,GAAG;AACvB,aAAO,KAAK;AAAA,QACV,MAAM,iBAAiB,KAAK;AAAA,QAC5B,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAEA,2BAAuB,SAAS,YAAY,iBAAiB,KAAK,eAAe,MAAM;AACvF;AAAA,MACE,SAAS;AAAA,MACT,iBAAiB,KAAK;AAAA,MACtB;AAAA,IACF;AACA;AAAA,MACE,SAAS;AAAA,MACT,iBAAiB,KAAK;AAAA,MACtB;AAAA,IACF;AACA;AAAA,MACE,SAAS;AAAA,MACT,iBAAiB,KAAK;AAAA,MACtB;AAAA,IACF;AACA;AAAA,MACE,SAAS;AAAA,MACT,iBAAiB,KAAK;AAAA,MACtB;AAAA,IACF;AACA,wBAAoB,SAAS,aAAa,iBAAiB,KAAK,gBAAgB,MAAM;AAAA,EACxF,CAAC;AACH;AAEA,SAAS,mBACP,OACA,MACA,QACA;AACA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AACD;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,OAAO,UAAU;AAC9B,QAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,KAAK;AAAA,QACtB,SAAS;AAAA,MACX,CAAC;AACD;AAAA,IACF;AAEA,2BAAuB,MAAM,MAAM,GAAG,IAAI,IAAI,KAAK,SAAS,MAAM;AAElE,QAAI,MAAM,WAAW,YAAY,MAAM,WAAW,UAAU;AAC1D,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,IAAI,IAAI,KAAK;AAAA,QACtB,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,2BAAuB,MAAM,SAAS,GAAG,IAAI,IAAI,KAAK,YAAY,MAAM;AAAA,EAC1E,CAAC;AACH;AAEA,SAAS,eACP,OACA,MACA,QACA;AACA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eACP,OACA,MACA,QACA;AACA,MAAI,OAAO,UAAU,YAAY,CAAC,iBAAiB,KAAK,KAAK,GAAG;AAC9D,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,uBACP,OACA,MACA,QACA;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,OACA,MACA,QACA;AACA,MACE,CAAC,MAAM,QAAQ,KAAK,KACpB,MAAM,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,WAAW,CAAC,GACrE;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,OACA,MACA,QACA;AACA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,GAAG;AACtE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBACP,OACA,MACA,QACA;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC,GAAG;AAChE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,SAAS,GAAG,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAwB,OAAU,uBAAiC;AAC1E,SAAO;AAAA,IACL,kBAAkB,KAAK;AAAA,IACvB,sBAAsB,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,uBAAuB,OAAgB,iBAAoC;AAClF,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,gBAAgB;AAAA,MACrB,CAAC,SAAS,cAAc,QAAQ,MAAM,SAAS,EAAE,KAAK,YAAY;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,iBAAiB,MAAM;AACxE,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,UAAU,uBAAuB,OAAO,eAAe,CAAC;AAAA,EAC5E;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,MAC1C;AAAA,MACA,uBAAuB,OAAO,eAAe;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kBAAqB,OAAa;AACzC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAEA,SAAS,uBAAuB,QAAsD;AACpF,SAAO,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,EAAE,KAAK,IAAI;AAC3E;AAEA,SAAS,iBAAiB,QAAkB;AAC1C,SAAO,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI;AACjD;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;","names":[]}
@@ -0,0 +1,270 @@
1
+ import {
2
+ createProviderCatalogPolicyBundle,
3
+ formatProviderCatalogPolicyBundle
4
+ } from "./chunk-CXZOO3U4.js";
5
+ import {
6
+ createProviderCatalog,
7
+ createProviderCatalogPolicyReport,
8
+ evaluateProviderCatalogPolicy,
9
+ formatProviderCatalogPolicyReport
10
+ } from "./chunk-ZJOLPBJJ.js";
11
+ import {
12
+ loadCliConfigDefault
13
+ } from "./chunk-NYTV263W.js";
14
+
15
+ // src/cli/providerCatalogPolicyCli.ts
16
+ import { mkdir, writeFile } from "fs/promises";
17
+ import { dirname, resolve } from "path";
18
+ var USAGE = "Usage: probemesh-catalog-check --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-bundle <path>] [--title <text>]";
19
+ async function runProviderCatalogPolicyCli(options = {}) {
20
+ const argv = options.argv ?? [];
21
+ const cwd = options.cwd ?? process.cwd();
22
+ try {
23
+ const parsedArgs = parseCliArgs(argv);
24
+ if (parsedArgs.help) {
25
+ return {
26
+ exitCode: 0,
27
+ skipped: true,
28
+ stdout: `${USAGE}
29
+ `
30
+ };
31
+ }
32
+ if (!parsedArgs.configPath) {
33
+ return cliFailure("--config <path> is required.");
34
+ }
35
+ const configExport = await loadCliConfig(parsedArgs.configPath, {
36
+ argv,
37
+ cwd
38
+ });
39
+ if (isCliSkip(configExport)) {
40
+ return {
41
+ exitCode: 0,
42
+ skipped: true,
43
+ skip: configExport,
44
+ stdout: `provider catalog policy check skipped: ${configExport.reason}
45
+ `
46
+ };
47
+ }
48
+ assertCliConfig(configExport);
49
+ const catalog = resolveCatalog(configExport);
50
+ const evaluation = evaluateProviderCatalogPolicy({
51
+ catalog,
52
+ catalogPolicy: configExport.catalogPolicy,
53
+ adapterInventory: configExport.adapterInventory,
54
+ queries: configExport.queries
55
+ });
56
+ const report = createProviderCatalogPolicyReport(evaluation, {
57
+ ...configExport.report ?? {},
58
+ title: parsedArgs.title ?? configExport.report?.title
59
+ });
60
+ const selectedFormat = parsedArgs.format ?? configExport.report?.format ?? "markdown";
61
+ const stdout = formatProviderCatalogPolicyReport(report, {
62
+ format: selectedFormat
63
+ });
64
+ const bundle = createOptionalBundle({
65
+ catalog,
66
+ config: configExport,
67
+ evaluation,
68
+ requestedBundleOutput: parsedArgs.outBundle
69
+ });
70
+ const artifactPaths = await writeArtifacts({
71
+ cwd,
72
+ report,
73
+ bundle,
74
+ outputs: {
75
+ json: parsedArgs.outJson ?? configExport.outputs?.json,
76
+ markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,
77
+ bundle: parsedArgs.outBundle ?? configExport.outputs?.bundle
78
+ }
79
+ });
80
+ return {
81
+ exitCode: evaluation.status === "passed" ? 0 : 1,
82
+ skipped: false,
83
+ evaluation,
84
+ report,
85
+ bundle,
86
+ stdout,
87
+ artifactPaths
88
+ };
89
+ } catch (error) {
90
+ return cliFailure(
91
+ error instanceof Error ? error.message : "Unknown catalog policy CLI failure."
92
+ );
93
+ }
94
+ }
95
+ function parseCliArgs(argv) {
96
+ const parsedArgs = {};
97
+ for (let index = 0; index < argv.length; index += 1) {
98
+ const arg = argv[index];
99
+ if (arg === "--") {
100
+ continue;
101
+ }
102
+ if (arg === "--help" || arg === "-h") {
103
+ parsedArgs.help = true;
104
+ continue;
105
+ }
106
+ if (arg === "--config") {
107
+ parsedArgs.configPath = requireValue(argv, index, arg);
108
+ index += 1;
109
+ continue;
110
+ }
111
+ if (arg === "--format") {
112
+ const format = requireValue(argv, index, arg);
113
+ if (format !== "markdown" && format !== "json") {
114
+ throw new Error("--format must be markdown or json.");
115
+ }
116
+ parsedArgs.format = format;
117
+ index += 1;
118
+ continue;
119
+ }
120
+ if (arg === "--out-json") {
121
+ parsedArgs.outJson = requireValue(argv, index, arg);
122
+ index += 1;
123
+ continue;
124
+ }
125
+ if (arg === "--out-md") {
126
+ parsedArgs.outMarkdown = requireValue(argv, index, arg);
127
+ index += 1;
128
+ continue;
129
+ }
130
+ if (arg === "--out-bundle") {
131
+ parsedArgs.outBundle = requireValue(argv, index, arg);
132
+ index += 1;
133
+ continue;
134
+ }
135
+ if (arg === "--title") {
136
+ parsedArgs.title = requireValue(argv, index, arg);
137
+ index += 1;
138
+ continue;
139
+ }
140
+ throw new Error(`Unknown argument "${arg}".`);
141
+ }
142
+ return parsedArgs;
143
+ }
144
+ function requireValue(argv, index, flag) {
145
+ const value = argv[index + 1];
146
+ if (!value || value.startsWith("--")) {
147
+ throw new Error(`${flag} requires a value.`);
148
+ }
149
+ return value;
150
+ }
151
+ async function loadCliConfig(configPath, context) {
152
+ const configExport = await loadCliConfigDefault(configPath, context.cwd);
153
+ if (typeof configExport === "function") {
154
+ return configExport(context);
155
+ }
156
+ return configExport;
157
+ }
158
+ function isCliSkip(value) {
159
+ return !!value && typeof value === "object" && !Array.isArray(value) && value.skip === true && typeof value.reason === "string";
160
+ }
161
+ function assertCliConfig(value) {
162
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
163
+ throw new Error("Catalog policy CLI config must export an object.");
164
+ }
165
+ const config = value;
166
+ if (!config.catalog && !config.artifacts) {
167
+ throw new Error("Catalog policy CLI config requires catalog or artifacts.");
168
+ }
169
+ if (config.catalog && config.artifacts) {
170
+ throw new Error("Catalog policy CLI config must not provide both catalog and artifacts.");
171
+ }
172
+ if (config.artifacts !== void 0 && !Array.isArray(config.artifacts)) {
173
+ throw new Error("Catalog policy CLI artifacts must be an array.");
174
+ }
175
+ if (!Array.isArray(config.adapterInventory)) {
176
+ throw new Error("Catalog policy CLI config requires adapterInventory array.");
177
+ }
178
+ if (!Array.isArray(config.queries) || config.queries.length === 0) {
179
+ throw new Error("Catalog policy CLI config requires at least one query.");
180
+ }
181
+ const outputs = config.outputs;
182
+ if (outputs !== void 0 && (!outputs || typeof outputs !== "object" || Array.isArray(outputs) || outputs.json !== void 0 && typeof outputs.json !== "string" || outputs.markdown !== void 0 && typeof outputs.markdown !== "string" || outputs.bundle !== void 0 && typeof outputs.bundle !== "string")) {
183
+ throw new Error("Catalog policy CLI outputs must contain string paths.");
184
+ }
185
+ const bundle = config.bundle;
186
+ if (bundle !== void 0 && (!bundle || typeof bundle !== "object" || Array.isArray(bundle) || bundle.bundleId !== void 0 && typeof bundle.bundleId !== "string" || bundle.generatedAt !== void 0 && typeof bundle.generatedAt !== "string")) {
187
+ throw new Error("Catalog policy CLI bundle config must contain string values.");
188
+ }
189
+ }
190
+ function resolveCatalog(config) {
191
+ if (config.catalog) {
192
+ return config.catalog;
193
+ }
194
+ return createProviderCatalog({
195
+ artifacts: config.artifacts ?? []
196
+ });
197
+ }
198
+ function createOptionalBundle(options) {
199
+ if (!options.config.bundle && !options.requestedBundleOutput && !options.config.outputs?.bundle) {
200
+ return void 0;
201
+ }
202
+ return createProviderCatalogPolicyBundle({
203
+ catalog: options.catalog,
204
+ catalogPolicy: options.config.catalogPolicy,
205
+ adapterInventory: options.config.adapterInventory,
206
+ queries: options.config.queries,
207
+ evaluation: options.evaluation,
208
+ bundleId: options.config.bundle?.bundleId,
209
+ generatedAt: options.config.bundle?.generatedAt,
210
+ forbiddenOutputValues: options.config.report?.forbiddenOutputValues
211
+ });
212
+ }
213
+ async function writeArtifacts(options) {
214
+ const artifactPaths = {};
215
+ if (options.outputs.json) {
216
+ const outputPath = resolve(options.cwd, options.outputs.json);
217
+ await writeArtifact(
218
+ outputPath,
219
+ formatProviderCatalogPolicyReport(options.report, {
220
+ format: "json"
221
+ })
222
+ );
223
+ artifactPaths.json = outputPath;
224
+ }
225
+ if (options.outputs.markdown) {
226
+ const outputPath = resolve(options.cwd, options.outputs.markdown);
227
+ await writeArtifact(
228
+ outputPath,
229
+ formatProviderCatalogPolicyReport(options.report, {
230
+ format: "markdown"
231
+ })
232
+ );
233
+ artifactPaths.markdown = outputPath;
234
+ }
235
+ if (options.outputs.bundle) {
236
+ if (!options.bundle) {
237
+ throw new Error("Catalog policy CLI bundle output requires bundle config.");
238
+ }
239
+ const outputPath = resolve(options.cwd, options.outputs.bundle);
240
+ await writeArtifact(
241
+ outputPath,
242
+ formatProviderCatalogPolicyBundle(options.bundle, {
243
+ format: "json"
244
+ })
245
+ );
246
+ artifactPaths.bundle = outputPath;
247
+ }
248
+ return artifactPaths;
249
+ }
250
+ async function writeArtifact(outputPath, body) {
251
+ await mkdir(dirname(outputPath), {
252
+ recursive: true
253
+ });
254
+ await writeFile(outputPath, body, "utf8");
255
+ }
256
+ function cliFailure(message) {
257
+ return {
258
+ exitCode: 2,
259
+ skipped: false,
260
+ stdout: "",
261
+ stderr: `${message}
262
+ ${USAGE}
263
+ `
264
+ };
265
+ }
266
+
267
+ export {
268
+ runProviderCatalogPolicyCli
269
+ };
270
+ //# sourceMappingURL=chunk-FRFBK4SY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/providerCatalogPolicyCli.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProviderCatalog,\n} from \"../providerCatalog\";\nimport type {\n ProviderCatalog,\n} from \"../providerCatalog\";\nimport type {\n ProviderCatalogArtifact,\n} from \"../providerCatalogArtifact\";\nimport {\n createProviderCatalogPolicyReport,\n evaluateProviderCatalogPolicy,\n formatProviderCatalogPolicyReport,\n} from \"../providerCatalogPolicy\";\nimport {\n createProviderCatalogPolicyBundle,\n formatProviderCatalogPolicyBundle,\n} from \"../providerCatalogPolicyBundle\";\nimport type {\n ProviderCatalogPolicyAdapterInventory,\n ProviderCatalogPolicyEvaluationResult,\n ProviderCatalogPolicyExpectedQuery,\n ProviderCatalogPolicyOptions,\n ProviderCatalogPolicyReport,\n ProviderCatalogPolicyReportFormat,\n ProviderCatalogPolicyReportOptions,\n} from \"../providerCatalogPolicy\";\nimport type {\n ProviderCatalogPolicyBundle,\n} from \"../providerCatalogPolicyBundle\";\n\nexport interface ProviderCatalogPolicyCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderCatalogPolicyCliOutputs {\n json?: string;\n markdown?: string;\n bundle?: string;\n}\n\nexport interface ProviderCatalogPolicyCliBundle {\n bundleId?: string;\n generatedAt?: string;\n}\n\nexport interface ProviderCatalogPolicyCliConfig {\n catalog?: ProviderCatalog;\n artifacts?: ProviderCatalogArtifact[];\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n report?: ProviderCatalogPolicyReportOptions & {\n format?: ProviderCatalogPolicyReportFormat;\n };\n bundle?: ProviderCatalogPolicyCliBundle;\n outputs?: ProviderCatalogPolicyCliOutputs;\n}\n\nexport type ProviderCatalogPolicyCliConfigExport =\n | ProviderCatalogPolicyCliConfig\n | ProviderCatalogPolicyCliSkip;\n\nexport type ProviderCatalogPolicyCliConfigFactory = (\n context: ProviderCatalogPolicyCliConfigContext,\n) =>\n | ProviderCatalogPolicyCliConfigExport\n | Promise<ProviderCatalogPolicyCliConfigExport>;\n\nexport interface ProviderCatalogPolicyCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderCatalogPolicyCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderCatalogPolicyCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderCatalogPolicyCliSkip;\n evaluation?: ProviderCatalogPolicyEvaluationResult;\n report?: ProviderCatalogPolicyReport;\n bundle?: ProviderCatalogPolicyBundle;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderCatalogPolicyCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderCatalogPolicyReportFormat;\n outJson?: string;\n outMarkdown?: string;\n outBundle?: string;\n title?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-catalog-check --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-bundle <path>] [--title <text>]\";\n\nexport async function runProviderCatalogPolicyCli(\n options: ProviderCatalogPolicyCliOptions = {},\n): Promise<ProviderCatalogPolicyCliResult> {\n const argv = options.argv ?? [];\n const cwd = options.cwd ?? process.cwd();\n\n try {\n const parsedArgs = parseCliArgs(argv);\n\n if (parsedArgs.help) {\n return {\n exitCode: 0,\n skipped: true,\n stdout: `${USAGE}\\n`,\n };\n }\n\n if (!parsedArgs.configPath) {\n return cliFailure(\"--config <path> is required.\");\n }\n\n const configExport = await loadCliConfig(parsedArgs.configPath, {\n argv,\n cwd,\n });\n\n if (isCliSkip(configExport)) {\n return {\n exitCode: 0,\n skipped: true,\n skip: configExport,\n stdout: `provider catalog policy check skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const catalog = resolveCatalog(configExport);\n const evaluation = evaluateProviderCatalogPolicy({\n catalog,\n catalogPolicy: configExport.catalogPolicy,\n adapterInventory: configExport.adapterInventory,\n queries: configExport.queries,\n });\n const report = createProviderCatalogPolicyReport(evaluation, {\n ...(configExport.report ?? {}),\n title: parsedArgs.title ?? configExport.report?.title,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.report?.format ?? \"markdown\";\n const stdout = formatProviderCatalogPolicyReport(report, {\n format: selectedFormat,\n });\n const bundle = createOptionalBundle({\n catalog,\n config: configExport,\n evaluation,\n requestedBundleOutput: parsedArgs.outBundle,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n report,\n bundle,\n outputs: {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n bundle: parsedArgs.outBundle ?? configExport.outputs?.bundle,\n },\n });\n\n return {\n exitCode: evaluation.status === \"passed\" ? 0 : 1,\n skipped: false,\n evaluation,\n report,\n bundle,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error ? error.message : \"Unknown catalog policy CLI failure.\",\n );\n }\n}\n\nfunction parseCliArgs(argv: string[]): ParsedCliArgs {\n const parsedArgs: ParsedCliArgs = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n if (arg === \"--\") {\n continue;\n }\n\n if (arg === \"--help\" || arg === \"-h\") {\n parsedArgs.help = true;\n continue;\n }\n\n if (arg === \"--config\") {\n parsedArgs.configPath = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--format\") {\n const format = requireValue(argv, index, arg);\n\n if (format !== \"markdown\" && format !== \"json\") {\n throw new Error(\"--format must be markdown or json.\");\n }\n\n parsedArgs.format = format;\n index += 1;\n continue;\n }\n\n if (arg === \"--out-json\") {\n parsedArgs.outJson = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--out-md\") {\n parsedArgs.outMarkdown = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--out-bundle\") {\n parsedArgs.outBundle = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--title\") {\n parsedArgs.title = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n throw new Error(`Unknown argument \"${arg}\".`);\n }\n\n return parsedArgs;\n}\n\nfunction requireValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n\n return value;\n}\n\nasync function loadCliConfig(\n configPath: string,\n context: ProviderCatalogPolicyCliConfigContext,\n): Promise<ProviderCatalogPolicyCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderCatalogPolicyCliConfigFactory)(context);\n }\n\n return configExport as ProviderCatalogPolicyCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderCatalogPolicyCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderCatalogPolicyCliSkip>).skip === true &&\n typeof (value as Partial<ProviderCatalogPolicyCliSkip>).reason === \"string\"\n );\n}\n\nfunction assertCliConfig(\n value: unknown,\n): asserts value is ProviderCatalogPolicyCliConfig {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Catalog policy CLI config must export an object.\");\n }\n\n const config = value as Partial<ProviderCatalogPolicyCliConfig>;\n\n if (!config.catalog && !config.artifacts) {\n throw new Error(\"Catalog policy CLI config requires catalog or artifacts.\");\n }\n\n if (config.catalog && config.artifacts) {\n throw new Error(\"Catalog policy CLI config must not provide both catalog and artifacts.\");\n }\n\n if (config.artifacts !== undefined && !Array.isArray(config.artifacts)) {\n throw new Error(\"Catalog policy CLI artifacts must be an array.\");\n }\n\n if (!Array.isArray(config.adapterInventory)) {\n throw new Error(\"Catalog policy CLI config requires adapterInventory array.\");\n }\n\n if (!Array.isArray(config.queries) || config.queries.length === 0) {\n throw new Error(\"Catalog policy CLI config requires at least one query.\");\n }\n\n const outputs = config.outputs;\n\n if (\n outputs !== undefined &&\n (!outputs ||\n typeof outputs !== \"object\" ||\n Array.isArray(outputs) ||\n (outputs.json !== undefined && typeof outputs.json !== \"string\") ||\n (outputs.markdown !== undefined && typeof outputs.markdown !== \"string\") ||\n (outputs.bundle !== undefined && typeof outputs.bundle !== \"string\"))\n ) {\n throw new Error(\"Catalog policy CLI outputs must contain string paths.\");\n }\n\n const bundle = config.bundle;\n\n if (\n bundle !== undefined &&\n (!bundle ||\n typeof bundle !== \"object\" ||\n Array.isArray(bundle) ||\n (bundle.bundleId !== undefined && typeof bundle.bundleId !== \"string\") ||\n (bundle.generatedAt !== undefined && typeof bundle.generatedAt !== \"string\"))\n ) {\n throw new Error(\"Catalog policy CLI bundle config must contain string values.\");\n }\n}\n\nfunction resolveCatalog(config: ProviderCatalogPolicyCliConfig) {\n if (config.catalog) {\n return config.catalog;\n }\n\n return createProviderCatalog({\n artifacts: config.artifacts ?? [],\n });\n}\n\nfunction createOptionalBundle(options: {\n catalog: ProviderCatalog;\n config: ProviderCatalogPolicyCliConfig;\n evaluation: ProviderCatalogPolicyEvaluationResult;\n requestedBundleOutput?: string;\n}) {\n if (!options.config.bundle && !options.requestedBundleOutput && !options.config.outputs?.bundle) {\n return undefined;\n }\n\n return createProviderCatalogPolicyBundle({\n catalog: options.catalog,\n catalogPolicy: options.config.catalogPolicy,\n adapterInventory: options.config.adapterInventory,\n queries: options.config.queries,\n evaluation: options.evaluation,\n bundleId: options.config.bundle?.bundleId,\n generatedAt: options.config.bundle?.generatedAt,\n forbiddenOutputValues: options.config.report?.forbiddenOutputValues,\n });\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n report: ProviderCatalogPolicyReport;\n bundle?: ProviderCatalogPolicyBundle;\n outputs: ProviderCatalogPolicyCliOutputs;\n}) {\n const artifactPaths: ProviderCatalogPolicyCliOutputs = {};\n\n if (options.outputs.json) {\n const outputPath = resolve(options.cwd, options.outputs.json);\n await writeArtifact(\n outputPath,\n formatProviderCatalogPolicyReport(options.report, {\n format: \"json\",\n }),\n );\n artifactPaths.json = outputPath;\n }\n\n if (options.outputs.markdown) {\n const outputPath = resolve(options.cwd, options.outputs.markdown);\n await writeArtifact(\n outputPath,\n formatProviderCatalogPolicyReport(options.report, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = outputPath;\n }\n\n if (options.outputs.bundle) {\n if (!options.bundle) {\n throw new Error(\"Catalog policy CLI bundle output requires bundle config.\");\n }\n\n const outputPath = resolve(options.cwd, options.outputs.bundle);\n await writeArtifact(\n outputPath,\n formatProviderCatalogPolicyBundle(options.bundle, {\n format: \"json\",\n }),\n );\n artifactPaths.bundle = outputPath;\n }\n\n return artifactPaths;\n}\n\nasync function writeArtifact(outputPath: string, body: string) {\n await mkdir(dirname(outputPath), {\n recursive: true,\n });\n await writeFile(outputPath, body, \"utf8\");\n}\n\nfunction cliFailure(message: string): ProviderCatalogPolicyCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `${message}\\n${USAGE}\\n`,\n };\n}\n"],"mappings":"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","names":[]}