@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,994 @@
1
+ import {
2
+ ProbeMeshError
3
+ } from "./chunk-2ASMVLG4.js";
4
+
5
+ // src/integrationTemplates.ts
6
+ var DEFAULT_SDK_VERSION = "^0.1.0";
7
+ var TEMPLATE_ORDER = [
8
+ "provider-x402-sandbox",
9
+ "buyer-hosted-router",
10
+ "catalog-policy-ci",
11
+ "audit-trail-export"
12
+ ];
13
+ var TEMPLATE_PACKAGE_NAMES = {
14
+ "provider-x402-sandbox": "probemesh-provider-x402-sandbox",
15
+ "buyer-hosted-router": "probemesh-buyer-hosted-router",
16
+ "catalog-policy-ci": "probemesh-catalog-policy-ci",
17
+ "audit-trail-export": "probemesh-audit-trail-export"
18
+ };
19
+ var TEMPLATE_REGISTRY = [
20
+ {
21
+ id: "provider-x402-sandbox",
22
+ name: "Provider x402 Sandbox",
23
+ description: "Manifest-backed provider starter with the x402 sandbox protocol and an acceptance config.",
24
+ files: createProviderX402SandboxFiles()
25
+ },
26
+ {
27
+ id: "buyer-hosted-router",
28
+ name: "Buyer Hosted Router",
29
+ description: "Hosted buyer starter with paid provider routing, payment strategy, catalog policy, and audit collection.",
30
+ files: createBuyerHostedRouterFiles()
31
+ },
32
+ {
33
+ id: "catalog-policy-ci",
34
+ name: "Catalog Policy CI",
35
+ description: "CI-friendly catalog policy check starter with machine-readable reports.",
36
+ files: createCatalogPolicyCiFiles()
37
+ },
38
+ {
39
+ id: "audit-trail-export",
40
+ name: "Audit Trail Export",
41
+ description: "Local audit artifact collection and audit trail export starter.",
42
+ files: createAuditTrailExportFiles()
43
+ }
44
+ ];
45
+ function listProbeMeshIntegrationTemplates() {
46
+ return TEMPLATE_ORDER.map((id) => cloneTemplate(requireTemplate(id)));
47
+ }
48
+ function getProbeMeshIntegrationTemplate(id) {
49
+ return cloneTemplate(requireTemplate(id));
50
+ }
51
+ function renderProbeMeshIntegrationTemplate(options) {
52
+ const template = requireTemplate(options.templateId);
53
+ const packageName = options.packageName?.trim() ?? TEMPLATE_PACKAGE_NAMES[template.id];
54
+ const sdkVersion = options.sdkVersion?.trim() ?? DEFAULT_SDK_VERSION;
55
+ assertValidPackageName(packageName);
56
+ assertNonEmptyString(sdkVersion, "sdkVersion");
57
+ return {
58
+ template: cloneTemplate(template),
59
+ packageName,
60
+ files: template.files.map((file) => ({
61
+ ...file,
62
+ path: validateRelativeTemplatePath(file.path),
63
+ content: renderTemplateContent(file.content, {
64
+ packageName,
65
+ sdkVersion
66
+ })
67
+ }))
68
+ };
69
+ }
70
+ function requireTemplate(id) {
71
+ const template = TEMPLATE_REGISTRY.find((candidate) => candidate.id === id);
72
+ if (!template) {
73
+ throw new ProbeMeshError({
74
+ code: "invalid_request",
75
+ message: `Unknown ProbeMesh integration template "${id}".`
76
+ });
77
+ }
78
+ return template;
79
+ }
80
+ function cloneTemplate(template) {
81
+ return {
82
+ ...template,
83
+ files: template.files.map((file) => ({ ...file }))
84
+ };
85
+ }
86
+ function renderTemplateContent(content, values) {
87
+ return content.replaceAll("{{packageName}}", values.packageName).replaceAll("{{sdkVersion}}", values.sdkVersion);
88
+ }
89
+ function assertNonEmptyString(value, label) {
90
+ if (value.trim().length === 0) {
91
+ throw new ProbeMeshError({
92
+ code: "invalid_request",
93
+ message: `${label} must be a non-empty string.`
94
+ });
95
+ }
96
+ }
97
+ function assertValidPackageName(packageName) {
98
+ assertNonEmptyString(packageName, "packageName");
99
+ if (packageName.length > 214 || packageName.startsWith(".") || packageName.startsWith("_") || packageName.includes(" ") || !/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(packageName)) {
100
+ throw new ProbeMeshError({
101
+ code: "invalid_request",
102
+ message: `Invalid packageName "${packageName}".`
103
+ });
104
+ }
105
+ }
106
+ function validateRelativeTemplatePath(path) {
107
+ assertNonEmptyString(path, "template file path");
108
+ if (path.startsWith("/") || path.startsWith("\\") || path.includes("..") || path.split(/[\\/]/).some((segment) => segment.length === 0)) {
109
+ throw new ProbeMeshError({
110
+ code: "invalid_request",
111
+ message: `Invalid template file path "${path}".`
112
+ });
113
+ }
114
+ return path;
115
+ }
116
+ function createProviderX402SandboxFiles() {
117
+ return [
118
+ templateFile(
119
+ "package.json",
120
+ [
121
+ "{",
122
+ ' "name": "{{packageName}}",',
123
+ ' "private": true,',
124
+ ' "type": "module",',
125
+ ' "engines": {',
126
+ ' "node": ">=20.12.0"',
127
+ " },",
128
+ ' "packageManager": "pnpm@10.33.0",',
129
+ ' "scripts": {',
130
+ ' "dev": "tsx src/index.ts",',
131
+ ' "accept:x402": "probemesh-x402-accept --config x402-acceptance.config.mjs",',
132
+ ' "conformance:provider": "probemesh-conformance --config provider-conformance.config.mjs",',
133
+ ' "dossier:provider": "probemesh-dossier --config provider-dossier.config.mjs"',
134
+ " },",
135
+ ' "dependencies": {',
136
+ ' "@probemesh/sdk": "{{sdkVersion}}"',
137
+ " },",
138
+ ' "devDependencies": {',
139
+ ' "tsx": "^4.15.7",',
140
+ ' "typescript": "^5.4.5"',
141
+ " }",
142
+ "}"
143
+ ]
144
+ ),
145
+ templateFile(
146
+ "README.md",
147
+ [
148
+ "# {{packageName}}",
149
+ "",
150
+ "Manifest-backed ProbeMesh provider starter using the local x402 sandbox protocol.",
151
+ "",
152
+ "## Run",
153
+ "",
154
+ "```sh",
155
+ "pnpm install",
156
+ "pnpm dev",
157
+ "pnpm accept:x402",
158
+ "pnpm conformance:provider",
159
+ "pnpm dossier:provider",
160
+ "```",
161
+ "",
162
+ "`pnpm accept:x402` writes a JSON report, Markdown report, and provider catalog artifact under `artifacts/`.",
163
+ "",
164
+ "`pnpm conformance:provider` writes a JSON report, Markdown report, and provider conformance artifact under `artifacts/`.",
165
+ "",
166
+ "`pnpm dossier:provider` bundles the catalog and conformance artifacts into one provider onboarding dossier under `artifacts/`.",
167
+ "",
168
+ "The x402 sandbox emits deterministic payment headers and receipts. It does not use a real wallet, facilitator, settlement network, or live funds."
169
+ ]
170
+ ),
171
+ templateFile(
172
+ "src/index.ts",
173
+ [
174
+ "import {",
175
+ " createAdapterFromManifest,",
176
+ " createProbeMesh,",
177
+ " createX402SandboxProtocol,",
178
+ " hasReceipt,",
179
+ '} from "@probemesh/sdk";',
180
+ "",
181
+ 'const providerId = "starter-x402-provider";',
182
+ "const manifest = {",
183
+ " id: providerId,",
184
+ ' displayName: "Starter x402 Provider",',
185
+ ' capabilities: ["price-lookup"],',
186
+ ' protocolMode: "x402",',
187
+ " paymentOptions: [",
188
+ " {",
189
+ ' id: "x402-sandbox-usdc",',
190
+ ' protocolMode: "x402",',
191
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
192
+ ' receiptTypes: ["payment_proof", "settlement_confirmation", "provider_delivery"],',
193
+ " },",
194
+ " ],",
195
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
196
+ ' inputSchema: { type: "object" },',
197
+ ' outputSchema: { type: "object" },',
198
+ " receipts: { payment: true, delivery: true, responseEvidence: false },",
199
+ "} as const;",
200
+ "",
201
+ "const adapter = createAdapterFromManifest(",
202
+ " manifest,",
203
+ " {",
204
+ ' "price-lookup": (_request, context) => ({',
205
+ ' data: { symbol: "BTC", currency: "USD", price: 64000, paidWith: context.paymentSelection?.protocolMode },',
206
+ " receiptRefs: [",
207
+ " {",
208
+ ' type: "provider_delivery",',
209
+ " provider: providerId,",
210
+ ' status: "recorded",',
211
+ ' ref: context.callId + ":provider_delivery",',
212
+ " timestamp: context.startedAt.toISOString(),",
213
+ " },",
214
+ " ],",
215
+ " }),",
216
+ " },",
217
+ " {",
218
+ " protocolAdapters: [createX402SandboxProtocol({ providerId })],",
219
+ " },",
220
+ ");",
221
+ "",
222
+ "const probemesh = createProbeMesh({ adapters: [adapter] });",
223
+ "const response = await probemesh.call({",
224
+ ' capability: "price-lookup",',
225
+ ' input: { symbol: "BTC", currency: "USD" },',
226
+ " constraints: { maxCostUsd: 0.02, requireReceipt: true },",
227
+ ' paymentPreferences: { allowedProtocols: ["x402"] },',
228
+ ' paymentStrategy: { mode: "receipt_coverage" },',
229
+ ' idempotencyKey: "starter-x402-call",',
230
+ "});",
231
+ "",
232
+ "console.log(JSON.stringify({",
233
+ " status: response.status,",
234
+ " provider: response.provider.id,",
235
+ " protocol: response.route?.paymentSelection?.protocolMode,",
236
+ ' hasPaymentProof: hasReceipt(response, "payment_proof"),',
237
+ ' hasSettlement: hasReceipt(response, "settlement_confirmation"),',
238
+ ' hasDelivery: hasReceipt(response, "provider_delivery"),',
239
+ " safety: response.safety,",
240
+ "}, null, 2));"
241
+ ]
242
+ ),
243
+ templateFile(
244
+ "x402-acceptance.config.mjs",
245
+ [
246
+ 'import { createAdapterFromManifest, createX402SandboxProtocol } from "@probemesh/sdk";',
247
+ "",
248
+ 'const providerId = "starter-x402-provider";',
249
+ "const manifest = {",
250
+ " id: providerId,",
251
+ ' displayName: "Starter x402 Provider",',
252
+ ' capabilities: ["price-lookup"],',
253
+ ' protocolMode: "x402",',
254
+ " paymentOptions: [",
255
+ " {",
256
+ ' id: "x402-sandbox-usdc",',
257
+ ' protocolMode: "x402",',
258
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
259
+ ' receiptTypes: ["payment_proof", "settlement_confirmation", "provider_delivery"],',
260
+ " },",
261
+ " ],",
262
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
263
+ ' inputSchema: { type: "object" },',
264
+ ' outputSchema: { type: "object" },',
265
+ " receipts: { payment: true, delivery: true, responseEvidence: false },",
266
+ "};",
267
+ "",
268
+ "const adapter = createAdapterFromManifest(",
269
+ " manifest,",
270
+ " {",
271
+ ' "price-lookup": (_request, context) => ({',
272
+ ' data: { symbol: "BTC", currency: "USD", price: 64000 },',
273
+ " receiptRefs: [",
274
+ " {",
275
+ ' type: "provider_delivery",',
276
+ " provider: providerId,",
277
+ ' status: "recorded",',
278
+ ' ref: context.callId + ":provider_delivery",',
279
+ " timestamp: context.startedAt.toISOString(),",
280
+ " },",
281
+ " ],",
282
+ " }),",
283
+ " },",
284
+ " { protocolAdapters: [createX402SandboxProtocol({ providerId })] },",
285
+ ");",
286
+ "",
287
+ "export default {",
288
+ " acceptance: {",
289
+ " adapters: [adapter],",
290
+ " request: {",
291
+ ' capability: "price-lookup",',
292
+ ' input: { symbol: "BTC", currency: "USD" },',
293
+ " constraints: { maxCostUsd: 0.02, requireReceipt: true },",
294
+ ' paymentPreferences: { allowedProtocols: ["x402"] },',
295
+ ' idempotencyKey: "starter-x402-acceptance",',
296
+ " },",
297
+ " expectedProviderId: providerId,",
298
+ ' requiredReceiptTypes: ["payment_proof", "settlement_confirmation", "provider_delivery"],',
299
+ " },",
300
+ ' catalog: { manifest, artifactId: providerId + ":x402-sandbox" },',
301
+ ' report: { title: "Starter x402 sandbox acceptance" },',
302
+ " outputs: {",
303
+ ' json: "artifacts/x402-acceptance-report.json",',
304
+ ' markdown: "artifacts/x402-acceptance-report.md",',
305
+ ' catalog: "artifacts/provider-catalog-artifact.json",',
306
+ " },",
307
+ "};"
308
+ ]
309
+ ),
310
+ templateFile(
311
+ "provider-conformance.config.mjs",
312
+ [
313
+ 'import { createAdapterFromManifest, createX402SandboxProtocol } from "@probemesh/sdk";',
314
+ "",
315
+ 'const providerId = "starter-x402-provider";',
316
+ 'const requiredReceiptTypes = ["payment_proof", "settlement_confirmation", "provider_delivery"];',
317
+ "const manifest = {",
318
+ " id: providerId,",
319
+ ' displayName: "Starter x402 Provider",',
320
+ ' capabilities: ["price-lookup"],',
321
+ ' protocolMode: "x402",',
322
+ " paymentOptions: [",
323
+ " {",
324
+ ' id: "x402-sandbox-usdc",',
325
+ ' protocolMode: "x402",',
326
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
327
+ " receiptTypes: requiredReceiptTypes,",
328
+ " },",
329
+ " ],",
330
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
331
+ " inputSchema: {",
332
+ ' type: "object",',
333
+ ' required: ["symbol", "currency"],',
334
+ " properties: {",
335
+ ' symbol: { type: "string" },',
336
+ ' currency: { type: "string" },',
337
+ " },",
338
+ " additionalProperties: true,",
339
+ " },",
340
+ " outputSchema: {",
341
+ ' type: "object",',
342
+ ' required: ["symbol", "currency", "price"],',
343
+ " properties: {",
344
+ ' symbol: { type: "string" },',
345
+ ' currency: { type: "string" },',
346
+ ' price: { type: "number" },',
347
+ ' paidWith: { type: "string" },',
348
+ " },",
349
+ " additionalProperties: true,",
350
+ " },",
351
+ " receipts: { payment: true, delivery: true, responseEvidence: false },",
352
+ "};",
353
+ "",
354
+ "const adapter = createAdapterFromManifest(",
355
+ " manifest,",
356
+ " {",
357
+ ' "price-lookup": (_request, context) => ({',
358
+ ' data: { symbol: "BTC", currency: "USD", price: 64000, paidWith: context.paymentSelection?.protocolMode },',
359
+ " receiptRefs: [",
360
+ " {",
361
+ ' type: "provider_delivery",',
362
+ " provider: providerId,",
363
+ ' status: "recorded",',
364
+ ' ref: context.callId + ":provider_delivery",',
365
+ " timestamp: context.startedAt.toISOString(),",
366
+ " },",
367
+ " ],",
368
+ " }),",
369
+ " },",
370
+ " { protocolAdapters: [createX402SandboxProtocol({ providerId })] },",
371
+ ");",
372
+ "",
373
+ "export default {",
374
+ " conformance: {",
375
+ " manifest,",
376
+ " adapters: [adapter],",
377
+ " request: {",
378
+ ' capability: "price-lookup",',
379
+ ' input: { symbol: "BTC", currency: "USD" },',
380
+ " constraints: { maxCostUsd: 0.02, requireReceipt: true },",
381
+ ' paymentPreferences: { allowedProtocols: ["x402"], requiredReceiptTypes },',
382
+ ' paymentStrategy: { mode: "receipt_coverage", preferredReceiptTypes: requiredReceiptTypes },',
383
+ ' idempotencyKey: "starter-x402-conformance",',
384
+ " },",
385
+ " expectedProviderId: providerId,",
386
+ " requiredReceiptTypes,",
387
+ " schemaValidation: { input: true, output: true },",
388
+ " },",
389
+ ' report: { title: "Starter x402 sandbox conformance", format: "markdown" },',
390
+ ' artifact: { artifactId: providerId + ":x402-sandbox-conformance" },',
391
+ " outputs: {",
392
+ ' json: "artifacts/provider-conformance-report.json",',
393
+ ' markdown: "artifacts/provider-conformance-report.md",',
394
+ ' artifact: "artifacts/provider-conformance-artifact.json",',
395
+ " },",
396
+ "};"
397
+ ]
398
+ ),
399
+ templateFile(
400
+ "provider-dossier.config.mjs",
401
+ [
402
+ "export default {",
403
+ ' catalogArtifactFile: "artifacts/provider-catalog-artifact.json",',
404
+ ' conformanceArtifactFile: "artifacts/provider-conformance-artifact.json",',
405
+ " dossier: {",
406
+ ' dossierId: "starter-x402-provider:onboarding-dossier",',
407
+ ' title: "Starter x402 provider onboarding dossier",',
408
+ ' format: "markdown",',
409
+ " },",
410
+ " outputs: {",
411
+ ' json: "artifacts/provider-onboarding-dossier.json",',
412
+ ' markdown: "artifacts/provider-onboarding-dossier.md",',
413
+ " },",
414
+ "};"
415
+ ]
416
+ )
417
+ ];
418
+ }
419
+ function createBuyerHostedRouterFiles() {
420
+ return [
421
+ templateFile(
422
+ "package.json",
423
+ [
424
+ "{",
425
+ ' "name": "{{packageName}}",',
426
+ ' "private": true,',
427
+ ' "type": "module",',
428
+ ' "engines": {',
429
+ ' "node": ">=20.12.0"',
430
+ " },",
431
+ ' "packageManager": "pnpm@10.33.0",',
432
+ ' "scripts": {',
433
+ ' "dev": "tsx src/index.ts"',
434
+ " },",
435
+ ' "dependencies": {',
436
+ ' "@probemesh/sdk": "{{sdkVersion}}"',
437
+ " },",
438
+ ' "devDependencies": {',
439
+ ' "tsx": "^4.15.7",',
440
+ ' "typescript": "^5.4.5"',
441
+ " }",
442
+ "}"
443
+ ]
444
+ ),
445
+ templateFile(
446
+ "README.md",
447
+ [
448
+ "# {{packageName}}",
449
+ "",
450
+ "Hosted buyer starter with a paid provider, payment strategy, catalog policy, and audit collector.",
451
+ "",
452
+ "## Run",
453
+ "",
454
+ "```sh",
455
+ "pnpm install",
456
+ "pnpm dev",
457
+ "```",
458
+ "",
459
+ "Everything runs locally. The payment protocol is mock-only and intended for integration testing."
460
+ ]
461
+ ),
462
+ templateFile(
463
+ "src/index.ts",
464
+ [
465
+ "import {",
466
+ " createPaidPriceLookupProvider,",
467
+ " createProbeMesh,",
468
+ " createProbeMeshAuditTrailCollector,",
469
+ " createProviderCatalog,",
470
+ " createProviderCatalogArtifact,",
471
+ " startHostedRouter,",
472
+ " summarizeProbeMeshAuditTrailBundle,",
473
+ '} from "@probemesh/sdk";',
474
+ "",
475
+ 'const apiKey = "local-dev-api-key";',
476
+ 'const providerId = "paid-price-provider";',
477
+ 'const receiptTypes = ["payment_proof", "provider_delivery"] as const;',
478
+ "const manifest = {",
479
+ " id: providerId,",
480
+ ' displayName: "Paid Price Lookup Provider",',
481
+ ' capabilities: ["price-lookup"],',
482
+ ' protocolMode: "mock-payment",',
483
+ " paymentOptions: [",
484
+ " {",
485
+ ' id: "mock-payment-standard",',
486
+ ' protocolMode: "mock-payment",',
487
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
488
+ " receiptTypes: [...receiptTypes],",
489
+ " },",
490
+ " ],",
491
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
492
+ ' inputSchema: { type: "object" },',
493
+ ' outputSchema: { type: "object" },',
494
+ " receipts: { payment: true, delivery: true, responseEvidence: false },",
495
+ "} as const;",
496
+ "",
497
+ "const acceptanceReport = {",
498
+ ' title: "Starter paid provider acceptance",',
499
+ ' status: "passed",',
500
+ ' gate: { accepted: true, status: "accepted", requiredCheckNames: [], failedRequiredCheckNames: [], reasons: ["local starter"] },',
501
+ " summary: {",
502
+ ' status: "passed", totalChecks: 1, passedChecks: 1, failedChecks: 0, failedCheckNames: [],',
503
+ " providerId, receiptTypes: [...receiptTypes], requiredReceiptTypes: [...receiptTypes],",
504
+ ' timelineEventTypes: ["call.completed"], telemetryEventTypes: ["call.completed"],',
505
+ ' safety: { paymentStatus: "authorized", settlementStatus: "settled", deliveryStatus: "delivered", moneyMayHaveMoved: true },',
506
+ ' retrySafety: { retryable: false, safeToAutoRetry: false, reason: "completed" },',
507
+ " },",
508
+ " checks: [],",
509
+ " receipts: {",
510
+ " total: 2, types: [...receiptTypes], providers: [providerId],",
511
+ " byType: { payment_proof: 1, provider_delivery: 1 },",
512
+ " hasPaymentProof: true, hasSettlementConfirmation: false, hasProviderDelivery: true,",
513
+ " },",
514
+ ' timelineEventTypes: ["call.completed"],',
515
+ ' telemetryEventTypes: ["call.completed"],',
516
+ ' safety: { paymentStatus: "authorized", settlementStatus: "settled", deliveryStatus: "delivered", moneyMayHaveMoved: true },',
517
+ ' retrySafety: { retryable: false, safeToAutoRetry: false, reason: "completed" },',
518
+ "} as const;",
519
+ "",
520
+ "const catalog = createProviderCatalog({",
521
+ " artifacts: [",
522
+ " createProviderCatalogArtifact({",
523
+ " manifest,",
524
+ " acceptanceReport,",
525
+ ' artifactId: providerId + ":mock-payment",',
526
+ ' generatedAt: "2026-05-15T00:00:00.000Z",',
527
+ " }),",
528
+ " ],",
529
+ "});",
530
+ "",
531
+ "const collector = createProbeMeshAuditTrailCollector();",
532
+ "const router = await startHostedRouter({",
533
+ " port: 0,",
534
+ " apiKeys: [apiKey],",
535
+ " adapters: [createPaidPriceLookupProvider()],",
536
+ " catalogPolicy: {",
537
+ " catalog,",
538
+ " requiredReceiptTypes: [...receiptTypes],",
539
+ " maxCostUsd: 0.02,",
540
+ " },",
541
+ " auditArtifacts: { enabled: true, onArtifact: collector.onArtifact },",
542
+ "});",
543
+ "",
544
+ "try {",
545
+ " const probemesh = createProbeMesh({ hosted: { baseUrl: router.url, apiKey } });",
546
+ " const response = await probemesh.call({",
547
+ ' capability: "price-lookup",',
548
+ ' input: { symbol: "ETH", currency: "USD" },',
549
+ " constraints: { maxCostUsd: 0.02, requireReceipt: true },",
550
+ ' paymentPreferences: { allowedProtocols: ["mock-payment"] },',
551
+ ' paymentStrategy: { mode: "lowest_cost" },',
552
+ ' idempotencyKey: "buyer-hosted-router-demo",',
553
+ " });",
554
+ ' const bundle = collector.createBundle({ bundleId: "buyer-hosted-router-audit" });',
555
+ " console.log(JSON.stringify({",
556
+ " status: response.status,",
557
+ " provider: response.provider.id,",
558
+ " route: response.route,",
559
+ " safety: response.safety,",
560
+ " auditSummary: summarizeProbeMeshAuditTrailBundle(bundle),",
561
+ " }, null, 2));",
562
+ "} finally {",
563
+ " await router.close();",
564
+ "}"
565
+ ]
566
+ )
567
+ ];
568
+ }
569
+ function createCatalogPolicyCiFiles() {
570
+ return [
571
+ templateFile(
572
+ "package.json",
573
+ [
574
+ "{",
575
+ ' "name": "{{packageName}}",',
576
+ ' "private": true,',
577
+ ' "type": "module",',
578
+ ' "engines": {',
579
+ ' "node": ">=20.12.0"',
580
+ " },",
581
+ ' "packageManager": "pnpm@10.33.0",',
582
+ ' "scripts": {',
583
+ ' "check:catalog": "probemesh-catalog-check --config catalog-policy.config.mjs --format markdown --out-json artifacts/catalog-policy.json --out-md artifacts/catalog-policy.md --out-bundle artifacts/catalog-policy-bundle.json"',
584
+ " },",
585
+ ' "dependencies": {',
586
+ ' "@probemesh/sdk": "{{sdkVersion}}"',
587
+ " }",
588
+ "}"
589
+ ]
590
+ ),
591
+ templateFile(
592
+ "README.md",
593
+ [
594
+ "# {{packageName}}",
595
+ "",
596
+ "CI starter for validating a buyer-side ProbeMesh provider catalog and router policy.",
597
+ "",
598
+ "## Run",
599
+ "",
600
+ "```sh",
601
+ "pnpm install",
602
+ "pnpm check:catalog",
603
+ "```",
604
+ "",
605
+ "The generated artifacts are safe to store in CI because they contain metadata and hashes, not secrets or executable adapters."
606
+ ]
607
+ ),
608
+ templateFile(
609
+ "catalog-policy.config.mjs",
610
+ [
611
+ 'import { createProviderCatalogArtifact } from "@probemesh/sdk";',
612
+ "",
613
+ 'const providerId = "catalog-ready-price-provider";',
614
+ 'const receiptTypes = ["payment_proof", "provider_delivery"];',
615
+ "const manifest = {",
616
+ " id: providerId,",
617
+ ' displayName: "Catalog Ready Price Provider",',
618
+ ' capabilities: ["price-lookup"],',
619
+ ' protocolMode: "mock-payment",',
620
+ " paymentOptions: [",
621
+ " {",
622
+ ' id: "mock-payment-standard",',
623
+ ' protocolMode: "mock-payment",',
624
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
625
+ " receiptTypes,",
626
+ " },",
627
+ " ],",
628
+ ' pricing: { unit: "call", amountUsd: 0.01, currency: "USD" },',
629
+ ' inputSchema: { type: "object" },',
630
+ ' outputSchema: { type: "object" },',
631
+ " receipts: { payment: true, delivery: true, responseEvidence: false },",
632
+ "};",
633
+ "const acceptanceReport = {",
634
+ ' title: "Catalog ready provider",',
635
+ ' status: "passed",',
636
+ ' gate: { accepted: true, status: "accepted", requiredCheckNames: [], failedRequiredCheckNames: [], reasons: ["starter fixture"] },',
637
+ ' summary: { status: "passed", totalChecks: 1, passedChecks: 1, failedChecks: 0, failedCheckNames: [], providerId, receiptTypes, requiredReceiptTypes: receiptTypes, timelineEventTypes: ["call.completed"], telemetryEventTypes: ["call.completed"] },',
638
+ " checks: [],",
639
+ " receipts: { total: 2, types: receiptTypes, providers: [providerId], byType: { payment_proof: 1, provider_delivery: 1 }, hasPaymentProof: true, hasSettlementConfirmation: false, hasProviderDelivery: true },",
640
+ ' timelineEventTypes: ["call.completed"],',
641
+ ' telemetryEventTypes: ["call.completed"],',
642
+ "};",
643
+ "",
644
+ "export default {",
645
+ ' artifacts: [createProviderCatalogArtifact({ manifest, acceptanceReport, artifactId: providerId + ":mock-payment" })],',
646
+ ' catalogPolicy: { status: "ready", maxCostUsd: 0.02, requiredReceiptTypes: receiptTypes },',
647
+ ' adapterInventory: [{ id: providerId, capabilities: ["price-lookup"], pricing: manifest.pricing }],',
648
+ " queries: [",
649
+ " {",
650
+ ' capability: "price-lookup",',
651
+ " minMatches: 1,",
652
+ ' paymentPreferences: { allowedProtocols: ["mock-payment"], requiredReceiptTypes: receiptTypes },',
653
+ ' paymentStrategy: { mode: "lowest_cost" },',
654
+ " },",
655
+ " ],",
656
+ ' report: { title: "Starter catalog policy check" },',
657
+ ' bundle: { bundleId: "starter-catalog-policy-bundle" },',
658
+ "};"
659
+ ]
660
+ )
661
+ ];
662
+ }
663
+ function createAuditTrailExportFiles() {
664
+ return [
665
+ templateFile(
666
+ "package.json",
667
+ [
668
+ "{",
669
+ ' "name": "{{packageName}}",',
670
+ ' "private": true,',
671
+ ' "type": "module",',
672
+ ' "engines": {',
673
+ ' "node": ">=20.12.0"',
674
+ " },",
675
+ ' "packageManager": "pnpm@10.33.0",',
676
+ ' "scripts": {',
677
+ ' "dev": "tsx src/index.ts",',
678
+ ' "export:audit-trail": "probemesh-audit-trail-export --config audit-trail.config.mjs --format markdown --out-json artifacts/audit-trail.json --out-md artifacts/audit-trail.md"',
679
+ " },",
680
+ ' "dependencies": {',
681
+ ' "@probemesh/sdk": "{{sdkVersion}}"',
682
+ " },",
683
+ ' "devDependencies": {',
684
+ ' "tsx": "^4.15.7",',
685
+ ' "typescript": "^5.4.5"',
686
+ " }",
687
+ "}"
688
+ ]
689
+ ),
690
+ templateFile(
691
+ "README.md",
692
+ [
693
+ "# {{packageName}}",
694
+ "",
695
+ "Starter for collecting safe ProbeMesh call audit artifacts and exporting a local audit trail bundle.",
696
+ "",
697
+ "## Run",
698
+ "",
699
+ "```sh",
700
+ "pnpm install",
701
+ "pnpm dev",
702
+ "pnpm export:audit-trail",
703
+ "```",
704
+ "",
705
+ "Audit artifacts include route, receipts, safety, retry decisions, and hashes. Raw request input and secrets are not stored."
706
+ ]
707
+ ),
708
+ templateFile(
709
+ "src/index.ts",
710
+ [
711
+ "import {",
712
+ " createPaidPriceLookupProvider,",
713
+ " createProbeMesh,",
714
+ " createProbeMeshAuditTrailCollector,",
715
+ " formatProbeMeshAuditTrailBundle,",
716
+ " startHostedRouter,",
717
+ '} from "@probemesh/sdk";',
718
+ "",
719
+ 'const apiKey = "local-audit-api-key";',
720
+ "const collector = createProbeMeshAuditTrailCollector();",
721
+ "const router = await startHostedRouter({",
722
+ " port: 0,",
723
+ " apiKeys: [apiKey],",
724
+ " adapters: [createPaidPriceLookupProvider()],",
725
+ " auditArtifacts: { enabled: true, onArtifact: collector.onArtifact },",
726
+ "});",
727
+ "",
728
+ "try {",
729
+ " const probemesh = createProbeMesh({ hosted: { baseUrl: router.url, apiKey } });",
730
+ " await probemesh.call({",
731
+ ' capability: "price-lookup",',
732
+ ' input: { symbol: "SOL", currency: "USD" },',
733
+ " constraints: { maxCostUsd: 0.02, requireReceipt: true },",
734
+ ' paymentPreferences: { allowedProtocols: ["mock-payment"] },',
735
+ ' idempotencyKey: "audit-trail-starter-call",',
736
+ " });",
737
+ ' const bundle = collector.createBundle({ bundleId: "audit-trail-starter-bundle" });',
738
+ ' console.log(formatProbeMeshAuditTrailBundle(bundle, { format: "markdown" }));',
739
+ "} finally {",
740
+ " await router.close();",
741
+ "}"
742
+ ]
743
+ ),
744
+ templateFile(
745
+ "audit-trail.config.mjs",
746
+ [
747
+ 'import { createProbeMeshCallAuditArtifact } from "@probemesh/sdk";',
748
+ "",
749
+ 'const generatedAt = "2026-05-15T00:00:00.000Z";',
750
+ "const response = {",
751
+ ' callId: "starter-audit-call",',
752
+ ' capability: "price-lookup",',
753
+ ' data: { symbol: "ETH", currency: "USD", price: 3200 },',
754
+ ' provider: { id: "starter-audit-provider", displayName: "Starter Audit Provider", mode: "hosted" },',
755
+ ' cost: { unit: "call", amountUsd: 0.01, currency: "USD" },',
756
+ " latencyMs: 4,",
757
+ ' receiptRefs: [{ type: "provider_delivery", provider: "starter-audit-provider", status: "recorded", ref: "starter-audit-call:delivery", timestamp: generatedAt }],',
758
+ ' retrySafety: { retryable: false, safeToAutoRetry: false, reason: "completed" },',
759
+ ' status: "completed",',
760
+ "};",
761
+ "",
762
+ "export default {",
763
+ " artifacts: [",
764
+ " createProbeMeshCallAuditArtifact({",
765
+ ' request: { capability: "price-lookup", input: { symbol: "ETH" }, idempotencyKey: "starter-audit-call" },',
766
+ " response,",
767
+ " generatedAt,",
768
+ " }),",
769
+ " ],",
770
+ ' bundle: { bundleId: "starter-audit-trail", generatedAt },',
771
+ "};"
772
+ ]
773
+ )
774
+ ];
775
+ }
776
+ function templateFile(path, lines) {
777
+ return {
778
+ path,
779
+ content: `${lines.join("\n")}
780
+ `
781
+ };
782
+ }
783
+
784
+ // src/cli/probemeshInitCli.ts
785
+ import { mkdir, stat, writeFile } from "fs/promises";
786
+ import { dirname, isAbsolute, relative, resolve } from "path";
787
+ var USAGE = "Usage: probemesh-init [--list] [--template <id> --out-dir <path>] [--package-name <name>] [--force] [--dry-run]";
788
+ async function runProbeMeshInitCli(options = {}) {
789
+ const argv = options.argv ?? [];
790
+ const cwd = options.cwd ?? process.cwd();
791
+ try {
792
+ const parsedArgs = parseCliArgs(argv);
793
+ if (parsedArgs.help) {
794
+ return cliSuccess({
795
+ listed: true,
796
+ dryRun: false,
797
+ stdout: `${USAGE}
798
+ `
799
+ });
800
+ }
801
+ if (parsedArgs.list) {
802
+ return cliSuccess({
803
+ listed: true,
804
+ dryRun: false,
805
+ stdout: formatTemplateList()
806
+ });
807
+ }
808
+ if (!parsedArgs.templateId) {
809
+ return cliFailure("--template <id> is required unless --list is used.");
810
+ }
811
+ if (!parsedArgs.outDir) {
812
+ return cliFailure("--out-dir <path> is required when generating a template.");
813
+ }
814
+ const rendered = renderProbeMeshIntegrationTemplate({
815
+ templateId: parsedArgs.templateId,
816
+ packageName: parsedArgs.packageName
817
+ });
818
+ const outDir = resolve(cwd, parsedArgs.outDir);
819
+ const plannedFiles = rendered.files.map((file) => ({
820
+ ...file,
821
+ path: file.path
822
+ }));
823
+ await assertSafeTargets({
824
+ outDir,
825
+ files: plannedFiles,
826
+ force: parsedArgs.force === true
827
+ });
828
+ if (!parsedArgs.dryRun) {
829
+ await writeRenderedTemplate({
830
+ outDir,
831
+ rendered
832
+ });
833
+ }
834
+ return cliSuccess({
835
+ listed: false,
836
+ dryRun: parsedArgs.dryRun === true,
837
+ templateId: rendered.template.id,
838
+ outDir,
839
+ files: plannedFiles,
840
+ stdout: formatGenerationResult({
841
+ rendered,
842
+ outDir,
843
+ dryRun: parsedArgs.dryRun === true
844
+ })
845
+ });
846
+ } catch (error) {
847
+ return cliFailure(
848
+ error instanceof Error ? error.message : "Unknown probemesh-init failure."
849
+ );
850
+ }
851
+ }
852
+ function parseCliArgs(argv) {
853
+ const parsedArgs = {};
854
+ for (let index = 0; index < argv.length; index += 1) {
855
+ const arg = argv[index];
856
+ if (arg === "--") {
857
+ continue;
858
+ }
859
+ if (arg === "--help" || arg === "-h") {
860
+ parsedArgs.help = true;
861
+ continue;
862
+ }
863
+ if (arg === "--list") {
864
+ parsedArgs.list = true;
865
+ continue;
866
+ }
867
+ if (arg === "--template") {
868
+ parsedArgs.templateId = requireValue(argv, index, arg);
869
+ index += 1;
870
+ continue;
871
+ }
872
+ if (arg === "--out-dir") {
873
+ parsedArgs.outDir = requireValue(argv, index, arg);
874
+ index += 1;
875
+ continue;
876
+ }
877
+ if (arg === "--package-name") {
878
+ parsedArgs.packageName = requireValue(argv, index, arg);
879
+ index += 1;
880
+ continue;
881
+ }
882
+ if (arg === "--force") {
883
+ parsedArgs.force = true;
884
+ continue;
885
+ }
886
+ if (arg === "--dry-run") {
887
+ parsedArgs.dryRun = true;
888
+ continue;
889
+ }
890
+ throw new Error(`Unknown argument "${arg}".`);
891
+ }
892
+ return parsedArgs;
893
+ }
894
+ function requireValue(argv, index, flag) {
895
+ const value = argv[index + 1];
896
+ if (!value || value.startsWith("--")) {
897
+ throw new Error(`${flag} requires a value.`);
898
+ }
899
+ return value;
900
+ }
901
+ function formatTemplateList() {
902
+ const templates = listProbeMeshIntegrationTemplates();
903
+ const lines = [
904
+ "Available ProbeMesh integration templates:",
905
+ ...templates.map(
906
+ (template) => `- ${template.id}: ${template.name} - ${template.description}`
907
+ )
908
+ ];
909
+ return `${lines.join("\n")}
910
+ `;
911
+ }
912
+ function formatGenerationResult(options) {
913
+ const prefix = options.dryRun ? "Dry run: would generate" : "Generated";
914
+ const lines = [
915
+ `${prefix} ${options.rendered.template.id} in ${options.outDir}`,
916
+ `Package: ${options.rendered.packageName}`,
917
+ ...options.rendered.files.map((file) => `- ${file.path}`)
918
+ ];
919
+ return `${lines.join("\n")}
920
+ `;
921
+ }
922
+ async function assertSafeTargets(options) {
923
+ const collisions = [];
924
+ for (const file of options.files) {
925
+ const target = resolveTemplateTarget(options.outDir, file.path);
926
+ if (options.force) {
927
+ continue;
928
+ }
929
+ if (await pathExists(target)) {
930
+ collisions.push(file.path);
931
+ }
932
+ }
933
+ if (collisions.length > 0) {
934
+ throw new Error(
935
+ [
936
+ "Refusing to overwrite existing template files without --force.",
937
+ `Existing files: ${collisions.join(", ")}`
938
+ ].join(" ")
939
+ );
940
+ }
941
+ }
942
+ async function writeRenderedTemplate(options) {
943
+ for (const file of options.rendered.files) {
944
+ const target = resolveTemplateTarget(options.outDir, file.path);
945
+ await mkdir(dirname(target), {
946
+ recursive: true
947
+ });
948
+ await writeFile(target, file.content, "utf8");
949
+ }
950
+ }
951
+ function resolveTemplateTarget(outDir, filePath) {
952
+ const target = resolve(outDir, filePath);
953
+ const relativeTarget = relative(outDir, target);
954
+ if (relativeTarget.startsWith("..") || isAbsolute(relativeTarget)) {
955
+ throw new Error(`Template file path escapes output directory: ${filePath}`);
956
+ }
957
+ return target;
958
+ }
959
+ async function pathExists(path) {
960
+ try {
961
+ await stat(path);
962
+ return true;
963
+ } catch (error) {
964
+ if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
965
+ return false;
966
+ }
967
+ throw error;
968
+ }
969
+ }
970
+ function cliSuccess(result) {
971
+ return {
972
+ exitCode: 0,
973
+ ...result
974
+ };
975
+ }
976
+ function cliFailure(message) {
977
+ return {
978
+ exitCode: 2,
979
+ listed: false,
980
+ dryRun: false,
981
+ stdout: "",
982
+ stderr: `${message}
983
+ ${USAGE}
984
+ `
985
+ };
986
+ }
987
+
988
+ export {
989
+ listProbeMeshIntegrationTemplates,
990
+ getProbeMeshIntegrationTemplate,
991
+ renderProbeMeshIntegrationTemplate,
992
+ runProbeMeshInitCli
993
+ };
994
+ //# sourceMappingURL=chunk-HJK52QJF.js.map