@probemesh/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +160 -0
  3. package/dist/chunk-257Y7LN2.js +827 -0
  4. package/dist/chunk-257Y7LN2.js.map +1 -0
  5. package/dist/chunk-2ASMVLG4.js +56 -0
  6. package/dist/chunk-2ASMVLG4.js.map +1 -0
  7. package/dist/chunk-2KWGHJYP.js +285 -0
  8. package/dist/chunk-2KWGHJYP.js.map +1 -0
  9. package/dist/chunk-3H7UGVI6.js +1117 -0
  10. package/dist/chunk-3H7UGVI6.js.map +1 -0
  11. package/dist/chunk-5Q3PDYIA.js +657 -0
  12. package/dist/chunk-5Q3PDYIA.js.map +1 -0
  13. package/dist/chunk-CXZOO3U4.js +550 -0
  14. package/dist/chunk-CXZOO3U4.js.map +1 -0
  15. package/dist/chunk-FRFBK4SY.js +270 -0
  16. package/dist/chunk-FRFBK4SY.js.map +1 -0
  17. package/dist/chunk-HJK52QJF.js +994 -0
  18. package/dist/chunk-HJK52QJF.js.map +1 -0
  19. package/dist/chunk-HNBDX7IU.js +705 -0
  20. package/dist/chunk-HNBDX7IU.js.map +1 -0
  21. package/dist/chunk-NYTV263W.js +116 -0
  22. package/dist/chunk-NYTV263W.js.map +1 -0
  23. package/dist/chunk-PXG54XOG.js +595 -0
  24. package/dist/chunk-PXG54XOG.js.map +1 -0
  25. package/dist/chunk-TDOBAMYM.js +607 -0
  26. package/dist/chunk-TDOBAMYM.js.map +1 -0
  27. package/dist/chunk-TV42EZSI.js +2157 -0
  28. package/dist/chunk-TV42EZSI.js.map +1 -0
  29. package/dist/chunk-UU2ZG7P7.js +408 -0
  30. package/dist/chunk-UU2ZG7P7.js.map +1 -0
  31. package/dist/chunk-WKN7QOCA.js +977 -0
  32. package/dist/chunk-WKN7QOCA.js.map +1 -0
  33. package/dist/chunk-ZJOLPBJJ.js +1091 -0
  34. package/dist/chunk-ZJOLPBJJ.js.map +1 -0
  35. package/dist/cli/audit-trail-export.cjs +1193 -0
  36. package/dist/cli/audit-trail-export.cjs.map +1 -0
  37. package/dist/cli/audit-trail-export.d.cts +1 -0
  38. package/dist/cli/audit-trail-export.d.ts +1 -0
  39. package/dist/cli/audit-trail-export.js +24 -0
  40. package/dist/cli/audit-trail-export.js.map +1 -0
  41. package/dist/cli/catalog-check.cjs +2687 -0
  42. package/dist/cli/catalog-check.cjs.map +1 -0
  43. package/dist/cli/catalog-check.d.cts +1 -0
  44. package/dist/cli/catalog-check.d.ts +1 -0
  45. package/dist/cli/catalog-check.js +26 -0
  46. package/dist/cli/catalog-check.js.map +1 -0
  47. package/dist/cli/probemesh-init.cjs +1049 -0
  48. package/dist/cli/probemesh-init.cjs.map +1 -0
  49. package/dist/cli/probemesh-init.d.cts +1 -0
  50. package/dist/cli/probemesh-init.d.ts +1 -0
  51. package/dist/cli/probemesh-init.js +22 -0
  52. package/dist/cli/probemesh-init.js.map +1 -0
  53. package/dist/cli/provider-conformance.cjs +6180 -0
  54. package/dist/cli/provider-conformance.cjs.map +1 -0
  55. package/dist/cli/provider-conformance.d.cts +1 -0
  56. package/dist/cli/provider-conformance.d.ts +1 -0
  57. package/dist/cli/provider-conformance.js +29 -0
  58. package/dist/cli/provider-conformance.js.map +1 -0
  59. package/dist/cli/provider-dossier-check.cjs +2978 -0
  60. package/dist/cli/provider-dossier-check.cjs.map +1 -0
  61. package/dist/cli/provider-dossier-check.d.cts +1 -0
  62. package/dist/cli/provider-dossier-check.d.ts +1 -0
  63. package/dist/cli/provider-dossier-check.js +27 -0
  64. package/dist/cli/provider-dossier-check.js.map +1 -0
  65. package/dist/cli/provider-dossier.cjs +1753 -0
  66. package/dist/cli/provider-dossier.cjs.map +1 -0
  67. package/dist/cli/provider-dossier.d.cts +1 -0
  68. package/dist/cli/provider-dossier.d.ts +1 -0
  69. package/dist/cli/provider-dossier.js +26 -0
  70. package/dist/cli/provider-dossier.js.map +1 -0
  71. package/dist/cli/x402-accept.cjs +6009 -0
  72. package/dist/cli/x402-accept.cjs.map +1 -0
  73. package/dist/cli/x402-accept.d.cts +1 -0
  74. package/dist/cli/x402-accept.d.ts +1 -0
  75. package/dist/cli/x402-accept.js +28 -0
  76. package/dist/cli/x402-accept.js.map +1 -0
  77. package/dist/index.cjs +13671 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.cts +2026 -0
  80. package/dist/index.d.ts +2026 -0
  81. package/dist/index.js +2560 -0
  82. package/dist/index.js.map +1 -0
  83. package/package.json +111 -0
@@ -0,0 +1,595 @@
1
+ import {
2
+ assertProviderOnboardingDossier,
3
+ validateProviderOnboardingDossier
4
+ } from "./chunk-TDOBAMYM.js";
5
+ import {
6
+ createProviderCatalog,
7
+ evaluateProviderCatalogPolicy,
8
+ summarizeProviderCatalog
9
+ } from "./chunk-ZJOLPBJJ.js";
10
+ import {
11
+ loadCliConfigDefault,
12
+ redactX402Secrets
13
+ } from "./chunk-NYTV263W.js";
14
+ import {
15
+ ProbeMeshError
16
+ } from "./chunk-2ASMVLG4.js";
17
+
18
+ // src/providerOnboardingDossierImport.ts
19
+ function parseProviderOnboardingDossierJson(json) {
20
+ if (typeof json !== "string") {
21
+ throw new ProbeMeshError({
22
+ code: "invalid_request",
23
+ message: "Provider onboarding dossier JSON must be a string."
24
+ });
25
+ }
26
+ let parsed;
27
+ try {
28
+ parsed = JSON.parse(json);
29
+ } catch (cause) {
30
+ throw new ProbeMeshError({
31
+ code: "invalid_request",
32
+ message: "Provider onboarding dossier JSON must be valid JSON.",
33
+ cause
34
+ });
35
+ }
36
+ assertProviderOnboardingDossier(parsed);
37
+ return parsed;
38
+ }
39
+ function createProviderCatalogFromOnboardingDossiers(options) {
40
+ assertDossierListOptions(options);
41
+ const readyArtifacts = options.dossiers.filter((dossier) => dossier.status === "ready").map((dossier) => dossier.artifacts.catalog);
42
+ return createProviderCatalog({
43
+ artifacts: readyArtifacts,
44
+ generatedAt: options.generatedAt
45
+ });
46
+ }
47
+ function evaluateProviderOnboardingDossiers(options) {
48
+ assertEvaluationOptions(options);
49
+ const catalog = createProviderCatalogFromOnboardingDossiers({
50
+ dossiers: options.dossiers,
51
+ generatedAt: options.generatedAt
52
+ });
53
+ const dossierResults = options.dossiers.map(summarizeDossierImport);
54
+ const readyDossiers = dossierResults.filter((dossier) => dossier.imported).length;
55
+ const failedDossiers = dossierResults.length - readyDossiers;
56
+ const checks = [
57
+ {
58
+ name: "dossiers_valid",
59
+ status: "passed",
60
+ message: `${options.dossiers.length} provider onboarding dossier(s) are valid.`
61
+ },
62
+ readyDossiers > 0 ? {
63
+ name: "ready_dossiers",
64
+ status: "passed",
65
+ message: `${readyDossiers} ready dossier(s) were imported into the buyer catalog.`
66
+ } : {
67
+ name: "ready_dossiers",
68
+ status: "failed",
69
+ message: "No ready dossiers were available for buyer catalog import."
70
+ }
71
+ ];
72
+ let policyEvaluation;
73
+ if (options.policy) {
74
+ policyEvaluation = evaluateProviderCatalogPolicy({
75
+ catalog,
76
+ catalogPolicy: options.policy.catalogPolicy,
77
+ adapterInventory: options.policy.adapterInventory,
78
+ queries: options.policy.queries
79
+ });
80
+ checks.push({
81
+ name: "catalog_policy",
82
+ status: policyEvaluation.status === "passed" ? "passed" : "failed",
83
+ message: policyEvaluation.status === "passed" ? "Imported dossier catalog passed the buyer catalog policy checks." : "Imported dossier catalog failed the buyer catalog policy checks."
84
+ });
85
+ }
86
+ if (failedDossiers > 0) {
87
+ checks.push({
88
+ name: "failed_dossiers_excluded",
89
+ status: "passed",
90
+ message: `${failedDossiers} failed dossier(s) were kept in the report and excluded from the buyer catalog.`
91
+ });
92
+ }
93
+ const failedChecks = checks.filter((check) => check.status === "failed").length;
94
+ const catalogSummary = summarizeProviderCatalog(catalog);
95
+ return {
96
+ status: failedChecks === 0 ? "passed" : "failed",
97
+ checks,
98
+ summary: {
99
+ ...catalogSummary,
100
+ totalDossiers: options.dossiers.length,
101
+ readyDossiers,
102
+ failedDossiers,
103
+ importedDossiers: readyDossiers,
104
+ excludedDossiers: failedDossiers,
105
+ policyStatus: policyEvaluation?.status
106
+ },
107
+ catalog,
108
+ dossiers: dossierResults,
109
+ policyEvaluation
110
+ };
111
+ }
112
+ function createHostedCatalogPolicyFromOnboardingDossiers(options) {
113
+ const catalogPolicy = createCatalogPolicyOptions(options);
114
+ const evaluation = evaluateProviderOnboardingDossiers({
115
+ dossiers: options.dossiers,
116
+ generatedAt: options.generatedAt,
117
+ policy: {
118
+ catalogPolicy,
119
+ adapterInventory: options.adapterInventory,
120
+ queries: options.queries
121
+ }
122
+ });
123
+ if (evaluation.status !== "passed") {
124
+ throw new ProbeMeshError({
125
+ code: "invalid_request",
126
+ message: `Provider onboarding dossiers cannot create a hosted catalog policy: ${formatFailedChecks(
127
+ evaluation.checks
128
+ )}`
129
+ });
130
+ }
131
+ return {
132
+ catalogPolicy: {
133
+ catalog: evaluation.catalog,
134
+ ...catalogPolicy
135
+ },
136
+ evaluation
137
+ };
138
+ }
139
+ function createProviderOnboardingDossierImportReport(result, options = {}) {
140
+ const report = {
141
+ title: options.title ?? "ProbeMesh Provider Onboarding Dossier Import Report",
142
+ generatedAt: options.generatedAt ?? (/* @__PURE__ */ new Date()).toISOString(),
143
+ status: result.status,
144
+ summary: cloneSerializable(result.summary),
145
+ checks: cloneSerializable(result.checks),
146
+ dossiers: cloneSerializable(result.dossiers),
147
+ policyEvaluation: cloneSerializable(result.policyEvaluation)
148
+ };
149
+ return sanitizeReport(report, options.forbiddenOutputValues ?? []);
150
+ }
151
+ function formatProviderOnboardingDossierImportReport(report, options = {}) {
152
+ if ((options.format ?? "json") === "markdown") {
153
+ return formatMarkdownReport(report);
154
+ }
155
+ return JSON.stringify(report, null, 2);
156
+ }
157
+ function assertDossierListOptions(options) {
158
+ if (!isRecord(options)) {
159
+ throw new ProbeMeshError({
160
+ code: "invalid_request",
161
+ message: "Provider onboarding dossier import options must be an object."
162
+ });
163
+ }
164
+ if (!Array.isArray(options.dossiers)) {
165
+ throw new ProbeMeshError({
166
+ code: "invalid_request",
167
+ message: "Provider onboarding dossier import options require dossiers array."
168
+ });
169
+ }
170
+ options.dossiers.forEach((dossier, index) => {
171
+ const validation = validateProviderOnboardingDossier(dossier);
172
+ if (!validation.valid) {
173
+ throw new ProbeMeshError({
174
+ code: "invalid_request",
175
+ message: `Invalid provider onboarding dossier at index ${index}: ${formatValidationErrors(
176
+ validation.errors
177
+ )}`
178
+ });
179
+ }
180
+ });
181
+ if (options.generatedAt !== void 0 && (typeof options.generatedAt !== "string" || Number.isNaN(Date.parse(options.generatedAt)))) {
182
+ throw new ProbeMeshError({
183
+ code: "invalid_request",
184
+ message: "Provider onboarding dossier import generatedAt must be an ISO timestamp."
185
+ });
186
+ }
187
+ }
188
+ function assertEvaluationOptions(options) {
189
+ assertDossierListOptions(options);
190
+ if (options.dossiers.length === 0) {
191
+ throw new ProbeMeshError({
192
+ code: "invalid_request",
193
+ message: "Provider onboarding dossier evaluation requires at least one dossier."
194
+ });
195
+ }
196
+ if (options.policy === void 0) {
197
+ return;
198
+ }
199
+ if (!isRecord(options.policy)) {
200
+ throw new ProbeMeshError({
201
+ code: "invalid_request",
202
+ message: "Provider onboarding dossier policy options must be an object."
203
+ });
204
+ }
205
+ if (!Array.isArray(options.policy.adapterInventory)) {
206
+ throw new ProbeMeshError({
207
+ code: "invalid_request",
208
+ message: "Provider onboarding dossier policy requires adapterInventory array."
209
+ });
210
+ }
211
+ if (!Array.isArray(options.policy.queries) || options.policy.queries.length === 0) {
212
+ throw new ProbeMeshError({
213
+ code: "invalid_request",
214
+ message: "Provider onboarding dossier policy requires at least one query."
215
+ });
216
+ }
217
+ }
218
+ function createCatalogPolicyOptions(options) {
219
+ return {
220
+ enabled: options.enabled,
221
+ status: options.status,
222
+ protocolMode: options.protocolMode,
223
+ paymentPreferences: options.paymentPreferences,
224
+ paymentStrategy: options.paymentStrategy,
225
+ maxCostUsd: options.maxCostUsd,
226
+ requiredReceiptTypes: options.requiredReceiptTypes,
227
+ providerIds: options.providerIds,
228
+ blockedProviderIds: options.blockedProviderIds
229
+ };
230
+ }
231
+ function summarizeDossierImport(dossier) {
232
+ return {
233
+ dossierId: dossier.dossierId,
234
+ providerId: dossier.provider.id,
235
+ status: dossier.status,
236
+ catalogArtifactId: dossier.evidence.catalog.artifactId,
237
+ conformanceArtifactId: dossier.evidence.conformance.artifactId,
238
+ imported: dossier.status === "ready",
239
+ reasons: [...dossier.readiness.reasons],
240
+ failedChecks: [...dossier.readiness.failedChecks]
241
+ };
242
+ }
243
+ function formatMarkdownReport(report) {
244
+ const lines = [
245
+ `# ${report.title}`,
246
+ "",
247
+ `Status: ${report.status}`,
248
+ `Generated: ${report.generatedAt}`,
249
+ "",
250
+ "## Summary",
251
+ `- Total dossiers: ${report.summary.totalDossiers}`,
252
+ `- Ready dossiers: ${report.summary.readyDossiers}`,
253
+ `- Failed dossiers: ${report.summary.failedDossiers}`,
254
+ `- Imported dossiers: ${report.summary.importedDossiers}`,
255
+ `- Excluded dossiers: ${report.summary.excludedDossiers}`,
256
+ `- Catalog entries: ${report.summary.totalEntries}`,
257
+ `- Providers: ${formatInlineList(report.summary.providers)}`,
258
+ `- Capabilities: ${formatInlineList(report.summary.capabilities)}`,
259
+ `- Policy status: ${report.summary.policyStatus ?? "not_run"}`,
260
+ "",
261
+ "## Checks",
262
+ ...report.checks.map(
263
+ (check) => `- [${check.status === "passed" ? "x" : " "}] ${check.name}: ${check.message}`
264
+ ),
265
+ "",
266
+ "## Dossiers",
267
+ ...report.dossiers.map(
268
+ (dossier) => `- ${dossier.dossierId}: ${dossier.status} / ${dossier.providerId} / ${dossier.imported ? "imported" : "excluded"}`
269
+ )
270
+ ];
271
+ if (report.policyEvaluation) {
272
+ lines.push(
273
+ "",
274
+ "## Policy",
275
+ `- Status: ${report.policyEvaluation.status}`,
276
+ `- Routeable matches: ${report.policyEvaluation.summary.routeableMatches}`,
277
+ `- Missing adapter matches: ${report.policyEvaluation.summary.missingAdapterMatches}`
278
+ );
279
+ }
280
+ return `${lines.join("\n")}
281
+ `;
282
+ }
283
+ function sanitizeReport(value, forbiddenOutputValues) {
284
+ const forbiddenValues = forbiddenOutputValues.filter((entry) => entry.length > 0);
285
+ return redactX402Secrets(
286
+ replaceForbiddenValues(value, forbiddenValues, /* @__PURE__ */ new WeakSet())
287
+ );
288
+ }
289
+ function replaceForbiddenValues(value, forbiddenValues, seen) {
290
+ if (typeof value === "string") {
291
+ return forbiddenValues.reduce(
292
+ (current, forbidden) => current.split(forbidden).join("[REDACTED]"),
293
+ value
294
+ );
295
+ }
296
+ if (value === null || typeof value !== "object" || value instanceof Date) {
297
+ return value;
298
+ }
299
+ if (seen.has(value)) {
300
+ return "[Circular]";
301
+ }
302
+ seen.add(value);
303
+ if (Array.isArray(value)) {
304
+ const entries2 = value.map(
305
+ (entry) => replaceForbiddenValues(entry, forbiddenValues, seen)
306
+ );
307
+ seen.delete(value);
308
+ return entries2;
309
+ }
310
+ const entries = Object.fromEntries(
311
+ Object.entries(value).map(([key, entry]) => [
312
+ key,
313
+ replaceForbiddenValues(entry, forbiddenValues, seen)
314
+ ])
315
+ );
316
+ seen.delete(value);
317
+ return entries;
318
+ }
319
+ function cloneSerializable(value) {
320
+ if (value === void 0) {
321
+ return value;
322
+ }
323
+ return JSON.parse(JSON.stringify(value));
324
+ }
325
+ function formatInlineList(values) {
326
+ return values.length > 0 ? values.join(", ") : "none";
327
+ }
328
+ function isRecord(value) {
329
+ return typeof value === "object" && value !== null && !Array.isArray(value);
330
+ }
331
+ function formatValidationErrors(errors) {
332
+ return errors.map((error) => `${error.path}: ${error.message}`).join("; ");
333
+ }
334
+ function formatFailedChecks(checks) {
335
+ const failedChecks = checks.filter((check) => check.status === "failed");
336
+ if (failedChecks.length === 0) {
337
+ return "unknown dossier import failure.";
338
+ }
339
+ return failedChecks.map((check) => `${check.name}: ${check.message}`).join("; ");
340
+ }
341
+
342
+ // src/cli/providerDossierCheckCli.ts
343
+ import { mkdir, readFile, writeFile } from "fs/promises";
344
+ import { dirname, resolve } from "path";
345
+ var USAGE = "Usage: probemesh-dossier-check --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-catalog <path>] [--title <text>] [--generated-at <iso>]";
346
+ async function runProviderDossierCheckCli(options = {}) {
347
+ const argv = options.argv ?? [];
348
+ const cwd = options.cwd ?? process.cwd();
349
+ try {
350
+ const parsedArgs = parseCliArgs(argv);
351
+ if (parsedArgs.help) {
352
+ return {
353
+ exitCode: 0,
354
+ skipped: true,
355
+ stdout: `${USAGE}
356
+ `
357
+ };
358
+ }
359
+ if (!parsedArgs.configPath) {
360
+ return cliFailure("--config <path> is required.");
361
+ }
362
+ const configExport = await loadCliConfig(parsedArgs.configPath, {
363
+ argv,
364
+ cwd
365
+ });
366
+ if (isCliSkip(configExport)) {
367
+ return {
368
+ exitCode: 0,
369
+ skipped: true,
370
+ skip: configExport,
371
+ stdout: `provider dossier check skipped: ${configExport.reason}
372
+ `
373
+ };
374
+ }
375
+ assertCliConfig(configExport);
376
+ const dossiers = await resolveDossiers(configExport, cwd);
377
+ const evaluation = evaluateProviderOnboardingDossiers({
378
+ dossiers,
379
+ generatedAt: parsedArgs.generatedAt ?? configExport.catalog?.generatedAt,
380
+ policy: configExport.policy
381
+ });
382
+ const report = createProviderOnboardingDossierImportReport(evaluation, {
383
+ ...configExport.report ?? {},
384
+ title: parsedArgs.title ?? configExport.report?.title,
385
+ generatedAt: parsedArgs.generatedAt ?? configExport.report?.generatedAt
386
+ });
387
+ const selectedFormat = parsedArgs.format ?? configExport.report?.format ?? "markdown";
388
+ const stdout = formatProviderOnboardingDossierImportReport(report, {
389
+ format: selectedFormat
390
+ });
391
+ const artifactPaths = await writeArtifacts({
392
+ cwd,
393
+ report,
394
+ catalog: evaluation.catalog,
395
+ outputs: {
396
+ json: parsedArgs.outJson ?? configExport.outputs?.json,
397
+ markdown: parsedArgs.outMarkdown ?? configExport.outputs?.markdown,
398
+ catalog: parsedArgs.outCatalog ?? configExport.outputs?.catalog
399
+ }
400
+ });
401
+ return {
402
+ exitCode: evaluation.status === "passed" ? 0 : 1,
403
+ skipped: false,
404
+ evaluation,
405
+ report,
406
+ catalog: evaluation.catalog,
407
+ stdout,
408
+ artifactPaths
409
+ };
410
+ } catch (error) {
411
+ return cliFailure(
412
+ error instanceof Error ? error.message : "Unknown provider dossier check CLI failure."
413
+ );
414
+ }
415
+ }
416
+ function parseCliArgs(argv) {
417
+ const parsedArgs = {};
418
+ for (let index = 0; index < argv.length; index += 1) {
419
+ const arg = argv[index];
420
+ if (arg === "--") {
421
+ continue;
422
+ }
423
+ if (arg === "--help" || arg === "-h") {
424
+ parsedArgs.help = true;
425
+ continue;
426
+ }
427
+ if (arg === "--config") {
428
+ parsedArgs.configPath = requireValue(argv, index, arg);
429
+ index += 1;
430
+ continue;
431
+ }
432
+ if (arg === "--format") {
433
+ const format = requireValue(argv, index, arg);
434
+ if (format !== "markdown" && format !== "json") {
435
+ throw new Error("--format must be markdown or json.");
436
+ }
437
+ parsedArgs.format = format;
438
+ index += 1;
439
+ continue;
440
+ }
441
+ if (arg === "--out-json") {
442
+ parsedArgs.outJson = requireValue(argv, index, arg);
443
+ index += 1;
444
+ continue;
445
+ }
446
+ if (arg === "--out-md") {
447
+ parsedArgs.outMarkdown = requireValue(argv, index, arg);
448
+ index += 1;
449
+ continue;
450
+ }
451
+ if (arg === "--out-catalog") {
452
+ parsedArgs.outCatalog = requireValue(argv, index, arg);
453
+ index += 1;
454
+ continue;
455
+ }
456
+ if (arg === "--title") {
457
+ parsedArgs.title = requireValue(argv, index, arg);
458
+ index += 1;
459
+ continue;
460
+ }
461
+ if (arg === "--generated-at") {
462
+ parsedArgs.generatedAt = requireValue(argv, index, arg);
463
+ index += 1;
464
+ continue;
465
+ }
466
+ throw new Error(`Unknown argument "${arg}".`);
467
+ }
468
+ return parsedArgs;
469
+ }
470
+ function requireValue(argv, index, flag) {
471
+ const value = argv[index + 1];
472
+ if (!value || value.startsWith("--")) {
473
+ throw new Error(`${flag} requires a value.`);
474
+ }
475
+ return value;
476
+ }
477
+ async function loadCliConfig(configPath, context) {
478
+ const configExport = await loadCliConfigDefault(configPath, context.cwd);
479
+ if (typeof configExport === "function") {
480
+ return configExport(context);
481
+ }
482
+ return configExport;
483
+ }
484
+ function isCliSkip(value) {
485
+ return !!value && typeof value === "object" && !Array.isArray(value) && value.skip === true && typeof value.reason === "string";
486
+ }
487
+ function assertCliConfig(config) {
488
+ if (!config || typeof config !== "object" || Array.isArray(config)) {
489
+ throw new Error("Provider dossier check CLI config must be an object.");
490
+ }
491
+ const candidate = config;
492
+ if (candidate.dossiers !== void 0 && !Array.isArray(candidate.dossiers)) {
493
+ throw new Error("Provider dossier check CLI dossiers must be an array.");
494
+ }
495
+ if (candidate.dossierFiles !== void 0 && (!Array.isArray(candidate.dossierFiles) || candidate.dossierFiles.some((file) => typeof file !== "string"))) {
496
+ throw new Error("Provider dossier check CLI dossierFiles must be an array of strings.");
497
+ }
498
+ if ((candidate.dossiers?.length ?? 0) === 0 && (candidate.dossierFiles?.length ?? 0) === 0) {
499
+ throw new Error("Provider dossier check CLI config requires dossiers or dossierFiles.");
500
+ }
501
+ if (candidate.catalog !== void 0 && !isRecord2(candidate.catalog)) {
502
+ throw new Error("Provider dossier check CLI catalog config must be an object.");
503
+ }
504
+ if (candidate.policy !== void 0 && !isRecord2(candidate.policy)) {
505
+ throw new Error("Provider dossier check CLI policy config must be an object.");
506
+ }
507
+ if (candidate.outputs !== void 0) {
508
+ assertOutputs(candidate.outputs);
509
+ }
510
+ }
511
+ function assertOutputs(outputs) {
512
+ if (!isRecord2(outputs)) {
513
+ throw new Error("Provider dossier check CLI outputs must be an object.");
514
+ }
515
+ for (const [key, value] of Object.entries(outputs)) {
516
+ if (!["json", "markdown", "catalog"].includes(key) || value !== void 0 && typeof value !== "string") {
517
+ throw new Error(
518
+ "Provider dossier check CLI outputs may only include json, markdown, and catalog string paths."
519
+ );
520
+ }
521
+ }
522
+ }
523
+ async function resolveDossiers(config, cwd) {
524
+ const dossiers = [
525
+ ...config.dossiers ?? []
526
+ ];
527
+ for (const dossierFile of config.dossierFiles ?? []) {
528
+ const parsed = JSON.parse(await readFile(resolve(cwd, dossierFile), "utf8"));
529
+ const entries = Array.isArray(parsed) ? parsed : [parsed];
530
+ for (const entry of entries) {
531
+ dossiers.push(parseProviderOnboardingDossierJson(JSON.stringify(entry)));
532
+ }
533
+ }
534
+ return dossiers;
535
+ }
536
+ async function writeArtifacts(options) {
537
+ const artifactPaths = {};
538
+ if (options.outputs.json) {
539
+ const path = resolve(options.cwd, options.outputs.json);
540
+ await writeTextFile(
541
+ path,
542
+ formatProviderOnboardingDossierImportReport(options.report, {
543
+ format: "json"
544
+ })
545
+ );
546
+ artifactPaths.json = path;
547
+ }
548
+ if (options.outputs.markdown) {
549
+ const path = resolve(options.cwd, options.outputs.markdown);
550
+ await writeTextFile(
551
+ path,
552
+ formatProviderOnboardingDossierImportReport(options.report, {
553
+ format: "markdown"
554
+ })
555
+ );
556
+ artifactPaths.markdown = path;
557
+ }
558
+ if (options.outputs.catalog) {
559
+ const path = resolve(options.cwd, options.outputs.catalog);
560
+ await writeTextFile(path, `${JSON.stringify(options.catalog, null, 2)}
561
+ `);
562
+ artifactPaths.catalog = path;
563
+ }
564
+ return artifactPaths;
565
+ }
566
+ async function writeTextFile(path, body) {
567
+ await mkdir(dirname(path), {
568
+ recursive: true
569
+ });
570
+ await writeFile(path, body, "utf8");
571
+ }
572
+ function cliFailure(message) {
573
+ return {
574
+ exitCode: 2,
575
+ skipped: false,
576
+ stdout: "",
577
+ stderr: `Provider dossier check CLI failed: ${message}
578
+ ${USAGE}
579
+ `
580
+ };
581
+ }
582
+ function isRecord2(value) {
583
+ return typeof value === "object" && value !== null && !Array.isArray(value);
584
+ }
585
+
586
+ export {
587
+ parseProviderOnboardingDossierJson,
588
+ createProviderCatalogFromOnboardingDossiers,
589
+ evaluateProviderOnboardingDossiers,
590
+ createHostedCatalogPolicyFromOnboardingDossiers,
591
+ createProviderOnboardingDossierImportReport,
592
+ formatProviderOnboardingDossierImportReport,
593
+ runProviderDossierCheckCli
594
+ };
595
+ //# sourceMappingURL=chunk-PXG54XOG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providerOnboardingDossierImport.ts","../src/cli/providerDossierCheckCli.ts"],"sourcesContent":["import { ProbeMeshError } from \"./errors\";\nimport type { HostedProviderCatalogPolicyOptions } from \"./hostedRouter\";\nimport {\n createProviderCatalog,\n summarizeProviderCatalog,\n type ProviderCatalog,\n type ProviderCatalogSummary,\n} from \"./providerCatalog\";\nimport {\n evaluateProviderCatalogPolicy,\n type ProviderCatalogPolicyAdapterInventory,\n type ProviderCatalogPolicyEvaluationResult,\n type ProviderCatalogPolicyExpectedQuery,\n type ProviderCatalogPolicyOptions,\n} from \"./providerCatalogPolicy\";\nimport {\n assertProviderOnboardingDossier,\n validateProviderOnboardingDossier,\n type ProviderOnboardingDossier,\n type ProviderOnboardingDossierStatus,\n} from \"./providerOnboardingDossier\";\nimport { redactX402Secrets } from \"./protocols/x402Redaction\";\n\nexport type ProviderOnboardingDossierImportStatus = \"passed\" | \"failed\";\n\nexport type ProviderOnboardingDossierImportCheckStatus = \"passed\" | \"failed\";\n\nexport type ProviderOnboardingDossierImportReportFormat = \"json\" | \"markdown\";\n\nexport interface ProviderCatalogFromOnboardingDossiersOptions {\n dossiers: ProviderOnboardingDossier[];\n generatedAt?: string;\n}\n\nexport interface ProviderOnboardingDossierPolicyEvaluationOptions {\n catalogPolicy?: ProviderCatalogPolicyOptions;\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n}\n\nexport interface ProviderOnboardingDossierEvaluationOptions\n extends ProviderCatalogFromOnboardingDossiersOptions {\n policy?: ProviderOnboardingDossierPolicyEvaluationOptions;\n}\n\nexport interface HostedCatalogPolicyFromOnboardingDossiersOptions\n extends ProviderCatalogFromOnboardingDossiersOptions,\n ProviderCatalogPolicyOptions {\n adapterInventory: ProviderCatalogPolicyAdapterInventory;\n queries: ProviderCatalogPolicyExpectedQuery[];\n}\n\nexport interface HostedCatalogPolicyFromOnboardingDossiersResult {\n catalogPolicy: HostedProviderCatalogPolicyOptions;\n evaluation: ProviderOnboardingDossierEvaluationResult;\n}\n\nexport interface ProviderOnboardingDossierImportCheck {\n name: string;\n status: ProviderOnboardingDossierImportCheckStatus;\n message: string;\n dossierId?: string;\n providerId?: string;\n}\n\nexport interface ProviderOnboardingDossierImportDossierResult {\n dossierId: string;\n providerId: string;\n status: ProviderOnboardingDossierStatus;\n catalogArtifactId: string;\n conformanceArtifactId: string;\n imported: boolean;\n reasons: string[];\n failedChecks: string[];\n}\n\nexport interface ProviderOnboardingDossierEvaluationResult {\n status: ProviderOnboardingDossierImportStatus;\n checks: ProviderOnboardingDossierImportCheck[];\n summary: ProviderCatalogSummary & {\n totalDossiers: number;\n readyDossiers: number;\n failedDossiers: number;\n importedDossiers: number;\n excludedDossiers: number;\n policyStatus?: ProviderCatalogPolicyEvaluationResult[\"status\"];\n };\n catalog: ProviderCatalog;\n dossiers: ProviderOnboardingDossierImportDossierResult[];\n policyEvaluation?: ProviderCatalogPolicyEvaluationResult;\n}\n\nexport interface ProviderOnboardingDossierImportReportOptions {\n title?: string;\n generatedAt?: string;\n forbiddenOutputValues?: string[];\n}\n\nexport interface ProviderOnboardingDossierImportReport {\n title: string;\n generatedAt: string;\n status: ProviderOnboardingDossierImportStatus;\n summary: ProviderOnboardingDossierEvaluationResult[\"summary\"];\n checks: ProviderOnboardingDossierImportCheck[];\n dossiers: ProviderOnboardingDossierImportDossierResult[];\n policyEvaluation?: ProviderCatalogPolicyEvaluationResult;\n}\n\nexport function parseProviderOnboardingDossierJson(\n json: string,\n): ProviderOnboardingDossier {\n if (typeof json !== \"string\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier JSON must be a string.\",\n });\n }\n\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(json);\n } catch (cause) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier JSON must be valid JSON.\",\n cause,\n });\n }\n\n assertProviderOnboardingDossier(parsed);\n\n return parsed;\n}\n\nexport function createProviderCatalogFromOnboardingDossiers(\n options: ProviderCatalogFromOnboardingDossiersOptions,\n): ProviderCatalog {\n assertDossierListOptions(options);\n\n const readyArtifacts = options.dossiers\n .filter((dossier) => dossier.status === \"ready\")\n .map((dossier) => dossier.artifacts.catalog);\n\n return createProviderCatalog({\n artifacts: readyArtifacts,\n generatedAt: options.generatedAt,\n });\n}\n\nexport function evaluateProviderOnboardingDossiers(\n options: ProviderOnboardingDossierEvaluationOptions,\n): ProviderOnboardingDossierEvaluationResult {\n assertEvaluationOptions(options);\n\n const catalog = createProviderCatalogFromOnboardingDossiers({\n dossiers: options.dossiers,\n generatedAt: options.generatedAt,\n });\n const dossierResults = options.dossiers.map(summarizeDossierImport);\n const readyDossiers = dossierResults.filter((dossier) => dossier.imported).length;\n const failedDossiers = dossierResults.length - readyDossiers;\n const checks: ProviderOnboardingDossierImportCheck[] = [\n {\n name: \"dossiers_valid\",\n status: \"passed\",\n message: `${options.dossiers.length} provider onboarding dossier(s) are valid.`,\n },\n readyDossiers > 0\n ? {\n name: \"ready_dossiers\",\n status: \"passed\",\n message: `${readyDossiers} ready dossier(s) were imported into the buyer catalog.`,\n }\n : {\n name: \"ready_dossiers\",\n status: \"failed\",\n message: \"No ready dossiers were available for buyer catalog import.\",\n },\n ];\n let policyEvaluation: ProviderCatalogPolicyEvaluationResult | undefined;\n\n if (options.policy) {\n policyEvaluation = evaluateProviderCatalogPolicy({\n catalog,\n catalogPolicy: options.policy.catalogPolicy,\n adapterInventory: options.policy.adapterInventory,\n queries: options.policy.queries,\n });\n checks.push({\n name: \"catalog_policy\",\n status: policyEvaluation.status === \"passed\" ? \"passed\" : \"failed\",\n message:\n policyEvaluation.status === \"passed\"\n ? \"Imported dossier catalog passed the buyer catalog policy checks.\"\n : \"Imported dossier catalog failed the buyer catalog policy checks.\",\n });\n }\n\n if (failedDossiers > 0) {\n checks.push({\n name: \"failed_dossiers_excluded\",\n status: \"passed\",\n message: `${failedDossiers} failed dossier(s) were kept in the report and excluded from the buyer catalog.`,\n });\n }\n\n const failedChecks = checks.filter((check) => check.status === \"failed\").length;\n const catalogSummary = summarizeProviderCatalog(catalog);\n\n return {\n status: failedChecks === 0 ? \"passed\" : \"failed\",\n checks,\n summary: {\n ...catalogSummary,\n totalDossiers: options.dossiers.length,\n readyDossiers,\n failedDossiers,\n importedDossiers: readyDossiers,\n excludedDossiers: failedDossiers,\n policyStatus: policyEvaluation?.status,\n },\n catalog,\n dossiers: dossierResults,\n policyEvaluation,\n };\n}\n\nexport function createHostedCatalogPolicyFromOnboardingDossiers(\n options: HostedCatalogPolicyFromOnboardingDossiersOptions,\n): HostedCatalogPolicyFromOnboardingDossiersResult {\n const catalogPolicy = createCatalogPolicyOptions(options);\n const evaluation = evaluateProviderOnboardingDossiers({\n dossiers: options.dossiers,\n generatedAt: options.generatedAt,\n policy: {\n catalogPolicy,\n adapterInventory: options.adapterInventory,\n queries: options.queries,\n },\n });\n\n if (evaluation.status !== \"passed\") {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Provider onboarding dossiers cannot create a hosted catalog policy: ${formatFailedChecks(\n evaluation.checks,\n )}`,\n });\n }\n\n return {\n catalogPolicy: {\n catalog: evaluation.catalog,\n ...catalogPolicy,\n },\n evaluation,\n };\n}\n\nexport function createProviderOnboardingDossierImportReport(\n result: ProviderOnboardingDossierEvaluationResult,\n options: ProviderOnboardingDossierImportReportOptions = {},\n): ProviderOnboardingDossierImportReport {\n const report: ProviderOnboardingDossierImportReport = {\n title: options.title ?? \"ProbeMesh Provider Onboarding Dossier Import Report\",\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n status: result.status,\n summary: cloneSerializable(result.summary),\n checks: cloneSerializable(result.checks),\n dossiers: cloneSerializable(result.dossiers),\n policyEvaluation: cloneSerializable(result.policyEvaluation),\n };\n\n return sanitizeReport(report, options.forbiddenOutputValues ?? []);\n}\n\nexport function formatProviderOnboardingDossierImportReport(\n report: ProviderOnboardingDossierImportReport,\n options: {\n format?: ProviderOnboardingDossierImportReportFormat;\n } = {},\n) {\n if ((options.format ?? \"json\") === \"markdown\") {\n return formatMarkdownReport(report);\n }\n\n return JSON.stringify(report, null, 2);\n}\n\nfunction assertDossierListOptions(\n options: ProviderCatalogFromOnboardingDossiersOptions,\n): asserts options is ProviderCatalogFromOnboardingDossiersOptions {\n if (!isRecord(options)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier import options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.dossiers)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier import options require dossiers array.\",\n });\n }\n\n options.dossiers.forEach((dossier, index) => {\n const validation = validateProviderOnboardingDossier(dossier);\n\n if (!validation.valid) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: `Invalid provider onboarding dossier at index ${index}: ${formatValidationErrors(\n validation.errors,\n )}`,\n });\n }\n });\n\n if (\n options.generatedAt !== undefined &&\n (typeof options.generatedAt !== \"string\" ||\n Number.isNaN(Date.parse(options.generatedAt)))\n ) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier import generatedAt must be an ISO timestamp.\",\n });\n }\n}\n\nfunction assertEvaluationOptions(\n options: ProviderOnboardingDossierEvaluationOptions,\n): asserts options is ProviderOnboardingDossierEvaluationOptions {\n assertDossierListOptions(options);\n\n if (options.dossiers.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier evaluation requires at least one dossier.\",\n });\n }\n\n if (options.policy === undefined) {\n return;\n }\n\n if (!isRecord(options.policy)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier policy options must be an object.\",\n });\n }\n\n if (!Array.isArray(options.policy.adapterInventory)) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier policy requires adapterInventory array.\",\n });\n }\n\n if (!Array.isArray(options.policy.queries) || options.policy.queries.length === 0) {\n throw new ProbeMeshError({\n code: \"invalid_request\",\n message: \"Provider onboarding dossier policy requires at least one query.\",\n });\n }\n}\n\nfunction createCatalogPolicyOptions(\n options: HostedCatalogPolicyFromOnboardingDossiersOptions,\n): ProviderCatalogPolicyOptions {\n return {\n enabled: options.enabled,\n status: options.status,\n protocolMode: options.protocolMode,\n paymentPreferences: options.paymentPreferences,\n paymentStrategy: options.paymentStrategy,\n maxCostUsd: options.maxCostUsd,\n requiredReceiptTypes: options.requiredReceiptTypes,\n providerIds: options.providerIds,\n blockedProviderIds: options.blockedProviderIds,\n };\n}\n\nfunction summarizeDossierImport(\n dossier: ProviderOnboardingDossier,\n): ProviderOnboardingDossierImportDossierResult {\n return {\n dossierId: dossier.dossierId,\n providerId: dossier.provider.id,\n status: dossier.status,\n catalogArtifactId: dossier.evidence.catalog.artifactId,\n conformanceArtifactId: dossier.evidence.conformance.artifactId,\n imported: dossier.status === \"ready\",\n reasons: [...dossier.readiness.reasons],\n failedChecks: [...dossier.readiness.failedChecks],\n };\n}\n\nfunction formatMarkdownReport(report: ProviderOnboardingDossierImportReport) {\n const lines = [\n `# ${report.title}`,\n \"\",\n `Status: ${report.status}`,\n `Generated: ${report.generatedAt}`,\n \"\",\n \"## Summary\",\n `- Total dossiers: ${report.summary.totalDossiers}`,\n `- Ready dossiers: ${report.summary.readyDossiers}`,\n `- Failed dossiers: ${report.summary.failedDossiers}`,\n `- Imported dossiers: ${report.summary.importedDossiers}`,\n `- Excluded dossiers: ${report.summary.excludedDossiers}`,\n `- Catalog entries: ${report.summary.totalEntries}`,\n `- Providers: ${formatInlineList(report.summary.providers)}`,\n `- Capabilities: ${formatInlineList(report.summary.capabilities)}`,\n `- Policy status: ${report.summary.policyStatus ?? \"not_run\"}`,\n \"\",\n \"## Checks\",\n ...report.checks.map(\n (check) =>\n `- [${check.status === \"passed\" ? \"x\" : \" \"}] ${check.name}: ${check.message}`,\n ),\n \"\",\n \"## Dossiers\",\n ...report.dossiers.map(\n (dossier) =>\n `- ${dossier.dossierId}: ${dossier.status} / ${dossier.providerId} / ${\n dossier.imported ? \"imported\" : \"excluded\"\n }`,\n ),\n ];\n\n if (report.policyEvaluation) {\n lines.push(\n \"\",\n \"## Policy\",\n `- Status: ${report.policyEvaluation.status}`,\n `- Routeable matches: ${report.policyEvaluation.summary.routeableMatches}`,\n `- Missing adapter matches: ${report.policyEvaluation.summary.missingAdapterMatches}`,\n );\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction sanitizeReport<T>(value: T, forbiddenOutputValues: string[]): 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 cloneSerializable<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction formatInlineList(values: readonly string[]) {\n return values.length > 0 ? values.join(\", \") : \"none\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction formatValidationErrors(\n errors: { path: string; message: string }[],\n) {\n return errors.map((error) => `${error.path}: ${error.message}`).join(\"; \");\n}\n\nfunction formatFailedChecks(checks: ProviderOnboardingDossierImportCheck[]) {\n const failedChecks = checks.filter((check) => check.status === \"failed\");\n\n if (failedChecks.length === 0) {\n return \"unknown dossier import failure.\";\n }\n\n return failedChecks\n .map((check) => `${check.name}: ${check.message}`)\n .join(\"; \");\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\n\nimport { loadCliConfigDefault } from \"./configLoader\";\n\nimport {\n createProviderOnboardingDossierImportReport,\n evaluateProviderOnboardingDossiers,\n formatProviderOnboardingDossierImportReport,\n parseProviderOnboardingDossierJson,\n} from \"../providerOnboardingDossierImport\";\nimport type {\n ProviderOnboardingDossierEvaluationResult,\n ProviderOnboardingDossierImportReport,\n ProviderOnboardingDossierImportReportFormat,\n ProviderOnboardingDossierImportReportOptions,\n ProviderOnboardingDossierPolicyEvaluationOptions,\n} from \"../providerOnboardingDossierImport\";\nimport type { ProviderCatalog } from \"../providerCatalog\";\nimport type { ProviderOnboardingDossier } from \"../providerOnboardingDossier\";\n\nexport interface ProviderDossierCheckCliSkip {\n skip: true;\n reason: string;\n details?: unknown;\n}\n\nexport interface ProviderDossierCheckCliCatalog {\n generatedAt?: string;\n}\n\nexport interface ProviderDossierCheckCliOutputs {\n json?: string;\n markdown?: string;\n catalog?: string;\n}\n\nexport interface ProviderDossierCheckCliConfig {\n dossiers?: ProviderOnboardingDossier[];\n dossierFiles?: string[];\n catalog?: ProviderDossierCheckCliCatalog;\n policy?: ProviderOnboardingDossierPolicyEvaluationOptions;\n report?: ProviderOnboardingDossierImportReportOptions & {\n format?: ProviderOnboardingDossierImportReportFormat;\n };\n outputs?: ProviderDossierCheckCliOutputs;\n}\n\nexport type ProviderDossierCheckCliConfigExport =\n | ProviderDossierCheckCliConfig\n | ProviderDossierCheckCliSkip;\n\nexport type ProviderDossierCheckCliConfigFactory = (\n context: ProviderDossierCheckCliConfigContext,\n) =>\n | ProviderDossierCheckCliConfigExport\n | Promise<ProviderDossierCheckCliConfigExport>;\n\nexport interface ProviderDossierCheckCliConfigContext {\n argv: string[];\n cwd: string;\n}\n\nexport interface ProviderDossierCheckCliOptions {\n argv?: string[];\n cwd?: string;\n}\n\nexport interface ProviderDossierCheckCliResult {\n exitCode: 0 | 1 | 2;\n skipped: boolean;\n skip?: ProviderDossierCheckCliSkip;\n evaluation?: ProviderOnboardingDossierEvaluationResult;\n report?: ProviderOnboardingDossierImportReport;\n catalog?: ProviderCatalog;\n stdout: string;\n stderr?: string;\n artifactPaths?: ProviderDossierCheckCliOutputs;\n}\n\ninterface ParsedCliArgs {\n configPath?: string;\n format?: ProviderOnboardingDossierImportReportFormat;\n outJson?: string;\n outMarkdown?: string;\n outCatalog?: string;\n title?: string;\n generatedAt?: string;\n help?: boolean;\n}\n\nconst USAGE =\n \"Usage: probemesh-dossier-check --config <path> [--format markdown|json] [--out-json <path>] [--out-md <path>] [--out-catalog <path>] [--title <text>] [--generated-at <iso>]\";\n\nexport async function runProviderDossierCheckCli(\n options: ProviderDossierCheckCliOptions = {},\n): Promise<ProviderDossierCheckCliResult> {\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 dossier check skipped: ${configExport.reason}\\n`,\n };\n }\n\n assertCliConfig(configExport);\n\n const dossiers = await resolveDossiers(configExport, cwd);\n const evaluation = evaluateProviderOnboardingDossiers({\n dossiers,\n generatedAt:\n parsedArgs.generatedAt ?? configExport.catalog?.generatedAt,\n policy: configExport.policy,\n });\n const report = createProviderOnboardingDossierImportReport(evaluation, {\n ...(configExport.report ?? {}),\n title: parsedArgs.title ?? configExport.report?.title,\n generatedAt: parsedArgs.generatedAt ?? configExport.report?.generatedAt,\n });\n const selectedFormat =\n parsedArgs.format ?? configExport.report?.format ?? \"markdown\";\n const stdout = formatProviderOnboardingDossierImportReport(report, {\n format: selectedFormat,\n });\n const artifactPaths = await writeArtifacts({\n cwd,\n report,\n catalog: evaluation.catalog,\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: evaluation.status === \"passed\" ? 0 : 1,\n skipped: false,\n evaluation,\n report,\n catalog: evaluation.catalog,\n stdout,\n artifactPaths,\n };\n } catch (error) {\n return cliFailure(\n error instanceof Error\n ? error.message\n : \"Unknown provider dossier check 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-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 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: ProviderDossierCheckCliConfigContext,\n): Promise<ProviderDossierCheckCliConfigExport> {\n const configExport = await loadCliConfigDefault(configPath, context.cwd);\n\n if (typeof configExport === \"function\") {\n return (configExport as ProviderDossierCheckCliConfigFactory)(context);\n }\n\n return configExport as ProviderDossierCheckCliConfigExport;\n}\n\nfunction isCliSkip(value: unknown): value is ProviderDossierCheckCliSkip {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (value as Partial<ProviderDossierCheckCliSkip>).skip === true &&\n typeof (value as Partial<ProviderDossierCheckCliSkip>).reason === \"string\"\n );\n}\n\nfunction assertCliConfig(\n config: unknown,\n): asserts config is ProviderDossierCheckCliConfig {\n if (!config || typeof config !== \"object\" || Array.isArray(config)) {\n throw new Error(\"Provider dossier check CLI config must be an object.\");\n }\n\n const candidate = config as Partial<ProviderDossierCheckCliConfig>;\n\n if (\n candidate.dossiers !== undefined &&\n !Array.isArray(candidate.dossiers)\n ) {\n throw new Error(\"Provider dossier check CLI dossiers must be an array.\");\n }\n\n if (\n candidate.dossierFiles !== undefined &&\n (!Array.isArray(candidate.dossierFiles) ||\n candidate.dossierFiles.some((file) => typeof file !== \"string\"))\n ) {\n throw new Error(\"Provider dossier check CLI dossierFiles must be an array of strings.\");\n }\n\n if (\n (candidate.dossiers?.length ?? 0) === 0 &&\n (candidate.dossierFiles?.length ?? 0) === 0\n ) {\n throw new Error(\"Provider dossier check CLI config requires dossiers or dossierFiles.\");\n }\n\n if (candidate.catalog !== undefined && !isRecord(candidate.catalog)) {\n throw new Error(\"Provider dossier check CLI catalog config must be an object.\");\n }\n\n if (candidate.policy !== undefined && !isRecord(candidate.policy)) {\n throw new Error(\"Provider dossier check CLI policy 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 dossier check CLI outputs must be an object.\");\n }\n\n for (const [key, value] of Object.entries(outputs)) {\n if (\n ![\"json\", \"markdown\", \"catalog\"].includes(key) ||\n (value !== undefined && typeof value !== \"string\")\n ) {\n throw new Error(\n \"Provider dossier check CLI outputs may only include json, markdown, and catalog string paths.\",\n );\n }\n }\n}\n\nasync function resolveDossiers(\n config: ProviderDossierCheckCliConfig,\n cwd: string,\n) {\n const dossiers: ProviderOnboardingDossier[] = [\n ...(config.dossiers ?? []),\n ];\n\n for (const dossierFile of config.dossierFiles ?? []) {\n const parsed = JSON.parse(await readFile(resolve(cwd, dossierFile), \"utf8\"));\n const entries = Array.isArray(parsed) ? parsed : [parsed];\n\n for (const entry of entries) {\n dossiers.push(parseProviderOnboardingDossierJson(JSON.stringify(entry)));\n }\n }\n\n return dossiers;\n}\n\nasync function writeArtifacts(options: {\n cwd: string;\n report: ProviderOnboardingDossierImportReport;\n catalog: ProviderCatalog;\n outputs: ProviderDossierCheckCliOutputs;\n}) {\n const artifactPaths: ProviderDossierCheckCliOutputs = {};\n\n if (options.outputs.json) {\n const path = resolve(options.cwd, options.outputs.json);\n await writeTextFile(\n path,\n formatProviderOnboardingDossierImportReport(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 formatProviderOnboardingDossierImportReport(options.report, {\n format: \"markdown\",\n }),\n );\n artifactPaths.markdown = path;\n }\n\n if (options.outputs.catalog) {\n const path = resolve(options.cwd, options.outputs.catalog);\n await writeTextFile(path, `${JSON.stringify(options.catalog, null, 2)}\\n`);\n artifactPaths.catalog = 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): ProviderDossierCheckCliResult {\n return {\n exitCode: 2,\n skipped: false,\n stdout: \"\",\n stderr: `Provider dossier check 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":";;;;;;;;;;;;;;;;;;AA4GO,SAAS,mCACd,MAC2B;AAC3B,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI;AAEJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,kCAAgC,MAAM;AAEtC,SAAO;AACT;AAEO,SAAS,4CACd,SACiB;AACjB,2BAAyB,OAAO;AAEhC,QAAM,iBAAiB,QAAQ,SAC5B,OAAO,CAAC,YAAY,QAAQ,WAAW,OAAO,EAC9C,IAAI,CAAC,YAAY,QAAQ,UAAU,OAAO;AAE7C,SAAO,sBAAsB;AAAA,IAC3B,WAAW;AAAA,IACX,aAAa,QAAQ;AAAA,EACvB,CAAC;AACH;AAEO,SAAS,mCACd,SAC2C;AAC3C,0BAAwB,OAAO;AAE/B,QAAM,UAAU,4CAA4C;AAAA,IAC1D,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB,CAAC;AACD,QAAM,iBAAiB,QAAQ,SAAS,IAAI,sBAAsB;AAClE,QAAM,gBAAgB,eAAe,OAAO,CAAC,YAAY,QAAQ,QAAQ,EAAE;AAC3E,QAAM,iBAAiB,eAAe,SAAS;AAC/C,QAAM,SAAiD;AAAA,IACrD;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,QAAQ,SAAS,MAAM;AAAA,IACrC;AAAA,IACA,gBAAgB,IACZ;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,aAAa;AAAA,IAC3B,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACN;AACA,MAAI;AAEJ,MAAI,QAAQ,QAAQ;AAClB,uBAAmB,8BAA8B;AAAA,MAC/C;AAAA,MACA,eAAe,QAAQ,OAAO;AAAA,MAC9B,kBAAkB,QAAQ,OAAO;AAAA,MACjC,SAAS,QAAQ,OAAO;AAAA,IAC1B,CAAC;AACD,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,iBAAiB,WAAW,WAAW,WAAW;AAAA,MAC1D,SACE,iBAAiB,WAAW,WACxB,qEACA;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,iBAAiB,GAAG;AACtB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,GAAG,cAAc;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ,EAAE;AACzE,QAAM,iBAAiB,yBAAyB,OAAO;AAEvD,SAAO;AAAA,IACL,QAAQ,iBAAiB,IAAI,WAAW;AAAA,IACxC;AAAA,IACA,SAAS;AAAA,MACP,GAAG;AAAA,MACH,eAAe,QAAQ,SAAS;AAAA,MAChC;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB,cAAc,kBAAkB;AAAA,IAClC;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,gDACd,SACiD;AACjD,QAAM,gBAAgB,2BAA2B,OAAO;AACxD,QAAM,aAAa,mCAAmC;AAAA,IACpD,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,IACrB,QAAQ;AAAA,MACN;AAAA,MACA,kBAAkB,QAAQ;AAAA,MAC1B,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF,CAAC;AAED,MAAI,WAAW,WAAW,UAAU;AAClC,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS,uEAAuE;AAAA,QAC9E,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,MACb,SAAS,WAAW;AAAA,MACpB,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,4CACd,QACA,UAAwD,CAAC,GAClB;AACvC,QAAM,SAAgD;AAAA,IACpD,OAAO,QAAQ,SAAS;AAAA,IACxB,aAAa,QAAQ,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3D,QAAQ,OAAO;AAAA,IACf,SAAS,kBAAkB,OAAO,OAAO;AAAA,IACzC,QAAQ,kBAAkB,OAAO,MAAM;AAAA,IACvC,UAAU,kBAAkB,OAAO,QAAQ;AAAA,IAC3C,kBAAkB,kBAAkB,OAAO,gBAAgB;AAAA,EAC7D;AAEA,SAAO,eAAe,QAAQ,QAAQ,yBAAyB,CAAC,CAAC;AACnE;AAEO,SAAS,4CACd,QACA,UAEI,CAAC,GACL;AACA,OAAK,QAAQ,UAAU,YAAY,YAAY;AAC7C,WAAO,qBAAqB,MAAM;AAAA,EACpC;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAEA,SAAS,yBACP,SACiE;AACjE,MAAI,CAAC,SAAS,OAAO,GAAG;AACtB,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,QAAQ,QAAQ,GAAG;AACpC,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,UAAQ,SAAS,QAAQ,CAAC,SAAS,UAAU;AAC3C,UAAM,aAAa,kCAAkC,OAAO;AAE5D,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,IAAI,eAAe;AAAA,QACvB,MAAM;AAAA,QACN,SAAS,gDAAgD,KAAK,KAAK;AAAA,UACjE,WAAW;AAAA,QACb,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,MACE,QAAQ,gBAAgB,WACvB,OAAO,QAAQ,gBAAgB,YAC9B,OAAO,MAAM,KAAK,MAAM,QAAQ,WAAW,CAAC,IAC9C;AACA,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBACP,SAC+D;AAC/D,2BAAyB,OAAO;AAEhC,MAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,WAAW,QAAW;AAChC;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,QAAQ,MAAM,GAAG;AAC7B,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,gBAAgB,GAAG;AACnD,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,MAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK,QAAQ,OAAO,QAAQ,WAAW,GAAG;AACjF,UAAM,IAAI,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,SAC8B;AAC9B,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,cAAc,QAAQ;AAAA,IACtB,oBAAoB,QAAQ;AAAA,IAC5B,iBAAiB,QAAQ;AAAA,IACzB,YAAY,QAAQ;AAAA,IACpB,sBAAsB,QAAQ;AAAA,IAC9B,aAAa,QAAQ;AAAA,IACrB,oBAAoB,QAAQ;AAAA,EAC9B;AACF;AAEA,SAAS,uBACP,SAC8C;AAC9C,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ,SAAS;AAAA,IAC7B,QAAQ,QAAQ;AAAA,IAChB,mBAAmB,QAAQ,SAAS,QAAQ;AAAA,IAC5C,uBAAuB,QAAQ,SAAS,YAAY;AAAA,IACpD,UAAU,QAAQ,WAAW;AAAA,IAC7B,SAAS,CAAC,GAAG,QAAQ,UAAU,OAAO;AAAA,IACtC,cAAc,CAAC,GAAG,QAAQ,UAAU,YAAY;AAAA,EAClD;AACF;AAEA,SAAS,qBAAqB,QAA+C;AAC3E,QAAM,QAAQ;AAAA,IACZ,KAAK,OAAO,KAAK;AAAA,IACjB;AAAA,IACA,WAAW,OAAO,MAAM;AAAA,IACxB,cAAc,OAAO,WAAW;AAAA,IAChC;AAAA,IACA;AAAA,IACA,qBAAqB,OAAO,QAAQ,aAAa;AAAA,IACjD,qBAAqB,OAAO,QAAQ,aAAa;AAAA,IACjD,sBAAsB,OAAO,QAAQ,cAAc;AAAA,IACnD,wBAAwB,OAAO,QAAQ,gBAAgB;AAAA,IACvD,wBAAwB,OAAO,QAAQ,gBAAgB;AAAA,IACvD,sBAAsB,OAAO,QAAQ,YAAY;AAAA,IACjD,gBAAgB,iBAAiB,OAAO,QAAQ,SAAS,CAAC;AAAA,IAC1D,mBAAmB,iBAAiB,OAAO,QAAQ,YAAY,CAAC;AAAA,IAChE,oBAAoB,OAAO,QAAQ,gBAAgB,SAAS;AAAA,IAC5D;AAAA,IACA;AAAA,IACA,GAAG,OAAO,OAAO;AAAA,MACf,CAAC,UACC,MAAM,MAAM,WAAW,WAAW,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,IAChF;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,OAAO,SAAS;AAAA,MACjB,CAAC,YACC,KAAK,QAAQ,SAAS,KAAK,QAAQ,MAAM,MAAM,QAAQ,UAAU,MAC/D,QAAQ,WAAW,aAAa,UAClC;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,OAAO,kBAAkB;AAC3B,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa,OAAO,iBAAiB,MAAM;AAAA,MAC3C,wBAAwB,OAAO,iBAAiB,QAAQ,gBAAgB;AAAA,MACxE,8BAA8B,OAAO,iBAAiB,QAAQ,qBAAqB;AAAA,IACrF;AAAA,EACF;AAEA,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAC5B;AAEA,SAAS,eAAkB,OAAU,uBAAoC;AACvE,QAAM,kBAAkB,sBAAsB,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AAEhF,SAAO;AAAA,IACL,uBAAuB,OAAO,iBAAiB,oBAAI,QAAgB,CAAC;AAAA,EACtE;AACF;AAEA,SAAS,uBACP,OACA,iBACA,MACS;AACT,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,gBAAgB;AAAA,MACrB,CAAC,SAAS,cAAc,QAAQ,MAAM,SAAS,EAAE,KAAK,YAAY;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,iBAAiB,MAAM;AACxE,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,IAAI,KAAK,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,OAAK,IAAI,KAAK;AAEd,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAMA,WAAU,MAAM;AAAA,MAAI,CAAC,UACzB,uBAAuB,OAAO,iBAAiB,IAAI;AAAA,IACrD;AAEA,SAAK,OAAO,KAAK;AACjB,WAAOA;AAAA,EACT;AAEA,QAAM,UAAU,OAAO;AAAA,IACrB,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,MAC1C;AAAA,MACA,uBAAuB,OAAO,iBAAiB,IAAI;AAAA,IACrD,CAAC;AAAA,EACH;AAEA,OAAK,OAAO,KAAK;AACjB,SAAO;AACT;AAEA,SAAS,kBAAqB,OAAa;AACzC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAEA,SAAS,iBAAiB,QAA2B;AACnD,SAAO,OAAO,SAAS,IAAI,OAAO,KAAK,IAAI,IAAI;AACjD;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,uBACP,QACA;AACA,SAAO,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,EAAE,KAAK,IAAI;AAC3E;AAEA,SAAS,mBAAmB,QAAgD;AAC1E,QAAM,eAAe,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ;AAEvE,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,aACJ,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE,EAChD,KAAK,IAAI;AACd;;;ACjhBA,SAAS,OAAO,UAAU,iBAAiB;AAC3C,SAAS,SAAS,eAAe;AA0FjC,IAAM,QACJ;AAEF,eAAsB,2BACpB,UAA0C,CAAC,GACH;AACxC,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,mCAAmC,aAAa,MAAM;AAAA;AAAA,MAChE;AAAA,IACF;AAEA,oBAAgB,YAAY;AAE5B,UAAM,WAAW,MAAM,gBAAgB,cAAc,GAAG;AACxD,UAAM,aAAa,mCAAmC;AAAA,MACpD;AAAA,MACA,aACE,WAAW,eAAe,aAAa,SAAS;AAAA,MAClD,QAAQ,aAAa;AAAA,IACvB,CAAC;AACD,UAAM,SAAS,4CAA4C,YAAY;AAAA,MACrE,GAAI,aAAa,UAAU,CAAC;AAAA,MAC5B,OAAO,WAAW,SAAS,aAAa,QAAQ;AAAA,MAChD,aAAa,WAAW,eAAe,aAAa,QAAQ;AAAA,IAC9D,CAAC;AACD,UAAM,iBACJ,WAAW,UAAU,aAAa,QAAQ,UAAU;AACtD,UAAM,SAAS,4CAA4C,QAAQ;AAAA,MACjE,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,gBAAgB,MAAM,eAAe;AAAA,MACzC;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,SAAS;AAAA,QACP,MAAM,WAAW,WAAW,aAAa,SAAS;AAAA,QAClD,UAAU,WAAW,eAAe,aAAa,SAAS;AAAA,QAC1D,SAAS,WAAW,cAAc,aAAa,SAAS;AAAA,MAC1D;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,UAAU,WAAW,WAAW,WAAW,IAAI;AAAA,MAC/C,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,MACpB;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,iBAAiB;AAC3B,iBAAW,aAAa,aAAa,MAAM,OAAO,GAAG;AACrD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW;AACrB,iBAAW,QAAQ,aAAa,MAAM,OAAO,GAAG;AAChD,eAAS;AACT;AAAA,IACF;AAEA,QAAI,QAAQ,kBAAkB;AAC5B,iBAAW,cAAc,aAAa,MAAM,OAAO,GAAG;AACtD,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,SAC8C;AAC9C,QAAM,eAAe,MAAM,qBAAqB,YAAY,QAAQ,GAAG;AAEvE,MAAI,OAAO,iBAAiB,YAAY;AACtC,WAAQ,aAAsD,OAAO;AAAA,EACvE;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAAsD;AACvE,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,KACnB,MAA+C,SAAS,QACzD,OAAQ,MAA+C,WAAW;AAEtE;AAEA,SAAS,gBACP,QACiD;AACjD,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,QAAM,YAAY;AAElB,MACE,UAAU,aAAa,UACvB,CAAC,MAAM,QAAQ,UAAU,QAAQ,GACjC;AACA,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,MACE,UAAU,iBAAiB,WAC1B,CAAC,MAAM,QAAQ,UAAU,YAAY,KACpC,UAAU,aAAa,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,IAChE;AACA,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,OACG,UAAU,UAAU,UAAU,OAAO,MACrC,UAAU,cAAc,UAAU,OAAO,GAC1C;AACA,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,MAAI,UAAU,YAAY,UAAa,CAACC,UAAS,UAAU,OAAO,GAAG;AACnE,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAEA,MAAI,UAAU,WAAW,UAAa,CAACA,UAAS,UAAU,MAAM,GAAG;AACjE,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AAEA,MAAI,UAAU,YAAY,QAAW;AACnC,kBAAc,UAAU,OAAO;AAAA,EACjC;AACF;AAEA,SAAS,cAAc,SAAkB;AACvC,MAAI,CAACA,UAAS,OAAO,GAAG;AACtB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,QACE,CAAC,CAAC,QAAQ,YAAY,SAAS,EAAE,SAAS,GAAG,KAC5C,UAAU,UAAa,OAAO,UAAU,UACzC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,gBACb,QACA,KACA;AACA,QAAM,WAAwC;AAAA,IAC5C,GAAI,OAAO,YAAY,CAAC;AAAA,EAC1B;AAEA,aAAW,eAAe,OAAO,gBAAgB,CAAC,GAAG;AACnD,UAAM,SAAS,KAAK,MAAM,MAAM,SAAS,QAAQ,KAAK,WAAW,GAAG,MAAM,CAAC;AAC3E,UAAM,UAAU,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAExD,eAAW,SAAS,SAAS;AAC3B,eAAS,KAAK,mCAAmC,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,IACzE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,eAAe,SAK3B;AACD,QAAM,gBAAgD,CAAC;AAEvD,MAAI,QAAQ,QAAQ,MAAM;AACxB,UAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,IAAI;AACtD,UAAM;AAAA,MACJ;AAAA,MACA,4CAA4C,QAAQ,QAAQ;AAAA,QAC1D,QAAQ;AAAA,MACV,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,4CAA4C,QAAQ,QAAQ;AAAA,QAC1D,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,kBAAc,WAAW;AAAA,EAC3B;AAEA,MAAI,QAAQ,QAAQ,SAAS;AAC3B,UAAM,OAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,OAAO;AACzD,UAAM,cAAc,MAAM,GAAG,KAAK,UAAU,QAAQ,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AACzE,kBAAc,UAAU;AAAA,EAC1B;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,SAAgD;AAClE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ,sCAAsC,OAAO;AAAA,EAAK,KAAK;AAAA;AAAA,EACjE;AACF;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;","names":["entries","isRecord"]}