@inf-monkeys-tech/monkeys 1.0.65 → 1.0.68

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 (66) hide show
  1. package/README.md +6 -0
  2. package/lib/contracts/capability.d.ts +4 -0
  3. package/lib/contracts/capability.d.ts.map +1 -1
  4. package/lib/contracts/capability.js +1 -0
  5. package/lib/contracts/capability.js.map +1 -1
  6. package/lib/contracts/declarative-control-http.d.ts +81420 -0
  7. package/lib/contracts/declarative-control-http.d.ts.map +1 -0
  8. package/lib/contracts/declarative-control-http.js +926 -0
  9. package/lib/contracts/declarative-control-http.js.map +1 -0
  10. package/lib/contracts/declarative-control.d.ts +17753 -0
  11. package/lib/contracts/declarative-control.d.ts.map +1 -0
  12. package/lib/contracts/declarative-control.js +1078 -0
  13. package/lib/contracts/declarative-control.js.map +1 -0
  14. package/lib/contracts/index.d.ts +2 -0
  15. package/lib/contracts/index.d.ts.map +1 -1
  16. package/lib/contracts/index.js +2 -0
  17. package/lib/contracts/index.js.map +1 -1
  18. package/lib/contracts/menu.d.ts +1 -1
  19. package/lib/contracts/page.d.ts +3 -3
  20. package/lib/contracts/semantic.d.ts +78 -1
  21. package/lib/contracts/semantic.d.ts.map +1 -1
  22. package/lib/contracts/semantic.js +27 -1
  23. package/lib/contracts/semantic.js.map +1 -1
  24. package/lib/contracts/tenant.d.ts +81 -12
  25. package/lib/contracts/tenant.d.ts.map +1 -1
  26. package/lib/contracts/tenant.js +279 -93
  27. package/lib/contracts/tenant.js.map +1 -1
  28. package/lib/contracts/trend.d.ts +4 -4
  29. package/lib/esm/contracts/index.mjs +2963 -1048
  30. package/lib/esm/contracts/index.mjs.map +1 -1
  31. package/lib/esm/index.mjs +5820 -3025
  32. package/lib/esm/index.mjs.map +1 -1
  33. package/lib/esm/runtime/index.mjs +2529 -632
  34. package/lib/esm/runtime/index.mjs.map +1 -1
  35. package/lib/esm/schemas/index.mjs +2081 -982
  36. package/lib/esm/schemas/index.mjs.map +1 -1
  37. package/lib/json-schema/capability-registry.schema.json +2 -1
  38. package/lib/json-schema/declarative-control-ontology-definition.schema.json +130 -0
  39. package/lib/json-schema/index.json +13 -0
  40. package/lib/json-schema/navigation-release.schema.json +2037 -0
  41. package/lib/json-schema/navigation-runtime-bundle.schema.json +7505 -0
  42. package/lib/json-schema/navigation.schema.json +4649 -0
  43. package/lib/json-schema/page-release.schema.json +2465 -0
  44. package/lib/json-schema/page-runtime-bundle.schema.json +5713 -0
  45. package/lib/json-schema/page.schema.json +7944 -0
  46. package/lib/json-schema/publication-plan.schema.json +1286 -0
  47. package/lib/json-schema/route-space.schema.json +93 -0
  48. package/lib/json-schema/stable-ref-alias-map.schema.json +535 -0
  49. package/lib/json-schema/tenant-product-config.schema.json +73 -0
  50. package/lib/json-schema/tenant-runtime-config.schema.json +73 -0
  51. package/lib/json-schema/workbench-release.schema.json +2481 -0
  52. package/lib/json-schema/workbench-runtime-bundle.schema.json +5290 -0
  53. package/lib/json-schema/workbench.schema.json +6698 -0
  54. package/lib/runtime/declarative-control-compiler.d.ts +141 -0
  55. package/lib/runtime/declarative-control-compiler.d.ts.map +1 -0
  56. package/lib/runtime/declarative-control-compiler.js +875 -0
  57. package/lib/runtime/declarative-control-compiler.js.map +1 -0
  58. package/lib/runtime/index.d.ts +1 -0
  59. package/lib/runtime/index.d.ts.map +1 -1
  60. package/lib/runtime/index.js +1 -0
  61. package/lib/runtime/index.js.map +1 -1
  62. package/lib/schemas/index.d.ts +14061 -3830
  63. package/lib/schemas/index.d.ts.map +1 -1
  64. package/lib/schemas/index.js +76 -4
  65. package/lib/schemas/index.js.map +1 -1
  66. package/package.json +1 -1
@@ -0,0 +1,1078 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompiledNavigationRegisteredMenuActionTargetSchema = exports.WorkbenchRuntimeBundleSchema = exports.ResolvedWorkbenchAppInstanceSchema = exports.PageRuntimeBundleSchema = exports.NavigationReleaseSchema = exports.ResolvedNavigationTargetSchema = exports.NavigationSchema = exports.NavigationNodeSchema = exports.NavigationSeparatorNodeSchema = exports.NavigationTargetNodeSchema = exports.NavigationGroupNodeSchema = exports.WorkbenchReleaseSchema = exports.WorkbenchSchema = exports.WorkbenchAppInstanceSchema = exports.WorkbenchGroupSchema = exports.PageReleaseSchema = exports.PageSchema = exports.ActionBindingSchema = exports.OntologyBindingSchema = exports.CapabilityInstanceSchema = exports.BindingSourceSchema = exports.WorkbenchIdentitySchema = exports.PublicationPlanSchema = exports.PublicationPlanOperationSchema = exports.ReleaseEvidenceSchema = exports.ReleaseValidationSchema = exports.ReleaseDependencySchema = exports.ReleaseDependencyRoleSchema = exports.ReleaseOperationSchema = exports.CompiledRouteClaimSchema = exports.CompiledRouteMatcherSchema = exports.DeclarativeRouteClaimSchema = exports.RouteClaimSchema = exports.LegacyRouteClaimSchema = exports.RouteSpaceSchema = exports.RouteSpaceParameterSchema = exports.RoutePathTemplateSchema = exports.ManagementAccessSchema = exports.AccessPolicySchema = exports.ProductSurfaceSchema = exports.DeclarativeLifecycleSchema = exports.StableRefAliasMapSchema = exports.StableRefAliasSchema = exports.RevisionRefSchema = exports.StableRefSchema = exports.ReferenceVisibilitySchema = exports.TenantScopeSchema = exports.ScopedIdentityRefSchema = exports.I18nTextSchema = exports.DECLARATIVE_CONTROL_SCHEMA_VERSION = void 0;
4
+ exports.DECLARATIVE_CONTROL_ONTOLOGY_DEFINITIONS = exports.DeclarativeControlOntologyDefinitionSchema = exports.NavigationRuntimeBundleSchema = exports.CompiledNavigationNodeSchema = exports.CompiledNavigationSeparatorNodeSchema = exports.CompiledNavigationTargetNodeSchema = exports.CompiledNavigationGroupNodeSchema = exports.CompiledNavigationResolvedTargetSchema = exports.CompiledNavigationDomainCommandTargetSchema = void 0;
5
+ const zod_1 = require("zod");
6
+ const common_1 = require("./common");
7
+ const data_1 = require("./data");
8
+ const render_1 = require("./render");
9
+ exports.DECLARATIVE_CONTROL_SCHEMA_VERSION = 1;
10
+ const uniqueArray = (values, identity) => {
11
+ const seen = new Set();
12
+ for (const value of values) {
13
+ const key = identity(value);
14
+ if (seen.has(key))
15
+ return key;
16
+ seen.add(key);
17
+ }
18
+ return undefined;
19
+ };
20
+ exports.I18nTextSchema = zod_1.z
21
+ .object({
22
+ defaultLocale: common_1.LocaleIdentifierSchema,
23
+ values: zod_1.z.record(common_1.LocaleIdentifierSchema, zod_1.z.string().trim().min(1)),
24
+ })
25
+ .strict()
26
+ .superRefine((value, context) => {
27
+ if (!Object.prototype.hasOwnProperty.call(value.values, value.defaultLocale)) {
28
+ context.addIssue({
29
+ code: 'custom',
30
+ path: ['values', value.defaultLocale],
31
+ message: 'I18nText values must contain the default locale.',
32
+ });
33
+ }
34
+ });
35
+ exports.ScopedIdentityRefSchema = zod_1.z
36
+ .object({
37
+ kind: common_1.ContractIdentifierSchema,
38
+ id: common_1.ContractIdentifierSchema,
39
+ ownerRepo: common_1.ContractIdentifierSchema,
40
+ })
41
+ .strict();
42
+ exports.TenantScopeSchema = zod_1.z
43
+ .object({
44
+ tenantRef: exports.ScopedIdentityRefSchema,
45
+ dataSpaceRef: exports.ScopedIdentityRefSchema,
46
+ teamRef: exports.ScopedIdentityRefSchema.optional(),
47
+ })
48
+ .strict()
49
+ .superRefine((value, context) => {
50
+ const expectedKinds = [
51
+ ['tenantRef', value.tenantRef, 'tenant'],
52
+ ['dataSpaceRef', value.dataSpaceRef, 'data-space'],
53
+ ['teamRef', value.teamRef, 'team'],
54
+ ];
55
+ expectedKinds.forEach(([field, reference, expectedKind]) => {
56
+ if (reference && reference.kind !== expectedKind) {
57
+ context.addIssue({ code: 'custom', path: [field, 'kind'], message: `${field} must reference ${expectedKind}.` });
58
+ }
59
+ });
60
+ });
61
+ exports.ReferenceVisibilitySchema = zod_1.z.enum(['tenant', 'global', 'public']);
62
+ const StableRefShape = {
63
+ kind: common_1.ContractIdentifierSchema,
64
+ id: common_1.ContractIdentifierSchema,
65
+ ownerRepo: common_1.ContractIdentifierSchema,
66
+ visibility: exports.ReferenceVisibilitySchema,
67
+ tenantScope: exports.TenantScopeSchema.optional(),
68
+ };
69
+ const validateReferenceScope = (value, context) => {
70
+ if (value.visibility === 'tenant' && !value.tenantScope) {
71
+ context.addIssue({ code: 'custom', path: ['tenantScope'], message: 'Tenant references require an explicit tenant scope.' });
72
+ }
73
+ if (value.visibility !== 'tenant' && value.tenantScope) {
74
+ context.addIssue({ code: 'custom', path: ['tenantScope'], message: 'Global and public references cannot carry a tenant scope.' });
75
+ }
76
+ };
77
+ exports.StableRefSchema = zod_1.z
78
+ .object(StableRefShape)
79
+ .strict()
80
+ .superRefine(validateReferenceScope);
81
+ exports.RevisionRefSchema = zod_1.z
82
+ .object({
83
+ ...StableRefShape,
84
+ revision: zod_1.z.number().int().positive(),
85
+ schemaVersion: common_1.ContractVersionSchema,
86
+ contentHash: common_1.Sha256Schema,
87
+ })
88
+ .strict()
89
+ .superRefine(validateReferenceScope);
90
+ const scopedIdentityKey = (reference) => `${reference.kind}:${reference.id}:${reference.ownerRepo}`;
91
+ const tenantScopeKey = (scope) => `${scopedIdentityKey(scope.tenantRef)}:${scopedIdentityKey(scope.dataSpaceRef)}:${scope.teamRef ? scopedIdentityKey(scope.teamRef) : ''}`;
92
+ const stableRefIdentity = (reference) => `${reference.visibility}:${reference.tenantScope ? tenantScopeKey(reference.tenantScope) : ''}:${reference.kind}:${reference.id}:${reference.ownerRepo}`;
93
+ const exactRevisionRef = (left, right) => stableRefIdentity(left) === stableRefIdentity(right)
94
+ && left.revision === right.revision
95
+ && left.schemaVersion === right.schemaVersion
96
+ && left.contentHash === right.contentHash;
97
+ exports.StableRefAliasSchema = zod_1.z
98
+ .object({
99
+ aliasRef: exports.StableRefSchema,
100
+ canonicalRef: exports.StableRefSchema,
101
+ validFrom: common_1.IsoDateTimeSchema,
102
+ validUntil: common_1.IsoDateTimeSchema.nullable(),
103
+ evidenceRef: exports.RevisionRefSchema,
104
+ })
105
+ .strict()
106
+ .superRefine((value, context) => {
107
+ if (value.aliasRef.kind !== value.canonicalRef.kind) {
108
+ context.addIssue({ code: 'custom', path: ['canonicalRef', 'kind'], message: 'Alias and canonical references must have the same kind.' });
109
+ }
110
+ if (value.validUntil && value.validUntil <= value.validFrom) {
111
+ context.addIssue({ code: 'custom', path: ['validUntil'], message: 'Alias validUntil must be later than validFrom.' });
112
+ }
113
+ });
114
+ exports.StableRefAliasMapSchema = zod_1.z
115
+ .object({
116
+ contract: zod_1.z.literal('StableRefAliasMap'),
117
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
118
+ tenantScope: exports.TenantScopeSchema,
119
+ aliases: zod_1.z.array(exports.StableRefAliasSchema),
120
+ contentHash: common_1.Sha256Schema,
121
+ })
122
+ .strict()
123
+ .superRefine((value, context) => {
124
+ const duplicate = uniqueArray(value.aliases, (entry) => stableRefIdentity(entry.aliasRef));
125
+ if (duplicate)
126
+ context.addIssue({ code: 'custom', path: ['aliases'], message: `Duplicate alias reference: ${duplicate}` });
127
+ });
128
+ exports.DeclarativeLifecycleSchema = zod_1.z.enum(['active', 'deprecated', 'retired']);
129
+ exports.ProductSurfaceSchema = zod_1.z.enum(['studio', 'kernel']);
130
+ const GroupRefSchema = exports.StableRefSchema.superRefine((value, context) => {
131
+ if (value.kind !== 'group')
132
+ context.addIssue({ code: 'custom', path: ['kind'], message: 'Access group references must use kind group.' });
133
+ });
134
+ const AccessConditionRefSchema = exports.RevisionRefSchema.superRefine((value, context) => {
135
+ if (value.kind !== 'access-condition') {
136
+ context.addIssue({ code: 'custom', path: ['kind'], message: 'Access condition references must use kind access-condition.' });
137
+ }
138
+ });
139
+ exports.AccessPolicySchema = zod_1.z
140
+ .object({
141
+ authenticated: zod_1.z.boolean(),
142
+ groupAllOf: zod_1.z.array(GroupRefSchema),
143
+ groupAnyOf: zod_1.z.array(GroupRefSchema),
144
+ permissionAllOf: zod_1.z.array(common_1.ContractIdentifierSchema),
145
+ permissionAnyOf: zod_1.z.array(common_1.ContractIdentifierSchema),
146
+ conditionAllOf: zod_1.z.array(AccessConditionRefSchema),
147
+ })
148
+ .strict()
149
+ .superRefine((value, context) => {
150
+ const checks = [
151
+ ['groupAllOf', value.groupAllOf, (candidate) => stableRefIdentity(candidate)],
152
+ ['groupAnyOf', value.groupAnyOf, (candidate) => stableRefIdentity(candidate)],
153
+ ['permissionAllOf', value.permissionAllOf, String],
154
+ ['permissionAnyOf', value.permissionAnyOf, String],
155
+ ['conditionAllOf', value.conditionAllOf, (candidate) => `${stableRefIdentity(candidate)}@${candidate.revision}`],
156
+ ];
157
+ checks.forEach(([field, values, identity]) => {
158
+ if (uniqueArray(values, identity))
159
+ context.addIssue({ code: 'custom', path: [field], message: `${field} entries must be unique.` });
160
+ });
161
+ });
162
+ exports.ManagementAccessSchema = zod_1.z
163
+ .object({
164
+ edit: exports.AccessPolicySchema,
165
+ preview: exports.AccessPolicySchema,
166
+ publish: exports.AccessPolicySchema,
167
+ deactivate: exports.AccessPolicySchema,
168
+ rollback: exports.AccessPolicySchema,
169
+ retire: exports.AccessPolicySchema,
170
+ })
171
+ .strict();
172
+ exports.RoutePathTemplateSchema = zod_1.z
173
+ .string()
174
+ .trim()
175
+ .regex(/^\/(?!\/)/, 'Expected an application-relative path.')
176
+ .superRefine((value, context) => {
177
+ if (value.includes('?') || value.includes('#') || value.includes('\\')) {
178
+ context.addIssue({ code: 'custom', message: 'Route paths cannot contain query strings, fragments, or backslashes.' });
179
+ }
180
+ if (value.split('/').some((segment) => segment === '.' || segment === '..')) {
181
+ context.addIssue({ code: 'custom', message: 'Route paths cannot contain traversal segments.' });
182
+ }
183
+ if (/^[a-z][a-z0-9+.-]*:/i.test(value) || value.includes('://')) {
184
+ context.addIssue({ code: 'custom', message: 'Route paths cannot contain a scheme or host.' });
185
+ }
186
+ });
187
+ exports.RouteSpaceParameterSchema = zod_1.z
188
+ .object({
189
+ name: common_1.ContractIdentifierSchema,
190
+ type: zod_1.z.enum(['identifier', 'integer', 'slug', 'uuid']),
191
+ required: zod_1.z.boolean(),
192
+ })
193
+ .strict();
194
+ exports.RouteSpaceSchema = zod_1.z
195
+ .object({
196
+ contract: zod_1.z.literal('RouteSpace'),
197
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
198
+ routeSpaceId: common_1.ContractIdentifierSchema,
199
+ supportedSurface: exports.ProductSurfaceSchema,
200
+ basePath: exports.RoutePathTemplateSchema,
201
+ caseSensitive: zod_1.z.boolean(),
202
+ trailingSlash: zod_1.z.enum(['preserve', 'remove', 'require']),
203
+ reservedPaths: zod_1.z.array(exports.RoutePathTemplateSchema),
204
+ parameters: zod_1.z.array(exports.RouteSpaceParameterSchema),
205
+ })
206
+ .strict()
207
+ .superRefine((value, context) => {
208
+ if (uniqueArray(value.parameters, (parameter) => parameter.name)) {
209
+ context.addIssue({ code: 'custom', path: ['parameters'], message: 'RouteSpace parameter names must be unique.' });
210
+ }
211
+ if (uniqueArray(value.reservedPaths, (path) => path)) {
212
+ context.addIssue({ code: 'custom', path: ['reservedPaths'], message: 'RouteSpace reserved paths must be unique.' });
213
+ }
214
+ });
215
+ const RouteClaimBaseSchema = zod_1.z
216
+ .object({
217
+ kind: zod_1.z.enum(['canonical', 'alias', 'redirect']),
218
+ routeSpaceRevisionRef: exports.RevisionRefSchema,
219
+ pathTemplate: exports.RoutePathTemplateSchema,
220
+ redirectTargetRef: exports.StableRefSchema.optional(),
221
+ })
222
+ .strict()
223
+ .superRefine((value, context) => {
224
+ if (value.routeSpaceRevisionRef.kind !== 'route-space') {
225
+ context.addIssue({ code: 'custom', path: ['routeSpaceRevisionRef', 'kind'], message: 'Route claims must reference a route-space revision.' });
226
+ }
227
+ if (value.kind === 'redirect' && !value.redirectTargetRef) {
228
+ context.addIssue({ code: 'custom', path: ['redirectTargetRef'], message: 'Redirect claims require a governed target reference.' });
229
+ }
230
+ if (value.kind !== 'redirect' && value.redirectTargetRef) {
231
+ context.addIssue({ code: 'custom', path: ['redirectTargetRef'], message: 'Only redirect claims may declare redirectTargetRef.' });
232
+ }
233
+ });
234
+ /**
235
+ * Read compatibility for schemaVersion 1 Page and Workbench records written
236
+ * before route claims carried their owning product surface. New declarations
237
+ * must use RouteClaimSchema; compilers infer this legacy form only from the
238
+ * exact pinned RouteSpace.
239
+ */
240
+ exports.LegacyRouteClaimSchema = RouteClaimBaseSchema;
241
+ exports.RouteClaimSchema = RouteClaimBaseSchema.safeExtend({
242
+ surface: exports.ProductSurfaceSchema,
243
+ }).strict();
244
+ exports.DeclarativeRouteClaimSchema = exports.RouteClaimSchema;
245
+ const LegacyDeclarativeRouteClaimSchema = exports.LegacyRouteClaimSchema;
246
+ const LegacyCompiledRouteMatcherSchema = zod_1.z
247
+ .object({
248
+ caseSensitive: zod_1.z.boolean(),
249
+ trailingSlash: zod_1.z.enum(['preserve', 'remove', 'require']),
250
+ parameters: zod_1.z.array(exports.RouteSpaceParameterSchema),
251
+ })
252
+ .strict();
253
+ exports.CompiledRouteMatcherSchema = LegacyCompiledRouteMatcherSchema.safeExtend({
254
+ surface: exports.ProductSurfaceSchema,
255
+ }).strict();
256
+ exports.CompiledRouteClaimSchema = exports.RouteClaimSchema.safeExtend({
257
+ normalizedPath: exports.RoutePathTemplateSchema,
258
+ matcher: exports.CompiledRouteMatcherSchema,
259
+ }).strict();
260
+ const LegacyCompiledRouteClaimSchema = exports.LegacyRouteClaimSchema.safeExtend({
261
+ normalizedPath: exports.RoutePathTemplateSchema,
262
+ matcher: LegacyCompiledRouteMatcherSchema,
263
+ }).strict();
264
+ const validateDeclaredRouteSurfaces = (supportedSurfaces, routeClaims, context) => {
265
+ if (uniqueArray(supportedSurfaces, (surface) => surface)) {
266
+ context.addIssue({ code: 'custom', path: ['supportedSurfaces'], message: 'Supported surfaces must be unique.' });
267
+ }
268
+ const explicitClaims = routeClaims.filter((claim) => 'surface' in claim);
269
+ if (explicitClaims.length > 0 && explicitClaims.length < routeClaims.length) {
270
+ context.addIssue({ code: 'custom', path: ['routeClaims'], message: 'Route claims must either all declare surface or all omit it for legacy compatibility.' });
271
+ return;
272
+ }
273
+ routeClaims.forEach((claim, index) => {
274
+ if ('surface' in claim && !supportedSurfaces.includes(claim.surface)) {
275
+ context.addIssue({ code: 'custom', path: ['routeClaims', index, 'surface'], message: 'Route claim surface must be declared by supportedSurfaces.' });
276
+ }
277
+ });
278
+ if (explicitClaims.length !== routeClaims.length)
279
+ return;
280
+ supportedSurfaces.forEach((surface) => {
281
+ const canonicalCount = explicitClaims.filter((claim) => claim.surface === surface && claim.kind === 'canonical').length;
282
+ if (canonicalCount !== 1) {
283
+ context.addIssue({ code: 'custom', path: ['routeClaims'], message: `Surface ${surface} requires exactly one canonical route claim.` });
284
+ }
285
+ });
286
+ };
287
+ exports.ReleaseOperationSchema = zod_1.z.enum(['activate', 'deactivate', 'rollback']);
288
+ exports.ReleaseDependencyRoleSchema = zod_1.z.enum([
289
+ 'route-space',
290
+ 'shell',
291
+ 'page',
292
+ 'page-release',
293
+ 'workbench',
294
+ 'workbench-release',
295
+ 'navigation',
296
+ 'navigation-release',
297
+ 'menu-action',
298
+ 'application-menu-catalog',
299
+ 'capability',
300
+ 'provider',
301
+ 'ontology-definition',
302
+ 'view',
303
+ 'projection',
304
+ 'action',
305
+ 'token',
306
+ 'schema',
307
+ 'compiler',
308
+ 'workflow',
309
+ 'agent',
310
+ 'built-in-application',
311
+ 'design',
312
+ 'layout-policy',
313
+ 'performance-budget',
314
+ 'observation-policy',
315
+ ]);
316
+ const DependencyKindByRole = {
317
+ 'route-space': 'route-space',
318
+ shell: 'shell',
319
+ page: 'page',
320
+ 'page-release': 'page-release',
321
+ workbench: 'workbench',
322
+ 'workbench-release': 'workbench-release',
323
+ navigation: 'navigation',
324
+ 'navigation-release': 'navigation-release',
325
+ 'menu-action': 'menu-action',
326
+ 'application-menu-catalog': 'application-menu-catalog',
327
+ capability: 'capability',
328
+ provider: 'view-provider',
329
+ 'ontology-definition': 'ontology-definition',
330
+ view: 'view',
331
+ projection: 'projection',
332
+ action: 'domain-command',
333
+ token: 'design-token',
334
+ schema: 'schema',
335
+ compiler: 'compiler',
336
+ workflow: 'workflow',
337
+ agent: 'agent',
338
+ 'built-in-application': 'built-in-application',
339
+ design: 'design',
340
+ 'layout-policy': 'layout-policy',
341
+ 'performance-budget': 'performance-budget',
342
+ 'observation-policy': 'observation-policy',
343
+ };
344
+ exports.ReleaseDependencySchema = zod_1.z
345
+ .object({
346
+ role: exports.ReleaseDependencyRoleSchema,
347
+ revisionRef: exports.RevisionRefSchema,
348
+ })
349
+ .strict()
350
+ .superRefine((value, context) => {
351
+ const expectedKind = DependencyKindByRole[value.role];
352
+ if (value.revisionRef.kind !== expectedKind) {
353
+ context.addIssue({
354
+ code: 'custom',
355
+ path: ['revisionRef', 'kind'],
356
+ message: `Dependency role ${value.role} requires reference kind ${expectedKind}.`,
357
+ });
358
+ }
359
+ });
360
+ exports.ReleaseValidationSchema = zod_1.z
361
+ .object({
362
+ result: zod_1.z.enum(['pass', 'fail']),
363
+ inputHash: common_1.Sha256Schema,
364
+ diagnosticRefs: zod_1.z.array(exports.RevisionRefSchema),
365
+ })
366
+ .strict();
367
+ exports.ReleaseEvidenceSchema = zod_1.z
368
+ .object({
369
+ publicationPlanRef: exports.StableRefSchema,
370
+ expectedHeadRevisionRef: exports.RevisionRefSchema.nullable(),
371
+ validation: exports.ReleaseValidationSchema,
372
+ approvalPolicyRevisionRef: exports.RevisionRefSchema,
373
+ approvalDecisionRevisionRef: exports.RevisionRefSchema,
374
+ actorRef: exports.StableRefSchema,
375
+ reason: zod_1.z.string().trim().min(1).max(4096),
376
+ idempotencyKey: common_1.ContractIdentifierSchema,
377
+ occurredAt: common_1.IsoDateTimeSchema,
378
+ evidenceRefs: zod_1.z.array(exports.RevisionRefSchema).min(1),
379
+ })
380
+ .strict()
381
+ .superRefine((value, context) => {
382
+ const expectedKinds = [
383
+ ['publicationPlanRef', value.publicationPlanRef, 'publication-plan'],
384
+ ['approvalPolicyRevisionRef', value.approvalPolicyRevisionRef, 'approval-policy'],
385
+ ['approvalDecisionRevisionRef', value.approvalDecisionRevisionRef, 'approval-decision'],
386
+ ['actorRef', value.actorRef, 'actor'],
387
+ ];
388
+ expectedKinds.forEach(([field, reference, expectedKind]) => {
389
+ if (reference.kind !== expectedKind) {
390
+ context.addIssue({ code: 'custom', path: [field, 'kind'], message: `${field} must reference ${expectedKind}.` });
391
+ }
392
+ });
393
+ value.evidenceRefs.forEach((reference, index) => {
394
+ if (reference.kind !== 'evidence')
395
+ context.addIssue({ code: 'custom', path: ['evidenceRefs', index, 'kind'], message: 'Release evidenceRefs must reference evidence revisions.' });
396
+ });
397
+ });
398
+ exports.PublicationPlanOperationSchema = zod_1.z
399
+ .object({
400
+ releaseKind: zod_1.z.enum(['page-release', 'workbench-release', 'navigation-release']),
401
+ releaseSlotId: common_1.ContractIdentifierSchema,
402
+ releaseRevisionRef: exports.RevisionRefSchema,
403
+ expectedHeadRevisionRef: exports.RevisionRefSchema.nullable(),
404
+ })
405
+ .strict()
406
+ .superRefine((value, context) => {
407
+ if (value.releaseRevisionRef.kind !== value.releaseKind || value.releaseRevisionRef.id !== value.releaseSlotId) {
408
+ context.addIssue({ code: 'custom', path: ['releaseRevisionRef'], message: 'Publication Plan operation must pin the exact release slot revision.' });
409
+ }
410
+ if (value.expectedHeadRevisionRef
411
+ && (value.expectedHeadRevisionRef.kind !== value.releaseKind || value.expectedHeadRevisionRef.id !== value.releaseSlotId)) {
412
+ context.addIssue({ code: 'custom', path: ['expectedHeadRevisionRef'], message: 'Expected head must identify the same release slot.' });
413
+ }
414
+ });
415
+ exports.PublicationPlanSchema = zod_1.z
416
+ .object({
417
+ contract: zod_1.z.literal('PublicationPlan'),
418
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
419
+ planId: common_1.ContractIdentifierSchema,
420
+ tenantScope: exports.TenantScopeSchema,
421
+ environmentRef: exports.StableRefSchema,
422
+ operations: zod_1.z.array(exports.PublicationPlanOperationSchema).min(1),
423
+ validation: exports.ReleaseValidationSchema,
424
+ approvalPolicyRevisionRef: exports.RevisionRefSchema,
425
+ approvalDecisionRevisionRef: exports.RevisionRefSchema,
426
+ actorRef: exports.StableRefSchema,
427
+ idempotencyKey: common_1.ContractIdentifierSchema,
428
+ evidenceRefs: zod_1.z.array(exports.RevisionRefSchema).min(1),
429
+ createdAt: common_1.IsoDateTimeSchema,
430
+ })
431
+ .strict()
432
+ .superRefine((value, context) => {
433
+ if (value.environmentRef.kind !== 'environment')
434
+ context.addIssue({ code: 'custom', path: ['environmentRef', 'kind'], message: 'Publication Plan requires an environment reference.' });
435
+ const governedRefs = [
436
+ ['approvalPolicyRevisionRef', value.approvalPolicyRevisionRef, 'approval-policy'],
437
+ ['approvalDecisionRevisionRef', value.approvalDecisionRevisionRef, 'approval-decision'],
438
+ ['actorRef', value.actorRef, 'actor'],
439
+ ];
440
+ governedRefs.forEach(([field, reference, expectedKind]) => {
441
+ if (reference.kind !== expectedKind)
442
+ context.addIssue({ code: 'custom', path: [field, 'kind'], message: `${field} must reference ${expectedKind}.` });
443
+ });
444
+ value.operations.forEach((operation, index) => {
445
+ [operation.releaseRevisionRef, operation.expectedHeadRevisionRef].forEach((reference, referenceIndex) => {
446
+ if (reference?.tenantScope && tenantScopeKey(reference.tenantScope) !== tenantScopeKey(value.tenantScope)) {
447
+ const field = referenceIndex === 0 ? 'releaseRevisionRef' : 'expectedHeadRevisionRef';
448
+ context.addIssue({ code: 'custom', path: ['operations', index, field, 'tenantScope'], message: 'Publication Plan operation belongs to another tenant scope.' });
449
+ }
450
+ });
451
+ });
452
+ value.evidenceRefs.forEach((reference, index) => {
453
+ if (reference.kind !== 'evidence')
454
+ context.addIssue({ code: 'custom', path: ['evidenceRefs', index, 'kind'], message: 'Publication Plan evidenceRefs must reference evidence revisions.' });
455
+ });
456
+ if (uniqueArray(value.operations, (operation) => `${operation.releaseKind}:${operation.releaseSlotId}`)) {
457
+ context.addIssue({ code: 'custom', path: ['operations'], message: 'Publication Plan release slots must be unique.' });
458
+ }
459
+ });
460
+ const IdentitySchema = zod_1.z
461
+ .object({
462
+ name: exports.I18nTextSchema,
463
+ description: exports.I18nTextSchema.optional(),
464
+ tags: zod_1.z.array(common_1.ContractIdentifierSchema).default([]),
465
+ })
466
+ .strict();
467
+ exports.WorkbenchIdentitySchema = IdentitySchema.extend({ iconRef: exports.StableRefSchema.optional() }).strict();
468
+ const ReleaseBaseShape = {
469
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
470
+ releaseSlotId: common_1.ContractIdentifierSchema,
471
+ tenantScope: exports.TenantScopeSchema,
472
+ operation: exports.ReleaseOperationSchema,
473
+ dependencySnapshot: zod_1.z.array(exports.ReleaseDependencySchema),
474
+ evidence: exports.ReleaseEvidenceSchema,
475
+ };
476
+ const validateDependencySnapshot = (snapshot, context) => {
477
+ const duplicate = uniqueArray(snapshot, (dependency) => `${dependency.role}:${stableRefIdentity(dependency.revisionRef)}@${dependency.revisionRef.revision}`);
478
+ if (duplicate)
479
+ context.addIssue({ code: 'custom', path: ['dependencySnapshot'], message: `Duplicate dependency: ${duplicate}` });
480
+ };
481
+ const validateReleaseExpectedHead = (value, expectedKind, context) => {
482
+ const expectedHead = value.evidence.expectedHeadRevisionRef;
483
+ if (expectedHead && (expectedHead.kind !== expectedKind || expectedHead.id !== value.releaseSlotId)) {
484
+ context.addIssue({ code: 'custom', path: ['evidence', 'expectedHeadRevisionRef'], message: 'Expected head must identify the same release slot.' });
485
+ }
486
+ if (expectedHead?.tenantScope && tenantScopeKey(expectedHead.tenantScope) !== tenantScopeKey(value.tenantScope)) {
487
+ context.addIssue({ code: 'custom', path: ['evidence', 'expectedHeadRevisionRef', 'tenantScope'], message: 'Expected head belongs to another tenant scope.' });
488
+ }
489
+ };
490
+ exports.BindingSourceSchema = zod_1.z.discriminatedUnion('kind', [
491
+ zod_1.z.object({ kind: zod_1.z.literal('constant'), value: zod_1.z.union([zod_1.z.string(), zod_1.z.number().finite(), zod_1.z.boolean(), zod_1.z.null()]) }).strict(),
492
+ zod_1.z.object({ kind: zod_1.z.literal('route-parameter'), name: common_1.ContractIdentifierSchema }).strict(),
493
+ zod_1.z.object({ kind: zod_1.z.literal('query-parameter'), name: common_1.ContractIdentifierSchema }).strict(),
494
+ zod_1.z.object({ kind: zod_1.z.literal('identity'), name: zod_1.z.enum(['tenantId', 'teamId', 'userId']) }).strict(),
495
+ zod_1.z.object({ kind: zod_1.z.literal('intent-field'), path: zod_1.z.string().trim().regex(/^[A-Za-z0-9_.-]+$/) }).strict(),
496
+ zod_1.z.object({ kind: zod_1.z.literal('binding-field'), bindingId: common_1.ContractIdentifierSchema, path: zod_1.z.string().trim().regex(/^[A-Za-z0-9_.-]+$/) }).strict(),
497
+ ]);
498
+ exports.CapabilityInstanceSchema = zod_1.z
499
+ .object({
500
+ instanceId: common_1.ContractIdentifierSchema,
501
+ nodeId: common_1.ContractIdentifierSchema,
502
+ capabilityRevisionRef: exports.RevisionRefSchema,
503
+ providerRevisionRef: exports.RevisionRefSchema,
504
+ propertySchemaRevisionRef: exports.RevisionRefSchema,
505
+ properties: common_1.JsonObjectSchema,
506
+ allowedSideEffects: zod_1.z.array(zod_1.z.enum(['network', 'storage', 'navigation', 'worker', 'websocket'])),
507
+ })
508
+ .strict();
509
+ exports.OntologyBindingSchema = zod_1.z
510
+ .object({
511
+ bindingId: common_1.ContractIdentifierSchema,
512
+ ontologyDefinitionRevisionRef: exports.RevisionRefSchema,
513
+ viewRevisionRef: exports.RevisionRefSchema.optional(),
514
+ projectionRevisionRef: exports.RevisionRefSchema.optional(),
515
+ parameters: zod_1.z.record(common_1.ContractIdentifierSchema, exports.BindingSourceSchema),
516
+ target: zod_1.z.object({ capabilityInstanceId: common_1.ContractIdentifierSchema, port: common_1.ContractIdentifierSchema }).strict(),
517
+ renderModelSchemaRevisionRef: exports.RevisionRefSchema,
518
+ pagination: zod_1.z.enum(['none', 'cursor', 'offset']),
519
+ cache: zod_1.z.enum(['none', 'identity-scoped', 'tenant-scoped']),
520
+ cancelOnChange: zod_1.z.boolean(),
521
+ })
522
+ .strict()
523
+ .superRefine((value, context) => {
524
+ if ((value.viewRevisionRef ? 1 : 0) + (value.projectionRevisionRef ? 1 : 0) !== 1) {
525
+ context.addIssue({ code: 'custom', path: ['viewRevisionRef'], message: 'Ontology bindings require exactly one View or Projection revision.' });
526
+ }
527
+ if (value.ontologyDefinitionRevisionRef.kind !== 'ontology-definition') {
528
+ context.addIssue({ code: 'custom', path: ['ontologyDefinitionRevisionRef', 'kind'], message: 'Expected an ontology-definition revision.' });
529
+ }
530
+ });
531
+ exports.ActionBindingSchema = zod_1.z
532
+ .object({
533
+ bindingId: common_1.ContractIdentifierSchema,
534
+ commandRevisionRef: exports.RevisionRefSchema,
535
+ source: zod_1.z.object({ capabilityInstanceId: common_1.ContractIdentifierSchema, port: common_1.ContractIdentifierSchema }).strict(),
536
+ sourceIntentSchemaRevisionRef: exports.RevisionRefSchema,
537
+ inputSchemaRevisionRef: exports.RevisionRefSchema,
538
+ inputMapping: zod_1.z.record(common_1.ContractIdentifierSchema, exports.BindingSourceSchema),
539
+ accessPolicy: exports.AccessPolicySchema,
540
+ confirmation: exports.I18nTextSchema.optional(),
541
+ idempotencyKeySource: zod_1.z.enum(['interaction', 'record-and-interaction', 'caller-provided']),
542
+ compensationCommandRevisionRef: exports.RevisionRefSchema.optional(),
543
+ resultSchemaRevisionRef: exports.RevisionRefSchema,
544
+ success: zod_1.z.object({
545
+ refreshBindingIds: zod_1.z.array(common_1.ContractIdentifierSchema),
546
+ navigationTargetRef: exports.StableRefSchema.optional(),
547
+ }).strict(),
548
+ recovery: zod_1.z.enum(['retry-safe', 'compensating-command', 'manual-review']),
549
+ lineageRequired: zod_1.z.literal(true),
550
+ })
551
+ .strict()
552
+ .superRefine((value, context) => {
553
+ if (value.commandRevisionRef.kind !== 'domain-command') {
554
+ context.addIssue({ code: 'custom', path: ['commandRevisionRef', 'kind'], message: 'Action bindings must reference a domain-command revision.' });
555
+ }
556
+ if (value.sourceIntentSchemaRevisionRef.kind !== 'schema') {
557
+ context.addIssue({ code: 'custom', path: ['sourceIntentSchemaRevisionRef', 'kind'], message: 'Action source intents must pin a schema revision.' });
558
+ }
559
+ if (value.inputSchemaRevisionRef.kind !== 'schema') {
560
+ context.addIssue({ code: 'custom', path: ['inputSchemaRevisionRef', 'kind'], message: 'Action command inputs must pin a schema revision.' });
561
+ }
562
+ if (value.recovery === 'compensating-command' && !value.compensationCommandRevisionRef) {
563
+ context.addIssue({ code: 'custom', path: ['compensationCommandRevisionRef'], message: 'Compensating recovery requires a compensation command.' });
564
+ }
565
+ });
566
+ exports.PageSchema = zod_1.z
567
+ .object({
568
+ contract: zod_1.z.literal('Page'),
569
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
570
+ pageId: common_1.ContractIdentifierSchema,
571
+ tenantScope: exports.TenantScopeSchema,
572
+ identity: IdentitySchema,
573
+ supportedSurfaces: zod_1.z.array(exports.ProductSurfaceSchema).min(1),
574
+ lifecycle: exports.DeclarativeLifecycleSchema,
575
+ routeClaims: zod_1.z.array(zod_1.z.union([exports.DeclarativeRouteClaimSchema, LegacyDeclarativeRouteClaimSchema])).min(1),
576
+ shellRevisionRef: exports.RevisionRefSchema,
577
+ renderTree: render_1.RenderTreeSchema,
578
+ capabilityInstances: zod_1.z.array(exports.CapabilityInstanceSchema).min(1),
579
+ ontologyBindings: zod_1.z.array(exports.OntologyBindingSchema),
580
+ actionBindings: zod_1.z.array(exports.ActionBindingSchema),
581
+ pageAccessPolicy: exports.AccessPolicySchema,
582
+ managementAccess: exports.ManagementAccessSchema,
583
+ tokenRevisionRefs: zod_1.z.array(exports.RevisionRefSchema).min(1),
584
+ performanceBudgetRef: exports.RevisionRefSchema,
585
+ observationPolicyRevisionRef: exports.RevisionRefSchema,
586
+ privacyClassification: zod_1.z.enum(['public', 'internal', 'confidential', 'restricted']),
587
+ })
588
+ .strict()
589
+ .superRefine((value, context) => {
590
+ validateDeclaredRouteSurfaces(value.supportedSurfaces, value.routeClaims, context);
591
+ const uniqueness = [
592
+ ['capabilityInstances', value.capabilityInstances, (candidate) => String(candidate.instanceId)],
593
+ ['ontologyBindings', value.ontologyBindings, (candidate) => String(candidate.bindingId)],
594
+ ['actionBindings', value.actionBindings, (candidate) => String(candidate.bindingId)],
595
+ ];
596
+ uniqueness.forEach(([field, values, identity]) => {
597
+ if (uniqueArray(values, identity))
598
+ context.addIssue({ code: 'custom', path: [field], message: `${field} identities must be unique.` });
599
+ });
600
+ const instanceIds = new Set(value.capabilityInstances.map((instance) => instance.instanceId));
601
+ value.ontologyBindings.forEach((binding, index) => {
602
+ if (!instanceIds.has(binding.target.capabilityInstanceId)) {
603
+ context.addIssue({ code: 'custom', path: ['ontologyBindings', index, 'target', 'capabilityInstanceId'], message: 'Ontology binding targets an unknown capability instance.' });
604
+ }
605
+ });
606
+ value.actionBindings.forEach((binding, index) => {
607
+ if (!instanceIds.has(binding.source.capabilityInstanceId)) {
608
+ context.addIssue({ code: 'custom', path: ['actionBindings', index, 'source', 'capabilityInstanceId'], message: 'Action binding sources an unknown capability instance.' });
609
+ }
610
+ binding.success.refreshBindingIds.forEach((bindingId) => {
611
+ if (!value.ontologyBindings.some((candidate) => candidate.bindingId === bindingId)) {
612
+ context.addIssue({ code: 'custom', path: ['actionBindings', index, 'success', 'refreshBindingIds'], message: `Unknown refresh binding: ${bindingId}` });
613
+ }
614
+ });
615
+ });
616
+ if (value.shellRevisionRef.kind !== 'shell')
617
+ context.addIssue({ code: 'custom', path: ['shellRevisionRef', 'kind'], message: 'Page shellRevisionRef must reference a shell.' });
618
+ value.capabilityInstances.forEach((instance, index) => {
619
+ const refs = [
620
+ ['capabilityRevisionRef', instance.capabilityRevisionRef, 'capability'],
621
+ ['providerRevisionRef', instance.providerRevisionRef, 'view-provider'],
622
+ ['propertySchemaRevisionRef', instance.propertySchemaRevisionRef, 'schema'],
623
+ ];
624
+ refs.forEach(([field, reference, expectedKind]) => {
625
+ if (reference.kind !== expectedKind)
626
+ context.addIssue({ code: 'custom', path: ['capabilityInstances', index, field, 'kind'], message: `${field} must reference ${expectedKind}.` });
627
+ });
628
+ });
629
+ value.tokenRevisionRefs.forEach((reference, index) => {
630
+ if (reference.kind !== 'design-token')
631
+ context.addIssue({ code: 'custom', path: ['tokenRevisionRefs', index, 'kind'], message: 'Page token references must use kind design-token.' });
632
+ });
633
+ if (value.performanceBudgetRef.kind !== 'performance-budget')
634
+ context.addIssue({ code: 'custom', path: ['performanceBudgetRef', 'kind'], message: 'Page requires a performance-budget revision.' });
635
+ if (value.observationPolicyRevisionRef.kind !== 'observation-policy')
636
+ context.addIssue({ code: 'custom', path: ['observationPolicyRevisionRef', 'kind'], message: 'Page requires an observation-policy revision.' });
637
+ });
638
+ exports.PageReleaseSchema = zod_1.z
639
+ .object({
640
+ contract: zod_1.z.literal('PageRelease'),
641
+ ...ReleaseBaseShape,
642
+ pageRevisionRef: exports.RevisionRefSchema,
643
+ target: zod_1.z.object({
644
+ environmentRef: exports.StableRefSchema,
645
+ surface: exports.ProductSurfaceSchema,
646
+ routeSpaceRevisionRef: exports.RevisionRefSchema,
647
+ normalizedPath: exports.RoutePathTemplateSchema,
648
+ routeClaim: zod_1.z.union([exports.CompiledRouteClaimSchema, LegacyCompiledRouteClaimSchema]),
649
+ }).strict(),
650
+ })
651
+ .strict()
652
+ .superRefine((value, context) => {
653
+ validateDependencySnapshot(value.dependencySnapshot, context);
654
+ validateReleaseExpectedHead(value, 'page-release', context);
655
+ if (value.pageRevisionRef.kind !== 'page')
656
+ context.addIssue({ code: 'custom', path: ['pageRevisionRef', 'kind'], message: 'Expected a page revision.' });
657
+ if (value.target.environmentRef.kind !== 'environment')
658
+ context.addIssue({ code: 'custom', path: ['target', 'environmentRef', 'kind'], message: 'Page release target requires an environment reference.' });
659
+ if (value.target.routeSpaceRevisionRef.kind !== 'route-space')
660
+ context.addIssue({ code: 'custom', path: ['target', 'routeSpaceRevisionRef', 'kind'], message: 'Page release target requires a route-space revision.' });
661
+ if (value.target.normalizedPath !== value.target.routeClaim.normalizedPath || !exactRevisionRef(value.target.routeSpaceRevisionRef, value.target.routeClaim.routeSpaceRevisionRef)) {
662
+ context.addIssue({ code: 'custom', path: ['target', 'routeClaim'], message: 'Page Release route authority must pin the exact compiled claim and normalized path.' });
663
+ }
664
+ if ('surface' in value.target.routeClaim && value.target.routeClaim.surface !== value.target.surface) {
665
+ context.addIssue({ code: 'custom', path: ['target', 'routeClaim', 'surface'], message: 'Page Release route claim must match the target surface.' });
666
+ }
667
+ });
668
+ exports.WorkbenchGroupSchema = zod_1.z
669
+ .object({
670
+ groupId: common_1.ContractIdentifierSchema,
671
+ label: exports.I18nTextSchema,
672
+ iconRef: exports.StableRefSchema.optional(),
673
+ order: zod_1.z.number().int(),
674
+ collapsedByDefault: zod_1.z.boolean(),
675
+ accessPolicy: exports.AccessPolicySchema.optional(),
676
+ })
677
+ .strict();
678
+ exports.WorkbenchAppInstanceSchema = zod_1.z
679
+ .object({
680
+ instanceId: common_1.ContractIdentifierSchema,
681
+ kind: zod_1.z.enum(['built-in-application', 'workflow-form', 'workflow', 'agent', 'design', 'capability']),
682
+ targetRevisionRef: exports.RevisionRefSchema,
683
+ providerRevisionRef: exports.RevisionRefSchema,
684
+ inputSchemaRevisionRef: exports.RevisionRefSchema,
685
+ input: common_1.JsonObjectSchema,
686
+ groupId: common_1.ContractIdentifierSchema,
687
+ order: zod_1.z.number().int(),
688
+ display: zod_1.z.object({ name: exports.I18nTextSchema.optional(), iconRef: exports.StableRefSchema.optional() }).strict(),
689
+ accessPolicy: exports.AccessPolicySchema,
690
+ })
691
+ .strict();
692
+ exports.WorkbenchSchema = zod_1.z
693
+ .object({
694
+ contract: zod_1.z.literal('Workbench'),
695
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
696
+ workbenchId: common_1.ContractIdentifierSchema,
697
+ tenantScope: exports.TenantScopeSchema,
698
+ purpose: zod_1.z.enum(['instance', 'template']),
699
+ sourceTemplateRevisionRef: exports.RevisionRefSchema.optional(),
700
+ identity: exports.WorkbenchIdentitySchema,
701
+ supportedSurfaces: zod_1.z.array(exports.ProductSurfaceSchema).min(1),
702
+ lifecycle: exports.DeclarativeLifecycleSchema,
703
+ routeClaims: zod_1.z.array(zod_1.z.union([exports.DeclarativeRouteClaimSchema, LegacyDeclarativeRouteClaimSchema])).min(1),
704
+ groups: zod_1.z.array(exports.WorkbenchGroupSchema).min(1),
705
+ appInstances: zod_1.z.array(exports.WorkbenchAppInstanceSchema).min(1),
706
+ defaultEntry: zod_1.z.object({ groupId: common_1.ContractIdentifierSchema, instanceId: common_1.ContractIdentifierSchema, showDefaultGroup: zod_1.z.boolean() }).strict(),
707
+ layout: zod_1.z.object({
708
+ hostCapabilityRevisionRef: exports.RevisionRefSchema,
709
+ hostProviderRevisionRef: exports.RevisionRefSchema,
710
+ layoutPolicyRevisionRef: exports.RevisionRefSchema,
711
+ tokenRevisionRefs: zod_1.z.array(exports.RevisionRefSchema).min(1),
712
+ }).strict(),
713
+ workbenchAccessPolicy: exports.AccessPolicySchema,
714
+ managementAccess: exports.ManagementAccessSchema,
715
+ personalPreferencesPolicy: zod_1.z.object({
716
+ allowed: zod_1.z.array(zod_1.z.enum(['collapsed-groups', 'recent-entry', 'layout-density'])),
717
+ authority: zod_1.z.literal('identity-overlay'),
718
+ }).strict(),
719
+ performanceBudgetRef: exports.RevisionRefSchema,
720
+ observationPolicyRevisionRef: exports.RevisionRefSchema,
721
+ privacyClassification: zod_1.z.enum(['public', 'internal', 'confidential', 'restricted']),
722
+ })
723
+ .strict()
724
+ .superRefine((value, context) => {
725
+ validateDeclaredRouteSurfaces(value.supportedSurfaces, value.routeClaims, context);
726
+ if (value.purpose === 'template' && value.sourceTemplateRevisionRef) {
727
+ context.addIssue({ code: 'custom', path: ['sourceTemplateRevisionRef'], message: 'Templates cannot derive from another template at runtime.' });
728
+ }
729
+ const duplicateGroup = uniqueArray(value.groups, (group) => group.groupId);
730
+ if (duplicateGroup)
731
+ context.addIssue({ code: 'custom', path: ['groups'], message: `Duplicate Workbench group: ${duplicateGroup}` });
732
+ const duplicateInstance = uniqueArray(value.appInstances, (instance) => instance.instanceId);
733
+ if (duplicateInstance)
734
+ context.addIssue({ code: 'custom', path: ['appInstances'], message: `Duplicate Workbench instance: ${duplicateInstance}` });
735
+ const groupIds = new Set(value.groups.map((group) => group.groupId));
736
+ value.appInstances.forEach((instance, index) => {
737
+ if (!groupIds.has(instance.groupId))
738
+ context.addIssue({ code: 'custom', path: ['appInstances', index, 'groupId'], message: 'Workbench app references an unknown group.' });
739
+ });
740
+ const defaultInstance = value.appInstances.find((instance) => instance.instanceId === value.defaultEntry.instanceId);
741
+ if (!defaultInstance || defaultInstance.groupId !== value.defaultEntry.groupId) {
742
+ context.addIssue({ code: 'custom', path: ['defaultEntry'], message: 'Workbench default entry must reference an app in the declared group.' });
743
+ }
744
+ const targetKindByInstanceKind = {
745
+ 'built-in-application': 'built-in-application',
746
+ 'workflow-form': 'workflow',
747
+ workflow: 'workflow',
748
+ agent: 'agent',
749
+ design: 'design',
750
+ capability: 'capability',
751
+ };
752
+ value.appInstances.forEach((instance, index) => {
753
+ if (instance.targetRevisionRef.kind !== targetKindByInstanceKind[instance.kind])
754
+ context.addIssue({ code: 'custom', path: ['appInstances', index, 'targetRevisionRef', 'kind'], message: `Workbench ${instance.kind} target has an incompatible reference kind.` });
755
+ if (instance.providerRevisionRef.kind !== 'view-provider')
756
+ context.addIssue({ code: 'custom', path: ['appInstances', index, 'providerRevisionRef', 'kind'], message: 'Workbench app provider must use kind view-provider.' });
757
+ if (instance.inputSchemaRevisionRef.kind !== 'schema')
758
+ context.addIssue({ code: 'custom', path: ['appInstances', index, 'inputSchemaRevisionRef', 'kind'], message: 'Workbench app input must pin a schema revision.' });
759
+ });
760
+ const layoutRefs = [
761
+ ['hostCapabilityRevisionRef', value.layout.hostCapabilityRevisionRef, 'capability'],
762
+ ['hostProviderRevisionRef', value.layout.hostProviderRevisionRef, 'view-provider'],
763
+ ['layoutPolicyRevisionRef', value.layout.layoutPolicyRevisionRef, 'layout-policy'],
764
+ ];
765
+ layoutRefs.forEach(([field, reference, expectedKind]) => {
766
+ if (reference.kind !== expectedKind)
767
+ context.addIssue({ code: 'custom', path: ['layout', field, 'kind'], message: `${field} must reference ${expectedKind}.` });
768
+ });
769
+ value.layout.tokenRevisionRefs.forEach((reference, index) => {
770
+ if (reference.kind !== 'design-token')
771
+ context.addIssue({ code: 'custom', path: ['layout', 'tokenRevisionRefs', index, 'kind'], message: 'Workbench token references must use kind design-token.' });
772
+ });
773
+ });
774
+ exports.WorkbenchReleaseSchema = zod_1.z
775
+ .object({
776
+ contract: zod_1.z.literal('WorkbenchRelease'),
777
+ ...ReleaseBaseShape,
778
+ workbenchRevisionRef: exports.RevisionRefSchema,
779
+ target: zod_1.z.object({
780
+ environmentRef: exports.StableRefSchema,
781
+ surface: exports.ProductSurfaceSchema,
782
+ workbenchId: common_1.ContractIdentifierSchema,
783
+ routeSpaceRevisionRef: exports.RevisionRefSchema,
784
+ normalizedPath: exports.RoutePathTemplateSchema,
785
+ routeClaim: zod_1.z.union([exports.CompiledRouteClaimSchema, LegacyCompiledRouteClaimSchema]),
786
+ order: zod_1.z.number().int(),
787
+ isDefaultCandidate: zod_1.z.boolean(),
788
+ }).strict(),
789
+ })
790
+ .strict()
791
+ .superRefine((value, context) => {
792
+ validateDependencySnapshot(value.dependencySnapshot, context);
793
+ validateReleaseExpectedHead(value, 'workbench-release', context);
794
+ if (value.workbenchRevisionRef.kind !== 'workbench')
795
+ context.addIssue({ code: 'custom', path: ['workbenchRevisionRef', 'kind'], message: 'Expected a workbench revision.' });
796
+ if (value.target.environmentRef.kind !== 'environment')
797
+ context.addIssue({ code: 'custom', path: ['target', 'environmentRef', 'kind'], message: 'Workbench release target requires an environment reference.' });
798
+ if (value.target.routeSpaceRevisionRef.kind !== 'route-space')
799
+ context.addIssue({ code: 'custom', path: ['target', 'routeSpaceRevisionRef', 'kind'], message: 'Workbench release target requires a route-space revision.' });
800
+ if (value.target.normalizedPath !== value.target.routeClaim.normalizedPath || !exactRevisionRef(value.target.routeSpaceRevisionRef, value.target.routeClaim.routeSpaceRevisionRef)) {
801
+ context.addIssue({ code: 'custom', path: ['target', 'routeClaim'], message: 'Workbench Release route authority must pin the exact compiled claim and normalized path.' });
802
+ }
803
+ if ('surface' in value.target.routeClaim && value.target.routeClaim.surface !== value.target.surface) {
804
+ context.addIssue({ code: 'custom', path: ['target', 'routeClaim', 'surface'], message: 'Workbench Release route claim must match the target surface.' });
805
+ }
806
+ });
807
+ const NavigationNodeBaseShape = {
808
+ nodeId: common_1.ContractIdentifierSchema,
809
+ parentNodeId: common_1.ContractIdentifierSchema.nullable(),
810
+ order: zod_1.z.number().int(),
811
+ disabled: zod_1.z.boolean().optional(),
812
+ };
813
+ exports.NavigationGroupNodeSchema = zod_1.z.object({
814
+ ...NavigationNodeBaseShape,
815
+ kind: zod_1.z.literal('group'),
816
+ label: exports.I18nTextSchema,
817
+ iconRef: exports.StableRefSchema.optional(),
818
+ collapsedByDefault: zod_1.z.boolean(),
819
+ audience: exports.AccessPolicySchema,
820
+ }).strict();
821
+ exports.NavigationTargetNodeSchema = zod_1.z.object({
822
+ ...NavigationNodeBaseShape,
823
+ kind: zod_1.z.literal('target'),
824
+ label: exports.I18nTextSchema,
825
+ iconRef: exports.StableRefSchema.optional(),
826
+ tone: zod_1.z.enum(['default', 'danger']).optional(),
827
+ targetRef: exports.StableRefSchema,
828
+ parameterMapping: zod_1.z.record(common_1.ContractIdentifierSchema, exports.BindingSourceSchema),
829
+ audience: exports.AccessPolicySchema,
830
+ }).strict();
831
+ exports.NavigationSeparatorNodeSchema = zod_1.z.object({
832
+ ...NavigationNodeBaseShape,
833
+ kind: zod_1.z.literal('separator'),
834
+ }).strict();
835
+ exports.NavigationNodeSchema = zod_1.z.discriminatedUnion('kind', [
836
+ exports.NavigationGroupNodeSchema,
837
+ exports.NavigationTargetNodeSchema,
838
+ exports.NavigationSeparatorNodeSchema,
839
+ ]);
840
+ const validateNavigationTree = (nodes, context) => {
841
+ const byId = new Map();
842
+ nodes.forEach((node, index) => {
843
+ if (byId.has(node.nodeId))
844
+ context.addIssue({ code: 'custom', path: ['nodes', index, 'nodeId'], message: `Duplicate Navigation node: ${node.nodeId}` });
845
+ else
846
+ byId.set(node.nodeId, { node, index });
847
+ });
848
+ const siblingOrders = new Set();
849
+ nodes.forEach((node, index) => {
850
+ const orderKey = `${node.parentNodeId ?? ''}:${node.order}`;
851
+ if (siblingOrders.has(orderKey))
852
+ context.addIssue({ code: 'custom', path: ['nodes', index, 'order'], message: 'Sibling Navigation order values must be unique.' });
853
+ siblingOrders.add(orderKey);
854
+ if (node.parentNodeId) {
855
+ const parent = byId.get(node.parentNodeId)?.node;
856
+ if (!parent)
857
+ context.addIssue({ code: 'custom', path: ['nodes', index, 'parentNodeId'], message: 'Navigation node has an unknown parent.' });
858
+ else if (parent.kind !== 'group')
859
+ context.addIssue({ code: 'custom', path: ['nodes', index, 'parentNodeId'], message: 'Navigation parents must be groups.' });
860
+ }
861
+ const ancestors = new Set([node.nodeId]);
862
+ let parentId = node.parentNodeId;
863
+ while (parentId) {
864
+ if (ancestors.has(parentId)) {
865
+ context.addIssue({ code: 'custom', path: ['nodes', index, 'parentNodeId'], message: `Navigation cycle contains ${node.nodeId}.` });
866
+ break;
867
+ }
868
+ ancestors.add(parentId);
869
+ parentId = byId.get(parentId)?.node.parentNodeId ?? null;
870
+ }
871
+ });
872
+ };
873
+ exports.NavigationSchema = zod_1.z
874
+ .object({
875
+ contract: zod_1.z.literal('Navigation'),
876
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
877
+ navigationId: common_1.ContractIdentifierSchema,
878
+ tenantScope: exports.TenantScopeSchema,
879
+ identity: IdentitySchema,
880
+ supportedSurfaces: zod_1.z.array(exports.ProductSurfaceSchema).min(1),
881
+ placements: zod_1.z.array(common_1.ContractIdentifierSchema).min(1),
882
+ lifecycle: exports.DeclarativeLifecycleSchema,
883
+ nodes: zod_1.z.array(exports.NavigationNodeSchema),
884
+ managementAccess: exports.ManagementAccessSchema,
885
+ performanceBudgetRef: exports.RevisionRefSchema,
886
+ observationPolicyRevisionRef: exports.RevisionRefSchema,
887
+ })
888
+ .strict()
889
+ .superRefine((value, context) => {
890
+ validateNavigationTree(value.nodes, context);
891
+ value.nodes.forEach((node, index) => {
892
+ if (node.kind === 'target' && !['page', 'workbench', 'menu-action', 'domain-command'].includes(node.targetRef.kind)) {
893
+ context.addIssue({ code: 'custom', path: ['nodes', index, 'targetRef', 'kind'], message: 'Navigation targets must reference Page, Workbench, registered Menu Action, or DomainCommand identities.' });
894
+ }
895
+ });
896
+ });
897
+ exports.ResolvedNavigationTargetSchema = zod_1.z
898
+ .object({
899
+ nodeId: common_1.ContractIdentifierSchema,
900
+ stableTargetRef: exports.StableRefSchema,
901
+ targetRevisionRef: exports.RevisionRefSchema,
902
+ releaseRevisionRef: exports.RevisionRefSchema.optional(),
903
+ })
904
+ .strict();
905
+ exports.NavigationReleaseSchema = zod_1.z
906
+ .object({
907
+ contract: zod_1.z.literal('NavigationRelease'),
908
+ ...ReleaseBaseShape,
909
+ navigationRevisionRef: exports.RevisionRefSchema,
910
+ target: zod_1.z.object({
911
+ environmentRef: exports.StableRefSchema,
912
+ surface: exports.ProductSurfaceSchema,
913
+ placement: common_1.ContractIdentifierSchema,
914
+ }).strict(),
915
+ resolvedTargets: zod_1.z.array(exports.ResolvedNavigationTargetSchema),
916
+ })
917
+ .strict()
918
+ .superRefine((value, context) => {
919
+ validateDependencySnapshot(value.dependencySnapshot, context);
920
+ validateReleaseExpectedHead(value, 'navigation-release', context);
921
+ if (value.navigationRevisionRef.kind !== 'navigation')
922
+ context.addIssue({ code: 'custom', path: ['navigationRevisionRef', 'kind'], message: 'Expected a navigation revision.' });
923
+ if (value.target.environmentRef.kind !== 'environment')
924
+ context.addIssue({ code: 'custom', path: ['target', 'environmentRef', 'kind'], message: 'Navigation release target requires an environment reference.' });
925
+ if (uniqueArray(value.resolvedTargets, (target) => target.nodeId))
926
+ context.addIssue({ code: 'custom', path: ['resolvedTargets'], message: 'Resolved Navigation node IDs must be unique.' });
927
+ });
928
+ const RuntimeDiagnosticSchema = zod_1.z.object({
929
+ code: common_1.ContractIdentifierSchema,
930
+ severity: zod_1.z.enum(['info', 'warning', 'error']),
931
+ path: zod_1.z.string().trim().min(1),
932
+ message: zod_1.z.string().trim().min(1),
933
+ }).strict();
934
+ const RuntimeBundleBaseShape = {
935
+ schemaVersion: zod_1.z.literal(exports.DECLARATIVE_CONTROL_SCHEMA_VERSION),
936
+ tenantScope: exports.TenantScopeSchema,
937
+ releaseRevisionRef: exports.RevisionRefSchema,
938
+ compilerRevisionRef: exports.RevisionRefSchema,
939
+ generation: zod_1.z.number().int().nonnegative(),
940
+ dependencySnapshot: zod_1.z.array(exports.ReleaseDependencySchema),
941
+ contentHash: common_1.Sha256Schema,
942
+ rebuildable: zod_1.z.literal(true),
943
+ diagnostics: zod_1.z.array(RuntimeDiagnosticSchema),
944
+ };
945
+ exports.PageRuntimeBundleSchema = zod_1.z.object({
946
+ contract: zod_1.z.literal('PageRuntimeBundle'),
947
+ ...RuntimeBundleBaseShape,
948
+ pageId: common_1.ContractIdentifierSchema,
949
+ pageRevisionRef: exports.RevisionRefSchema,
950
+ surface: exports.ProductSurfaceSchema,
951
+ routeClaims: zod_1.z.array(exports.CompiledRouteClaimSchema),
952
+ shellRevisionRef: exports.RevisionRefSchema,
953
+ renderTree: render_1.RenderTreeSchema,
954
+ capabilityInstances: zod_1.z.array(exports.CapabilityInstanceSchema),
955
+ ontologyBindings: zod_1.z.array(exports.OntologyBindingSchema),
956
+ actionBindings: zod_1.z.array(exports.ActionBindingSchema),
957
+ pageAccessPolicy: exports.AccessPolicySchema,
958
+ tokenRevisionRefs: zod_1.z.array(exports.RevisionRefSchema),
959
+ performanceBudgetRef: exports.RevisionRefSchema,
960
+ observationPolicyRevisionRef: exports.RevisionRefSchema,
961
+ privacyClassification: zod_1.z.enum(['public', 'internal', 'confidential', 'restricted']),
962
+ }).strict();
963
+ exports.ResolvedWorkbenchAppInstanceSchema = exports.WorkbenchAppInstanceSchema.extend({
964
+ targetAccessPolicy: exports.AccessPolicySchema,
965
+ }).strict();
966
+ const WorkbenchRuntimeTargetSchema = exports.WorkbenchReleaseSchema.shape.target.safeExtend({
967
+ routeClaim: exports.CompiledRouteClaimSchema,
968
+ }).strict();
969
+ exports.WorkbenchRuntimeBundleSchema = zod_1.z.object({
970
+ contract: zod_1.z.literal('WorkbenchRuntimeBundle'),
971
+ ...RuntimeBundleBaseShape,
972
+ workbenchId: common_1.ContractIdentifierSchema,
973
+ workbenchRevisionRef: exports.RevisionRefSchema,
974
+ surface: exports.ProductSurfaceSchema,
975
+ routeClaims: zod_1.z.array(exports.CompiledRouteClaimSchema),
976
+ groups: zod_1.z.array(exports.WorkbenchGroupSchema),
977
+ appInstances: zod_1.z.array(exports.ResolvedWorkbenchAppInstanceSchema),
978
+ defaultEntry: exports.WorkbenchSchema.shape.defaultEntry,
979
+ layout: exports.WorkbenchSchema.shape.layout,
980
+ workbenchAccessPolicy: exports.AccessPolicySchema,
981
+ personalPreferencesPolicy: exports.WorkbenchSchema.shape.personalPreferencesPolicy,
982
+ target: WorkbenchRuntimeTargetSchema,
983
+ performanceBudgetRef: exports.RevisionRefSchema,
984
+ observationPolicyRevisionRef: exports.RevisionRefSchema,
985
+ privacyClassification: zod_1.z.enum(['public', 'internal', 'confidential', 'restricted']),
986
+ }).strict();
987
+ const CompiledNavigationTargetSchema = exports.ResolvedNavigationTargetSchema.extend({
988
+ kind: zod_1.z.literal('route'),
989
+ accessPolicy: exports.AccessPolicySchema,
990
+ routeClaim: exports.CompiledRouteClaimSchema,
991
+ }).strict();
992
+ exports.CompiledNavigationRegisteredMenuActionTargetSchema = exports.ResolvedNavigationTargetSchema.extend({
993
+ kind: zod_1.z.literal('registered-menu-action'),
994
+ accessPolicy: exports.AccessPolicySchema,
995
+ execution: zod_1.z.literal('client'),
996
+ applicationId: common_1.ContractIdentifierSchema,
997
+ actionRef: common_1.ContractIdentifierSchema,
998
+ inputSchemaRef: common_1.ContractIdentifierSchema.optional(),
999
+ input: common_1.JsonObjectSchema,
1000
+ sourceCatalogRevisionRef: exports.RevisionRefSchema,
1001
+ }).strict();
1002
+ exports.CompiledNavigationDomainCommandTargetSchema = exports.ResolvedNavigationTargetSchema.extend({
1003
+ kind: zod_1.z.literal('governed-domain-command'),
1004
+ accessPolicy: exports.AccessPolicySchema,
1005
+ execution: zod_1.z.literal('server'),
1006
+ commandRevisionRef: exports.RevisionRefSchema,
1007
+ inputSchemaRevisionRef: exports.RevisionRefSchema,
1008
+ resultSchemaRevisionRef: exports.RevisionRefSchema.optional(),
1009
+ input: common_1.JsonObjectSchema,
1010
+ }).strict();
1011
+ exports.CompiledNavigationResolvedTargetSchema = zod_1.z.discriminatedUnion('kind', [
1012
+ CompiledNavigationTargetSchema,
1013
+ exports.CompiledNavigationRegisteredMenuActionTargetSchema,
1014
+ exports.CompiledNavigationDomainCommandTargetSchema,
1015
+ ]);
1016
+ exports.CompiledNavigationGroupNodeSchema = exports.NavigationGroupNodeSchema.extend({
1017
+ ancestorAccessPolicies: zod_1.z.array(exports.AccessPolicySchema),
1018
+ }).strict();
1019
+ exports.CompiledNavigationTargetNodeSchema = exports.NavigationTargetNodeSchema.extend({
1020
+ ancestorAccessPolicies: zod_1.z.array(exports.AccessPolicySchema),
1021
+ resolvedTarget: exports.CompiledNavigationResolvedTargetSchema,
1022
+ }).strict();
1023
+ exports.CompiledNavigationSeparatorNodeSchema = exports.NavigationSeparatorNodeSchema.extend({
1024
+ ancestorAccessPolicies: zod_1.z.array(exports.AccessPolicySchema),
1025
+ }).strict();
1026
+ exports.CompiledNavigationNodeSchema = zod_1.z.discriminatedUnion('kind', [
1027
+ exports.CompiledNavigationGroupNodeSchema,
1028
+ exports.CompiledNavigationTargetNodeSchema,
1029
+ exports.CompiledNavigationSeparatorNodeSchema,
1030
+ ]);
1031
+ exports.NavigationRuntimeBundleSchema = zod_1.z.object({
1032
+ contract: zod_1.z.literal('NavigationRuntimeBundle'),
1033
+ ...RuntimeBundleBaseShape,
1034
+ navigationId: common_1.ContractIdentifierSchema,
1035
+ navigationRevisionRef: exports.RevisionRefSchema,
1036
+ surface: exports.ProductSurfaceSchema,
1037
+ placement: common_1.ContractIdentifierSchema,
1038
+ nodes: zod_1.z.array(exports.CompiledNavigationNodeSchema),
1039
+ performanceBudgetRef: exports.RevisionRefSchema,
1040
+ observationPolicyRevisionRef: exports.RevisionRefSchema,
1041
+ }).strict();
1042
+ exports.DeclarativeControlOntologyDefinitionSchema = data_1.OntologyDefinitionSchema.extend({
1043
+ classification: zod_1.z.literal('control'),
1044
+ discovery: zod_1.z.object({
1045
+ ordinaryDataBrowser: zod_1.z.literal(false),
1046
+ businessSearch: zod_1.z.literal(false),
1047
+ businessStatistics: zod_1.z.literal(false),
1048
+ ordinaryExport: zod_1.z.literal(false),
1049
+ genericWrite: zod_1.z.literal(false),
1050
+ }).strict(),
1051
+ }).strict();
1052
+ const controlDefinition = (ontologyId, bodySchemaRef) => exports.DeclarativeControlOntologyDefinitionSchema.parse({
1053
+ contract: 'OntologyDefinition',
1054
+ ontologyId,
1055
+ dataSpaceId: 'monkeys.control',
1056
+ ownerRepo: 'monkeys-js-sdk',
1057
+ bodySchemaRef,
1058
+ authority: { service: 'monkeys-data-server', storage: 'domain-record', scope: 'tenant' },
1059
+ relationKinds: [],
1060
+ metricKinds: [],
1061
+ classification: 'control',
1062
+ discovery: {
1063
+ ordinaryDataBrowser: false,
1064
+ businessSearch: false,
1065
+ businessStatistics: false,
1066
+ ordinaryExport: false,
1067
+ genericWrite: false,
1068
+ },
1069
+ });
1070
+ exports.DECLARATIVE_CONTROL_ONTOLOGY_DEFINITIONS = Object.freeze([
1071
+ controlDefinition('monkeys.system.page', 'monkeys.system.page/v1'),
1072
+ controlDefinition('monkeys.system.page-release', 'monkeys.system.page-release/v1'),
1073
+ controlDefinition('monkeys.system.workbench', 'monkeys.system.workbench/v1'),
1074
+ controlDefinition('monkeys.system.workbench-release', 'monkeys.system.workbench-release/v1'),
1075
+ controlDefinition('monkeys.system.navigation', 'monkeys.system.navigation/v1'),
1076
+ controlDefinition('monkeys.system.navigation-release', 'monkeys.system.navigation-release/v1'),
1077
+ ]);
1078
+ //# sourceMappingURL=declarative-control.js.map