@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,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":"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","names":["entries","isRecord"]}
|