@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/protocols/x402Acceptance.ts","../src/cli/x402AcceptanceCli.ts"],"sourcesContent":["import type { HostedTelemetryEvent } from \"../hostedRouter\";\nimport { startHostedRouter } from \"../hostedRouter\";\nimport { createProbeMesh } from \"../client\";\nimport { ProbeMeshError, isProbeMeshError } from \"../errors\";\nimport { redactX402Secrets } from \"./x402Redaction\";\nimport type {\n ProbeMeshAdapter,\n ProbeMeshCallRequest,\n ProbeMeshCallResponse,\n ProbeMeshCallSafety,\n ProbeMeshCallTimeline,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteDecisionReason,\n ProbeMeshRouteMetadata,\n ProbeMeshTimelineEventType,\n ReceiptRef,\n ReceiptType,\n} from \"../types\";\n\nexport type X402ProviderAcceptanceStatus = \"passed\" | \"failed\";\n\nexport interface X402ProviderAcceptanceCheck {\n name: string;\n status: X402ProviderAcceptanceStatus;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface X402ProviderAcceptanceOptions<Input = unknown> {\n adapters: ProbeMeshAdapter[];\n request: ProbeMeshCallRequest<Input>;\n apiKey?: string;\n expectedProviderId?: string;\n requiredReceiptTypes?: ReceiptType[];\n forbiddenOutputValues?: string[];\n}\n\nexport interface X402ProviderAcceptanceError {\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?: ProbeMeshCallTimeline;\n retrySafety?: ProbeMeshRetrySafety;\n route?: ProbeMeshRouteMetadata;\n}\n\nexport interface X402ProviderAcceptanceResult<Data = unknown> {\n status: X402ProviderAcceptanceStatus;\n checks: X402ProviderAcceptanceCheck[];\n response?: ProbeMeshCallResponse<Data>;\n error?: X402ProviderAcceptanceError;\n telemetryEvents: HostedTelemetryEvent[];\n summary: X402ProviderAcceptanceSummary;\n}\n\nexport interface X402ProviderAcceptanceSummary {\n status: X402ProviderAcceptanceStatus;\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 type X402ProviderAcceptanceGateStatus = \"accepted\" | \"rejected\";\n\nexport interface X402ProviderAcceptanceGateOptions {\n requiredCheckNames?: string[];\n}\n\nexport interface X402ProviderAcceptanceGate {\n accepted: boolean;\n status: X402ProviderAcceptanceGateStatus;\n requiredCheckNames: string[];\n failedRequiredCheckNames: string[];\n reasons: string[];\n}\n\nexport interface X402ProviderAcceptanceReportOptions {\n gate?: X402ProviderAcceptanceGateOptions;\n forbiddenOutputValues?: string[];\n title?: string;\n}\n\nexport type X402ProviderAcceptanceReportFormat = \"json\" | \"markdown\";\n\nexport interface X402ProviderAcceptanceReport {\n title: string;\n status: X402ProviderAcceptanceStatus;\n gate: X402ProviderAcceptanceGate;\n summary: X402ProviderAcceptanceSummary;\n checks: X402ProviderAcceptanceCheck[];\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?: X402ProviderAcceptanceSummary[\"route\"];\n timelineEventTypes: ProbeMeshTimelineEventType[];\n telemetryEventTypes: ProbeMeshTimelineEventType[];\n safety?: ProbeMeshCallSafety;\n retrySafety?: ProbeMeshRetrySafety;\n error?: X402ProviderAcceptanceError;\n}\n\nconst DEFAULT_REQUIRED_RECEIPT_TYPES: ReceiptType[] = [\n \"payment_proof\",\n \"settlement_confirmation\",\n \"provider_delivery\",\n];\n\nexport async function runX402ProviderAcceptance<\n Input = unknown,\n Data = unknown,\n>(\n options: X402ProviderAcceptanceOptions<Input>,\n): Promise<X402ProviderAcceptanceResult<Data>> {\n assertAcceptanceOptions(options);\n\n const telemetryEvents: HostedTelemetryEvent[] = [];\n const requiredReceiptTypes =\n options.requiredReceiptTypes ?? DEFAULT_REQUIRED_RECEIPT_TYPES;\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: X402ProviderAcceptanceError | 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 = toAcceptanceError(caught);\n }\n } finally {\n await hostedRouter.close();\n }\n\n const baseChecks = createAcceptanceChecks({\n response,\n error,\n telemetryEvents,\n expectedProviderId: options.expectedProviderId,\n requiredReceiptTypes,\n });\n const checks = [\n ...baseChecks,\n createSecretSafeOutputCheck({\n response,\n error,\n telemetryEvents,\n checks: baseChecks,\n requiredReceiptTypes,\n forbiddenOutputValues: options.forbiddenOutputValues ?? [],\n }),\n ];\n const status = checks.every((check) => check.status === \"passed\")\n ? \"passed\"\n : \"failed\";\n const forbiddenOutputValues = options.forbiddenOutputValues ?? [];\n const sanitizedChecks = sanitizeAcceptanceOutput(checks, forbiddenOutputValues);\n const sanitizedResponse = sanitizeAcceptanceOutput(response, forbiddenOutputValues);\n const sanitizedError = sanitizeAcceptanceOutput(error, forbiddenOutputValues);\n const sanitizedTelemetryEvents = sanitizeAcceptanceOutput(\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 summarizeX402AcceptanceResult(\n result: X402ProviderAcceptanceResult,\n): X402ProviderAcceptanceSummary {\n return createSummary({\n status: result.status,\n checks: result.checks,\n response: result.response,\n error: result.error,\n telemetryEvents: result.telemetryEvents,\n requiredReceiptTypes: result.summary.requiredReceiptTypes,\n });\n}\n\nexport function evaluateX402ProviderAcceptanceGate(\n result: X402ProviderAcceptanceResult,\n options: X402ProviderAcceptanceGateOptions = {},\n): X402ProviderAcceptanceGate {\n const requiredCheckNames =\n options.requiredCheckNames ?? result.checks.map((check) => check.name);\n const failedRequiredCheckNames = requiredCheckNames.filter((checkName) => {\n const check = result.checks.find((candidate) => candidate.name === checkName);\n\n return check?.status !== \"passed\";\n });\n const reasons = createGateReasons({\n result,\n requiredCheckNames,\n failedRequiredCheckNames,\n });\n const accepted =\n result.status === \"passed\" && failedRequiredCheckNames.length === 0;\n\n return {\n accepted,\n status: accepted ? \"accepted\" : \"rejected\",\n requiredCheckNames: [...requiredCheckNames],\n failedRequiredCheckNames,\n reasons: accepted\n ? [\"All required x402 provider acceptance checks passed.\"]\n : reasons,\n };\n}\n\nexport function createX402ProviderAcceptanceReport(\n result: X402ProviderAcceptanceResult,\n options: X402ProviderAcceptanceReportOptions = {},\n): X402ProviderAcceptanceReport {\n const summary = summarizeX402AcceptanceResult(result);\n const receiptRefs = result.response?.receiptRefs ?? result.error?.receiptRefs;\n const report: X402ProviderAcceptanceReport = {\n title: options.title ?? \"x402 Provider Acceptance Report\",\n status: result.status,\n gate: evaluateX402ProviderAcceptanceGate(result, options.gate),\n summary,\n checks: result.checks,\n receipts: summarizeAcceptanceReceipts(receiptRefs),\n route: summary.route,\n timelineEventTypes: summary.timelineEventTypes,\n telemetryEventTypes: summary.telemetryEventTypes,\n safety: summary.safety,\n retrySafety: summary.retrySafety,\n error: result.error,\n };\n\n return sanitizeAcceptanceOutput(report, options.forbiddenOutputValues ?? []);\n}\n\nexport function formatX402ProviderAcceptanceReport(\n report: X402ProviderAcceptanceReport,\n options: {\n format?: X402ProviderAcceptanceReportFormat;\n } = {},\n): string {\n const sanitizedReport = sanitizeAcceptanceOutput(report, []);\n\n if ((options.format ?? \"markdown\") === \"json\") {\n return JSON.stringify(sanitizedReport, null, 2);\n }\n\n return formatAcceptanceReportMarkdown(sanitizedReport);\n}\n\nfunction createAcceptanceChecks(options: {\n response?: ProbeMeshCallResponse;\n error?: X402ProviderAcceptanceError;\n telemetryEvents: HostedTelemetryEvent[];\n expectedProviderId?: string;\n requiredReceiptTypes: ReceiptType[];\n}): X402ProviderAcceptanceCheck[] {\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 safetySettledDeliveredCheck(options.response, options.error),\n retrySafetyAfterSuccessCheck(options.response, options.error),\n telemetryMatchesTimelineCheck(options.response, options.telemetryEvents),\n ];\n}\n\nfunction createGateReasons(options: {\n result: X402ProviderAcceptanceResult;\n requiredCheckNames: string[];\n failedRequiredCheckNames: string[];\n}) {\n const reasons: string[] = [];\n\n if (options.result.status !== \"passed\") {\n reasons.push(`Acceptance result status is \"${options.result.status}\".`);\n }\n\n for (const checkName of options.failedRequiredCheckNames) {\n const check = options.result.checks.find(\n (candidate) => candidate.name === checkName,\n );\n\n if (!check) {\n reasons.push(`Required check \"${checkName}\" was not found.`);\n continue;\n }\n\n reasons.push(`Required check \"${checkName}\" failed: ${check.message}`);\n }\n\n return reasons;\n}\n\nfunction summarizeAcceptanceReceipts(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 formatAcceptanceReportMarkdown(\n report: X402ProviderAcceptanceReport,\n) {\n const lines = [\n `# ${report.title}`,\n \"\",\n `Gate: ${report.gate.status}`,\n `Acceptance: ${report.status}`,\n `Provider: ${report.summary.providerId ?? \"unknown\"}`,\n `Call: ${report.summary.callId ?? \"unknown\"}`,\n `Error: ${report.summary.errorCode ?? \"none\"}`,\n \"\",\n \"## Gate Reasons\",\n ...formatList(report.gate.reasons),\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 `- Payment proof: ${String(report.receipts.hasPaymentProof)}`,\n `- Settlement confirmation: ${String(\n report.receipts.hasSettlementConfirmation,\n )}`,\n `- Provider delivery: ${String(report.receipts.hasProviderDelivery)}`,\n \"\",\n \"## Route\",\n `- Route ID: ${report.route?.routeId ?? \"none\"}`,\n `- Selected provider: ${report.route?.selectedProviderId ?? \"none\"}`,\n `- Fallback used: ${String(report.route?.fallbackUsed ?? false)}`,\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 formatList(values: string[]) {\n if (values.length === 0) {\n return [\"- none\"];\n }\n\n return values.map((value) => `- ${value}`);\n}\n\nfunction formatInlineList(values: readonly string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction completedResponseCheck(\n response: ProbeMeshCallResponse | undefined,\n error: X402ProviderAcceptanceError | undefined,\n) {\n if (response?.status === \"completed\") {\n return pass(\"completed_response\", \"Hosted x402 call completed.\");\n }\n\n return fail(\n \"completed_response\",\n error\n ? `Hosted x402 call failed with ${error.code}.`\n : \"Hosted x402 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: X402ProviderAcceptanceError | 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: X402ProviderAcceptanceError | 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: X402ProviderAcceptanceError | 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 \"payment.attempted\",\n \"receipt.recorded\",\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 x402 acceptance events.\", {\n timelineEventTypes,\n });\n }\n\n return fail(\"timeline_events\", \"Hosted timeline is missing required x402 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: X402ProviderAcceptanceError | 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 x402 receipts are present.\", {\n receiptTypes,\n });\n }\n\n return fail(\"required_receipts\", \"Required x402 receipts are missing.\", {\n missingReceiptTypes,\n receiptTypes,\n errorReceiptTypes: getReceiptTypes(error?.receiptRefs),\n });\n}\n\nfunction safetySettledDeliveredCheck(\n response: ProbeMeshCallResponse | undefined,\n error: X402ProviderAcceptanceError | undefined,\n) {\n const safety = response?.safety;\n\n if (\n safety?.paymentStatus === \"authorized\" &&\n safety.settlementStatus === \"settled\" &&\n safety.deliveryStatus === \"delivered\" &&\n safety.moneyMayHaveMoved === true\n ) {\n return pass(\"safety_settled_delivered\", \"Safety metadata proves authorized, settled delivery.\", {\n safety,\n });\n }\n\n return fail(\n \"safety_settled_delivered\",\n \"Safety metadata does not prove settled delivery.\",\n {\n safety,\n errorSafety: error?.safety,\n },\n );\n}\n\nfunction retrySafetyAfterSuccessCheck(\n response: ProbeMeshCallResponse | undefined,\n error: X402ProviderAcceptanceError | undefined,\n) {\n const retrySafety = response?.retrySafety;\n\n if (\n retrySafety?.retryable === false &&\n retrySafety.safeToAutoRetry === false &&\n retrySafety.reason === \"completed\"\n ) {\n return pass(\"retry_safety_after_success\", \"Completed paid call is not retryable.\", {\n retrySafety,\n });\n }\n\n return fail(\n \"retry_safety_after_success\",\n \"Completed paid call retry safety is missing or incorrect.\",\n {\n retrySafety,\n errorRetrySafety: error?.retrySafety,\n },\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 createSecretSafeOutputCheck(options: {\n response?: ProbeMeshCallResponse;\n error?: X402ProviderAcceptanceError;\n telemetryEvents: HostedTelemetryEvent[];\n checks: X402ProviderAcceptanceCheck[];\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: options.checks.every((check) => check.status === \"passed\")\n ? \"passed\"\n : \"failed\",\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 acceptance output contains no forbidden values.\", {\n checkedForbiddenValueCount: forbiddenOutputValues.length,\n });\n }\n\n return fail(\"secret_safe_output\", \"Serialized acceptance output contains forbidden values.\", {\n leakedValueCount: leakedValues.length,\n });\n}\n\nfunction createSummary(options: {\n status: X402ProviderAcceptanceStatus;\n checks: X402ProviderAcceptanceCheck[];\n response?: ProbeMeshCallResponse;\n error?: X402ProviderAcceptanceError;\n telemetryEvents: HostedTelemetryEvent[];\n requiredReceiptTypes: ReceiptType[];\n}): X402ProviderAcceptanceSummary {\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 toAcceptanceError(error: unknown): X402ProviderAcceptanceError {\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 : \"x402 provider acceptance call failed.\",\n status: \"failed\",\n };\n}\n\nfunction getReceiptTypes(receiptRefs: ReceiptRef[] | undefined) {\n return [...new Set((receiptRefs ?? []).map((receiptRef) => receiptRef.type))];\n}\n\nfunction sanitizeAcceptanceOutput<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 pass(\n name: string,\n message: string,\n details?: Record<string, unknown>,\n): X402ProviderAcceptanceCheck {\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): X402ProviderAcceptanceCheck {\n return {\n name,\n status: \"failed\",\n message,\n details,\n };\n}\n\nfunction assertAcceptanceOptions(\n options: X402ProviderAcceptanceOptions,\n): asserts options is X402ProviderAcceptanceOptions {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n throw invalidOptions(\"x402 acceptance options must be an object.\");\n }\n\n if (!Array.isArray(options.adapters) || options.adapters.length === 0) {\n throw invalidOptions(\"x402 acceptance options require at least one adapter.\");\n }\n\n if (\n !options.request ||\n typeof options.request !== \"object\" ||\n Array.isArray(options.request)\n ) {\n throw invalidOptions(\"x402 acceptance options require a call request object.\");\n }\n\n if (\n options.apiKey !== undefined &&\n (typeof options.apiKey !== \"string\" || options.apiKey.length === 0)\n ) {\n throw invalidOptions(\"x402 acceptance apiKey must be a non-empty string.\");\n }\n\n if (\n options.expectedProviderId !== undefined &&\n (typeof options.expectedProviderId !== \"string\" ||\n options.expectedProviderId.length === 0)\n ) {\n throw invalidOptions(\n \"x402 acceptance expectedProviderId must be a non-empty string.\",\n );\n }\n\n if (\n options.requiredReceiptTypes !== undefined &&\n (!Array.isArray(options.requiredReceiptTypes) ||\n options.requiredReceiptTypes.some(\n (receiptType) =>\n typeof receiptType !== \"string\" || receiptType.length === 0,\n ))\n ) {\n throw invalidOptions(\n \"x402 acceptance requiredReceiptTypes must be an array of receipt type strings.\",\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 invalidOptions(\n \"x402 acceptance forbiddenOutputValues must be an array of strings.\",\n );\n }\n}\n\nfunction invalidOptions(message: string) {\n return new ProbeMeshError({\n code: \"invalid_request\",\n message,\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProviderCatalogArtifact,\n formatProviderCatalogArtifact,\n} from \"../providerCatalogArtifact\";\nimport type {\n ProviderCatalogArtifact,\n ProviderCatalogArtifactOptions,\n} from \"../providerCatalogArtifact\";\nimport type { ProviderManifest } from \"../providerKit/types\";\nimport {\n createX402ProviderAcceptanceReport,\n formatX402ProviderAcceptanceReport,\n runX402ProviderAcceptance,\n} from \"../protocols/x402Acceptance\";\nimport type {\n X402ProviderAcceptanceOptions,\n X402ProviderAcceptanceReport,\n X402ProviderAcceptanceReportFormat,\n X402ProviderAcceptanceReportOptions,\n} from \"../protocols/x402Acceptance\";\n\nexport interface X402ProviderAcceptanceCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface X402ProviderAcceptanceCliOutputs {\n json?: string;\n markdown?: string;\n catalog?: string;\n}\n\nexport interface X402ProviderAcceptanceCliCatalog {\n manifest: ProviderManifest;\n artifactId?: string;\n generatedAt?: string;\n}\n\nexport interface X402ProviderAcceptanceCliConfig<Input = unknown> {\n acceptance: X402ProviderAcceptanceOptions<Input>;\n report?: X402ProviderAcceptanceReportOptions & {\n format?: X402ProviderAcceptanceReportFormat;\n };\n catalog?: X402ProviderAcceptanceCliCatalog;\n outputs?: X402ProviderAcceptanceCliOutputs;\n}\n\nexport type X402ProviderAcceptanceCliConfigExport<Input = unknown> =\n | X402ProviderAcceptanceCliConfig<Input>\n | X402ProviderAcceptanceCliSkip;\n\nexport type X402ProviderAcceptanceCliConfigFactory<Input = unknown> = (\n context: X402ProviderAcceptanceCliConfigContext,\n) =>\n | X402ProviderAcceptanceCliConfigExport<Input>\n | Promise<X402ProviderAcceptanceCliConfigExport<Input>>;\n\nexport interface X402ProviderAcceptanceCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface X402ProviderAcceptanceCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface X402ProviderAcceptanceCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: X402ProviderAcceptanceCliSkip;\n report?: X402ProviderAcceptanceReport;\n catalogArtifact?: ProviderCatalogArtifact;\n stdout: string;\n stderr?: string;\n artifactPaths?: X402ProviderAcceptanceCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: X402ProviderAcceptanceReportFormat;\n outJson?: string;\n outMarkdown?: string;\n outCatalog?: string;\n title?: string;\n help?: boolean;\n}\n\nconst USAGE = `Usage: probemesh-x402-accept --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-catalog <path>] [--title <text>]`;\n\nexport async function runX402ProviderAcceptanceCli(\n options: X402ProviderAcceptanceCliOptions = {},\n): Promise<X402ProviderAcceptanceCliResult> {\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: `x402 acceptance skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const result = await runX402ProviderAcceptance(configExport.acceptance);\n const report = createX402ProviderAcceptanceReport(result, {\n ...(configExport.report ?? {}),\n title: parsedArgs.title ?? configExport.report?.title,\n forbiddenOutputValues: mergeForbiddenOutputValues(configExport),\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.report?.format ?? \"markdown\";\n const stdout = formatX402ProviderAcceptanceReport(report, {\n format: selectedFormat,\n });\n const catalogArtifact = createOptionalCatalogArtifact(\n configExport,\n report,\n parsedArgs.outCatalog,\n );\n const artifactPaths = await writeArtifacts({\n cwd,\n report,\n catalogArtifact,\n outputs: {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n catalog: parsedArgs.outCatalog ?? configExport.outputs?.catalog,\n },\n });\n\n return {\n exitCode: report.gate.accepted ? 0 : 1,\n skipped: false,\n report,\n catalogArtifact,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(error instanceof Error ? error.message : \"Unknown CLI failure.\");\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-catalog\") {\n parsedArgs.outCatalog = 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: X402ProviderAcceptanceCliConfigContext,\n): Promise<X402ProviderAcceptanceCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as X402ProviderAcceptanceCliConfigFactory)(context);\n }\n\n return configExport as X402ProviderAcceptanceCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is X402ProviderAcceptanceCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<X402ProviderAcceptanceCliSkip>).skip === true &&\n typeof (value as Partial<X402ProviderAcceptanceCliSkip>).reason === \"string\"\n );\n}\n\nfunction assertCliConfig(\n value: unknown,\n): asserts value is X402ProviderAcceptanceCliConfig {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"x402 acceptance CLI config must export an object.\");\n }\n\n if (\n !(\"acceptance\" in value) ||\n !(value as Partial<X402ProviderAcceptanceCliConfig>).acceptance ||\n typeof (value as Partial<X402ProviderAcceptanceCliConfig>).acceptance !==\n \"object\"\n ) {\n throw new Error(\"x402 acceptance CLI config requires acceptance options.\");\n }\n\n const outputs = (value as Partial<X402ProviderAcceptanceCliConfig>).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.catalog !== undefined && typeof outputs.catalog !== \"string\"))\n ) {\n throw new Error(\"x402 acceptance CLI outputs must contain string paths.\");\n }\n\n const catalog = (value as Partial<X402ProviderAcceptanceCliConfig>).catalog;\n\n if (catalog !== undefined) {\n if (!catalog || typeof catalog !== \"object\" || Array.isArray(catalog)) {\n throw new Error(\"x402 acceptance CLI catalog config must be an object.\");\n }\n\n if (\n !(\"manifest\" in catalog) ||\n !(catalog as Partial<X402ProviderAcceptanceCliCatalog>).manifest ||\n typeof (catalog as Partial<X402ProviderAcceptanceCliCatalog>).manifest !==\n \"object\"\n ) {\n throw new Error(\"x402 acceptance CLI catalog config requires manifest.\");\n }\n\n if (\n catalog.artifactId !== undefined &&\n typeof catalog.artifactId !== \"string\"\n ) {\n throw new Error(\"x402 acceptance CLI catalog artifactId must be a string.\");\n }\n\n if (\n catalog.generatedAt !== undefined &&\n typeof catalog.generatedAt !== \"string\"\n ) {\n throw new Error(\"x402 acceptance CLI catalog generatedAt must be a string.\");\n }\n }\n}\n\nfunction mergeForbiddenOutputValues(config: X402ProviderAcceptanceCliConfig) {\n return [\n ...(config.acceptance.forbiddenOutputValues ?? []),\n ...(config.report?.forbiddenOutputValues ?? []),\n ];\n}\n\nfunction createOptionalCatalogArtifact(\n config: X402ProviderAcceptanceCliConfig,\n report: X402ProviderAcceptanceReport,\n requestedCatalogOutput: string | undefined,\n) {\n if (!config.catalog) {\n if (requestedCatalogOutput ?? config.outputs?.catalog) {\n throw new Error(\n \"x402 acceptance CLI catalog output requires catalog manifest config.\",\n );\n }\n\n return undefined;\n }\n\n return createProviderCatalogArtifact({\n manifest: config.catalog.manifest,\n acceptanceReport: report,\n artifactId: config.catalog.artifactId,\n generatedAt: config.catalog.generatedAt,\n forbiddenOutputValues: mergeForbiddenOutputValues(config),\n } satisfies ProviderCatalogArtifactOptions);\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n report: X402ProviderAcceptanceReport;\n catalogArtifact?: ProviderCatalogArtifact;\n outputs: X402ProviderAcceptanceCliOutputs;\n}) {\n const artifactPaths: X402ProviderAcceptanceCliOutputs = {};\n\n if (options.outputs.json) {\n const outputPath = resolve(options.cwd, options.outputs.json);\n await writeArtifact(\n outputPath,\n formatX402ProviderAcceptanceReport(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 formatX402ProviderAcceptanceReport(options.report, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = outputPath;\n }\n\n if (options.outputs.catalog) {\n if (!options.catalogArtifact) {\n throw new Error(\n \"x402 acceptance CLI catalog output requires a catalog artifact.\",\n );\n }\n\n const outputPath = resolve(options.cwd, options.outputs.catalog);\n await writeArtifact(\n outputPath,\n formatProviderCatalogArtifact(options.catalogArtifact, {\n format: \"json\",\n }),\n );\n artifactPaths.catalog = 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): X402ProviderAcceptanceCliResult {\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":["entries"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
var ProbeMeshError = class extends Error {
|
|
3
|
+
code;
|
|
4
|
+
status = "failed";
|
|
5
|
+
capability;
|
|
6
|
+
provider;
|
|
7
|
+
callId;
|
|
8
|
+
receiptRefs;
|
|
9
|
+
safety;
|
|
10
|
+
timeline;
|
|
11
|
+
retrySafety;
|
|
12
|
+
attempt;
|
|
13
|
+
route;
|
|
14
|
+
cause;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super(options.message);
|
|
17
|
+
this.name = "ProbeMeshError";
|
|
18
|
+
this.code = options.code;
|
|
19
|
+
this.capability = options.capability;
|
|
20
|
+
this.provider = options.provider;
|
|
21
|
+
this.callId = options.callId;
|
|
22
|
+
this.receiptRefs = options.receiptRefs;
|
|
23
|
+
this.safety = options.safety;
|
|
24
|
+
this.timeline = options.timeline;
|
|
25
|
+
this.retrySafety = options.retrySafety;
|
|
26
|
+
this.attempt = options.attempt;
|
|
27
|
+
this.route = options.route;
|
|
28
|
+
this.cause = options.cause;
|
|
29
|
+
}
|
|
30
|
+
toJSON() {
|
|
31
|
+
return {
|
|
32
|
+
name: this.name,
|
|
33
|
+
code: this.code,
|
|
34
|
+
message: this.message,
|
|
35
|
+
status: this.status,
|
|
36
|
+
capability: this.capability,
|
|
37
|
+
provider: this.provider,
|
|
38
|
+
callId: this.callId,
|
|
39
|
+
receiptRefs: this.receiptRefs,
|
|
40
|
+
safety: this.safety,
|
|
41
|
+
timeline: this.timeline,
|
|
42
|
+
retrySafety: this.retrySafety,
|
|
43
|
+
attempt: this.attempt,
|
|
44
|
+
route: this.route
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
function isProbeMeshError(error) {
|
|
49
|
+
return error instanceof ProbeMeshError;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
ProbeMeshError,
|
|
54
|
+
isProbeMeshError
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=chunk-2ASMVLG4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts"],"sourcesContent":["import type {\n CallStatus,\n ProbeMeshAttemptMetadata,\n ProbeMeshCallTimeline,\n ProbeMeshCallSafety,\n ProbeMeshErrorCode,\n ProbeMeshRetrySafety,\n ProbeMeshRouteMetadata,\n ReceiptRef,\n} from \"./types\";\n\nexport interface ProbeMeshErrorOptions {\n code: ProbeMeshErrorCode;\n message: string;\n capability?: string;\n provider?: string;\n callId?: string;\n receiptRefs?: ReceiptRef[];\n safety?: ProbeMeshCallSafety;\n timeline?: ProbeMeshCallTimeline;\n retrySafety?: ProbeMeshRetrySafety;\n attempt?: ProbeMeshAttemptMetadata;\n route?: ProbeMeshRouteMetadata;\n cause?: unknown;\n}\n\nexport class ProbeMeshError extends Error {\n readonly code: ProbeMeshErrorCode;\n readonly status: CallStatus = \"failed\";\n readonly capability?: string;\n readonly provider?: string;\n readonly callId?: string;\n readonly receiptRefs?: ReceiptRef[];\n readonly safety?: ProbeMeshCallSafety;\n readonly timeline?: ProbeMeshCallTimeline;\n readonly retrySafety?: ProbeMeshRetrySafety;\n readonly attempt?: ProbeMeshAttemptMetadata;\n readonly route?: ProbeMeshRouteMetadata;\n readonly cause?: unknown;\n\n constructor(options: ProbeMeshErrorOptions) {\n super(options.message);\n this.name = \"ProbeMeshError\";\n this.code = options.code;\n this.capability = options.capability;\n this.provider = options.provider;\n this.callId = options.callId;\n this.receiptRefs = options.receiptRefs;\n this.safety = options.safety;\n this.timeline = options.timeline;\n this.retrySafety = options.retrySafety;\n this.attempt = options.attempt;\n this.route = options.route;\n this.cause = options.cause;\n }\n\n toJSON() {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n capability: this.capability,\n provider: this.provider,\n callId: this.callId,\n receiptRefs: this.receiptRefs,\n safety: this.safety,\n timeline: this.timeline,\n retrySafety: this.retrySafety,\n attempt: this.attempt,\n route: this.route,\n };\n }\n}\n\nexport function isProbeMeshError(error: unknown): error is ProbeMeshError {\n return error instanceof ProbeMeshError;\n}\n"],"mappings":";AA0BO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAC/B;AAAA,EACA,SAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAAgC;AAC1C,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ;AACxB,SAAK,SAAS,QAAQ;AACtB,SAAK,cAAc,QAAQ;AAC3B,SAAK,SAAS,QAAQ;AACtB,SAAK,WAAW,QAAQ;AACxB,SAAK,cAAc,QAAQ;AAC3B,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,OAAyC;AACxE,SAAO,iBAAiB;AAC1B;","names":[]}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createProviderOnboardingDossier,
|
|
3
|
+
formatProviderOnboardingDossier
|
|
4
|
+
} from "./chunk-TDOBAMYM.js";
|
|
5
|
+
import {
|
|
6
|
+
assertProviderConformanceArtifact
|
|
7
|
+
} from "./chunk-UU2ZG7P7.js";
|
|
8
|
+
import {
|
|
9
|
+
assertProviderCatalogArtifact
|
|
10
|
+
} from "./chunk-3H7UGVI6.js";
|
|
11
|
+
import {
|
|
12
|
+
loadCliConfigDefault
|
|
13
|
+
} from "./chunk-NYTV263W.js";
|
|
14
|
+
|
|
15
|
+
// src/cli/providerOnboardingDossierCli.ts
|
|
16
|
+
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
17
|
+
import { dirname, resolve } from "path";
|
|
18
|
+
var USAGE = "Usage: probemesh-dossier --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--dossier-id <text>] [--generated-at <iso>] [--title <text>]";
|
|
19
|
+
async function runProviderOnboardingDossierCli(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 onboarding dossier skipped: ${configExport.reason}
|
|
45
|
+
`
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
assertCliConfig(configExport);
|
|
49
|
+
const catalogArtifact = await resolveCatalogArtifact(configExport, cwd);
|
|
50
|
+
const conformanceArtifact = await resolveConformanceArtifact(
|
|
51
|
+
configExport,
|
|
52
|
+
cwd
|
|
53
|
+
);
|
|
54
|
+
const dossier = createProviderOnboardingDossier({
|
|
55
|
+
catalogArtifact,
|
|
56
|
+
conformanceArtifact,
|
|
57
|
+
dossierId: parsedArgs.dossierId ?? configExport.dossier?.dossierId,
|
|
58
|
+
generatedAt: parsedArgs.generatedAt ?? configExport.dossier?.generatedAt,
|
|
59
|
+
forbiddenOutputValues: configExport.dossier?.forbiddenOutputValues
|
|
60
|
+
});
|
|
61
|
+
const selectedFormat = parsedArgs.format ?? configExport.dossier?.format ?? "markdown";
|
|
62
|
+
const title = parsedArgs.title ?? configExport.dossier?.title;
|
|
63
|
+
const stdout = formatProviderOnboardingDossier(dossier, {
|
|
64
|
+
format: selectedFormat,
|
|
65
|
+
title
|
|
66
|
+
});
|
|
67
|
+
const artifactPaths = await writeArtifacts({
|
|
68
|
+
cwd,
|
|
69
|
+
dossier,
|
|
70
|
+
title,
|
|
71
|
+
outputs: {
|
|
72
|
+
json: parsedArgs.outJson ?? configExport.outputs?.json,
|
|
73
|
+
markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
exitCode: dossier.status === "ready" ? 0 : 1,
|
|
78
|
+
skipped: false,
|
|
79
|
+
dossier,
|
|
80
|
+
stdout,
|
|
81
|
+
artifactPaths
|
|
82
|
+
};
|
|
83
|
+
} catch (error) {
|
|
84
|
+
return cliFailure(
|
|
85
|
+
error instanceof Error ? error.message : "Unknown provider onboarding dossier CLI failure."
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function parseCliArgs(argv) {
|
|
90
|
+
const parsedArgs = {};
|
|
91
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
92
|
+
const arg = argv[index];
|
|
93
|
+
if (arg === "--") {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
if (arg === "--help" || arg === "-h") {
|
|
97
|
+
parsedArgs.help = true;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (arg === "--config") {
|
|
101
|
+
parsedArgs.configPath = requireValue(argv, index, arg);
|
|
102
|
+
index += 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (arg === "--format") {
|
|
106
|
+
const format = requireValue(argv, index, arg);
|
|
107
|
+
if (format !== "markdown" && format !== "json") {
|
|
108
|
+
throw new Error("--format must be markdown or json.");
|
|
109
|
+
}
|
|
110
|
+
parsedArgs.format = format;
|
|
111
|
+
index += 1;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (arg === "--out-json") {
|
|
115
|
+
parsedArgs.outJson = requireValue(argv, index, arg);
|
|
116
|
+
index += 1;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (arg === "--out-md") {
|
|
120
|
+
parsedArgs.outMarkdown = requireValue(argv, index, arg);
|
|
121
|
+
index += 1;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (arg === "--dossier-id") {
|
|
125
|
+
parsedArgs.dossierId = requireValue(argv, index, arg);
|
|
126
|
+
index += 1;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (arg === "--generated-at") {
|
|
130
|
+
parsedArgs.generatedAt = requireValue(argv, index, arg);
|
|
131
|
+
index += 1;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (arg === "--title") {
|
|
135
|
+
parsedArgs.title = requireValue(argv, index, arg);
|
|
136
|
+
index += 1;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
throw new Error(`Unknown argument "${arg}".`);
|
|
140
|
+
}
|
|
141
|
+
return parsedArgs;
|
|
142
|
+
}
|
|
143
|
+
function requireValue(argv, index, flag) {
|
|
144
|
+
const value = argv[index + 1];
|
|
145
|
+
if (!value || value.startsWith("--")) {
|
|
146
|
+
throw new Error(`${flag} requires a value.`);
|
|
147
|
+
}
|
|
148
|
+
return value;
|
|
149
|
+
}
|
|
150
|
+
async function loadCliConfig(configPath, context) {
|
|
151
|
+
const configExport = await loadCliConfigDefault(configPath, context.cwd);
|
|
152
|
+
if (typeof configExport === "function") {
|
|
153
|
+
return configExport(context);
|
|
154
|
+
}
|
|
155
|
+
return configExport;
|
|
156
|
+
}
|
|
157
|
+
function isCliSkip(value) {
|
|
158
|
+
return !!value && typeof value === "object" && !Array.isArray(value) && value.skip === true && typeof value.reason === "string";
|
|
159
|
+
}
|
|
160
|
+
function assertCliConfig(config) {
|
|
161
|
+
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
162
|
+
throw new Error("Provider onboarding dossier CLI config must be an object.");
|
|
163
|
+
}
|
|
164
|
+
const candidate = config;
|
|
165
|
+
if (candidate.catalogArtifact !== void 0 && candidate.catalogArtifactFile !== void 0) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
"Provider onboarding dossier CLI config may not provide both catalogArtifact and catalogArtifactFile."
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
if (candidate.conformanceArtifact !== void 0 && candidate.conformanceArtifactFile !== void 0) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
"Provider onboarding dossier CLI config may not provide both conformanceArtifact and conformanceArtifactFile."
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
if (candidate.catalogArtifact === void 0 && candidate.catalogArtifactFile === void 0) {
|
|
176
|
+
throw new Error(
|
|
177
|
+
"Provider onboarding dossier CLI config requires catalogArtifact or catalogArtifactFile."
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
if (candidate.conformanceArtifact === void 0 && candidate.conformanceArtifactFile === void 0) {
|
|
181
|
+
throw new Error(
|
|
182
|
+
"Provider onboarding dossier CLI config requires conformanceArtifact or conformanceArtifactFile."
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
if (candidate.catalogArtifactFile !== void 0 && typeof candidate.catalogArtifactFile !== "string") {
|
|
186
|
+
throw new Error(
|
|
187
|
+
"Provider onboarding dossier CLI catalogArtifactFile must be a string."
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
if (candidate.conformanceArtifactFile !== void 0 && typeof candidate.conformanceArtifactFile !== "string") {
|
|
191
|
+
throw new Error(
|
|
192
|
+
"Provider onboarding dossier CLI conformanceArtifactFile must be a string."
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
if (candidate.dossier !== void 0 && !isRecord(candidate.dossier)) {
|
|
196
|
+
throw new Error("Provider onboarding dossier CLI dossier config must be an object.");
|
|
197
|
+
}
|
|
198
|
+
if (candidate.outputs !== void 0) {
|
|
199
|
+
assertOutputs(candidate.outputs);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function assertOutputs(outputs) {
|
|
203
|
+
if (!isRecord(outputs)) {
|
|
204
|
+
throw new Error("Provider onboarding dossier CLI outputs must be an object.");
|
|
205
|
+
}
|
|
206
|
+
for (const [key, value] of Object.entries(outputs)) {
|
|
207
|
+
if (!["json", "markdown"].includes(key) || value !== void 0 && typeof value !== "string") {
|
|
208
|
+
throw new Error(
|
|
209
|
+
"Provider onboarding dossier CLI outputs may only include json and markdown string paths."
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function resolveCatalogArtifact(config, cwd) {
|
|
215
|
+
if (config.catalogArtifact !== void 0) {
|
|
216
|
+
assertProviderCatalogArtifact(config.catalogArtifact);
|
|
217
|
+
return config.catalogArtifact;
|
|
218
|
+
}
|
|
219
|
+
const artifact = JSON.parse(
|
|
220
|
+
await readFile(resolve(cwd, config.catalogArtifactFile), "utf8")
|
|
221
|
+
);
|
|
222
|
+
assertProviderCatalogArtifact(artifact);
|
|
223
|
+
return artifact;
|
|
224
|
+
}
|
|
225
|
+
async function resolveConformanceArtifact(config, cwd) {
|
|
226
|
+
if (config.conformanceArtifact !== void 0) {
|
|
227
|
+
assertProviderConformanceArtifact(config.conformanceArtifact);
|
|
228
|
+
return config.conformanceArtifact;
|
|
229
|
+
}
|
|
230
|
+
const artifact = JSON.parse(
|
|
231
|
+
await readFile(resolve(cwd, config.conformanceArtifactFile), "utf8")
|
|
232
|
+
);
|
|
233
|
+
assertProviderConformanceArtifact(artifact);
|
|
234
|
+
return artifact;
|
|
235
|
+
}
|
|
236
|
+
async function writeArtifacts(options) {
|
|
237
|
+
const artifactPaths = {};
|
|
238
|
+
if (options.outputs.json) {
|
|
239
|
+
const path = resolve(options.cwd, options.outputs.json);
|
|
240
|
+
await writeTextFile(
|
|
241
|
+
path,
|
|
242
|
+
formatProviderOnboardingDossier(options.dossier, {
|
|
243
|
+
format: "json",
|
|
244
|
+
title: options.title
|
|
245
|
+
})
|
|
246
|
+
);
|
|
247
|
+
artifactPaths.json = path;
|
|
248
|
+
}
|
|
249
|
+
if (options.outputs.markdown) {
|
|
250
|
+
const path = resolve(options.cwd, options.outputs.markdown);
|
|
251
|
+
await writeTextFile(
|
|
252
|
+
path,
|
|
253
|
+
formatProviderOnboardingDossier(options.dossier, {
|
|
254
|
+
format: "markdown",
|
|
255
|
+
title: options.title
|
|
256
|
+
})
|
|
257
|
+
);
|
|
258
|
+
artifactPaths.markdown = path;
|
|
259
|
+
}
|
|
260
|
+
return artifactPaths;
|
|
261
|
+
}
|
|
262
|
+
async function writeTextFile(path, body) {
|
|
263
|
+
await mkdir(dirname(path), {
|
|
264
|
+
recursive: true
|
|
265
|
+
});
|
|
266
|
+
await writeFile(path, body, "utf8");
|
|
267
|
+
}
|
|
268
|
+
function cliFailure(message) {
|
|
269
|
+
return {
|
|
270
|
+
exitCode: 2,
|
|
271
|
+
skipped: false,
|
|
272
|
+
stdout: "",
|
|
273
|
+
stderr: `Provider onboarding dossier CLI failed: ${message}
|
|
274
|
+
${USAGE}
|
|
275
|
+
`
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
function isRecord(value) {
|
|
279
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export {
|
|
283
|
+
runProviderOnboardingDossierCli
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=chunk-2KWGHJYP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/providerOnboardingDossierCli.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n assertProviderCatalogArtifact,\n type ProviderCatalogArtifact,\n} from \"../providerCatalogArtifact\";\nimport {\n assertProviderConformanceArtifact,\n type ProviderConformanceArtifact,\n} from \"../providerConformanceArtifact\";\nimport {\n createProviderOnboardingDossier,\n formatProviderOnboardingDossier,\n} from \"../providerOnboardingDossier\";\nimport type {\n ProviderOnboardingDossier,\n ProviderOnboardingDossierFormat,\n ProviderOnboardingDossierOptions,\n} from \"../providerOnboardingDossier\";\n\nexport interface ProviderOnboardingDossierCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderOnboardingDossierCliOutputs {\n json?: string;\n markdown?: string;\n}\n\nexport interface ProviderOnboardingDossierCliDossier\n extends Omit<\n ProviderOnboardingDossierOptions,\n \"catalogArtifact\" | \"conformanceArtifact\"\n > {\n format?: ProviderOnboardingDossierFormat;\n title?: string;\n}\n\nexport interface ProviderOnboardingDossierCliConfig {\n catalogArtifact?: ProviderCatalogArtifact;\n catalogArtifactFile?: string;\n conformanceArtifact?: ProviderConformanceArtifact;\n conformanceArtifactFile?: string;\n dossier?: ProviderOnboardingDossierCliDossier;\n outputs?: ProviderOnboardingDossierCliOutputs;\n}\n\nexport type ProviderOnboardingDossierCliConfigExport =\n | ProviderOnboardingDossierCliConfig\n | ProviderOnboardingDossierCliSkip;\n\nexport type ProviderOnboardingDossierCliConfigFactory = (\n context: ProviderOnboardingDossierCliConfigContext,\n) =>\n | ProviderOnboardingDossierCliConfigExport\n | Promise<ProviderOnboardingDossierCliConfigExport>;\n\nexport interface ProviderOnboardingDossierCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderOnboardingDossierCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderOnboardingDossierCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderOnboardingDossierCliSkip;\n dossier?: ProviderOnboardingDossier;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderOnboardingDossierCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderOnboardingDossierFormat;\n outJson?: string;\n outMarkdown?: string;\n dossierId?: string;\n generatedAt?: string;\n title?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-dossier --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--dossier-id <text>] [--generated-at <iso>] [--title <text>]\";\n\nexport async function runProviderOnboardingDossierCli(\n options: ProviderOnboardingDossierCliOptions = {},\n): Promise<ProviderOnboardingDossierCliResult> {\n const argv = options.argv ?? [];\n const cwd = options.cwd ?? process.cwd();\n\n try {\n const parsedArgs = parseCliArgs(argv);\n\n if (parsedArgs.help) {\n return {\n exitCode: 0,\n skipped: true,\n stdout: `${USAGE}\\n`,\n };\n }\n\n if (!parsedArgs.configPath) {\n return cliFailure(\"--config <path> is required.\");\n }\n\n const configExport = await loadCliConfig(parsedArgs.configPath, {\n argv,\n cwd,\n });\n\n if (isCliSkip(configExport)) {\n return {\n exitCode: 0,\n skipped: true,\n skip: configExport,\n stdout: `provider onboarding dossier skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const catalogArtifact = await resolveCatalogArtifact(configExport, cwd);\n const conformanceArtifact = await resolveConformanceArtifact(\n configExport,\n cwd,\n );\n const dossier = createProviderOnboardingDossier({\n catalogArtifact,\n conformanceArtifact,\n dossierId: parsedArgs.dossierId ?? configExport.dossier?.dossierId,\n generatedAt: parsedArgs.generatedAt ?? configExport.dossier?.generatedAt,\n forbiddenOutputValues: configExport.dossier?.forbiddenOutputValues,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.dossier?.format ?? \"markdown\";\n const title = parsedArgs.title ?? configExport.dossier?.title;\n const stdout = formatProviderOnboardingDossier(dossier, {\n format: selectedFormat,\n title,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n dossier,\n title,\n outputs: {\n json: parsedArgs.outJson ?? configExport.outputs?.json,\n markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,\n },\n });\n\n return {\n exitCode: dossier.status === \"ready\" ? 0 : 1,\n skipped: false,\n dossier,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error\n ? error.message\n : \"Unknown provider onboarding dossier CLI failure.\",\n );\n }\n}\n\nfunction parseCliArgs(argv: string[]): ParsedCliArgs {\n const parsedArgs: ParsedCliArgs = {};\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n\n if (arg === \"--\") {\n continue;\n }\n\n if (arg === \"--help\" || arg === \"-h\") {\n parsedArgs.help = true;\n continue;\n }\n\n if (arg === \"--config\") {\n parsedArgs.configPath = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--format\") {\n const format = requireValue(argv, index, arg);\n\n if (format !== \"markdown\" && format !== \"json\") {\n throw new Error(\"--format must be markdown or json.\");\n }\n\n parsedArgs.format = format;\n index += 1;\n continue;\n }\n\n if (arg === \"--out-json\") {\n parsedArgs.outJson = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--out-md\") {\n parsedArgs.outMarkdown = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--dossier-id\") {\n parsedArgs.dossierId = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--generated-at\") {\n parsedArgs.generatedAt = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n if (arg === \"--title\") {\n parsedArgs.title = requireValue(argv, index, arg);\n index += 1;\n continue;\n }\n\n throw new Error(`Unknown argument \"${arg}\".`);\n }\n\n return parsedArgs;\n}\n\nfunction requireValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n\n return value;\n}\n\nasync function loadCliConfig(\n configPath: string,\n context: ProviderOnboardingDossierCliConfigContext,\n): Promise<ProviderOnboardingDossierCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderOnboardingDossierCliConfigFactory)(context);\n }\n\n return configExport as ProviderOnboardingDossierCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderOnboardingDossierCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderOnboardingDossierCliSkip>).skip === true &&\n typeof (value as Partial<ProviderOnboardingDossierCliSkip>).reason ===\n \"string\"\n );\n}\n\nfunction assertCliConfig(\n config: unknown,\n): asserts config is ProviderOnboardingDossierCliConfig {\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new Error(\"Provider onboarding dossier CLI config must be an object.\");\n }\n\n const candidate = config as Partial<ProviderOnboardingDossierCliConfig>;\n\n if (\n candidate.catalogArtifact !== undefined &&\n candidate.catalogArtifactFile !== undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config may not provide both catalogArtifact and catalogArtifactFile.\",\n );\n }\n\n if (\n candidate.conformanceArtifact !== undefined &&\n candidate.conformanceArtifactFile !== undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config may not provide both conformanceArtifact and conformanceArtifactFile.\",\n );\n }\n\n if (\n candidate.catalogArtifact === undefined &&\n candidate.catalogArtifactFile === undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config requires catalogArtifact or catalogArtifactFile.\",\n );\n }\n\n if (\n candidate.conformanceArtifact === undefined &&\n candidate.conformanceArtifactFile === undefined\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI config requires conformanceArtifact or conformanceArtifactFile.\",\n );\n }\n\n if (\n candidate.catalogArtifactFile !== undefined &&\n typeof candidate.catalogArtifactFile !== \"string\"\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI catalogArtifactFile must be a string.\",\n );\n }\n\n if (\n candidate.conformanceArtifactFile !== undefined &&\n typeof candidate.conformanceArtifactFile !== \"string\"\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI conformanceArtifactFile must be a string.\",\n );\n }\n\n if (candidate.dossier !== undefined && !isRecord(candidate.dossier)) {\n throw new Error(\"Provider onboarding dossier CLI dossier config must be an object.\");\n }\n\n if (candidate.outputs !== undefined) {\n assertOutputs(candidate.outputs);\n }\n}\n\nfunction assertOutputs(outputs: unknown) {\n if (!isRecord(outputs)) {\n throw new Error(\"Provider onboarding dossier CLI outputs must be an object.\");\n }\n\n for (const [key, value] of Object.entries(outputs)) {\n if (\n ![\"json\", \"markdown\"].includes(key) ||\n (value !== undefined && typeof value !== \"string\")\n ) {\n throw new Error(\n \"Provider onboarding dossier CLI outputs may only include json and markdown string paths.\",\n );\n }\n }\n}\n\nasync function resolveCatalogArtifact(\n config: ProviderOnboardingDossierCliConfig,\n cwd: string,\n) {\n if (config.catalogArtifact !== undefined) {\n assertProviderCatalogArtifact(config.catalogArtifact);\n return config.catalogArtifact;\n }\n\n const artifact = JSON.parse(\n await readFile(resolve(cwd, config.catalogArtifactFile!), \"utf8\"),\n );\n assertProviderCatalogArtifact(artifact);\n return artifact;\n}\n\nasync function resolveConformanceArtifact(\n config: ProviderOnboardingDossierCliConfig,\n cwd: string,\n) {\n if (config.conformanceArtifact !== undefined) {\n assertProviderConformanceArtifact(config.conformanceArtifact);\n return config.conformanceArtifact;\n }\n\n const artifact = JSON.parse(\n await readFile(resolve(cwd, config.conformanceArtifactFile!), \"utf8\"),\n );\n assertProviderConformanceArtifact(artifact);\n return artifact;\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n dossier: ProviderOnboardingDossier;\n title?: string;\n outputs: ProviderOnboardingDossierCliOutputs;\n}) {\n const artifactPaths: ProviderOnboardingDossierCliOutputs = {};\n\n if (options.outputs.json) {\n const path = resolve(options.cwd, options.outputs.json);\n await writeTextFile(\n path,\n formatProviderOnboardingDossier(options.dossier, {\n format: \"json\",\n title: options.title,\n }),\n );\n artifactPaths.json = path;\n }\n\n if (options.outputs.markdown) {\n const path = resolve(options.cwd, options.outputs.markdown);\n await writeTextFile(\n path,\n formatProviderOnboardingDossier(options.dossier, {\n format: \"markdown\",\n title: options.title,\n }),\n );\n artifactPaths.markdown = path;\n }\n\n return artifactPaths;\n}\n\nasync function writeTextFile(path: string, body: string) {\n await mkdir(dirname(path), {\n recursive: true,\n });\n await writeFile(path, body, \"utf8\");\n}\n\nfunction cliFailure(message: string): ProviderOnboardingDossierCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `Provider onboarding dossier CLI failed: ${message}\\n${USAGE}\\n`,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,SAAS,eAAe;AA4FjC,IAAM,QACJ;AAEF,eAAsB,gCACpB,UAA+C,CAAC,GACH;AAC7C,QAAM,OAAO,QAAQ,QAAQ,CAAC;AAC9B,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAEvC,MAAI;AACF,UAAM,aAAa,aAAa,IAAI;AAEpC,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ,GAAG,KAAK;AAAA;AAAA,MAClB;AAAA,IACF;AAEA,QAAI,CAAC,WAAW,YAAY;AAC1B,aAAO,WAAW,8BAA8B;AAAA,IAClD;AAEA,UAAM,eAAe,MAAM,cAAc,WAAW,YAAY;AAAA,MAC9D;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,UAAU,YAAY,GAAG;AAC3B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,QAAQ,wCAAwC,aAAa,MAAM;AAAA;AAAA,MACrE;AAAA,IACF;AAEA,oBAAgB,YAAY;AAE5B,UAAM,kBAAkB,MAAM,uBAAuB,cAAc,GAAG;AACtE,UAAM,sBAAsB,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AACA,UAAM,UAAU,gCAAgC;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,WAAW,WAAW,aAAa,aAAa,SAAS;AAAA,MACzD,aAAa,WAAW,eAAe,aAAa,SAAS;AAAA,MAC7D,uBAAuB,aAAa,SAAS;AAAA,IAC/C,CAAC;AACD,UAAM,iBACJ,WAAW,UAAU,aAAa,SAAS,UAAU;AACvD,UAAM,QAAQ,WAAW,SAAS,aAAa,SAAS;AACxD,UAAM,SAAS,gCAAgC,SAAS;AAAA,MACtD,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,UAAM,gBAAgB,MAAM,eAAe;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,MAAM,WAAW,WAAW,aAAa,SAAS;AAAA,QAClD,UAAU,WAAW,eAAe,aAAa,SAAS;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,UAAU,QAAQ,WAAW,UAAU,IAAI;AAAA,MAC3C,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,iBAAiB,QACb,MAAM,UACN;AAAA,IACN;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAA+B;AACnD,QAAM,aAA4B,CAAC;AAEnC,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AAEtB,QAAI,QAAQ,MAAM;AAChB;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,iBAAW,OAAO;AAClB;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY;AACtB,iBAAW,aAAa,aAAa,MAAM,OAAO,GAAG;AACrD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY;AACtB,YAAM,SAAS,aAAa,MAAM,OAAO,GAAG;AAE5C,UAAI,WAAW,cAAc,WAAW,QAAQ;AAC9C,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AAEA,iBAAW,SAAS;AACpB,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,cAAc;AACxB,iBAAW,UAAU,aAAa,MAAM,OAAO,GAAG;AAClD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY;AACtB,iBAAW,cAAc,aAAa,MAAM,OAAO,GAAG;AACtD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,gBAAgB;AAC1B,iBAAW,YAAY,aAAa,MAAM,OAAO,GAAG;AACpD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,iBAAW,cAAc,aAAa,MAAM,OAAO,GAAG;AACtD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW;AACrB,iBAAW,QAAQ,aAAa,MAAM,OAAO,GAAG;AAChD,eAAS;AACT;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,qBAAqB,GAAG,IAAI;AAAA,EAC9C;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAgB,OAAe,MAAc;AACjE,QAAM,QAAQ,KAAK,QAAQ,CAAC;AAE5B,MAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,UAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,eAAe,cACb,YACA,SACmD;AACnD,QAAM,eAAe,MAAM,qBAAqB,YAAY,QAAQ,GAAG;AAEvE,MAAI,OAAO,iBAAiB,YAAY;AACtC,WAAQ,aAA2D,OAAO;AAAA,EAC5E;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAA2D;AAC5E,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,KACnB,MAAoD,SAAS,QAC9D,OAAQ,MAAoD,WAC1D;AAEN;AAEA,SAAS,gBACP,QACsD;AACtD,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,QAAM,YAAY;AAElB,MACE,UAAU,oBAAoB,UAC9B,UAAU,wBAAwB,QAClC;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,UAAU,wBAAwB,UAClC,UAAU,4BAA4B,QACtC;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,UAAU,oBAAoB,UAC9B,UAAU,wBAAwB,QAClC;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,UAAU,wBAAwB,UAClC,UAAU,4BAA4B,QACtC;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,UAAU,wBAAwB,UAClC,OAAO,UAAU,wBAAwB,UACzC;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MACE,UAAU,4BAA4B,UACtC,OAAO,UAAU,4BAA4B,UAC7C;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,YAAY,UAAa,CAAC,SAAS,UAAU,OAAO,GAAG;AACnE,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AAEA,MAAI,UAAU,YAAY,QAAW;AACnC,kBAAc,UAAU,OAAO;AAAA,EACjC;AACF;AAEA,SAAS,cAAc,SAAkB;AACvC,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,MAAM,4DAA4D;AAAA,EAC9E;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QACE,CAAC,CAAC,QAAQ,UAAU,EAAE,SAAS,GAAG,KACjC,UAAU,UAAa,OAAO,UAAU,UACzC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,uBACb,QACA,KACA;AACA,MAAI,OAAO,oBAAoB,QAAW;AACxC,kCAA8B,OAAO,eAAe;AACpD,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,WAAW,KAAK;AAAA,IACpB,MAAM,SAAS,QAAQ,KAAK,OAAO,mBAAoB,GAAG,MAAM;AAAA,EAClE;AACA,gCAA8B,QAAQ;AACtC,SAAO;AACT;AAEA,eAAe,2BACb,QACA,KACA;AACA,MAAI,OAAO,wBAAwB,QAAW;AAC5C,sCAAkC,OAAO,mBAAmB;AAC5D,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,WAAW,KAAK;AAAA,IACpB,MAAM,SAAS,QAAQ,KAAK,OAAO,uBAAwB,GAAG,MAAM;AAAA,EACtE;AACA,oCAAkC,QAAQ;AAC1C,SAAO;AACT;AAEA,eAAe,eAAe,SAK3B;AACD,QAAM,gBAAqD,CAAC;AAE5D,MAAI,QAAQ,QAAQ,MAAM;AACxB,UAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,IAAI;AACtD,UAAM;AAAA,MACJ;AAAA,MACA,gCAAgC,QAAQ,SAAS;AAAA,QAC/C,QAAQ;AAAA,QACR,OAAO,QAAQ;AAAA,MACjB,CAAC;AAAA,IACH;AACA,kBAAc,OAAO;AAAA,EACvB;AAEA,MAAI,QAAQ,QAAQ,UAAU;AAC5B,UAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,QAAQ;AAC1D,UAAM;AAAA,MACJ;AAAA,MACA,gCAAgC,QAAQ,SAAS;AAAA,QAC/C,QAAQ;AAAA,QACR,OAAO,QAAQ;AAAA,MACjB,CAAC;AAAA,IACH;AACA,kBAAc,WAAW;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,eAAe,cAAc,MAAc,MAAc;AACvD,QAAM,MAAM,QAAQ,IAAI,GAAG;AAAA,IACzB,WAAW;AAAA,EACb,CAAC;AACD,QAAM,UAAU,MAAM,MAAM,MAAM;AACpC;AAEA,SAAS,WAAW,SAAqD;AACvE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ,2CAA2C,OAAO;AAAA,EAAK,KAAK;AAAA;AAAA,EACtE;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;","names":[]}
|