@probemesh/sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +160 -0
- package/dist/chunk-257Y7LN2.js +827 -0
- package/dist/chunk-257Y7LN2.js.map +1 -0
- package/dist/chunk-2ASMVLG4.js +56 -0
- package/dist/chunk-2ASMVLG4.js.map +1 -0
- package/dist/chunk-2KWGHJYP.js +285 -0
- package/dist/chunk-2KWGHJYP.js.map +1 -0
- package/dist/chunk-3H7UGVI6.js +1117 -0
- package/dist/chunk-3H7UGVI6.js.map +1 -0
- package/dist/chunk-5Q3PDYIA.js +657 -0
- package/dist/chunk-5Q3PDYIA.js.map +1 -0
- package/dist/chunk-CXZOO3U4.js +550 -0
- package/dist/chunk-CXZOO3U4.js.map +1 -0
- package/dist/chunk-FRFBK4SY.js +270 -0
- package/dist/chunk-FRFBK4SY.js.map +1 -0
- package/dist/chunk-HJK52QJF.js +994 -0
- package/dist/chunk-HJK52QJF.js.map +1 -0
- package/dist/chunk-HNBDX7IU.js +705 -0
- package/dist/chunk-HNBDX7IU.js.map +1 -0
- package/dist/chunk-NYTV263W.js +116 -0
- package/dist/chunk-NYTV263W.js.map +1 -0
- package/dist/chunk-PXG54XOG.js +595 -0
- package/dist/chunk-PXG54XOG.js.map +1 -0
- package/dist/chunk-TDOBAMYM.js +607 -0
- package/dist/chunk-TDOBAMYM.js.map +1 -0
- package/dist/chunk-TV42EZSI.js +2157 -0
- package/dist/chunk-TV42EZSI.js.map +1 -0
- package/dist/chunk-UU2ZG7P7.js +408 -0
- package/dist/chunk-UU2ZG7P7.js.map +1 -0
- package/dist/chunk-WKN7QOCA.js +977 -0
- package/dist/chunk-WKN7QOCA.js.map +1 -0
- package/dist/chunk-ZJOLPBJJ.js +1091 -0
- package/dist/chunk-ZJOLPBJJ.js.map +1 -0
- package/dist/cli/audit-trail-export.cjs +1193 -0
- package/dist/cli/audit-trail-export.cjs.map +1 -0
- package/dist/cli/audit-trail-export.d.cts +1 -0
- package/dist/cli/audit-trail-export.d.ts +1 -0
- package/dist/cli/audit-trail-export.js +24 -0
- package/dist/cli/audit-trail-export.js.map +1 -0
- package/dist/cli/catalog-check.cjs +2687 -0
- package/dist/cli/catalog-check.cjs.map +1 -0
- package/dist/cli/catalog-check.d.cts +1 -0
- package/dist/cli/catalog-check.d.ts +1 -0
- package/dist/cli/catalog-check.js +26 -0
- package/dist/cli/catalog-check.js.map +1 -0
- package/dist/cli/probemesh-init.cjs +1049 -0
- package/dist/cli/probemesh-init.cjs.map +1 -0
- package/dist/cli/probemesh-init.d.cts +1 -0
- package/dist/cli/probemesh-init.d.ts +1 -0
- package/dist/cli/probemesh-init.js +22 -0
- package/dist/cli/probemesh-init.js.map +1 -0
- package/dist/cli/provider-conformance.cjs +6180 -0
- package/dist/cli/provider-conformance.cjs.map +1 -0
- package/dist/cli/provider-conformance.d.cts +1 -0
- package/dist/cli/provider-conformance.d.ts +1 -0
- package/dist/cli/provider-conformance.js +29 -0
- package/dist/cli/provider-conformance.js.map +1 -0
- package/dist/cli/provider-dossier-check.cjs +2978 -0
- package/dist/cli/provider-dossier-check.cjs.map +1 -0
- package/dist/cli/provider-dossier-check.d.cts +1 -0
- package/dist/cli/provider-dossier-check.d.ts +1 -0
- package/dist/cli/provider-dossier-check.js +27 -0
- package/dist/cli/provider-dossier-check.js.map +1 -0
- package/dist/cli/provider-dossier.cjs +1753 -0
- package/dist/cli/provider-dossier.cjs.map +1 -0
- package/dist/cli/provider-dossier.d.cts +1 -0
- package/dist/cli/provider-dossier.d.ts +1 -0
- package/dist/cli/provider-dossier.js +26 -0
- package/dist/cli/provider-dossier.js.map +1 -0
- package/dist/cli/x402-accept.cjs +6009 -0
- package/dist/cli/x402-accept.cjs.map +1 -0
- package/dist/cli/x402-accept.d.cts +1 -0
- package/dist/cli/x402-accept.d.ts +1 -0
- package/dist/cli/x402-accept.js +28 -0
- package/dist/cli/x402-accept.js.map +1 -0
- package/dist/index.cjs +13671 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2026 -0
- package/dist/index.d.ts +2026 -0
- package/dist/index.js +2560 -0
- package/dist/index.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auditTrailBundle.ts","../src/cli/auditTrailExportCli.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\n\nimport {\n assertProbeMeshCallAuditArtifact,\n validateProbeMeshCallAuditArtifact,\n} from \"./callAuditArtifact\";\nimport { ProbeMeshError } from \"./errors\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport type {\n ProbeMeshCallAuditArtifact,\n} from \"./callAuditArtifact\";\n\nexport const PROBEMESH_AUDIT_TRAIL_BUNDLE_SCHEMA_VERSION =\n \"probemesh.audit-trail.v1\" as const;\n\nexport type ProbeMeshAuditTrailBundleStatus = \"complete\" | \"incomplete\";\n\nexport type ProbeMeshAuditTrailBundleFormat = \"json\" | \"markdown\";\n\nexport interface ProbeMeshAuditTrailBundleOptions {\n artifacts: ProbeMeshCallAuditArtifact[];\n generatedAt?: string;\n bundleId?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProbeMeshAuditTrailBundleSummary {\n totalCalls: number;\n completedCalls: number;\n failedCalls: number;\n providers: string[];\n capabilities: string[];\n receiptTypes: string[];\n policyBundleIds: string[];\n unsafePaymentEvidenceCalls: number;\n retrySafeFailures: number;\n uncoveredPolicyFailures: number;\n}\n\nexport interface ProbeMeshAuditTrailBundleHashes {\n artifacts: string;\n summary: string;\n bundle: string;\n}\n\nexport interface ProbeMeshAuditTrailBundle {\n schemaVersion: typeof PROBEMESH_AUDIT_TRAIL_BUNDLE_SCHEMA_VERSION;\n bundleId: string;\n generatedAt: string;\n status: ProbeMeshAuditTrailBundleStatus;\n hashAlgorithm: \"sha256\";\n hashes: ProbeMeshAuditTrailBundleHashes;\n summary: ProbeMeshAuditTrailBundleSummary;\n artifacts: ProbeMeshCallAuditArtifact[];\n}\n\nexport interface ProbeMeshAuditTrailBundleValidationError {\n path: string;\n message: string;\n}\n\nexport interface ProbeMeshAuditTrailBundleValidationResult {\n valid: boolean;\n errors: ProbeMeshAuditTrailBundleValidationError[];\n}\n\nexport interface ProbeMeshAuditTrailCollector {\n onArtifact(artifact: ProbeMeshCallAuditArtifact): void;\n getArtifacts(): ProbeMeshCallAuditArtifact[];\n clear(): void;\n createBundle(\n options?: Omit<ProbeMeshAuditTrailBundleOptions, \"artifacts\">,\n ): ProbeMeshAuditTrailBundle;\n}\n\nexport function createProbeMeshAuditTrailCollector(): ProbeMeshAuditTrailCollector {\n const artifacts: ProbeMeshCallAuditArtifact[] = [];\n\n return {\n onArtifact(artifact) {\n assertProbeMeshCallAuditArtifact(artifact);\n artifacts.push(cloneSerializable(artifact));\n },\n getArtifacts() {\n return cloneSerializable(artifacts);\n },\n clear() {\n artifacts.length = 0;\n },\n createBundle(options = {}) {\n return createProbeMeshAuditTrailBundle({\n ...options,\n artifacts,\n });\n },\n };\n}\n\nexport function createProbeMeshAuditTrailBundle(\n options: ProbeMeshAuditTrailBundleOptions,\n): ProbeMeshAuditTrailBundle {\n assertBundleOptions(options);\n\n for (const [index, artifact] of options.artifacts.entries()) {\n const validation = validateProbeMeshCallAuditArtifact(artifact);\n\n if (!validation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid ProbeMesh call audit artifact at index ${index}: ${formatValidationErrors(\n validation.errors,\n )}`,\n });\n }\n }\n\n const artifacts = sanitizeBundleOutput(\n options.artifacts,\n options.forbiddenOutputValues ?? [],\n );\n const summary = summarizeArtifacts(artifacts);\n const hashesWithoutBundle: ProbeMeshAuditTrailBundleHashes = {\n artifacts: hashStableJson(artifacts),\n summary: hashStableJson(summary),\n bundle: \"\",\n };\n const bundleBase: ProbeMeshAuditTrailBundle = {\n schemaVersion: PROBEMESH_AUDIT_TRAIL_BUNDLE_SCHEMA_VERSION,\n bundleId:\n options.bundleId ??\n `audit_trail_${hashStableJson({\n artifacts: hashesWithoutBundle.artifacts,\n summary: hashesWithoutBundle.summary,\n }).slice(0, 16)}`,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: artifacts.length > 0 ? \"complete\" : \"incomplete\",\n hashAlgorithm: \"sha256\",\n hashes: hashesWithoutBundle,\n summary,\n artifacts,\n };\n const bundle: ProbeMeshAuditTrailBundle = {\n ...bundleBase,\n hashes: {\n ...hashesWithoutBundle,\n bundle: hashBundleContent(bundleBase),\n },\n };\n\n assertProbeMeshAuditTrailBundle(bundle);\n\n return bundle;\n}\n\nexport function summarizeProbeMeshAuditTrailBundle(\n bundleOrArtifacts: ProbeMeshAuditTrailBundle | ProbeMeshCallAuditArtifact[],\n): ProbeMeshAuditTrailBundleSummary {\n return Array.isArray(bundleOrArtifacts)\n ? summarizeArtifacts(bundleOrArtifacts)\n : cloneSerializable(bundleOrArtifacts.summary);\n}\n\nexport function validateProbeMeshAuditTrailBundle(\n bundle: unknown,\n): ProbeMeshAuditTrailBundleValidationResult {\n const errors: ProbeMeshAuditTrailBundleValidationError[] = [];\n\n if (!isRecord(bundle)) {\n return {\n valid: false,\n errors: [\n {\n path: \"$\",\n message: \"ProbeMesh audit trail bundle must be an object.\",\n },\n ],\n };\n }\n\n if (bundle.schemaVersion !== PROBEMESH_AUDIT_TRAIL_BUNDLE_SCHEMA_VERSION) {\n errors.push({\n path: \"schemaVersion\",\n message: `schemaVersion must be \"${PROBEMESH_AUDIT_TRAIL_BUNDLE_SCHEMA_VERSION}\".`,\n });\n }\n\n validateNonEmptyString(bundle.bundleId, \"bundleId\", errors);\n validateIsoTimestamp(bundle.generatedAt, \"generatedAt\", errors);\n\n if (bundle.status !== \"complete\" && bundle.status !== \"incomplete\") {\n errors.push({\n path: \"status\",\n message: 'status must be \"complete\" or \"incomplete\".',\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 validateSummary(bundle.summary, errors);\n\n if (!Array.isArray(bundle.artifacts)) {\n errors.push({\n path: \"artifacts\",\n message: \"artifacts must be an array.\",\n });\n } else {\n bundle.artifacts.forEach((artifact, index) => {\n const validation = validateProbeMeshCallAuditArtifact(artifact);\n\n for (const artifactError of validation.errors) {\n errors.push({\n path: `artifacts.${index}.${artifactError.path}`,\n message: artifactError.message,\n });\n }\n });\n }\n\n if (errors.length === 0) {\n const typedBundle = bundle as unknown as ProbeMeshAuditTrailBundle;\n\n pushHashMismatch(\n errors,\n \"hashes.artifacts\",\n typedBundle.hashes.artifacts,\n hashStableJson(typedBundle.artifacts),\n );\n pushHashMismatch(\n errors,\n \"hashes.summary\",\n typedBundle.hashes.summary,\n hashStableJson(typedBundle.summary),\n );\n pushHashMismatch(\n errors,\n \"hashes.bundle\",\n typedBundle.hashes.bundle,\n hashBundleContent(typedBundle),\n );\n\n const expectedSummary = summarizeArtifacts(typedBundle.artifacts);\n\n if (stableStringify(typedBundle.summary) !== stableStringify(expectedSummary)) {\n errors.push({\n path: \"summary\",\n message: \"summary does not match bundle artifacts.\",\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertProbeMeshAuditTrailBundle(\n bundle: unknown,\n): asserts bundle is ProbeMeshAuditTrailBundle {\n const result = validateProbeMeshAuditTrailBundle(bundle);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid ProbeMesh audit trail bundle: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nexport function formatProbeMeshAuditTrailBundle(\n bundle: ProbeMeshAuditTrailBundle,\n options: {\n format?: ProbeMeshAuditTrailBundleFormat;\n } = {},\n) {\n assertProbeMeshAuditTrailBundle(bundle);\n\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatBundleMarkdown(bundle);\n }\n\n return JSON.stringify(bundle, null, 2);\n}\n\nfunction assertBundleOptions(\n options: ProbeMeshAuditTrailBundleOptions,\n): asserts options is ProbeMeshAuditTrailBundleOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh audit trail bundle options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.artifacts)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"ProbeMesh audit trail bundle artifacts must be an 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: \"ProbeMesh audit trail bundle generatedAt must be an ISO timestamp.\",\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: \"ProbeMesh audit trail bundleId must be a non-empty string.\",\n });\n }\n\n if (\n options.forbiddenOutputValues !== undefined &&\n (!Array.isArray(options.forbiddenOutputValues) ||\n options.forbiddenOutputValues.some((value) => typeof value !== \"string\"))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message:\n \"ProbeMesh audit trail bundle forbiddenOutputValues must be an array of strings.\",\n });\n }\n}\n\nfunction summarizeArtifacts(\n artifacts: ProbeMeshCallAuditArtifact[],\n): ProbeMeshAuditTrailBundleSummary {\n const providers: string[] = [];\n const capabilities: string[] = [];\n const receiptTypes: string[] = [];\n const policyBundleIds: string[] = [];\n let unsafePaymentEvidenceCalls = 0;\n let retrySafeFailures = 0;\n let uncoveredPolicyFailures = 0;\n\n for (const artifact of artifacts) {\n pushUnique(providers, artifact.call.providerId);\n pushUnique(capabilities, artifact.call.capability);\n\n for (const receiptType of artifact.evidence.receiptSummary.types) {\n pushUnique(receiptTypes, receiptType);\n }\n\n const attestationBundleId = artifact.evidence.route?.attestation?.bundleId;\n pushUnique(policyBundleIds, attestationBundleId);\n\n if (\n artifact.evidence.safety?.moneyMayHaveMoved === true ||\n artifact.evidence.receiptSummary.hasPaymentProof\n ) {\n unsafePaymentEvidenceCalls += 1;\n }\n\n if (\n artifact.status === \"failed\" &&\n artifact.evidence.retrySafety?.safeToAutoRetry === true\n ) {\n retrySafeFailures += 1;\n }\n\n if (\n artifact.status === \"failed\" &&\n artifact.evidence.route?.explanation?.attempts.some(\n (attempt) => attempt.reason === \"skipped_policy_bundle_uncovered\",\n ) === true\n ) {\n uncoveredPolicyFailures += 1;\n }\n }\n\n return {\n totalCalls: artifacts.length,\n completedCalls: artifacts.filter((artifact) => artifact.status === \"completed\")\n .length,\n failedCalls: artifacts.filter((artifact) => artifact.status === \"failed\")\n .length,\n providers,\n capabilities,\n receiptTypes,\n policyBundleIds,\n unsafePaymentEvidenceCalls,\n retrySafeFailures,\n uncoveredPolicyFailures,\n };\n}\n\nfunction validateHashes(\n hashes: unknown,\n errors: ProbeMeshAuditTrailBundleValidationError[],\n) {\n if (!isRecord(hashes)) {\n errors.push({\n path: \"hashes\",\n message: \"hashes must be an object.\",\n });\n return;\n }\n\n for (const key of [\"artifacts\", \"summary\", \"bundle\"]) {\n validateSha256String(hashes[key], `hashes.${key}`, errors);\n }\n}\n\nfunction validateSummary(\n summary: unknown,\n errors: ProbeMeshAuditTrailBundleValidationError[],\n) {\n if (!isRecord(summary)) {\n errors.push({\n path: \"summary\",\n message: \"summary must be an object.\",\n });\n return;\n }\n\n for (const key of [\n \"totalCalls\",\n \"completedCalls\",\n \"failedCalls\",\n \"unsafePaymentEvidenceCalls\",\n \"retrySafeFailures\",\n \"uncoveredPolicyFailures\",\n ]) {\n if (\n typeof summary[key] !== \"number\" ||\n !Number.isFinite(summary[key]) ||\n summary[key] < 0\n ) {\n errors.push({\n path: `summary.${key}`,\n message: `summary.${key} must be a non-negative finite number.`,\n });\n }\n }\n\n validateStringArray(summary.providers, \"summary.providers\", errors);\n validateStringArray(summary.capabilities, \"summary.capabilities\", errors);\n validateStringArray(summary.receiptTypes, \"summary.receiptTypes\", errors);\n validateStringArray(summary.policyBundleIds, \"summary.policyBundleIds\", errors);\n}\n\nfunction hashBundleContent(bundle: ProbeMeshAuditTrailBundle) {\n return hashStableJson({\n ...bundle,\n hashes: {\n ...bundle.hashes,\n bundle: \"\",\n },\n });\n}\n\nfunction pushHashMismatch(\n errors: ProbeMeshAuditTrailBundleValidationError[],\n path: string,\n expected: string,\n actual: string,\n) {\n if (expected === actual) {\n return;\n }\n\n errors.push({\n path,\n message: `${path} does not match bundle content.`,\n });\n}\n\nfunction hashStableJson(value: unknown) {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortSerializable(value));\n}\n\nfunction sortSerializable(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortSerializable);\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n return Object.fromEntries(\n Object.keys(value)\n .sort()\n .filter((key) => value[key] !== undefined)\n .map((key) => [key, sortSerializable(value[key])]),\n );\n}\n\nfunction sanitizeBundleOutput<T>(value: T, forbiddenOutputValues: string[]) {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(cloneSerializable(value), forbiddenValues),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => replaceForbiddenValues(entry, forbiddenValues));\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues),\n ]),\n );\n}\n\nfunction cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction formatBundleMarkdown(bundle: ProbeMeshAuditTrailBundle) {\n return [\n `# ProbeMesh Audit Trail Bundle`,\n ``,\n `Status: ${bundle.status}`,\n `Schema: ${bundle.schemaVersion}`,\n `Bundle ID: ${bundle.bundleId}`,\n `Generated: ${bundle.generatedAt}`,\n ``,\n `## Summary`,\n `- Total calls: ${bundle.summary.totalCalls}`,\n `- Completed: ${bundle.summary.completedCalls}`,\n `- Failed: ${bundle.summary.failedCalls}`,\n `- Providers: ${formatInlineList(bundle.summary.providers)}`,\n `- Capabilities: ${formatInlineList(bundle.summary.capabilities)}`,\n `- Receipt types: ${formatInlineList(bundle.summary.receiptTypes)}`,\n `- Policy bundles: ${formatInlineList(bundle.summary.policyBundleIds)}`,\n `- Unsafe payment evidence calls: ${bundle.summary.unsafePaymentEvidenceCalls}`,\n `- Retry-safe failures: ${bundle.summary.retrySafeFailures}`,\n `- Uncovered policy failures: ${bundle.summary.uncoveredPolicyFailures}`,\n ``,\n `## Artifacts`,\n ...bundle.artifacts.map(\n (artifact) =>\n `- ${artifact.call.callId ?? artifact.artifactId}: ${artifact.status} / ${artifact.call.capability} / ${artifact.call.providerId ?? \"none\"}`,\n ),\n ``,\n `## Hashes`,\n `- Bundle: ${bundle.hashes.bundle}`,\n `- Artifacts: ${bundle.hashes.artifacts}`,\n `- Summary: ${bundle.hashes.summary}`,\n ].join(\"\\n\");\n}\n\nfunction formatInlineList(values: string[]) {\n return values.length === 0 ? \"none\" : values.join(\", \");\n}\n\nfunction pushUnique(values: string[], value: string | undefined) {\n if (value && !values.includes(value)) {\n values.push(value);\n }\n}\n\nfunction validateSha256String(\n value: unknown,\n path: string,\n errors: ProbeMeshAuditTrailBundleValidationError[],\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: ProbeMeshAuditTrailBundleValidationError[],\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: ProbeMeshAuditTrailBundleValidationError[],\n) {\n if (typeof value !== \"string\" || Number.isNaN(Date.parse(value))) {\n errors.push({\n path,\n message: `${path} must be an ISO timestamp.`,\n });\n }\n}\n\nfunction validateStringArray(\n value: unknown,\n path: string,\n errors: ProbeMeshAuditTrailBundleValidationError[],\n) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\" || entry.length === 0)\n ) {\n errors.push({\n path,\n message: `${path} must be an array of non-empty strings.`,\n });\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction formatValidationErrors(errors: Array<{ path: string; message: string }>) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProbeMeshAuditTrailBundle,\n formatProbeMeshAuditTrailBundle,\n} from \"../auditTrailBundle\";\nimport type {\n ProbeMeshAuditTrailBundle,\n ProbeMeshAuditTrailBundleFormat,\n ProbeMeshAuditTrailBundleOptions,\n} from \"../auditTrailBundle\";\nimport type {\n ProbeMeshCallAuditArtifact,\n} from \"../callAuditArtifact\";\n\nexport interface ProbeMeshAuditTrailExportCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProbeMeshAuditTrailExportCliOutputs {\n json?: string;\n markdown?: string;\n}\n\nexport interface ProbeMeshAuditTrailExportCliBundle\n extends Omit<ProbeMeshAuditTrailBundleOptions, \"artifacts\"> {\n format?: ProbeMeshAuditTrailBundleFormat;\n}\n\nexport interface ProbeMeshAuditTrailExportCliConfig {\n artifacts?: ProbeMeshCallAuditArtifact[];\n artifactFiles?: string[];\n bundle?: ProbeMeshAuditTrailExportCliBundle;\n outputs?: ProbeMeshAuditTrailExportCliOutputs;\n}\n\nexport type ProbeMeshAuditTrailExportCliConfigExport =\n | ProbeMeshAuditTrailExportCliConfig\n | ProbeMeshAuditTrailExportCliSkip;\n\nexport type ProbeMeshAuditTrailExportCliConfigFactory = (\n context: ProbeMeshAuditTrailExportCliConfigContext,\n) =>\n | ProbeMeshAuditTrailExportCliConfigExport\n | Promise<ProbeMeshAuditTrailExportCliConfigExport>;\n\nexport interface ProbeMeshAuditTrailExportCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProbeMeshAuditTrailExportCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProbeMeshAuditTrailExportCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProbeMeshAuditTrailExportCliSkip;\n bundle?: ProbeMeshAuditTrailBundle;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProbeMeshAuditTrailExportCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProbeMeshAuditTrailBundleFormat;\n outJson?: string;\n outMarkdown?: string;\n bundleId?: string;\n generatedAt?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-audit-trail-export --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--bundle-id <text>] [--generated-at <iso>]\";\n\nexport async function runProbeMeshAuditTrailExportCli(\n options: ProbeMeshAuditTrailExportCliOptions = {},\n): Promise<ProbeMeshAuditTrailExportCliResult> {\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: `ProbeMesh audit trail export skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const artifacts = await loadArtifacts({\n cwd,\n inlineArtifacts: configExport.artifacts,\n artifactFiles: configExport.artifactFiles,\n });\n const bundle = createProbeMeshAuditTrailBundle({\n artifacts,\n bundleId: parsedArgs.bundleId ?? configExport.bundle?.bundleId,\n generatedAt: parsedArgs.generatedAt ?? configExport.bundle?.generatedAt,\n forbiddenOutputValues: configExport.bundle?.forbiddenOutputValues,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.bundle?.format ?? \"markdown\";\n const stdout = formatProbeMeshAuditTrailBundle(bundle, {\n format: selectedFormat,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n bundle,\n outputs: {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n },\n });\n\n return {\n exitCode: bundle.status === \"complete\" ? 0 : 1,\n skipped: false,\n bundle,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error\n ? error.message\n : \"Unknown audit trail export 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 === \"--bundle-id\") {\n parsedArgs.bundleId = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--generated-at\") {\n parsedArgs.generatedAt = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n throw new Error(`Unknown argument \"${arg}\".`);\n }\n\n return parsedArgs;\n}\n\nfunction requireValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n\n return value;\n}\n\nasync function loadCliConfig(\n configPath: string,\n context: ProbeMeshAuditTrailExportCliConfigContext,\n): Promise<ProbeMeshAuditTrailExportCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProbeMeshAuditTrailExportCliConfigFactory)(context);\n }\n\n return configExport as ProbeMeshAuditTrailExportCliConfigExport;\n}\n\nfunction isCliSkip(\n value: unknown,\n): value is ProbeMeshAuditTrailExportCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProbeMeshAuditTrailExportCliSkip>).skip === true &&\n typeof (value as Partial<ProbeMeshAuditTrailExportCliSkip>).reason ===\n \"string\"\n );\n}\n\nfunction assertCliConfig(\n value: unknown,\n): asserts value is ProbeMeshAuditTrailExportCliConfig {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Audit trail export CLI config must export an object.\");\n }\n\n const config = value as Partial<ProbeMeshAuditTrailExportCliConfig>;\n\n if (config.artifacts !== undefined && !Array.isArray(config.artifacts)) {\n throw new Error(\"Audit trail export CLI artifacts must be an array.\");\n }\n\n if (\n config.artifactFiles !== undefined &&\n (!Array.isArray(config.artifactFiles) ||\n config.artifactFiles.some((artifactFile) => typeof artifactFile !== \"string\"))\n ) {\n throw new Error(\"Audit trail export CLI artifactFiles must be an array of strings.\");\n }\n\n if (config.bundle !== undefined) {\n assertBundleConfig(config.bundle);\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 ) {\n throw new Error(\"Audit trail export CLI outputs must contain string paths.\");\n }\n}\n\nfunction assertBundleConfig(value: unknown) {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Audit trail export CLI bundle config must be an object.\");\n }\n\n const bundle = value as Partial<ProbeMeshAuditTrailExportCliBundle>;\n\n if (bundle.bundleId !== undefined && typeof bundle.bundleId !== \"string\") {\n throw new Error(\"Audit trail export CLI bundleId must be a string.\");\n }\n\n if (bundle.generatedAt !== undefined && typeof bundle.generatedAt !== \"string\") {\n throw new Error(\"Audit trail export CLI generatedAt must be a string.\");\n }\n\n if (\n bundle.forbiddenOutputValues !== undefined &&\n (!Array.isArray(bundle.forbiddenOutputValues) ||\n bundle.forbiddenOutputValues.some((value) => typeof value !== \"string\"))\n ) {\n throw new Error(\n \"Audit trail export CLI forbiddenOutputValues must be an array of strings.\",\n );\n }\n\n if (\n bundle.format !== undefined &&\n bundle.format !== \"markdown\" &&\n bundle.format !== \"json\"\n ) {\n throw new Error(\"Audit trail export CLI bundle format must be markdown or json.\");\n }\n}\n\nasync function loadArtifacts(options: {\n cwd: string;\n inlineArtifacts?: ProbeMeshCallAuditArtifact[];\n artifactFiles?: string[];\n}) {\n const artifacts: ProbeMeshCallAuditArtifact[] = [\n ...(options.inlineArtifacts ?? []),\n ];\n\n for (const artifactFile of options.artifactFiles ?? []) {\n const loadedArtifacts = await loadArtifactFile(options.cwd, artifactFile);\n artifacts.push(...loadedArtifacts);\n }\n\n return artifacts;\n}\n\nasync function loadArtifactFile(cwd: string, artifactFile: string) {\n const artifactPath = resolve(cwd, artifactFile);\n const body = await readFile(artifactPath, \"utf8\");\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(body);\n } catch (error) {\n throw new Error(\n `Invalid audit artifact JSON in \"${artifactFile}\": ${\n error instanceof Error ? error.message : \"parse failed\"\n }`,\n );\n }\n\n if (Array.isArray(parsed)) {\n return parsed as ProbeMeshCallAuditArtifact[];\n }\n\n if (parsed && typeof parsed === \"object\") {\n return [parsed as ProbeMeshCallAuditArtifact];\n }\n\n throw new Error(\n `Audit artifact file \"${artifactFile}\" must contain an artifact object or artifact array.`,\n );\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n bundle: ProbeMeshAuditTrailBundle;\n outputs: ProbeMeshAuditTrailExportCliOutputs;\n}) {\n const artifactPaths: ProbeMeshAuditTrailExportCliOutputs = {};\n\n if (options.outputs.json) {\n const outputPath = resolve(options.cwd, options.outputs.json);\n await writeArtifact(\n outputPath,\n formatProbeMeshAuditTrailBundle(options.bundle, {\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 formatProbeMeshAuditTrailBundle(options.bundle, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = 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): ProbeMeshAuditTrailExportCliResult {\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":["value"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/protocols/x402Redaction.ts
|
|
2
|
+
var DEFAULT_REPLACEMENT = "[REDACTED]";
|
|
3
|
+
var DEFAULT_MAX_DEPTH = 12;
|
|
4
|
+
var PRIVATE_KEY_PATTERN = /\b0x[a-fA-F0-9]{64}\b/g;
|
|
5
|
+
var HEX_SIGNATURE_PATTERN = /\b0x[a-fA-F0-9]{130}\b/g;
|
|
6
|
+
var SECRET_FIELD_NAMES = /* @__PURE__ */ new Set([
|
|
7
|
+
"api-key",
|
|
8
|
+
"apikey",
|
|
9
|
+
"authorization",
|
|
10
|
+
"bearer",
|
|
11
|
+
"payment-required",
|
|
12
|
+
"payment-response",
|
|
13
|
+
"payment-signature",
|
|
14
|
+
"privatekey",
|
|
15
|
+
"signature",
|
|
16
|
+
"x-api-key"
|
|
17
|
+
]);
|
|
18
|
+
function redactX402Secrets(value, options = {}) {
|
|
19
|
+
const replacement = options.replacement ?? DEFAULT_REPLACEMENT;
|
|
20
|
+
const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
|
|
21
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
22
|
+
return redactValue(value, {
|
|
23
|
+
replacement,
|
|
24
|
+
maxDepth,
|
|
25
|
+
depth: 0,
|
|
26
|
+
seen,
|
|
27
|
+
key: void 0
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function redactValue(value, context) {
|
|
31
|
+
if (context.key && shouldRedactKey(context.key)) {
|
|
32
|
+
return context.replacement;
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === "string") {
|
|
35
|
+
return redactString(value, context.replacement);
|
|
36
|
+
}
|
|
37
|
+
if (value === null || typeof value !== "object" || value instanceof Date) {
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
if (context.depth >= context.maxDepth) {
|
|
41
|
+
return "[MaxDepth]";
|
|
42
|
+
}
|
|
43
|
+
if (context.seen.has(value)) {
|
|
44
|
+
return "[Circular]";
|
|
45
|
+
}
|
|
46
|
+
context.seen.add(value);
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
return value.map(
|
|
49
|
+
(entry) => redactValue(entry, {
|
|
50
|
+
...context,
|
|
51
|
+
depth: context.depth + 1,
|
|
52
|
+
key: void 0
|
|
53
|
+
})
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return Object.fromEntries(
|
|
57
|
+
Object.entries(value).map(([key, entry]) => [
|
|
58
|
+
key,
|
|
59
|
+
redactValue(entry, {
|
|
60
|
+
...context,
|
|
61
|
+
depth: context.depth + 1,
|
|
62
|
+
key
|
|
63
|
+
})
|
|
64
|
+
])
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function shouldRedactKey(key) {
|
|
68
|
+
const normalized = key.toLowerCase().replace(/_/g, "-");
|
|
69
|
+
return SECRET_FIELD_NAMES.has(normalized) || normalized.includes("private-key") || normalized.includes("privatekey") || normalized.includes("payment-signature") || normalized.includes("payment-response") || normalized.includes("payment-required") || normalized.includes("api-key");
|
|
70
|
+
}
|
|
71
|
+
function redactString(value, replacement) {
|
|
72
|
+
return value.replace(PRIVATE_KEY_PATTERN, replacement).replace(HEX_SIGNATURE_PATTERN, replacement);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// src/cli/configLoader.ts
|
|
76
|
+
import { readFile } from "fs/promises";
|
|
77
|
+
import { resolve } from "path";
|
|
78
|
+
import { pathToFileURL } from "url";
|
|
79
|
+
async function loadCliConfigDefault(configPath, cwd) {
|
|
80
|
+
const resolvedPath = resolve(cwd, configPath);
|
|
81
|
+
const moduleUrl = pathToFileURL(resolvedPath);
|
|
82
|
+
try {
|
|
83
|
+
const loadedModule = await import(
|
|
84
|
+
/* @vite-ignore */
|
|
85
|
+
moduleUrl.href
|
|
86
|
+
);
|
|
87
|
+
return loadedModule.default;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
return loadSelfContainedConfigFallback(resolvedPath, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function loadSelfContainedConfigFallback(resolvedPath, importError) {
|
|
93
|
+
const source = await readFile(resolvedPath, "utf8");
|
|
94
|
+
if (/\bimport\s/.test(source) || !/\bexport\s+default\b/.test(source)) {
|
|
95
|
+
throw importError;
|
|
96
|
+
}
|
|
97
|
+
const transformedSource = source.replace(
|
|
98
|
+
/\bexport\s+default\b/,
|
|
99
|
+
"const __probemeshDefault ="
|
|
100
|
+
);
|
|
101
|
+
try {
|
|
102
|
+
const factory = new Function(
|
|
103
|
+
`${transformedSource}
|
|
104
|
+
return __probemeshDefault;`
|
|
105
|
+
);
|
|
106
|
+
return factory();
|
|
107
|
+
} catch {
|
|
108
|
+
throw importError;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export {
|
|
113
|
+
redactX402Secrets,
|
|
114
|
+
loadCliConfigDefault
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=chunk-NYTV263W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/protocols/x402Redaction.ts","../src/cli/configLoader.ts"],"sourcesContent":["export interface X402SecretRedactionOptions {\n replacement?: string;\n maxDepth?: number;\n}\n\nconst DEFAULT_REPLACEMENT = \"[REDACTED]\";\nconst DEFAULT_MAX_DEPTH = 12;\nconst PRIVATE_KEY_PATTERN = /\\b0x[a-fA-F0-9]{64}\\b/g;\nconst HEX_SIGNATURE_PATTERN = /\\b0x[a-fA-F0-9]{130}\\b/g;\nconst SECRET_FIELD_NAMES = new Set([\n \"api-key\",\n \"apikey\",\n \"authorization\",\n \"bearer\",\n \"payment-required\",\n \"payment-response\",\n \"payment-signature\",\n \"privatekey\",\n \"signature\",\n \"x-api-key\",\n]);\n\nexport function redactX402Secrets<T>(\n value: T,\n options: X402SecretRedactionOptions = {},\n): T {\n const replacement = options.replacement ?? DEFAULT_REPLACEMENT;\n const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;\n const seen = new WeakSet<object>();\n\n return redactValue(value, {\n replacement,\n maxDepth,\n depth: 0,\n seen,\n key: undefined,\n }) as T;\n}\n\nfunction redactValue(\n value: unknown,\n context: {\n replacement: string;\n maxDepth: number;\n depth: number;\n seen: WeakSet<object>;\n key: string | undefined;\n },\n): unknown {\n if (context.key && shouldRedactKey(context.key)) {\n return context.replacement;\n }\n\n if (typeof value === \"string\") {\n return redactString(value, context.replacement);\n }\n\n if (\n value === null ||\n typeof value !== \"object\" ||\n value instanceof Date\n ) {\n return value;\n }\n\n if (context.depth >= context.maxDepth) {\n return \"[MaxDepth]\";\n }\n\n if (context.seen.has(value)) {\n return \"[Circular]\";\n }\n\n context.seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((entry) =>\n redactValue(entry, {\n ...context,\n depth: context.depth + 1,\n key: undefined,\n }),\n );\n }\n\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n redactValue(entry, {\n ...context,\n depth: context.depth + 1,\n key,\n }),\n ]),\n );\n}\n\nfunction shouldRedactKey(key: string) {\n const normalized = key.toLowerCase().replace(/_/g, \"-\");\n\n return (\n SECRET_FIELD_NAMES.has(normalized) ||\n normalized.includes(\"private-key\") ||\n normalized.includes(\"privatekey\") ||\n normalized.includes(\"payment-signature\") ||\n normalized.includes(\"payment-response\") ||\n normalized.includes(\"payment-required\") ||\n normalized.includes(\"api-key\")\n );\n}\n\nfunction redactString(value: string, replacement: string) {\n return value\n .replace(PRIVATE_KEY_PATTERN, replacement)\n .replace(HEX_SIGNATURE_PATTERN, replacement);\n}\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport async function loadCliConfigDefault(\n configPath: string,\n cwd: string,\n): Promise<unknown> {\n const resolvedPath = resolve(cwd, configPath);\n const moduleUrl = pathToFileURL(resolvedPath);\n\n try {\n const loadedModule = await import(/* @vite-ignore */ moduleUrl.href);\n return loadedModule.default;\n } catch (error) {\n return loadSelfContainedConfigFallback(resolvedPath, error);\n }\n}\n\nasync function loadSelfContainedConfigFallback(\n resolvedPath: string,\n importError: unknown,\n): Promise<unknown> {\n const source = await readFile(resolvedPath, \"utf8\");\n\n if (/\\bimport\\s/.test(source) || !/\\bexport\\s+default\\b/.test(source)) {\n throw importError;\n }\n\n const transformedSource = source.replace(\n /\\bexport\\s+default\\b/,\n \"const __probemeshDefault =\",\n );\n\n try {\n const factory = new Function(\n `${transformedSource}\\nreturn __probemeshDefault;`,\n ) as () => unknown;\n return factory();\n } catch {\n throw importError;\n }\n}\n"],"mappings":"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","names":[]}
|