@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/schemaValidation.ts","../src/providerConformance.ts","../src/cli/providerConformanceCli.ts"],"sourcesContent":["import { ProbeMeshError } from \"./errors\";\nimport type { JsonSchemaLike } from \"./providerKit/types\";\n\nexport interface JsonSchemaLikeValidationError {\n path: string;\n message: string;\n}\n\nexport interface JsonSchemaLikeValidationResult {\n valid: boolean;\n errors: JsonSchemaLikeValidationError[];\n}\n\nexport interface JsonSchemaLikeValidationOptions {\n path?: string;\n}\n\nexport function validateJsonSchemaLikeValue(\n value: unknown,\n schema: JsonSchemaLike,\n options: JsonSchemaLikeValidationOptions = {},\n): JsonSchemaLikeValidationResult {\n const errors: JsonSchemaLikeValidationError[] = [];\n\n validateValue(value, schema, options.path ?? \"$\", errors);\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nexport function assertJsonSchemaLikeValue(\n value: unknown,\n schema: JsonSchemaLike,\n options: JsonSchemaLikeValidationOptions = {},\n): void {\n const result = validateJsonSchemaLikeValue(value, schema, options);\n\n if (result.valid) {\n return;\n }\n\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `JSON schema-lite validation failed: ${formatValidationErrors(\n result.errors,\n )}`,\n });\n}\n\nfunction validateValue(\n value: unknown,\n schema: JsonSchemaLike,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (!isRecord(schema)) {\n errors.push({\n path,\n message: \"schema must be an object.\",\n });\n return;\n }\n\n if (schema.enum !== undefined) {\n if (!Array.isArray(schema.enum)) {\n errors.push({\n path,\n message: \"schema enum must be an array.\",\n });\n } else if (!schema.enum.some((candidate) => deepEqual(candidate, value))) {\n errors.push({\n path,\n message: \"value must match one of the schema enum values.\",\n });\n }\n }\n\n if (schema.type !== undefined) {\n validateType(value, schema.type, path, errors);\n }\n\n if (isRecord(value)) {\n validateObjectValue(value, schema, path, errors);\n }\n\n if (Array.isArray(value)) {\n validateArrayValue(value, schema, path, errors);\n }\n}\n\nfunction validateType(\n value: unknown,\n type: unknown,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (typeof type !== \"string\") {\n errors.push({\n path,\n message: \"schema type must be a string.\",\n });\n return;\n }\n\n const valid =\n type === \"object\"\n ? isRecord(value)\n : type === \"array\"\n ? Array.isArray(value)\n : type === \"string\"\n ? typeof value === \"string\"\n : type === \"number\"\n ? typeof value === \"number\" && Number.isFinite(value)\n : type === \"integer\"\n ? Number.isInteger(value)\n : type === \"boolean\"\n ? typeof value === \"boolean\"\n : type === \"null\"\n ? value === null\n : true;\n\n if (!valid) {\n errors.push({\n path,\n message: `value must be ${type}.`,\n });\n }\n}\n\nfunction validateObjectValue(\n value: Record<string, unknown>,\n schema: JsonSchemaLike,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (schema.required !== undefined) {\n if (!Array.isArray(schema.required)) {\n errors.push({\n path,\n message: \"schema required must be an array.\",\n });\n } else {\n for (const requiredKey of schema.required) {\n if (typeof requiredKey !== \"string\") {\n errors.push({\n path,\n message: \"schema required entries must be strings.\",\n });\n continue;\n }\n\n if (!(requiredKey in value)) {\n errors.push({\n path: `${path}.${requiredKey}`,\n message: \"required property is missing.\",\n });\n }\n }\n }\n }\n\n const properties = isRecord(schema.properties) ? schema.properties : undefined;\n\n if (properties) {\n for (const [key, propertySchema] of Object.entries(properties)) {\n if (key in value) {\n validateValue(\n value[key],\n propertySchema as JsonSchemaLike,\n `${path}.${key}`,\n errors,\n );\n }\n }\n }\n\n if (schema.additionalProperties === false && properties) {\n for (const key of Object.keys(value)) {\n if (!(key in properties)) {\n errors.push({\n path: `${path}.${key}`,\n message: \"additional property is not allowed.\",\n });\n }\n }\n } else if (isRecord(schema.additionalProperties)) {\n const additionalSchema = schema.additionalProperties as JsonSchemaLike;\n\n for (const key of Object.keys(value)) {\n if (!properties || !(key in properties)) {\n validateValue(value[key], additionalSchema, `${path}.${key}`, errors);\n }\n }\n }\n}\n\nfunction validateArrayValue(\n value: unknown[],\n schema: JsonSchemaLike,\n path: string,\n errors: JsonSchemaLikeValidationError[],\n) {\n if (schema.items === undefined) {\n return;\n }\n\n if (!isRecord(schema.items)) {\n errors.push({\n path,\n message: \"schema items must be an object.\",\n });\n return;\n }\n\n value.forEach((item, index) => {\n validateValue(item, schema.items as JsonSchemaLike, `${path}.${index}`, errors);\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction deepEqual(left: unknown, right: unknown) {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction formatValidationErrors(errors: JsonSchemaLikeValidationError[]) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n","import type { HostedTelemetryEvent } from \"./hostedRouter\";\nimport { startHostedRouter } from \"./hostedRouter\";\nimport { createProbeMesh } from \"./client\";\nimport { ProbeMeshError, isProbeMeshError } from \"./errors\";\nimport {\n isSharedJsonSchemaLike,\n validateProviderManifest,\n} from \"./providerKit/manifest\";\nimport type { JsonSchemaLike, ProviderManifest } from \"./providerKit/types\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\nimport {\n validateJsonSchemaLikeValue,\n type JsonSchemaLikeValidationError,\n} from \"./schemaValidation\";\nimport type {\n ProbeMeshAdapter,\n ProbeMeshCallRequest,\n ProbeMeshCallResponse,\n ProbeMeshCallSafety,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteDecisionReason,\n ProbeMeshRouteMetadata,\n ProbeMeshTimelineEventType,\n ReceiptRef,\n ReceiptType,\n} from \"./types\";\n\nexport type ProviderConformanceStatus = \"passed\" | \"failed\";\n\nexport interface ProviderConformanceCheck {\n name: string;\n status: ProviderConformanceStatus;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface ProviderConformanceSchemaValidationMode {\n input?: boolean;\n output?: boolean;\n}\n\nexport interface ProviderConformanceOptions<Input = unknown> {\n manifest: ProviderManifest;\n adapters: ProbeMeshAdapter[];\n request: ProbeMeshCallRequest<Input>;\n apiKey?: string;\n expectedProviderId?: string;\n requiredReceiptTypes?: ReceiptType[];\n schemaValidation?: ProviderConformanceSchemaValidationMode;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderConformanceError {\n name: \"ProbeMeshError\";\n code: ProbeMeshErrorCode;\n message: string;\n status: \"failed\";\n capability?: string;\n provider?: string;\n callId?: string;\n receiptRefs?: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n timeline?: ProbeMeshCallResponse[\"timeline\"];\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProbeMeshRouteMetadata;\n}\n\nexport interface ProviderConformanceSummary {\n status: ProviderConformanceStatus;\n totalChecks: number;\n passedChecks: number;\n failedChecks: number;\n failedCheckNames: string[];\n callId?: string;\n providerId?: string;\n errorCode?: ProbeMeshErrorCode;\n receiptTypes: ReceiptType[];\n requiredReceiptTypes: ReceiptType[];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n route?: {\n routeId?: string;\n selectedProviderId?: string;\n fallbackUsed?: boolean;\n fallbackCount?: number;\n stopReason?: ProbeMeshRouteDecisionReason;\n };\n}\n\nexport interface ProviderConformanceResult<Data = unknown> {\n status: ProviderConformanceStatus;\n checks: ProviderConformanceCheck[];\n response?: ProbeMeshCallResponse<Data>;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n summary: ProviderConformanceSummary;\n}\n\nexport type ProviderConformanceReportFormat = \"json\" | \"markdown\";\n\nexport interface ProviderConformanceReportOptions {\n title?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderConformanceReport {\n title: string;\n status: ProviderConformanceStatus;\n summary: ProviderConformanceSummary;\n checks: ProviderConformanceCheck[];\n receipts: {\n total: number;\n types: ReceiptType[];\n providers: string[];\n byType: Partial<Record<ReceiptType, number>>;\n hasPaymentProof: boolean;\n hasSettlementConfirmation: boolean;\n hasProviderDelivery: boolean;\n };\n route?: ProviderConformanceSummary[\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n error?: ProviderConformanceError;\n}\n\nconst DEFAULT_REQUIRED_RECEIPT_TYPES: ReceiptType[] = [\"provider_delivery\"];\n\nexport async function runProviderConformance<\n Input = unknown,\n Data = unknown,\n>(\n options: ProviderConformanceOptions<Input>,\n): Promise<ProviderConformanceResult<Data>> {\n assertConformanceOptions(options);\n\n const requiredReceiptTypes =\n options.requiredReceiptTypes ?? DEFAULT_REQUIRED_RECEIPT_TYPES;\n const schemaValidation = options.schemaValidation ?? {};\n const forbiddenOutputValues = options.forbiddenOutputValues ?? [];\n const manifestValidation = validateProviderManifest(options.manifest);\n const setupChecks: ProviderConformanceCheck[] = [\n manifestValidation.valid\n ? pass(\"manifest_valid\", \"Provider manifest is valid.\")\n : fail(\"manifest_valid\", \"Provider manifest is invalid.\", {\n errors: manifestValidation.errors,\n }),\n ];\n const inputSchema = schemaValidation.input\n ? schemaForCapability(options.manifest.inputSchema, options.request.capability)\n : undefined;\n\n if (inputSchema) {\n const inputValidation = validateJsonSchemaLikeValue(\n options.request.input,\n inputSchema,\n {\n path: \"$.input\",\n },\n );\n\n setupChecks.push(\n inputValidation.valid\n ? pass(\"input_schema_valid\", \"Request input matches the declared schema.\")\n : fail(\"input_schema_valid\", \"Request input does not match the declared schema.\", {\n errors: inputValidation.errors,\n }),\n );\n } else if (schemaValidation.input) {\n setupChecks.push(\n fail(\"input_schema_valid\", \"No input schema is declared for this capability.\"),\n );\n }\n\n if (setupChecks.some((check) => check.status === \"failed\")) {\n const checks = [\n ...setupChecks,\n createSecretSafeOutputCheck({\n checks: setupChecks,\n requiredReceiptTypes,\n telemetryEvents: [],\n forbiddenOutputValues,\n }),\n ];\n const status = statusFromChecks(checks);\n const sanitizedChecks = sanitizeConformanceOutput(checks, forbiddenOutputValues);\n\n return {\n status,\n checks: sanitizedChecks,\n telemetryEvents: [],\n summary: createSummary({\n status,\n checks: sanitizedChecks,\n telemetryEvents: [],\n requiredReceiptTypes,\n }),\n };\n }\n\n const telemetryEvents: HostedTelemetryEvent[] = [];\n const hostedRouter = await startHostedRouter({\n port: 0,\n adapters: options.adapters,\n apiKeys: options.apiKey ? [options.apiKey] : undefined,\n onTelemetryEvent(event) {\n telemetryEvents.push(event);\n },\n });\n\n let response: ProbeMeshCallResponse<Data> | undefined;\n let error: ProviderConformanceError | undefined;\n\n try {\n const probemesh = createProbeMesh({\n hosted: {\n baseUrl: hostedRouter.url,\n apiKey: options.apiKey,\n },\n });\n\n try {\n response = await probemesh.call<Input, Data>(options.request);\n } catch (caught) {\n error = toConformanceError(caught);\n }\n } finally {\n await hostedRouter.close();\n }\n\n const baseChecks = [\n ...setupChecks,\n ...createExecutionChecks({\n response,\n error,\n telemetryEvents,\n expectedProviderId: options.expectedProviderId ?? options.manifest.id,\n requiredReceiptTypes,\n }),\n ];\n const outputSchema = schemaValidation.output\n ? schemaForCapability(options.manifest.outputSchema, options.request.capability)\n : undefined;\n\n if (outputSchema) {\n baseChecks.push(outputSchemaCheck(response, outputSchema));\n } else if (schemaValidation.output) {\n baseChecks.push(\n fail(\"output_schema_valid\", \"No output schema is declared for this capability.\"),\n );\n }\n\n const checks = [\n ...baseChecks,\n createSecretSafeOutputCheck({\n response,\n error,\n telemetryEvents,\n checks: baseChecks,\n requiredReceiptTypes,\n forbiddenOutputValues,\n }),\n ];\n const status = statusFromChecks(checks);\n const sanitizedChecks = sanitizeConformanceOutput(checks, forbiddenOutputValues);\n const sanitizedResponse = sanitizeConformanceOutput(response, forbiddenOutputValues);\n const sanitizedError = sanitizeConformanceOutput(error, forbiddenOutputValues);\n const sanitizedTelemetryEvents = sanitizeConformanceOutput(\n telemetryEvents,\n forbiddenOutputValues,\n );\n\n return {\n status,\n checks: sanitizedChecks,\n response: sanitizedResponse,\n error: sanitizedError,\n telemetryEvents: sanitizedTelemetryEvents,\n summary: createSummary({\n status,\n checks: sanitizedChecks,\n response: sanitizedResponse,\n error: sanitizedError,\n telemetryEvents: sanitizedTelemetryEvents,\n requiredReceiptTypes,\n }),\n };\n}\n\nexport function createProviderConformanceReport(\n result: ProviderConformanceResult,\n options: ProviderConformanceReportOptions = {},\n): ProviderConformanceReport {\n const receiptRefs = result.response?.receiptRefs ?? result.error?.receiptRefs;\n const report: ProviderConformanceReport = {\n title: options.title ?? \"ProbeMesh Provider Conformance Report\",\n status: result.status,\n summary: result.summary,\n checks: result.checks,\n receipts: summarizeReceipts(receiptRefs),\n route: result.summary.route,\n timelineEventTypes: result.summary.timelineEventTypes,\n telemetryEventTypes: result.summary.telemetryEventTypes,\n safety: result.summary.safety,\n retrySafety: result.summary.retrySafety,\n error: result.error,\n };\n\n return sanitizeConformanceOutput(report, options.forbiddenOutputValues ?? []);\n}\n\nexport function formatProviderConformanceReport(\n report: ProviderConformanceReport,\n options: {\n format?: ProviderConformanceReportFormat;\n } = {},\n) {\n const sanitizedReport = sanitizeConformanceOutput(report, []);\n\n if ((options.format ?? \"markdown\") === \"json\") {\n return JSON.stringify(sanitizedReport, null, 2);\n }\n\n return formatConformanceReportMarkdown(sanitizedReport);\n}\n\nfunction createExecutionChecks(options: {\n response?: ProbeMeshCallResponse;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n expectedProviderId?: string;\n requiredReceiptTypes: ReceiptType[];\n}): ProviderConformanceCheck[] {\n return [\n completedResponseCheck(options.response, options.error),\n selectedProviderCheck(\n options.response,\n options.error,\n options.expectedProviderId,\n ),\n routeMetadataCheck(options.response, options.error),\n timelineEventsCheck(options.response, options.error),\n requiredReceiptsCheck(options.response, options.error, options.requiredReceiptTypes),\n safetyMetadataCheck(options.response, options.error, options.requiredReceiptTypes),\n retrySafetyCheck(options.response, options.error),\n telemetryMatchesTimelineCheck(options.response, options.telemetryEvents),\n ];\n}\n\nfunction completedResponseCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n if (response?.status === \"completed\") {\n return pass(\"completed_response\", \"Hosted provider call completed.\");\n }\n\n return fail(\n \"completed_response\",\n error\n ? `Hosted provider call failed with ${error.code}.`\n : \"Hosted provider call did not return a completed response.\",\n {\n errorCode: error?.code,\n errorMessage: error?.message,\n },\n );\n}\n\nfunction selectedProviderCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n expectedProviderId: string | undefined,\n) {\n const providerId = response?.provider.id;\n\n if (\n providerId &&\n (!expectedProviderId || providerId === expectedProviderId)\n ) {\n return pass(\"selected_provider\", \"Hosted route selected the expected provider.\", {\n providerId,\n });\n }\n\n return fail(\"selected_provider\", \"Hosted route did not select the expected provider.\", {\n expectedProviderId,\n providerId,\n errorProvider: error?.provider,\n });\n}\n\nfunction routeMetadataCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n if (\n response?.route?.mode === \"hosted\" &&\n typeof response.route.routeId === \"string\" &&\n response.route.routeId.length > 0\n ) {\n return pass(\"route_metadata\", \"Hosted route metadata is present.\", {\n routeId: response.route.routeId,\n selectedProviderId: response.route.selectedProviderId,\n });\n }\n\n return fail(\"route_metadata\", \"Hosted route metadata is missing.\", {\n errorRouteId: error?.route?.routeId,\n });\n}\n\nfunction timelineEventsCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n const timelineEventTypes =\n response?.timeline?.events.map((event) => event.type) ?? [];\n const requiredEvents: ProbeMeshTimelineEventType[] = [\n \"call.requested\",\n \"provider.attempted\",\n \"provider.selected\",\n \"call.completed\",\n ];\n const missingEvents = requiredEvents.filter(\n (eventType) => !timelineEventTypes.includes(eventType),\n );\n\n if (missingEvents.length === 0) {\n return pass(\"timeline_events\", \"Hosted timeline contains the provider conformance events.\", {\n timelineEventTypes,\n });\n }\n\n return fail(\"timeline_events\", \"Hosted timeline is missing required events.\", {\n missingEvents,\n timelineEventTypes,\n errorTimelineEventTypes: error?.timeline?.events.map((event) => event.type),\n });\n}\n\nfunction requiredReceiptsCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n requiredReceiptTypes: ReceiptType[],\n) {\n const receiptTypes = getReceiptTypes(response?.receiptRefs);\n const missingReceiptTypes = requiredReceiptTypes.filter(\n (receiptType) => !receiptTypes.includes(receiptType),\n );\n\n if (missingReceiptTypes.length === 0) {\n return pass(\"required_receipts\", \"Required receipts are present.\", {\n receiptTypes,\n });\n }\n\n return fail(\"required_receipts\", \"Required receipts are missing.\", {\n missingReceiptTypes,\n receiptTypes,\n errorReceiptTypes: getReceiptTypes(error?.receiptRefs),\n });\n}\n\nfunction safetyMetadataCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n requiredReceiptTypes: ReceiptType[],\n) {\n const requiresPaymentSafety = requiredReceiptTypes.some((receiptType) =>\n [\"payment_proof\", \"settlement_confirmation\"].includes(receiptType),\n );\n\n if (!requiresPaymentSafety) {\n return pass(\"safety_metadata\", \"Payment safety metadata is not required for this conformance run.\");\n }\n\n if (response?.safety) {\n return pass(\"safety_metadata\", \"Safety metadata is present for paid conformance.\", {\n safety: response.safety,\n });\n }\n\n return fail(\"safety_metadata\", \"Safety metadata is missing for paid conformance.\", {\n errorSafety: error?.safety,\n });\n}\n\nfunction retrySafetyCheck(\n response: ProbeMeshCallResponse | undefined,\n error: ProviderConformanceError | undefined,\n) {\n if (response?.retrySafety) {\n return pass(\"retry_safety\", \"Hosted response includes retry safety metadata.\", {\n retrySafety: response.retrySafety,\n });\n }\n\n return fail(\"retry_safety\", \"Hosted response retry safety metadata is missing.\", {\n errorRetrySafety: error?.retrySafety,\n });\n}\n\nfunction telemetryMatchesTimelineCheck(\n response: ProbeMeshCallResponse | undefined,\n telemetryEvents: HostedTelemetryEvent[],\n) {\n const timelineEventTypes =\n response?.timeline?.events.map((event) => event.type) ?? [];\n const telemetryEventTypes = telemetryEvents.map((event) => event.type);\n const matches =\n timelineEventTypes.length > 0 &&\n timelineEventTypes.length === telemetryEventTypes.length &&\n timelineEventTypes.every(\n (eventType, index) => eventType === telemetryEventTypes[index],\n );\n\n if (matches) {\n return pass(\"telemetry_matches_timeline\", \"Telemetry mirrors the hosted timeline.\", {\n telemetryEventTypes,\n });\n }\n\n return fail(\"telemetry_matches_timeline\", \"Telemetry does not mirror the hosted timeline.\", {\n timelineEventTypes,\n telemetryEventTypes,\n });\n}\n\nfunction outputSchemaCheck(\n response: ProbeMeshCallResponse | undefined,\n schema: JsonSchemaLike,\n) {\n if (!response) {\n return fail(\"output_schema_valid\", \"Cannot validate output schema without a response.\");\n }\n\n const result = validateJsonSchemaLikeValue(response.data, schema, {\n path: \"$.data\",\n });\n\n if (result.valid) {\n return pass(\"output_schema_valid\", \"Provider response data matches the declared schema.\");\n }\n\n return fail(\"output_schema_valid\", \"Provider response data does not match the declared schema.\", {\n errors: result.errors,\n });\n}\n\nfunction createSecretSafeOutputCheck(options: {\n response?: ProbeMeshCallResponse;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n checks: ProviderConformanceCheck[];\n requiredReceiptTypes: ReceiptType[];\n forbiddenOutputValues: string[];\n}) {\n const forbiddenOutputValues = options.forbiddenOutputValues.filter(\n (value) => value.length > 0,\n );\n const candidate = {\n response: options.response,\n error: options.error,\n telemetryEvents: options.telemetryEvents,\n checks: options.checks,\n summary: createSummary({\n status: statusFromChecks(options.checks),\n checks: options.checks,\n response: options.response,\n error: options.error,\n telemetryEvents: options.telemetryEvents,\n requiredReceiptTypes: options.requiredReceiptTypes,\n }),\n };\n const serialized = JSON.stringify(candidate);\n const leakedValues = forbiddenOutputValues.filter((value) =>\n serialized.includes(value),\n );\n\n if (leakedValues.length === 0) {\n return pass(\"secret_safe_output\", \"Serialized conformance output contains no forbidden values.\", {\n checkedForbiddenValueCount: forbiddenOutputValues.length,\n });\n }\n\n return fail(\"secret_safe_output\", \"Serialized conformance output contains forbidden values.\", {\n leakedValueCount: leakedValues.length,\n });\n}\n\nfunction createSummary(options: {\n status: ProviderConformanceStatus;\n checks: ProviderConformanceCheck[];\n response?: ProbeMeshCallResponse;\n error?: ProviderConformanceError;\n telemetryEvents: HostedTelemetryEvent[];\n requiredReceiptTypes: ReceiptType[];\n}): ProviderConformanceSummary {\n const receiptRefs = options.response?.receiptRefs ?? options.error?.receiptRefs;\n const timeline = options.response?.timeline ?? options.error?.timeline;\n const route = options.response?.route ?? options.error?.route;\n const failedCheckNames = options.checks\n .filter((check) => check.status === \"failed\")\n .map((check) => check.name);\n\n return {\n status: options.status,\n totalChecks: options.checks.length,\n passedChecks: options.checks.length - failedCheckNames.length,\n failedChecks: failedCheckNames.length,\n failedCheckNames,\n callId: options.response?.callId ?? options.error?.callId,\n providerId: options.response?.provider.id ?? options.error?.provider,\n errorCode: options.error?.code,\n receiptTypes: getReceiptTypes(receiptRefs),\n requiredReceiptTypes: [...options.requiredReceiptTypes],\n timelineEventTypes: timeline?.events.map((event) => event.type) ?? [],\n telemetryEventTypes: options.telemetryEvents.map((event) => event.type),\n safety: options.response?.safety ?? options.error?.safety,\n retrySafety: options.response?.retrySafety ?? options.error?.retrySafety,\n route: route\n ? {\n routeId: route.routeId,\n selectedProviderId: route.selectedProviderId,\n fallbackUsed: route.explanation?.fallbackUsed,\n fallbackCount: route.explanation?.fallbackCount,\n stopReason: route.explanation?.stopReason,\n }\n : undefined,\n };\n}\n\nfunction summarizeReceipts(receiptRefs: ReceiptRef[] | undefined) {\n const receipts = receiptRefs ?? [];\n const byType: Partial<Record<ReceiptType, number>> = {};\n\n for (const receiptRef of receipts) {\n byType[receiptRef.type] = (byType[receiptRef.type] ?? 0) + 1;\n }\n\n return {\n total: receipts.length,\n types: getReceiptTypes(receipts),\n providers: [\n ...new Set(receipts.map((receiptRef) => receiptRef.provider)),\n ],\n byType,\n hasPaymentProof: receipts.some(\n (receiptRef) => receiptRef.type === \"payment_proof\",\n ),\n hasSettlementConfirmation: receipts.some(\n (receiptRef) => receiptRef.type === \"settlement_confirmation\",\n ),\n hasProviderDelivery: receipts.some(\n (receiptRef) => receiptRef.type === \"provider_delivery\",\n ),\n };\n}\n\nfunction formatConformanceReportMarkdown(report: ProviderConformanceReport) {\n const lines = [\n `# ${report.title}`,\n \"\",\n `Conformance: ${report.status}`,\n `Provider: ${report.summary.providerId ?? \"unknown\"}`,\n `Call: ${report.summary.callId ?? \"unknown\"}`,\n `Error: ${report.summary.errorCode ?? \"none\"}`,\n \"\",\n \"## Checks\",\n ...report.checks.map(\n (check) =>\n `- [${check.status === \"passed\" ? \"x\" : \" \"}] ${check.name}: ${check.message}`,\n ),\n \"\",\n \"## Receipts\",\n `- Total: ${report.receipts.total}`,\n `- Types: ${formatInlineList(report.receipts.types)}`,\n `- Providers: ${formatInlineList(report.receipts.providers)}`,\n \"\",\n \"## Route\",\n `- Route ID: ${report.route?.routeId ?? \"none\"}`,\n `- Selected provider: ${report.route?.selectedProviderId ?? \"none\"}`,\n `- Stop reason: ${report.route?.stopReason ?? \"none\"}`,\n \"\",\n \"## Safety\",\n `- Payment: ${report.safety?.paymentStatus ?? \"unknown\"}`,\n `- Settlement: ${report.safety?.settlementStatus ?? \"unknown\"}`,\n `- Delivery: ${report.safety?.deliveryStatus ?? \"unknown\"}`,\n `- Money may have moved: ${String(\n report.safety?.moneyMayHaveMoved ?? false,\n )}`,\n \"\",\n \"## Retry Safety\",\n `- Retryable: ${String(report.retrySafety?.retryable ?? false)}`,\n `- Safe to auto retry: ${String(\n report.retrySafety?.safeToAutoRetry ?? false,\n )}`,\n `- Reason: ${report.retrySafety?.reason ?? \"unknown\"}`,\n \"\",\n \"## Timeline\",\n `- Events: ${formatInlineList(report.timelineEventTypes)}`,\n `- Telemetry: ${formatInlineList(report.telemetryEventTypes)}`,\n ];\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction schemaForCapability(\n declaration: JsonSchemaLike | Record<string, JsonSchemaLike>,\n capability: string,\n): JsonSchemaLike | undefined {\n if (isSharedJsonSchemaLike(declaration)) {\n return declaration;\n }\n\n return declaration[capability];\n}\n\nfunction toConformanceError(error: unknown): ProviderConformanceError {\n if (isProbeMeshError(error)) {\n return {\n name: \"ProbeMeshError\",\n code: error.code,\n message: error.message,\n status: \"failed\",\n capability: error.capability,\n provider: error.provider,\n callId: error.callId,\n receiptRefs: error.receiptRefs,\n safety: error.safety,\n timeline: error.timeline,\n retrySafety: error.retrySafety,\n route: error.route,\n };\n }\n\n return {\n name: \"ProbeMeshError\",\n code: \"provider_unavailable\",\n message:\n error instanceof Error\n ? error.message\n : \"provider conformance call failed.\",\n status: \"failed\",\n };\n}\n\nfunction sanitizeConformanceOutput<T>(\n value: T,\n forbiddenOutputValues: string[],\n): T {\n const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);\n\n return redactX402Secrets(\n replaceForbiddenValues(value, forbiddenValues, new WeakSet<object>()),\n ) as T;\n}\n\nfunction replaceForbiddenValues(\n value: unknown,\n forbiddenValues: string[],\n seen: WeakSet<object>,\n): unknown {\n if (typeof value === \"string\") {\n return forbiddenValues.reduce(\n (current, forbidden) => current.split(forbidden).join(\"[REDACTED]\"),\n value,\n );\n }\n\n if (value === null || typeof value !== \"object\" || value instanceof Date) {\n return value;\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n\n seen.add(value);\n\n if (Array.isArray(value)) {\n const entries = value.map((entry) =>\n replaceForbiddenValues(entry, forbiddenValues, seen),\n );\n\n seen.delete(value);\n return entries;\n }\n\n const entries = Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n replaceForbiddenValues(entry, forbiddenValues, seen),\n ]),\n );\n\n seen.delete(value);\n return entries;\n}\n\nfunction assertConformanceOptions(\n options: ProviderConformanceOptions,\n): asserts options is ProviderConformanceOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.adapters)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance adapters must be an array.\",\n });\n }\n\n if (\n !options.request ||\n typeof options.request !== \"object\" ||\n Array.isArray(options.request)\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider conformance request must be an object.\",\n });\n }\n}\n\nfunction getReceiptTypes(receiptRefs: ReceiptRef[] | undefined) {\n return [...new Set((receiptRefs ?? []).map((receiptRef) => receiptRef.type))];\n}\n\nfunction statusFromChecks(checks: ProviderConformanceCheck[]) {\n return checks.every((check) => check.status === \"passed\")\n ? \"passed\"\n : \"failed\";\n}\n\nfunction formatInlineList(values: readonly string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction pass(\n name: string,\n message: string,\n details?: Record<string, unknown>,\n): ProviderConformanceCheck {\n return {\n name,\n status: \"passed\",\n message,\n details,\n };\n}\n\nfunction fail(\n name: string,\n message: string,\n details?: Record<string, unknown>,\n): ProviderConformanceCheck {\n return {\n name,\n status: \"failed\",\n message,\n details,\n };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProviderConformanceArtifact,\n formatProviderConformanceArtifact,\n} from \"../providerConformanceArtifact\";\nimport type {\n ProviderConformanceArtifact,\n ProviderConformanceArtifactOptions,\n} from \"../providerConformanceArtifact\";\nimport {\n createProviderConformanceReport,\n formatProviderConformanceReport,\n runProviderConformance,\n} from \"../providerConformance\";\nimport type {\n ProviderConformanceOptions,\n ProviderConformanceReport,\n ProviderConformanceReportFormat,\n ProviderConformanceReportOptions,\n ProviderConformanceResult,\n} from \"../providerConformance\";\n\nexport interface ProviderConformanceCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderConformanceCliOutputs {\n json?: string;\n markdown?: string;\n artifact?: string;\n}\n\nexport interface ProviderConformanceCliArtifact\n extends Omit<ProviderConformanceArtifactOptions, \"manifest\" | \"report\"> {\n format?: \"json\" | \"markdown\";\n}\n\nexport interface ProviderConformanceCliConfig {\n conformance: ProviderConformanceOptions;\n report?: ProviderConformanceReportOptions & {\n format?: ProviderConformanceReportFormat;\n };\n artifact?: ProviderConformanceCliArtifact;\n outputs?: ProviderConformanceCliOutputs;\n}\n\nexport type ProviderConformanceCliConfigExport =\n | ProviderConformanceCliConfig\n | ProviderConformanceCliSkip;\n\nexport type ProviderConformanceCliConfigFactory = (\n context: ProviderConformanceCliConfigContext,\n) =>\n | ProviderConformanceCliConfigExport\n | Promise<ProviderConformanceCliConfigExport>;\n\nexport interface ProviderConformanceCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderConformanceCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderConformanceCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderConformanceCliSkip;\n result?: ProviderConformanceResult;\n report?: ProviderConformanceReport;\n artifact?: ProviderConformanceArtifact;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderConformanceCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderConformanceReportFormat;\n outJson?: string;\n outMarkdown?: string;\n outArtifact?: string;\n title?: string;\n artifactId?: string;\n generatedAt?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-conformance --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-artifact <path>] [--title <text>] [--artifact-id <text>] [--generated-at <iso>]\";\n\nexport async function runProviderConformanceCli(\n options: ProviderConformanceCliOptions = {},\n): Promise<ProviderConformanceCliResult> {\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 conformance skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const result = await runProviderConformance(configExport.conformance);\n const report = createProviderConformanceReport(result, {\n ...(configExport.report ?? {}),\n title: parsedArgs.title ?? configExport.report?.title,\n });\n const outputs = {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n artifact: parsedArgs.outArtifact ?? configExport.outputs?.artifact,\n };\n const artifact = createOptionalArtifact({\n config: configExport,\n report,\n artifactId: parsedArgs.artifactId,\n generatedAt: parsedArgs.generatedAt,\n requestedArtifactOutput: outputs.artifact,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.report?.format ?? \"markdown\";\n const stdout = formatProviderConformanceReport(report, {\n format: selectedFormat,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n report,\n artifact,\n outputs,\n });\n\n return {\n exitCode: result.status === \"passed\" ? 0 : 1,\n skipped: false,\n result,\n report,\n artifact,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error\n ? error.message\n : \"Unknown provider conformance 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-artifact\") {\n parsedArgs.outArtifact = 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 if (arg === \"--artifact-id\") {\n parsedArgs.artifactId = 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: ProviderConformanceCliConfigContext,\n): Promise<ProviderConformanceCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderConformanceCliConfigFactory)(context);\n }\n\n return configExport as ProviderConformanceCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderConformanceCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderConformanceCliSkip>).skip === true &&\n typeof (value as Partial<ProviderConformanceCliSkip>).reason === \"string\"\n );\n}\n\nfunction assertCliConfig(\n config: unknown,\n): asserts config is ProviderConformanceCliConfig {\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new Error(\"Provider conformance CLI config must be an object.\");\n }\n\n const candidate = config as Partial<ProviderConformanceCliConfig>;\n\n if (\n !candidate.conformance ||\n typeof candidate.conformance !== \"object\" ||\n Array.isArray(candidate.conformance)\n ) {\n throw new Error(\"Provider conformance CLI config requires conformance options.\");\n }\n\n if (candidate.report !== undefined && !isRecord(candidate.report)) {\n throw new Error(\"Provider conformance CLI report config must be an object.\");\n }\n\n if (candidate.artifact !== undefined && !isRecord(candidate.artifact)) {\n throw new Error(\"Provider conformance CLI artifact config must be an object.\");\n }\n\n if (candidate.outputs !== undefined) {\n assertOutputs(candidate.outputs);\n }\n}\n\nfunction assertOutputs(outputs: unknown) {\n if (!isRecord(outputs)) {\n throw new Error(\"Provider conformance CLI outputs must be an object.\");\n }\n\n for (const [key, value] of Object.entries(outputs)) {\n if (\n ![\"json\", \"markdown\", \"artifact\"].includes(key) ||\n (value !== undefined && typeof value !== \"string\")\n ) {\n throw new Error(\n \"Provider conformance CLI outputs may only include json, markdown, and artifact string paths.\",\n );\n }\n }\n}\n\nfunction createOptionalArtifact(options: {\n config: ProviderConformanceCliConfig;\n report: ProviderConformanceReport;\n artifactId?: string;\n generatedAt?: string;\n requestedArtifactOutput?: string;\n}) {\n if (!options.config.artifact && !options.requestedArtifactOutput) {\n return undefined;\n }\n\n return createProviderConformanceArtifact({\n manifest: options.config.conformance.manifest,\n report: options.report,\n artifactId: options.artifactId ?? options.config.artifact?.artifactId,\n generatedAt: options.generatedAt ?? options.config.artifact?.generatedAt,\n forbiddenOutputValues:\n options.config.artifact?.forbiddenOutputValues ??\n options.config.report?.forbiddenOutputValues ??\n options.config.conformance.forbiddenOutputValues,\n });\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n report: ProviderConformanceReport;\n artifact?: ProviderConformanceArtifact;\n outputs: ProviderConformanceCliOutputs;\n}) {\n const artifactPaths: ProviderConformanceCliOutputs = {};\n\n if (options.outputs.json) {\n const path = resolve(options.cwd, options.outputs.json);\n await writeTextFile(\n path,\n formatProviderConformanceReport(options.report, {\n format: \"json\",\n }),\n );\n artifactPaths.json = path;\n }\n\n if (options.outputs.markdown) {\n const path = resolve(options.cwd, options.outputs.markdown);\n await writeTextFile(\n path,\n formatProviderConformanceReport(options.report, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = path;\n }\n\n if (options.outputs.artifact) {\n if (!options.artifact) {\n throw new Error(\"Provider conformance artifact output requested but no artifact was created.\");\n }\n\n const path = resolve(options.cwd, options.outputs.artifact);\n await writeTextFile(\n path,\n formatProviderConformanceArtifact(options.artifact, {\n format: \"json\",\n }),\n );\n artifactPaths.artifact = path;\n }\n\n return artifactPaths;\n}\n\nasync function writeTextFile(path: string, body: string) {\n await mkdir(dirname(path), {\n recursive: true,\n });\n await writeFile(path, body);\n}\n\nfunction cliFailure(message: string): ProviderConformanceCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `Provider conformance CLI failed: ${message}\\n`,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":["checks","status","sanitizedChecks","entries","isRecord"]}
|