@ucptools/validator 1.0.0 → 1.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/dist/auth/config.d.ts +20 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +114 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +17 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +45 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +170 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/service.d.ts +80 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +298 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +375 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mock-server.d.ts +20 -0
- package/dist/cli/mock-server.d.ts.map +1 -0
- package/dist/cli/mock-server.js +261 -0
- package/dist/cli/mock-server.js.map +1 -0
- package/dist/compliance/compliance-generator.d.ts +34 -0
- package/dist/compliance/compliance-generator.d.ts.map +1 -0
- package/dist/compliance/compliance-generator.js +320 -0
- package/dist/compliance/compliance-generator.js.map +1 -0
- package/dist/compliance/index.d.ts +8 -0
- package/dist/compliance/index.d.ts.map +1 -0
- package/dist/compliance/index.js +17 -0
- package/dist/compliance/index.js.map +1 -0
- package/dist/compliance/templates.d.ts +34 -0
- package/dist/compliance/templates.d.ts.map +1 -0
- package/{src/compliance/templates.ts → dist/compliance/templates.js} +117 -155
- package/dist/compliance/templates.js.map +1 -0
- package/dist/compliance/types.d.ts +64 -0
- package/dist/compliance/types.d.ts.map +1 -0
- package/dist/compliance/types.js +64 -0
- package/dist/compliance/types.js.map +1 -0
- package/dist/db/index.d.ts +17 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +80 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +3886 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +425 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/utils.d.ts +252 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/db/utils.js +295 -0
- package/dist/db/utils.js.map +1 -0
- package/dist/feed-analyzer/feed-analyzer.d.ts +26 -0
- package/dist/feed-analyzer/feed-analyzer.d.ts.map +1 -0
- package/{src/feed-analyzer/feed-analyzer.ts → dist/feed-analyzer/feed-analyzer.js} +856 -726
- package/dist/feed-analyzer/feed-analyzer.js.map +1 -0
- package/dist/feed-analyzer/index.d.ts +8 -0
- package/dist/feed-analyzer/index.d.ts.map +1 -0
- package/dist/feed-analyzer/index.js +19 -0
- package/dist/feed-analyzer/index.js.map +1 -0
- package/dist/feed-analyzer/types.d.ts +285 -0
- package/dist/feed-analyzer/types.d.ts.map +1 -0
- package/dist/feed-analyzer/types.js +175 -0
- package/dist/feed-analyzer/types.js.map +1 -0
- package/{src/generator/index.ts → dist/generator/index.d.ts} +1 -1
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +13 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/key-generator.d.ts +24 -0
- package/dist/generator/key-generator.d.ts.map +1 -0
- package/dist/generator/key-generator.js +144 -0
- package/dist/generator/key-generator.js.map +1 -0
- package/dist/generator/profile-builder.d.ts +15 -0
- package/dist/generator/profile-builder.d.ts.map +1 -0
- package/dist/generator/profile-builder.js +338 -0
- package/dist/generator/profile-builder.js.map +1 -0
- package/dist/hosting/artifacts-generator.d.ts +10 -0
- package/dist/hosting/artifacts-generator.d.ts.map +1 -0
- package/{src/hosting/artifacts-generator.ts → dist/hosting/artifacts-generator.js} +191 -241
- package/dist/hosting/artifacts-generator.js.map +1 -0
- package/{src/hosting/index.ts → dist/hosting/index.d.ts} +1 -1
- package/dist/hosting/index.d.ts.map +1 -0
- package/dist/hosting/index.js +10 -0
- package/dist/hosting/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/analytics.d.ts +337 -0
- package/dist/lib/analytics.d.ts.map +1 -0
- package/dist/lib/analytics.js +188 -0
- package/dist/lib/analytics.js.map +1 -0
- package/{src/security/index.ts → dist/security/index.d.ts} +8 -15
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +12 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security-scanner.d.ts +10 -0
- package/dist/security/security-scanner.d.ts.map +1 -0
- package/dist/security/security-scanner.js +669 -0
- package/dist/security/security-scanner.js.map +1 -0
- package/dist/security/types.d.ts +80 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/types.js +21 -0
- package/dist/security/types.js.map +1 -0
- package/dist/services/analytics.d.ts +114 -0
- package/dist/services/analytics.d.ts.map +1 -0
- package/dist/services/analytics.js +862 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/badge.d.ts +31 -0
- package/dist/services/badge.d.ts.map +1 -0
- package/dist/services/badge.js +152 -0
- package/dist/services/badge.js.map +1 -0
- package/dist/services/cron.d.ts +125 -0
- package/dist/services/cron.d.ts.map +1 -0
- package/dist/services/cron.js +613 -0
- package/dist/services/cron.js.map +1 -0
- package/dist/services/directory.d.ts +106 -0
- package/dist/services/directory.d.ts.map +1 -0
- package/dist/services/directory.js +351 -0
- package/dist/services/directory.js.map +1 -0
- package/dist/services/email.d.ts +112 -0
- package/dist/services/email.d.ts.map +1 -0
- package/dist/services/email.js +772 -0
- package/dist/services/email.js.map +1 -0
- package/dist/services/hosted-profiles.d.ts +77 -0
- package/dist/services/hosted-profiles.d.ts.map +1 -0
- package/dist/services/hosted-profiles.js +433 -0
- package/dist/services/hosted-profiles.js.map +1 -0
- package/dist/services/latency.d.ts +67 -0
- package/dist/services/latency.d.ts.map +1 -0
- package/dist/services/latency.js +274 -0
- package/dist/services/latency.js.map +1 -0
- package/dist/services/manifest-compliance.d.ts +64 -0
- package/dist/services/manifest-compliance.d.ts.map +1 -0
- package/dist/services/manifest-compliance.js +271 -0
- package/dist/services/manifest-compliance.js.map +1 -0
- package/dist/services/monitoring-diff.d.ts +31 -0
- package/dist/services/monitoring-diff.d.ts.map +1 -0
- package/dist/services/monitoring-diff.js +189 -0
- package/dist/services/monitoring-diff.js.map +1 -0
- package/dist/services/notifications.d.ts +46 -0
- package/dist/services/notifications.d.ts.map +1 -0
- package/dist/services/notifications.js +88 -0
- package/dist/services/notifications.js.map +1 -0
- package/dist/services/stripe.d.ts +93 -0
- package/dist/services/stripe.d.ts.map +1 -0
- package/dist/services/stripe.js +490 -0
- package/dist/services/stripe.js.map +1 -0
- package/dist/services/validation-history.d.ts +99 -0
- package/dist/services/validation-history.d.ts.map +1 -0
- package/dist/services/validation-history.js +344 -0
- package/dist/services/validation-history.js.map +1 -0
- package/dist/services/validation-logging.d.ts +103 -0
- package/dist/services/validation-logging.d.ts.map +1 -0
- package/dist/services/validation-logging.js +210 -0
- package/dist/services/validation-logging.js.map +1 -0
- package/dist/services/validation.d.ts +119 -0
- package/dist/services/validation.d.ts.map +1 -0
- package/dist/services/validation.js +1185 -0
- package/dist/services/validation.js.map +1 -0
- package/dist/simulator/agent-simulator.d.ts +69 -0
- package/dist/simulator/agent-simulator.d.ts.map +1 -0
- package/dist/simulator/agent-simulator.js +870 -0
- package/dist/simulator/agent-simulator.js.map +1 -0
- package/{src/simulator/index.ts → dist/simulator/index.d.ts} +7 -7
- package/dist/simulator/index.d.ts.map +1 -0
- package/dist/simulator/index.js +23 -0
- package/dist/simulator/index.js.map +1 -0
- package/{src/simulator/types.ts → dist/simulator/types.d.ts} +171 -170
- package/dist/simulator/types.d.ts.map +1 -0
- package/dist/simulator/types.js +18 -0
- package/dist/simulator/types.js.map +1 -0
- package/dist/types/acp-validation.d.ts +87 -0
- package/dist/types/acp-validation.d.ts.map +1 -0
- package/dist/types/acp-validation.js +40 -0
- package/dist/types/acp-validation.js.map +1 -0
- package/dist/types/analytics.d.ts +182 -0
- package/dist/types/analytics.d.ts.map +1 -0
- package/dist/types/analytics.js +7 -0
- package/dist/types/analytics.js.map +1 -0
- package/dist/types/generator.d.ts +106 -0
- package/dist/types/generator.d.ts.map +1 -0
- package/dist/types/generator.js +6 -0
- package/dist/types/generator.js.map +1 -0
- package/{src/types/index.ts → dist/types/index.d.ts} +1 -1
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/ucp-profile.d.ts +111 -0
- package/dist/types/ucp-profile.d.ts.map +1 -0
- package/dist/types/ucp-profile.js +45 -0
- package/dist/types/ucp-profile.js.map +1 -0
- package/dist/types/validation.d.ts +76 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +42 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/validator/acp/index.d.ts +31 -0
- package/dist/validator/acp/index.d.ts.map +1 -0
- package/dist/validator/acp/index.js +574 -0
- package/dist/validator/acp/index.js.map +1 -0
- package/dist/validator/index.d.ts +26 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +161 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/network-validator.d.ts +28 -0
- package/dist/validator/network-validator.d.ts.map +1 -0
- package/dist/validator/network-validator.js +319 -0
- package/dist/validator/network-validator.js.map +1 -0
- package/dist/validator/rules-validator.d.ts +19 -0
- package/dist/validator/rules-validator.d.ts.map +1 -0
- package/dist/validator/rules-validator.js +306 -0
- package/dist/validator/rules-validator.js.map +1 -0
- package/dist/validator/sdk-validator.d.ts +58 -0
- package/dist/validator/sdk-validator.d.ts.map +1 -0
- package/{src/validator/sdk-validator.ts → dist/validator/sdk-validator.js} +273 -330
- package/dist/validator/sdk-validator.js.map +1 -0
- package/dist/validator/structural-validator.d.ts +11 -0
- package/dist/validator/structural-validator.d.ts.map +1 -0
- package/dist/validator/structural-validator.js +549 -0
- package/dist/validator/structural-validator.js.map +1 -0
- package/dist/validator/utils.d.ts +51 -0
- package/dist/validator/utils.d.ts.map +1 -0
- package/dist/validator/utils.js +132 -0
- package/dist/validator/utils.js.map +1 -0
- package/package.json +44 -12
- package/CLAUDE.md +0 -109
- package/api/analyze-feed.js +0 -140
- package/api/badge.js +0 -185
- package/api/benchmark.js +0 -177
- package/api/directory-stats.ts +0 -29
- package/api/directory.ts +0 -73
- package/api/generate-compliance.js +0 -143
- package/api/generate-schema.js +0 -457
- package/api/generate.js +0 -132
- package/api/security-scan.js +0 -133
- package/api/simulate.js +0 -187
- package/api/tsconfig.json +0 -10
- package/api/validate.js +0 -1351
- package/apify-actor/.actor/actor.json +0 -68
- package/apify-actor/.actor/input_schema.json +0 -32
- package/apify-actor/APIFY-STORE-LISTING.md +0 -412
- package/apify-actor/Dockerfile +0 -8
- package/apify-actor/README.md +0 -166
- package/apify-actor/main.ts +0 -111
- package/apify-actor/package.json +0 -17
- package/apify-actor/src/main.js +0 -199
- package/docs/BRAND-IDENTITY.md +0 -238
- package/docs/BRAND-STYLE-GUIDE.md +0 -356
- package/drizzle/0000_black_king_cobra.sql +0 -39
- package/drizzle/meta/0000_snapshot.json +0 -309
- package/drizzle/meta/_journal.json +0 -13
- package/drizzle.config.ts +0 -10
- package/public/.well-known/ucp +0 -25
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/brand.css +0 -321
- package/public/directory.html +0 -701
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/guides/bigcommerce.html +0 -743
- package/public/guides/fastucp.html +0 -838
- package/public/guides/magento.html +0 -779
- package/public/guides/shopify.html +0 -726
- package/public/guides/squarespace.html +0 -749
- package/public/guides/wix.html +0 -747
- package/public/guides/woocommerce.html +0 -733
- package/public/index.html +0 -3835
- package/public/learn.html +0 -396
- package/public/logo.jpeg +0 -0
- package/public/og-image-icon.png +0 -0
- package/public/og-image.png +0 -0
- package/public/robots.txt +0 -6
- package/public/site.webmanifest +0 -31
- package/public/sitemap.xml +0 -69
- package/public/social/linkedin-banner-1128x191.png +0 -0
- package/public/social/temp.PNG +0 -0
- package/public/social/x-header-1500x500.png +0 -0
- package/public/verify.html +0 -410
- package/scripts/generate-favicons.js +0 -44
- package/scripts/generate-ico.js +0 -23
- package/scripts/generate-og-image.js +0 -45
- package/scripts/reset-db.ts +0 -77
- package/scripts/seed-db.ts +0 -71
- package/scripts/setup-benchmark-db.js +0 -70
- package/src/api/server.ts +0 -266
- package/src/cli/index.ts +0 -302
- package/src/compliance/compliance-generator.ts +0 -452
- package/src/compliance/index.ts +0 -28
- package/src/compliance/types.ts +0 -170
- package/src/db/index.ts +0 -28
- package/src/db/schema.ts +0 -84
- package/src/feed-analyzer/index.ts +0 -34
- package/src/feed-analyzer/types.ts +0 -354
- package/src/generator/key-generator.ts +0 -124
- package/src/generator/profile-builder.ts +0 -402
- package/src/index.ts +0 -105
- package/src/security/security-scanner.ts +0 -604
- package/src/security/types.ts +0 -55
- package/src/services/directory.ts +0 -434
- package/src/simulator/agent-simulator.ts +0 -941
- package/src/types/generator.ts +0 -140
- package/src/types/ucp-profile.ts +0 -140
- package/src/types/validation.ts +0 -89
- package/src/validator/index.ts +0 -194
- package/src/validator/network-validator.ts +0 -417
- package/src/validator/rules-validator.ts +0 -297
- package/src/validator/structural-validator.ts +0 -476
- package/tests/fixtures/non-compliant-profile.json +0 -25
- package/tests/fixtures/official-sample-profile.json +0 -75
- package/tests/integration/benchmark.test.ts +0 -207
- package/tests/integration/database.test.ts +0 -163
- package/tests/integration/directory-api.test.ts +0 -268
- package/tests/integration/simulate-api.test.ts +0 -230
- package/tests/integration/validate-api.test.ts +0 -269
- package/tests/setup.ts +0 -15
- package/tests/unit/agent-simulator.test.ts +0 -575
- package/tests/unit/compliance-generator.test.ts +0 -374
- package/tests/unit/directory-service.test.ts +0 -272
- package/tests/unit/feed-analyzer.test.ts +0 -517
- package/tests/unit/lint-suggestions.test.ts +0 -423
- package/tests/unit/official-samples.test.ts +0 -211
- package/tests/unit/pdf-report.test.ts +0 -390
- package/tests/unit/sdk-validator.test.ts +0 -531
- package/tests/unit/security-scanner.test.ts +0 -410
- package/tests/unit/validation.test.ts +0 -390
- package/tsconfig.json +0 -20
- package/vercel.json +0 -34
- package/vitest.config.ts +0 -22
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Structural Validator
|
|
4
|
+
* Validates UCP Profile JSON structure (no network calls)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.validateStructure = validateStructure;
|
|
8
|
+
const validation_js_1 = require("../types/validation.js");
|
|
9
|
+
const utils_js_1 = require("./utils.js");
|
|
10
|
+
/**
|
|
11
|
+
* Version format regex (YYYY-MM-DD)
|
|
12
|
+
*/
|
|
13
|
+
const VERSION_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
14
|
+
/**
|
|
15
|
+
* Validate the structural integrity of a UCP profile
|
|
16
|
+
* Returns an array of validation issues
|
|
17
|
+
*/
|
|
18
|
+
function validateStructure(profile) {
|
|
19
|
+
const issues = [];
|
|
20
|
+
// Check if it's an object
|
|
21
|
+
if (!profile || typeof profile !== 'object') {
|
|
22
|
+
issues.push({
|
|
23
|
+
severity: 'error',
|
|
24
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_UCP_OBJECT,
|
|
25
|
+
path: '$',
|
|
26
|
+
message: 'Profile must be a JSON object',
|
|
27
|
+
hint: 'Ensure your profile is valid JSON and contains a root object',
|
|
28
|
+
});
|
|
29
|
+
return issues;
|
|
30
|
+
}
|
|
31
|
+
const profileObj = profile;
|
|
32
|
+
// Check for ucp root object
|
|
33
|
+
if (!profileObj.ucp || typeof profileObj.ucp !== 'object') {
|
|
34
|
+
issues.push({
|
|
35
|
+
severity: 'error',
|
|
36
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_UCP_OBJECT,
|
|
37
|
+
path: '$.ucp',
|
|
38
|
+
message: 'Missing required "ucp" object at root level',
|
|
39
|
+
hint: 'Add a "ucp" object containing version, services, and capabilities',
|
|
40
|
+
});
|
|
41
|
+
return issues;
|
|
42
|
+
}
|
|
43
|
+
const ucp = profileObj.ucp;
|
|
44
|
+
// Validate version
|
|
45
|
+
issues.push(...validateVersion(ucp));
|
|
46
|
+
// Validate services
|
|
47
|
+
issues.push(...validateServices(ucp));
|
|
48
|
+
// Validate capabilities
|
|
49
|
+
issues.push(...validateCapabilities(ucp));
|
|
50
|
+
// Validate signing_keys (required per UCP spec 2026-01-11)
|
|
51
|
+
if (profileObj.signing_keys === undefined) {
|
|
52
|
+
issues.push({
|
|
53
|
+
severity: 'error',
|
|
54
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_SIGNING_KEYS,
|
|
55
|
+
path: '$.signing_keys',
|
|
56
|
+
message: 'Missing required "signing_keys" field',
|
|
57
|
+
hint: 'Add signing_keys array with at least one JWK public key for signature verification',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
issues.push(...validateSigningKeys(profileObj.signing_keys));
|
|
62
|
+
}
|
|
63
|
+
// Validate payment handlers (required per UCP spec 2026-01-11)
|
|
64
|
+
issues.push(...validatePaymentHandlers(profileObj));
|
|
65
|
+
return issues;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validate UCP version field
|
|
69
|
+
*/
|
|
70
|
+
function validateVersion(ucp) {
|
|
71
|
+
const issues = [];
|
|
72
|
+
if (!ucp.version) {
|
|
73
|
+
issues.push({
|
|
74
|
+
severity: 'error',
|
|
75
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_VERSION,
|
|
76
|
+
path: '$.ucp.version',
|
|
77
|
+
message: 'Missing required "version" field in ucp object',
|
|
78
|
+
hint: 'Add version field with format "YYYY-MM-DD" (e.g., "2026-01-11")',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else if (typeof ucp.version !== 'string') {
|
|
82
|
+
issues.push({
|
|
83
|
+
severity: 'error',
|
|
84
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_VERSION_FORMAT,
|
|
85
|
+
path: '$.ucp.version',
|
|
86
|
+
message: 'Version must be a string',
|
|
87
|
+
hint: 'Use format "YYYY-MM-DD" (e.g., "2026-01-11")',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else if (!VERSION_REGEX.test(ucp.version)) {
|
|
91
|
+
issues.push({
|
|
92
|
+
severity: 'error',
|
|
93
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_VERSION_FORMAT,
|
|
94
|
+
path: '$.ucp.version',
|
|
95
|
+
message: `Invalid version format: "${ucp.version}"`,
|
|
96
|
+
hint: 'Use format "YYYY-MM-DD" (e.g., "2026-01-11")',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return issues;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate services object
|
|
103
|
+
*/
|
|
104
|
+
function validateServices(ucp) {
|
|
105
|
+
const issues = [];
|
|
106
|
+
if (!ucp.services) {
|
|
107
|
+
issues.push({
|
|
108
|
+
severity: 'error',
|
|
109
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_SERVICES,
|
|
110
|
+
path: '$.ucp.services',
|
|
111
|
+
message: 'Missing required "services" field in ucp object',
|
|
112
|
+
hint: 'Add a services object with at least one service definition',
|
|
113
|
+
});
|
|
114
|
+
return issues;
|
|
115
|
+
}
|
|
116
|
+
if (typeof ucp.services !== 'object' || Array.isArray(ucp.services)) {
|
|
117
|
+
issues.push({
|
|
118
|
+
severity: 'error',
|
|
119
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
120
|
+
path: '$.ucp.services',
|
|
121
|
+
message: 'Services must be an object (not an array)',
|
|
122
|
+
hint: 'Use format: { "dev.ucp.shopping": { ... } }',
|
|
123
|
+
});
|
|
124
|
+
return issues;
|
|
125
|
+
}
|
|
126
|
+
const services = ucp.services;
|
|
127
|
+
// Check for at least one service
|
|
128
|
+
if (Object.keys(services).length === 0) {
|
|
129
|
+
issues.push({
|
|
130
|
+
severity: 'warn',
|
|
131
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_SERVICES,
|
|
132
|
+
path: '$.ucp.services',
|
|
133
|
+
message: 'Services object is empty',
|
|
134
|
+
hint: 'Add at least one service (e.g., "dev.ucp.shopping")',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Normalize services from both object and array formats (Google vs Shopify)
|
|
138
|
+
const normalizedServices = (0, utils_js_1.normalizeServices)(services);
|
|
139
|
+
if (normalizedServices.length === 0 && Object.keys(services).length > 0) {
|
|
140
|
+
// Services exist but couldn't be normalized - check for format issues
|
|
141
|
+
for (const [serviceName, serviceData] of Object.entries(services)) {
|
|
142
|
+
if (!serviceData) {
|
|
143
|
+
issues.push({
|
|
144
|
+
severity: 'error',
|
|
145
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
146
|
+
path: `$.ucp.services["${serviceName}"]`,
|
|
147
|
+
message: `Service "${serviceName}" is null or undefined`,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Validate each normalized service
|
|
153
|
+
for (const { name, service } of normalizedServices) {
|
|
154
|
+
issues.push(...validateService(name, service));
|
|
155
|
+
}
|
|
156
|
+
return issues;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Validate individual service definition (already normalized)
|
|
160
|
+
*/
|
|
161
|
+
function validateService(name, service) {
|
|
162
|
+
const issues = [];
|
|
163
|
+
const path = `$.ucp.services["${name}"]`;
|
|
164
|
+
// Check required version
|
|
165
|
+
if (!service.version) {
|
|
166
|
+
issues.push({
|
|
167
|
+
severity: 'error',
|
|
168
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
169
|
+
path: `${path}.version`,
|
|
170
|
+
message: `Service "${name}" missing required "version" field`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else if (typeof service.version === 'string' && !VERSION_REGEX.test(service.version)) {
|
|
174
|
+
issues.push({
|
|
175
|
+
severity: 'error',
|
|
176
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_VERSION_FORMAT,
|
|
177
|
+
path: `${path}.version`,
|
|
178
|
+
message: `Invalid version format in service "${name}"`,
|
|
179
|
+
hint: 'Use format "YYYY-MM-DD"',
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Check required spec
|
|
183
|
+
if (!service.spec) {
|
|
184
|
+
issues.push({
|
|
185
|
+
severity: 'error',
|
|
186
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
187
|
+
path: `${path}.spec`,
|
|
188
|
+
message: `Service "${name}" missing required "spec" field`,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// Check for at least one transport
|
|
192
|
+
const hasTransport = service.rest || service.mcp || service.a2a || service.embedded;
|
|
193
|
+
if (!hasTransport) {
|
|
194
|
+
issues.push({
|
|
195
|
+
severity: 'warn',
|
|
196
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
197
|
+
path,
|
|
198
|
+
message: `Service "${name}" has no transport bindings`,
|
|
199
|
+
hint: 'Add at least one transport: rest, mcp, a2a, or embedded',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Validate REST transport if present
|
|
203
|
+
if (service.rest) {
|
|
204
|
+
issues.push(...validateRestTransport(service.rest, `${path}.rest`));
|
|
205
|
+
}
|
|
206
|
+
// Validate MCP transport if present
|
|
207
|
+
if (service.mcp) {
|
|
208
|
+
issues.push(...validateMcpTransport(service.mcp, `${path}.mcp`));
|
|
209
|
+
}
|
|
210
|
+
return issues;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Validate REST transport binding
|
|
214
|
+
*/
|
|
215
|
+
function validateRestTransport(transport, path) {
|
|
216
|
+
const issues = [];
|
|
217
|
+
if (!transport || typeof transport !== 'object') {
|
|
218
|
+
issues.push({
|
|
219
|
+
severity: 'error',
|
|
220
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
221
|
+
path,
|
|
222
|
+
message: 'REST transport must be an object',
|
|
223
|
+
});
|
|
224
|
+
return issues;
|
|
225
|
+
}
|
|
226
|
+
const rest = transport;
|
|
227
|
+
if (!rest.schema) {
|
|
228
|
+
issues.push({
|
|
229
|
+
severity: 'error',
|
|
230
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
231
|
+
path: `${path}.schema`,
|
|
232
|
+
message: 'REST transport missing required "schema" field',
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
if (!rest.endpoint) {
|
|
236
|
+
issues.push({
|
|
237
|
+
severity: 'error',
|
|
238
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
239
|
+
path: `${path}.endpoint`,
|
|
240
|
+
message: 'REST transport missing required "endpoint" field',
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return issues;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Validate MCP transport binding
|
|
247
|
+
*/
|
|
248
|
+
function validateMcpTransport(transport, path) {
|
|
249
|
+
const issues = [];
|
|
250
|
+
if (!transport || typeof transport !== 'object') {
|
|
251
|
+
issues.push({
|
|
252
|
+
severity: 'error',
|
|
253
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
254
|
+
path,
|
|
255
|
+
message: 'MCP transport must be an object',
|
|
256
|
+
});
|
|
257
|
+
return issues;
|
|
258
|
+
}
|
|
259
|
+
const mcp = transport;
|
|
260
|
+
if (!mcp.schema) {
|
|
261
|
+
issues.push({
|
|
262
|
+
severity: 'error',
|
|
263
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
264
|
+
path: `${path}.schema`,
|
|
265
|
+
message: 'MCP transport missing required "schema" field',
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
if (!mcp.endpoint) {
|
|
269
|
+
issues.push({
|
|
270
|
+
severity: 'error',
|
|
271
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SERVICE_STRUCTURE,
|
|
272
|
+
path: `${path}.endpoint`,
|
|
273
|
+
message: 'MCP transport missing required "endpoint" field',
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
return issues;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Validate capabilities array
|
|
280
|
+
*/
|
|
281
|
+
function validateCapabilities(ucp) {
|
|
282
|
+
const issues = [];
|
|
283
|
+
if (!ucp.capabilities) {
|
|
284
|
+
issues.push({
|
|
285
|
+
severity: 'error',
|
|
286
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_CAPABILITIES,
|
|
287
|
+
path: '$.ucp.capabilities',
|
|
288
|
+
message: 'Missing required "capabilities" field in ucp object',
|
|
289
|
+
hint: 'Add a capabilities array with at least one capability',
|
|
290
|
+
});
|
|
291
|
+
return issues;
|
|
292
|
+
}
|
|
293
|
+
// Normalize capabilities from both array and object formats
|
|
294
|
+
const normalizedCapabilities = (0, utils_js_1.normalizeCapabilities)(ucp.capabilities);
|
|
295
|
+
if (normalizedCapabilities.length === 0) {
|
|
296
|
+
// Check if it was a non-empty object that failed to normalize
|
|
297
|
+
if (typeof ucp.capabilities === 'object' && !Array.isArray(ucp.capabilities) && Object.keys(ucp.capabilities).length > 0) {
|
|
298
|
+
issues.push({
|
|
299
|
+
severity: 'warn',
|
|
300
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_CAPABILITIES,
|
|
301
|
+
path: '$.ucp.capabilities',
|
|
302
|
+
message: 'Capabilities object could not be normalized - check format',
|
|
303
|
+
hint: 'Capabilities should be either an array or an object with capability names as keys',
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
issues.push({
|
|
308
|
+
severity: 'warn',
|
|
309
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_CAPABILITIES,
|
|
310
|
+
path: '$.ucp.capabilities',
|
|
311
|
+
message: 'Capabilities array is empty',
|
|
312
|
+
hint: 'Add at least one capability (e.g., dev.ucp.shopping.checkout)',
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Validate each normalized capability
|
|
317
|
+
for (let i = 0; i < normalizedCapabilities.length; i++) {
|
|
318
|
+
const cap = normalizedCapabilities[i];
|
|
319
|
+
issues.push(...validateCapability(cap, i, cap.name));
|
|
320
|
+
}
|
|
321
|
+
return issues;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Validate individual capability
|
|
325
|
+
*/
|
|
326
|
+
function validateCapability(capability, index, capabilityName) {
|
|
327
|
+
const issues = [];
|
|
328
|
+
const path = capabilityName ? `$.ucp.capabilities["${capabilityName}"]` : `$.ucp.capabilities[${index}]`;
|
|
329
|
+
if (!capability || typeof capability !== 'object') {
|
|
330
|
+
issues.push({
|
|
331
|
+
severity: 'error',
|
|
332
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE,
|
|
333
|
+
path,
|
|
334
|
+
message: `Capability at index ${index} must be an object`,
|
|
335
|
+
});
|
|
336
|
+
return issues;
|
|
337
|
+
}
|
|
338
|
+
const cap = capability;
|
|
339
|
+
const capName = capabilityName ? `"${capabilityName}"` : (cap.name ? `"${cap.name}"` : `#${index + 1}`);
|
|
340
|
+
// Check required fields
|
|
341
|
+
if (!cap.name) {
|
|
342
|
+
issues.push({
|
|
343
|
+
severity: 'error',
|
|
344
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE,
|
|
345
|
+
path: `${path}.name`,
|
|
346
|
+
message: `Capability #${index + 1} missing required "name" field`,
|
|
347
|
+
hint: 'Add a name like "checkout", "order", or "fulfillment"',
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
if (!cap.version) {
|
|
351
|
+
issues.push({
|
|
352
|
+
severity: 'error',
|
|
353
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE,
|
|
354
|
+
path: `${path}.version`,
|
|
355
|
+
message: `Capability ${capName} missing required "version" field`,
|
|
356
|
+
hint: 'Add version in format "YYYY-MM-DD" (e.g., "2026-01-11")',
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
else if (typeof cap.version === 'string' && !VERSION_REGEX.test(cap.version)) {
|
|
360
|
+
issues.push({
|
|
361
|
+
severity: 'error',
|
|
362
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_VERSION_FORMAT,
|
|
363
|
+
path: `${path}.version`,
|
|
364
|
+
message: `Capability ${capName} has invalid version format: "${cap.version}"`,
|
|
365
|
+
hint: 'Use format "YYYY-MM-DD" (e.g., "2026-01-11")',
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
if (!cap.spec) {
|
|
369
|
+
issues.push({
|
|
370
|
+
severity: 'error',
|
|
371
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE,
|
|
372
|
+
path: `${path}.spec`,
|
|
373
|
+
message: `Capability ${capName} missing required "spec" field`,
|
|
374
|
+
hint: 'Add spec URL like "https://ucp.dev/specs/checkout/1.0"',
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
if (!cap.schema) {
|
|
378
|
+
issues.push({
|
|
379
|
+
severity: 'error',
|
|
380
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_CAPABILITY_STRUCTURE,
|
|
381
|
+
path: `${path}.schema`,
|
|
382
|
+
message: `Capability ${capName} missing required "schema" field`,
|
|
383
|
+
hint: 'Add schema URL pointing to JSON Schema for this capability',
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
return issues;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Validate signing_keys structure
|
|
390
|
+
* Accepts signing_keys as a direct array of JWKs (official UCP format)
|
|
391
|
+
*/
|
|
392
|
+
function validateSigningKeys(signingKeys) {
|
|
393
|
+
const issues = [];
|
|
394
|
+
const path = '$.signing_keys';
|
|
395
|
+
// signing_keys should be an array of JWKs
|
|
396
|
+
if (!Array.isArray(signingKeys)) {
|
|
397
|
+
issues.push({
|
|
398
|
+
severity: 'error',
|
|
399
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SIGNING_KEY,
|
|
400
|
+
path,
|
|
401
|
+
message: 'signing_keys must be an array of JWK objects',
|
|
402
|
+
});
|
|
403
|
+
return issues;
|
|
404
|
+
}
|
|
405
|
+
for (let i = 0; i < signingKeys.length; i++) {
|
|
406
|
+
issues.push(...validateJwk(signingKeys[i], `${path}[${i}]`));
|
|
407
|
+
}
|
|
408
|
+
return issues;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Validate JWK structure
|
|
412
|
+
*/
|
|
413
|
+
function validateJwk(jwk, path) {
|
|
414
|
+
const issues = [];
|
|
415
|
+
if (!jwk || typeof jwk !== 'object') {
|
|
416
|
+
issues.push({
|
|
417
|
+
severity: 'error',
|
|
418
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SIGNING_KEY,
|
|
419
|
+
path,
|
|
420
|
+
message: 'JWK must be an object',
|
|
421
|
+
});
|
|
422
|
+
return issues;
|
|
423
|
+
}
|
|
424
|
+
const key = jwk;
|
|
425
|
+
if (!key.kty) {
|
|
426
|
+
issues.push({
|
|
427
|
+
severity: 'error',
|
|
428
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SIGNING_KEY,
|
|
429
|
+
path: `${path}.kty`,
|
|
430
|
+
message: 'JWK missing required "kty" field',
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
if (!key.kid) {
|
|
434
|
+
issues.push({
|
|
435
|
+
severity: 'error',
|
|
436
|
+
code: validation_js_1.ValidationErrorCodes.INVALID_SIGNING_KEY,
|
|
437
|
+
path: `${path}.kid`,
|
|
438
|
+
message: 'JWK missing required "kid" field',
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
return issues;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Validate payment handlers (required per UCP spec 2026-01-11)
|
|
445
|
+
* Supports both formats:
|
|
446
|
+
* - Google format: { payment: { handlers: [...] } }
|
|
447
|
+
* - Shopify format: { payment_handlers: { [name]: [...] } }
|
|
448
|
+
*/
|
|
449
|
+
function validatePaymentHandlers(profile) {
|
|
450
|
+
const issues = [];
|
|
451
|
+
// Check for payment handlers in both Google and Shopify formats
|
|
452
|
+
const hasPaymentObject = profile.payment && typeof profile.payment === 'object';
|
|
453
|
+
const hasPaymentHandlers = profile.payment_handlers && typeof profile.payment_handlers === 'object';
|
|
454
|
+
if (!hasPaymentObject && !hasPaymentHandlers) {
|
|
455
|
+
issues.push({
|
|
456
|
+
severity: 'error',
|
|
457
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_PAYMENT_HANDLERS,
|
|
458
|
+
path: '$.payment',
|
|
459
|
+
message: 'Missing required "payment" object',
|
|
460
|
+
hint: 'Add payment object with handlers array per UCP spec, or payment_handlers for Shopify format',
|
|
461
|
+
});
|
|
462
|
+
return issues;
|
|
463
|
+
}
|
|
464
|
+
// Normalize handlers from both formats
|
|
465
|
+
const normalizedHandlers = normalizePaymentHandlers(profile);
|
|
466
|
+
if (normalizedHandlers.length === 0) {
|
|
467
|
+
const path = hasPaymentHandlers ? '$.payment_handlers' : '$.payment.handlers';
|
|
468
|
+
issues.push({
|
|
469
|
+
severity: 'error',
|
|
470
|
+
code: validation_js_1.ValidationErrorCodes.MISSING_PAYMENT_HANDLERS,
|
|
471
|
+
path,
|
|
472
|
+
message: 'Payment handlers must be a non-empty array or object',
|
|
473
|
+
hint: 'Add at least one payment handler configuration',
|
|
474
|
+
});
|
|
475
|
+
return issues;
|
|
476
|
+
}
|
|
477
|
+
// Validate each handler - use relaxed requirements for Shopify format
|
|
478
|
+
// Google spec requires: id, name, version, spec, config_schema, instrument_schemas
|
|
479
|
+
// Shopify provides: id, version, spec, schema, config
|
|
480
|
+
const coreFields = ['id', 'version', 'spec'];
|
|
481
|
+
normalizedHandlers.forEach((handler, idx) => {
|
|
482
|
+
const handlerPath = `$.payment_handlers[${idx}]`;
|
|
483
|
+
if (!handler || typeof handler !== 'object') {
|
|
484
|
+
issues.push({
|
|
485
|
+
severity: 'error',
|
|
486
|
+
code: validation_js_1.ValidationErrorCodes.PAYMENT_HANDLER_MISSING_FIELD,
|
|
487
|
+
path: handlerPath,
|
|
488
|
+
message: `Payment handler ${idx + 1} must be an object`,
|
|
489
|
+
});
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
const handlerObj = handler;
|
|
493
|
+
// Check core required fields (common to both formats)
|
|
494
|
+
coreFields.forEach(field => {
|
|
495
|
+
if (!handlerObj[field]) {
|
|
496
|
+
issues.push({
|
|
497
|
+
severity: 'error',
|
|
498
|
+
code: validation_js_1.ValidationErrorCodes.PAYMENT_HANDLER_MISSING_FIELD,
|
|
499
|
+
path: `${handlerPath}.${field}`,
|
|
500
|
+
message: `Payment handler ${idx + 1} missing required field: ${field}`,
|
|
501
|
+
hint: `Add "${field}" to payment handler configuration`,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
// Additional fields are warnings (different formats have different requirements)
|
|
506
|
+
if (!handlerObj.schema && !handlerObj.config_schema) {
|
|
507
|
+
issues.push({
|
|
508
|
+
severity: 'warn',
|
|
509
|
+
code: validation_js_1.ValidationErrorCodes.PAYMENT_HANDLER_MISSING_FIELD,
|
|
510
|
+
path: `${handlerPath}.schema`,
|
|
511
|
+
message: `Payment handler ${idx + 1} missing schema/config_schema field`,
|
|
512
|
+
hint: 'Add "schema" or "config_schema" for full spec compliance',
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
return issues;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Normalize payment handlers from both Google and Shopify formats
|
|
520
|
+
* - Google: { payment: { handlers: [...] } }
|
|
521
|
+
* - Shopify: { payment_handlers: { [name]: [{...}, ...] } }
|
|
522
|
+
*/
|
|
523
|
+
function normalizePaymentHandlers(profile) {
|
|
524
|
+
// Try Shopify format first (payment_handlers at root)
|
|
525
|
+
if (profile.payment_handlers && typeof profile.payment_handlers === 'object') {
|
|
526
|
+
const handlers = [];
|
|
527
|
+
const paymentHandlers = profile.payment_handlers;
|
|
528
|
+
for (const [_name, entries] of Object.entries(paymentHandlers)) {
|
|
529
|
+
if (Array.isArray(entries)) {
|
|
530
|
+
handlers.push(...entries);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
if (handlers.length > 0) {
|
|
534
|
+
return handlers;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
// Try Google format (payment.handlers)
|
|
538
|
+
if (profile.payment && typeof profile.payment === 'object') {
|
|
539
|
+
const payment = profile.payment;
|
|
540
|
+
if (Array.isArray(payment.handlers)) {
|
|
541
|
+
return payment.handlers;
|
|
542
|
+
}
|
|
543
|
+
if (payment.handlers && typeof payment.handlers === 'object') {
|
|
544
|
+
return Object.values(payment.handlers);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return [];
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=structural-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structural-validator.js","sourceRoot":"","sources":["../../src/validator/structural-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator Utilities
|
|
3
|
+
* Helper functions for normalizing UCP profile data
|
|
4
|
+
*/
|
|
5
|
+
import type { UcpCapability, UcpService, UcpCapabilities } from '../types/ucp-profile.js';
|
|
6
|
+
/**
|
|
7
|
+
* Capability entry in the object-keyed format (Shopify style)
|
|
8
|
+
* Where capabilities is: { [name]: CapabilityEntry[] }
|
|
9
|
+
*/
|
|
10
|
+
export interface CapabilityEntry {
|
|
11
|
+
version: string;
|
|
12
|
+
spec?: string;
|
|
13
|
+
schema?: string;
|
|
14
|
+
extends?: string;
|
|
15
|
+
config?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Service entry in array format (Shopify style)
|
|
19
|
+
* Where services is: { [name]: ServiceEntry[] }
|
|
20
|
+
*/
|
|
21
|
+
export interface ServiceEntry {
|
|
22
|
+
version: string;
|
|
23
|
+
spec?: string;
|
|
24
|
+
transport?: string;
|
|
25
|
+
endpoint?: string;
|
|
26
|
+
schema?: string;
|
|
27
|
+
rest?: UcpService['rest'];
|
|
28
|
+
mcp?: UcpService['mcp'];
|
|
29
|
+
a2a?: UcpService['a2a'];
|
|
30
|
+
embedded?: UcpService['embedded'];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Capabilities can be in two formats:
|
|
34
|
+
* 1. Array format: [{ name, version, spec, schema, ... }, ...]
|
|
35
|
+
* 2. Object format (Shopify): { [name]: [{ version, spec, schema, ... }, ...] }
|
|
36
|
+
*
|
|
37
|
+
* This function normalizes both to our standard array format.
|
|
38
|
+
*/
|
|
39
|
+
export declare function normalizeCapabilities(capabilities: UcpCapabilities | unknown): UcpCapability[];
|
|
40
|
+
/**
|
|
41
|
+
* Services can be in two formats:
|
|
42
|
+
* 1. Object format (our format): { [name]: { version, rest?, mcp?, ... } }
|
|
43
|
+
* 2. Array format (Shopify): { [name]: [{ version, transport, endpoint, ... }, ...] }
|
|
44
|
+
*
|
|
45
|
+
* This function normalizes services and returns individual service objects.
|
|
46
|
+
*/
|
|
47
|
+
export declare function normalizeServices(services: Record<string, UcpService | UcpService[] | ServiceEntry[]> | undefined): Array<{
|
|
48
|
+
name: string;
|
|
49
|
+
service: UcpService;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/validator/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1F;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,GAAG,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,eAAe,GAAG,OAAO,GACtC,aAAa,EAAE,CA0CjB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,YAAY,EAAE,CAAC,GAAG,SAAS,GAC/E,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,CAuB9C"}
|