@revealui/contracts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +160 -0
  3. package/dist/a2a/index.d.ts +383 -0
  4. package/dist/a2a/index.d.ts.map +1 -0
  5. package/dist/a2a/index.js +276 -0
  6. package/dist/a2a/index.js.map +1 -0
  7. package/dist/actions/action-validator.d.ts +48 -0
  8. package/dist/actions/action-validator.d.ts.map +1 -0
  9. package/dist/actions/action-validator.js +288 -0
  10. package/dist/actions/action-validator.js.map +1 -0
  11. package/dist/actions/index.d.ts +7 -0
  12. package/dist/actions/index.d.ts.map +1 -0
  13. package/dist/actions/index.js +7 -0
  14. package/dist/actions/index.js.map +1 -0
  15. package/dist/agents/index.d.ts +628 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +511 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/types.d.ts +22 -0
  20. package/dist/agents/types.d.ts.map +1 -0
  21. package/dist/agents/types.js +2 -0
  22. package/dist/agents/types.js.map +1 -0
  23. package/dist/api/auth.d.ts +60 -0
  24. package/dist/api/auth.d.ts.map +1 -0
  25. package/dist/api/auth.js +84 -0
  26. package/dist/api/auth.js.map +1 -0
  27. package/dist/api/chat.d.ts +45 -0
  28. package/dist/api/chat.d.ts.map +1 -0
  29. package/dist/api/chat.js +55 -0
  30. package/dist/api/chat.js.map +1 -0
  31. package/dist/api/gdpr.d.ts +39 -0
  32. package/dist/api/gdpr.d.ts.map +1 -0
  33. package/dist/api/gdpr.js +53 -0
  34. package/dist/api/gdpr.js.map +1 -0
  35. package/dist/cms/collection.d.ts +108 -0
  36. package/dist/cms/collection.d.ts.map +1 -0
  37. package/dist/cms/collection.js +144 -0
  38. package/dist/cms/collection.js.map +1 -0
  39. package/dist/cms/compat.d.ts +128 -0
  40. package/dist/cms/compat.d.ts.map +1 -0
  41. package/dist/cms/compat.js +141 -0
  42. package/dist/cms/compat.js.map +1 -0
  43. package/dist/cms/config-contract.d.ts +278 -0
  44. package/dist/cms/config-contract.d.ts.map +1 -0
  45. package/dist/cms/config-contract.js +220 -0
  46. package/dist/cms/config-contract.js.map +1 -0
  47. package/dist/cms/config.d.ts +351 -0
  48. package/dist/cms/config.d.ts.map +1 -0
  49. package/dist/cms/config.js +50 -0
  50. package/dist/cms/config.js.map +1 -0
  51. package/dist/cms/errors.d.ts +122 -0
  52. package/dist/cms/errors.d.ts.map +1 -0
  53. package/dist/cms/errors.js +163 -0
  54. package/dist/cms/errors.js.map +1 -0
  55. package/dist/cms/extensibility.d.ts +211 -0
  56. package/dist/cms/extensibility.d.ts.map +1 -0
  57. package/dist/cms/extensibility.js +313 -0
  58. package/dist/cms/extensibility.js.map +1 -0
  59. package/dist/cms/field.d.ts +69 -0
  60. package/dist/cms/field.d.ts.map +1 -0
  61. package/dist/cms/field.js +94 -0
  62. package/dist/cms/field.js.map +1 -0
  63. package/dist/cms/functions.d.ts +466 -0
  64. package/dist/cms/functions.d.ts.map +1 -0
  65. package/dist/cms/functions.js +19 -0
  66. package/dist/cms/functions.js.map +1 -0
  67. package/dist/cms/global.d.ts +45 -0
  68. package/dist/cms/global.d.ts.map +1 -0
  69. package/dist/cms/global.js +62 -0
  70. package/dist/cms/global.js.map +1 -0
  71. package/dist/cms/index.d.ts +23 -0
  72. package/dist/cms/index.d.ts.map +1 -0
  73. package/dist/cms/index.js +42 -0
  74. package/dist/cms/index.js.map +1 -0
  75. package/dist/cms/structure.d.ts +1601 -0
  76. package/dist/cms/structure.d.ts.map +1 -0
  77. package/dist/cms/structure.js +757 -0
  78. package/dist/cms/structure.js.map +1 -0
  79. package/dist/content/index.d.ts +1542 -0
  80. package/dist/content/index.d.ts.map +1 -0
  81. package/dist/content/index.js +522 -0
  82. package/dist/content/index.js.map +1 -0
  83. package/dist/database/bridge.d.ts +177 -0
  84. package/dist/database/bridge.d.ts.map +1 -0
  85. package/dist/database/bridge.js +139 -0
  86. package/dist/database/bridge.js.map +1 -0
  87. package/dist/database/index.d.ts +8 -0
  88. package/dist/database/index.d.ts.map +1 -0
  89. package/dist/database/index.js +9 -0
  90. package/dist/database/index.js.map +1 -0
  91. package/dist/database/type-bridge.d.ts +178 -0
  92. package/dist/database/type-bridge.d.ts.map +1 -0
  93. package/dist/database/type-bridge.js +154 -0
  94. package/dist/database/type-bridge.js.map +1 -0
  95. package/dist/entities/agent-context.d.ts +280 -0
  96. package/dist/entities/agent-context.d.ts.map +1 -0
  97. package/dist/entities/agent-context.js +390 -0
  98. package/dist/entities/agent-context.js.map +1 -0
  99. package/dist/entities/agent-memory.d.ts +661 -0
  100. package/dist/entities/agent-memory.d.ts.map +1 -0
  101. package/dist/entities/agent-memory.js +544 -0
  102. package/dist/entities/agent-memory.js.map +1 -0
  103. package/dist/entities/board.d.ts +95 -0
  104. package/dist/entities/board.d.ts.map +1 -0
  105. package/dist/entities/board.js +99 -0
  106. package/dist/entities/board.js.map +1 -0
  107. package/dist/entities/code-provenance.d.ts +270 -0
  108. package/dist/entities/code-provenance.d.ts.map +1 -0
  109. package/dist/entities/code-provenance.js +339 -0
  110. package/dist/entities/code-provenance.js.map +1 -0
  111. package/dist/entities/index.d.ts +22 -0
  112. package/dist/entities/index.d.ts.map +1 -0
  113. package/dist/entities/index.js +22 -0
  114. package/dist/entities/index.js.map +1 -0
  115. package/dist/entities/media.d.ts +485 -0
  116. package/dist/entities/media.d.ts.map +1 -0
  117. package/dist/entities/media.js +606 -0
  118. package/dist/entities/media.js.map +1 -0
  119. package/dist/entities/page-revision.d.ts +390 -0
  120. package/dist/entities/page-revision.d.ts.map +1 -0
  121. package/dist/entities/page-revision.js +406 -0
  122. package/dist/entities/page-revision.js.map +1 -0
  123. package/dist/entities/page.d.ts +2349 -0
  124. package/dist/entities/page.d.ts.map +1 -0
  125. package/dist/entities/page.js +377 -0
  126. package/dist/entities/page.js.map +1 -0
  127. package/dist/entities/post.d.ts +619 -0
  128. package/dist/entities/post.d.ts.map +1 -0
  129. package/dist/entities/post.js +555 -0
  130. package/dist/entities/post.js.map +1 -0
  131. package/dist/entities/price.d.ts +772 -0
  132. package/dist/entities/price.d.ts.map +1 -0
  133. package/dist/entities/price.js +308 -0
  134. package/dist/entities/price.js.map +1 -0
  135. package/dist/entities/product.d.ts +753 -0
  136. package/dist/entities/product.d.ts.map +1 -0
  137. package/dist/entities/product.js +307 -0
  138. package/dist/entities/product.js.map +1 -0
  139. package/dist/entities/session.d.ts +222 -0
  140. package/dist/entities/session.d.ts.map +1 -0
  141. package/dist/entities/session.js +253 -0
  142. package/dist/entities/session.js.map +1 -0
  143. package/dist/entities/site.d.ts +387 -0
  144. package/dist/entities/site.d.ts.map +1 -0
  145. package/dist/entities/site.js +348 -0
  146. package/dist/entities/site.js.map +1 -0
  147. package/dist/entities/ticket-comment.d.ts +49 -0
  148. package/dist/entities/ticket-comment.d.ts.map +1 -0
  149. package/dist/entities/ticket-comment.js +58 -0
  150. package/dist/entities/ticket-comment.js.map +1 -0
  151. package/dist/entities/ticket-label.d.ts +64 -0
  152. package/dist/entities/ticket-label.d.ts.map +1 -0
  153. package/dist/entities/ticket-label.js +77 -0
  154. package/dist/entities/ticket-label.js.map +1 -0
  155. package/dist/entities/ticket.d.ts +204 -0
  156. package/dist/entities/ticket.d.ts.map +1 -0
  157. package/dist/entities/ticket.js +205 -0
  158. package/dist/entities/ticket.js.map +1 -0
  159. package/dist/entities/user.d.ts +336 -0
  160. package/dist/entities/user.d.ts.map +1 -0
  161. package/dist/entities/user.js +255 -0
  162. package/dist/entities/user.js.map +1 -0
  163. package/dist/foundation/contract.d.ts +221 -0
  164. package/dist/foundation/contract.d.ts.map +1 -0
  165. package/dist/foundation/contract.js +133 -0
  166. package/dist/foundation/contract.js.map +1 -0
  167. package/dist/foundation/index.d.ts +7 -0
  168. package/dist/foundation/index.d.ts.map +1 -0
  169. package/dist/foundation/index.js +7 -0
  170. package/dist/foundation/index.js.map +1 -0
  171. package/dist/generated/contracts.d.ts +1514 -0
  172. package/dist/generated/contracts.d.ts.map +1 -0
  173. package/dist/generated/contracts.js +959 -0
  174. package/dist/generated/contracts.js.map +1 -0
  175. package/dist/generated/database.d.ts +48 -0
  176. package/dist/generated/database.d.ts.map +1 -0
  177. package/dist/generated/database.js +17 -0
  178. package/dist/generated/database.js.map +1 -0
  179. package/dist/generated/zod-schemas.d.ts +14793 -0
  180. package/dist/generated/zod-schemas.d.ts.map +1 -0
  181. package/dist/generated/zod-schemas.js +547 -0
  182. package/dist/generated/zod-schemas.js.map +1 -0
  183. package/dist/index.d.ts +50 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +81 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/representation/index.d.ts +304 -0
  188. package/dist/representation/index.d.ts.map +1 -0
  189. package/dist/representation/index.js +280 -0
  190. package/dist/representation/index.js.map +1 -0
  191. package/package.json +117 -0
@@ -0,0 +1,276 @@
1
+ /**
2
+ * A2A (Agent-to-Agent) Protocol Contracts
3
+ *
4
+ * Implements the Google A2A specification as Zod schemas, bound to RevealUI's
5
+ * existing AgentDefinition and ToolDefinition contracts. This enables RevealUI
6
+ * agents to interoperate with any A2A-compatible orchestrator (LangGraph,
7
+ * Google ADK, Vertex AI, etc.).
8
+ *
9
+ * Spec: https://google.github.io/A2A
10
+ *
11
+ * Binding:
12
+ * AgentDefinition → A2AAgentCard
13
+ * ToolDefinition → A2ASkill
14
+ */
15
+ import { z } from 'zod/v4';
16
+ // =============================================================================
17
+ // Agent Card — discovery document served at /.well-known/agent.json
18
+ // =============================================================================
19
+ /**
20
+ * A skill exposed by an A2A agent (maps from ToolDefinition)
21
+ */
22
+ export const A2ASkillSchema = z.object({
23
+ /** Unique skill identifier (maps from ToolDefinition.name) */
24
+ id: z.string(),
25
+ /** Human-readable name */
26
+ name: z.string(),
27
+ /** Description of what this skill does */
28
+ description: z.string(),
29
+ /** Categorisation tags */
30
+ tags: z.array(z.string()).optional(),
31
+ /** Example prompts that invoke this skill */
32
+ examples: z.array(z.string()).optional(),
33
+ /** Supported input modalities */
34
+ inputModes: z.array(z.string()).default(['text']),
35
+ /** Supported output modalities */
36
+ outputModes: z.array(z.string()).default(['text']),
37
+ });
38
+ /**
39
+ * Agent capabilities flags
40
+ */
41
+ export const A2ACapabilitiesSchema = z.object({
42
+ /** Whether the agent supports SSE streaming via tasks/sendSubscribe */
43
+ streaming: z.boolean().default(false),
44
+ /** Whether the agent can push notifications to a webhook */
45
+ pushNotifications: z.boolean().default(false),
46
+ /** Whether the agent includes full task history in responses */
47
+ stateTransitionHistory: z.boolean().default(false),
48
+ });
49
+ /**
50
+ * Provider information
51
+ */
52
+ export const A2AProviderSchema = z.object({
53
+ organization: z.string(),
54
+ url: z.string().url().optional(),
55
+ });
56
+ /**
57
+ * Authentication configuration
58
+ */
59
+ export const A2AAuthSchema = z.object({
60
+ /** Supported auth schemes */
61
+ schemes: z.array(z.enum(['Bearer', 'ApiKey', 'OAuth2', 'None'])).default(['Bearer']),
62
+ /** Optional credentials hint (never put actual secrets here) */
63
+ credentials: z.string().nullable().default(null),
64
+ });
65
+ /**
66
+ * A2A Agent Card — the full discovery document.
67
+ * Served at /.well-known/agent.json (platform) or
68
+ * /.well-known/agents/:id/agent.json (per-agent).
69
+ */
70
+ export const A2AAgentCardSchema = z.object({
71
+ /** Agent display name */
72
+ name: z.string(),
73
+ /** Human-readable description */
74
+ description: z.string(),
75
+ /** The A2A task endpoint URL */
76
+ url: z.string().url(),
77
+ /** Agent Card URL (self-reference) */
78
+ documentationUrl: z.string().url().optional(),
79
+ /** Provider / publisher info */
80
+ provider: A2AProviderSchema.optional(),
81
+ /** Semver version string */
82
+ version: z.string().default('1.0.0'),
83
+ /** Protocol capabilities */
84
+ capabilities: A2ACapabilitiesSchema,
85
+ /** Authentication requirements */
86
+ authentication: A2AAuthSchema,
87
+ /** Accepted input modalities */
88
+ defaultInputModes: z.array(z.string()).default(['text']),
89
+ /** Produced output modalities */
90
+ defaultOutputModes: z.array(z.string()).default(['text']),
91
+ /** Skills this agent exposes */
92
+ skills: z.array(A2ASkillSchema),
93
+ });
94
+ // =============================================================================
95
+ // Task & Message — runtime protocol types
96
+ // =============================================================================
97
+ /**
98
+ * Text part of a message
99
+ */
100
+ export const A2ATextPartSchema = z.object({
101
+ type: z.literal('text'),
102
+ text: z.string(),
103
+ });
104
+ /**
105
+ * Structured data part of a message
106
+ */
107
+ export const A2ADataPartSchema = z.object({
108
+ type: z.literal('data'),
109
+ data: z.record(z.string(), z.unknown()),
110
+ mimeType: z.string().optional(),
111
+ });
112
+ /**
113
+ * File/binary part of a message
114
+ */
115
+ export const A2AFilePartSchema = z.object({
116
+ type: z.literal('file'),
117
+ mimeType: z.string(),
118
+ /** Base64-encoded file data */
119
+ data: z.string(),
120
+ /** Optional filename hint */
121
+ name: z.string().optional(),
122
+ });
123
+ /** Discriminated union of all part types */
124
+ export const A2APartSchema = z.discriminatedUnion('type', [
125
+ A2ATextPartSchema,
126
+ A2ADataPartSchema,
127
+ A2AFilePartSchema,
128
+ ]);
129
+ /**
130
+ * A single message in a task conversation
131
+ */
132
+ export const A2AMessageSchema = z.object({
133
+ /** Who authored this message */
134
+ role: z.enum(['user', 'agent']),
135
+ /** Content parts */
136
+ parts: z.array(A2APartSchema),
137
+ /** Optional message-level metadata */
138
+ metadata: z.record(z.string(), z.unknown()).optional(),
139
+ });
140
+ /**
141
+ * Task lifecycle states
142
+ */
143
+ export const A2ATaskStateSchema = z.enum([
144
+ 'submitted',
145
+ 'working',
146
+ 'input-required',
147
+ 'completed',
148
+ 'canceled',
149
+ 'failed',
150
+ 'unknown',
151
+ ]);
152
+ /**
153
+ * Task status snapshot
154
+ */
155
+ export const A2ATaskStatusSchema = z.object({
156
+ state: A2ATaskStateSchema,
157
+ message: A2AMessageSchema.optional(),
158
+ timestamp: z.string().datetime(),
159
+ });
160
+ /**
161
+ * An artifact produced by a task
162
+ */
163
+ export const A2AArtifactSchema = z.object({
164
+ name: z.string().optional(),
165
+ description: z.string().optional(),
166
+ parts: z.array(A2APartSchema),
167
+ metadata: z.record(z.string(), z.unknown()).optional(),
168
+ index: z.number().int().default(0),
169
+ append: z.boolean().optional(),
170
+ lastChunk: z.boolean().optional(),
171
+ });
172
+ /**
173
+ * A complete A2A Task entity
174
+ */
175
+ export const A2ATaskSchema = z.object({
176
+ /** Server-assigned task ID */
177
+ id: z.string(),
178
+ /** Optional session ID for grouping related tasks */
179
+ sessionId: z.string().optional(),
180
+ /** Current task status */
181
+ status: A2ATaskStatusSchema,
182
+ /** Produced artifacts (available when state=completed) */
183
+ artifacts: z.array(A2AArtifactSchema).optional(),
184
+ /** Full message history (when stateTransitionHistory=true) */
185
+ history: z.array(A2AMessageSchema).optional(),
186
+ /** Arbitrary task-level metadata */
187
+ metadata: z.record(z.string(), z.unknown()).optional(),
188
+ });
189
+ // =============================================================================
190
+ // JSON-RPC 2.0 envelope
191
+ // =============================================================================
192
+ export const A2AJsonRpcRequestSchema = z.object({
193
+ jsonrpc: z.literal('2.0'),
194
+ id: z.union([z.string(), z.number()]),
195
+ method: z.string(),
196
+ params: z.record(z.string(), z.unknown()).optional(),
197
+ });
198
+ export const A2AJsonRpcErrorSchema = z.object({
199
+ code: z.number().int(),
200
+ message: z.string(),
201
+ data: z.unknown().optional(),
202
+ });
203
+ export const A2AJsonRpcResponseSchema = z.object({
204
+ jsonrpc: z.literal('2.0'),
205
+ id: z.union([z.string(), z.number()]),
206
+ result: z.unknown().optional(),
207
+ error: A2AJsonRpcErrorSchema.optional(),
208
+ });
209
+ // =============================================================================
210
+ // tasks/send params
211
+ // =============================================================================
212
+ export const A2ASendTaskParamsSchema = z.object({
213
+ /** Optional task ID (server generates one if omitted) */
214
+ id: z.string().optional(),
215
+ /** Optional session ID */
216
+ sessionId: z.string().optional(),
217
+ /** The initial user message */
218
+ message: A2AMessageSchema,
219
+ /** Arbitrary caller metadata */
220
+ metadata: z.record(z.string(), z.unknown()).optional(),
221
+ });
222
+ // =============================================================================
223
+ // Mapper functions — bind A2A spec to RevealUI contracts
224
+ // =============================================================================
225
+ /**
226
+ * Convert a RevealUI ToolDefinition to an A2A Skill.
227
+ * ToolDefinition.name → Skill.id
228
+ * ToolDefinition.examples[].description → Skill.examples
229
+ */
230
+ export function toolDefinitionToSkill(tool) {
231
+ return {
232
+ id: tool.name,
233
+ name: tool.name
234
+ .replace(/([A-Z])/g, ' $1')
235
+ .replace(/^./, (s) => s.toUpperCase())
236
+ .trim(),
237
+ description: tool.description,
238
+ tags: tool.requiredCapabilities ?? [],
239
+ examples: tool.examples?.map((e) => e.description ?? JSON.stringify(e.input)).filter(Boolean),
240
+ inputModes: ['text'],
241
+ outputModes: ['text'],
242
+ };
243
+ }
244
+ /**
245
+ * Convert a RevealUI AgentDefinition to an A2A Agent Card.
246
+ *
247
+ * @param def - The AgentDefinition from @revealui/contracts
248
+ * @param baseUrl - The public base URL of the A2A endpoint (e.g. https://api.revealui.com)
249
+ */
250
+ export function agentDefinitionToCard(def, baseUrl) {
251
+ const url = baseUrl.replace(/\/$/, '');
252
+ return {
253
+ name: def.name,
254
+ description: def.description,
255
+ url: `${url}/a2a`,
256
+ documentationUrl: `${url}/docs`,
257
+ provider: {
258
+ organization: 'RevealUI Studio',
259
+ url: 'https://revealui.com',
260
+ },
261
+ version: String(def.version),
262
+ capabilities: {
263
+ streaming: true,
264
+ pushNotifications: false,
265
+ stateTransitionHistory: false,
266
+ },
267
+ authentication: {
268
+ schemes: ['Bearer'],
269
+ credentials: null,
270
+ },
271
+ defaultInputModes: ['text'],
272
+ defaultOutputModes: ['text'],
273
+ skills: def.tools.map(toolDefinitionToSkill),
274
+ };
275
+ }
276
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/a2a/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Action Validation Layer
3
+ *
4
+ * Validates actions against entity constraints, agent capabilities, and permissions.
5
+ * This provides runtime enforcement of the constraints defined in entity schemas.
6
+ *
7
+ * @module @revealui/contracts/actions
8
+ */
9
+ import type { AgentDefinition } from '@revealui/contracts/agents';
10
+ import type { AgentConstraint, DualEntity } from '../representation/index.js';
11
+ export interface ActionValidationContext {
12
+ /** The entity being acted upon */
13
+ entity: DualEntity;
14
+ /** The action name (e.g., 'update', 'delete', 'addBlock') */
15
+ action: string;
16
+ /** The agent attempting the action */
17
+ agent: AgentDefinition;
18
+ /** Proposed changes (for update/create actions) */
19
+ changes?: Record<string, unknown>;
20
+ /** User permissions (for permission-based constraints) */
21
+ permissions?: string[];
22
+ /** Additional context */
23
+ context?: Record<string, unknown>;
24
+ }
25
+ export interface ActionValidationSuccess {
26
+ success: true;
27
+ allowed: true;
28
+ warnings?: string[];
29
+ }
30
+ export interface ActionValidationFailure {
31
+ success: false;
32
+ allowed: false;
33
+ errors: ActionValidationError[];
34
+ }
35
+ export interface ActionValidationError {
36
+ code: string;
37
+ message: string;
38
+ field?: string;
39
+ constraint?: AgentConstraint;
40
+ }
41
+ export type ActionValidationResult = ActionValidationSuccess | ActionValidationFailure;
42
+ /**
43
+ * Validate an action against entity constraints, agent capabilities, and permissions
44
+ *
45
+ * This is the main entry point for action validation in @revealui/contracts/actions
46
+ */
47
+ export declare function validateAction(context: ActionValidationContext): ActionValidationResult;
48
+ //# sourceMappingURL=action-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-validator.d.ts","sourceRoot":"","sources":["../../src/actions/action-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAyB,eAAe,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAMpG,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,MAAM,EAAE,UAAU,CAAA;IAElB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAA;IAEd,sCAAsC;IACtC,KAAK,EAAE,eAAe,CAAA;IAEtB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEjC,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IAEtB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,EAAE,IAAI,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,KAAK,CAAA;IACd,OAAO,EAAE,KAAK,CAAA;IACd,MAAM,EAAE,qBAAqB,EAAE,CAAA;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,eAAe,CAAA;CAC7B;AAED,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,GAAG,uBAAuB,CAAA;AAmRtF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CAsDvF"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Action Validation Layer
3
+ *
4
+ * Validates actions against entity constraints, agent capabilities, and permissions.
5
+ * This provides runtime enforcement of the constraints defined in entity schemas.
6
+ *
7
+ * @module @revealui/contracts/actions
8
+ */
9
+ // =============================================================================
10
+ // Constraint Checking
11
+ // =============================================================================
12
+ /**
13
+ * Check if changes violate entity constraints
14
+ */
15
+ function checkConstraints(entity, changes) {
16
+ if (!changes)
17
+ return { success: true, allowed: true };
18
+ const constraints = entity.agent?.constraints || [];
19
+ const errors = [];
20
+ for (const constraint of constraints) {
21
+ const result = checkSingleConstraint(constraint, entity, changes);
22
+ if (!result.allowed) {
23
+ errors.push(...result.errors);
24
+ }
25
+ }
26
+ if (errors.length > 0) {
27
+ return { success: false, allowed: false, errors };
28
+ }
29
+ return { success: true, allowed: true };
30
+ }
31
+ /**
32
+ * Check a single constraint
33
+ */
34
+ function checkSingleConstraint(constraint, entity, changes) {
35
+ const { type, field, params, message } = constraint;
36
+ // If constraint applies to a specific field, only check if that field is changing
37
+ if (field && !(field in changes)) {
38
+ return { success: true, allowed: true };
39
+ }
40
+ const value = field ? changes[field] : changes;
41
+ switch (type) {
42
+ case 'readonly':
43
+ if (field && field in changes) {
44
+ return {
45
+ success: false,
46
+ allowed: false,
47
+ errors: [
48
+ {
49
+ code: 'READONLY_FIELD',
50
+ message: message || `Field '${field}' is readonly`,
51
+ field,
52
+ constraint,
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ break;
58
+ case 'required':
59
+ if (field && (!value || value === '')) {
60
+ return {
61
+ success: false,
62
+ allowed: false,
63
+ errors: [
64
+ {
65
+ code: 'REQUIRED_FIELD',
66
+ message: message || `Field '${field}' is required`,
67
+ field,
68
+ constraint,
69
+ },
70
+ ],
71
+ };
72
+ }
73
+ break;
74
+ case 'immutable': {
75
+ // Check if field already has a value (immutable after creation)
76
+ const currentValue = field ? entity[field] : entity;
77
+ if (currentValue !== undefined && value !== currentValue) {
78
+ return {
79
+ success: false,
80
+ allowed: false,
81
+ errors: [
82
+ {
83
+ code: 'IMMUTABLE_FIELD',
84
+ message: message || `Field '${field}' cannot be changed after creation`,
85
+ ...(field && { field }),
86
+ constraint,
87
+ },
88
+ ],
89
+ };
90
+ }
91
+ break;
92
+ }
93
+ case 'range':
94
+ if (typeof value === 'number' && params) {
95
+ const min = params.min;
96
+ const max = params.max;
97
+ if ((min !== undefined && value < min) || (max !== undefined && value > max)) {
98
+ return {
99
+ success: false,
100
+ allowed: false,
101
+ errors: [
102
+ {
103
+ code: 'RANGE_VIOLATION',
104
+ message: message || `Value must be between ${min} and ${max}`,
105
+ ...(field && { field }),
106
+ constraint,
107
+ },
108
+ ],
109
+ };
110
+ }
111
+ }
112
+ break;
113
+ case 'pattern': {
114
+ if (typeof value === 'string') {
115
+ const pattern = typeof params?.pattern === 'string' ? params.pattern : null;
116
+ if (pattern) {
117
+ const regex = new RegExp(pattern);
118
+ if (!regex.test(value)) {
119
+ return {
120
+ success: false,
121
+ allowed: false,
122
+ errors: [
123
+ {
124
+ code: 'PATTERN_VIOLATION',
125
+ message: message || `Value must match pattern ${pattern}`,
126
+ ...(field && { field }),
127
+ constraint,
128
+ },
129
+ ],
130
+ };
131
+ }
132
+ }
133
+ }
134
+ break;
135
+ }
136
+ case 'capability':
137
+ // Handled separately in checkCapabilities
138
+ break;
139
+ case 'permission':
140
+ // Handled separately in checkPermissions
141
+ break;
142
+ case 'custom': {
143
+ // Custom constraint logic would be evaluated here
144
+ const validator = params?.validator;
145
+ if (typeof validator === 'function') {
146
+ const customResult = validator(value, entity, changes);
147
+ if (!customResult) {
148
+ return {
149
+ success: false,
150
+ allowed: false,
151
+ errors: [
152
+ {
153
+ code: 'CUSTOM_CONSTRAINT_FAILED',
154
+ message: message || 'Custom constraint validation failed',
155
+ ...(field && { field }),
156
+ constraint,
157
+ },
158
+ ],
159
+ };
160
+ }
161
+ }
162
+ break;
163
+ }
164
+ }
165
+ return { success: true, allowed: true };
166
+ }
167
+ // =============================================================================
168
+ // Capability Checking
169
+ // =============================================================================
170
+ /**
171
+ * Check if agent has required capabilities for action
172
+ */
173
+ function checkCapabilities(agent, requiredCapabilities) {
174
+ const agentCapabilities = agent.capabilities || [];
175
+ const missing = requiredCapabilities.filter((cap) => !agentCapabilities.includes(cap));
176
+ if (missing.length > 0) {
177
+ return {
178
+ success: false,
179
+ allowed: false,
180
+ errors: [
181
+ {
182
+ code: 'MISSING_CAPABILITY',
183
+ message: `Agent missing required capabilities: ${missing.join(', ')}`,
184
+ },
185
+ ],
186
+ };
187
+ }
188
+ return { success: true, allowed: true };
189
+ }
190
+ // =============================================================================
191
+ // Permission Checking
192
+ // =============================================================================
193
+ /**
194
+ * Check if user has required permissions for action
195
+ */
196
+ function checkPermissions(permissions, actionDef) {
197
+ // If action doesn't require permissions, allow it
198
+ const requiredPermissions = actionDef.requiredCapabilities
199
+ ?.filter((cap) => cap.startsWith('permission:'))
200
+ .map((cap) => cap.replace('permission:', ''));
201
+ if (!requiredPermissions || requiredPermissions.length === 0) {
202
+ return { success: true, allowed: true };
203
+ }
204
+ if (!permissions || permissions.length === 0) {
205
+ return {
206
+ success: false,
207
+ allowed: false,
208
+ errors: [
209
+ {
210
+ code: 'MISSING_PERMISSION',
211
+ message: `Action requires permissions: ${requiredPermissions.join(', ')}`,
212
+ },
213
+ ],
214
+ };
215
+ }
216
+ const missing = requiredPermissions.filter((perm) => !permissions.includes(perm));
217
+ if (missing.length > 0) {
218
+ return {
219
+ success: false,
220
+ allowed: false,
221
+ errors: [
222
+ {
223
+ code: 'MISSING_PERMISSION',
224
+ message: `Missing permissions: ${missing.join(', ')}`,
225
+ },
226
+ ],
227
+ };
228
+ }
229
+ return { success: true, allowed: true };
230
+ }
231
+ // =============================================================================
232
+ // Action Validation (Main Entry Point)
233
+ // =============================================================================
234
+ /**
235
+ * Validate an action against entity constraints, agent capabilities, and permissions
236
+ *
237
+ * This is the main entry point for action validation in @revealui/contracts/actions
238
+ */
239
+ export function validateAction(context) {
240
+ const { entity, action, agent, changes, permissions } = context;
241
+ // 1. Check if action is defined on entity
242
+ const actionDef = entity.agent?.actions?.find((a) => a.name === action);
243
+ if (!actionDef) {
244
+ return {
245
+ success: false,
246
+ allowed: false,
247
+ errors: [
248
+ {
249
+ code: 'ACTION_NOT_FOUND',
250
+ message: `Action '${action}' is not available on this entity`,
251
+ },
252
+ ],
253
+ };
254
+ }
255
+ // 2. Check if action is destructive and requires confirmation
256
+ if (actionDef.destructive && !context.context?.confirmed) {
257
+ return {
258
+ success: false,
259
+ allowed: false,
260
+ errors: [
261
+ {
262
+ code: 'DESTRUCTIVE_ACTION_REQUIRES_CONFIRMATION',
263
+ message: `Action '${action}' is destructive and requires confirmation`,
264
+ },
265
+ ],
266
+ };
267
+ }
268
+ // 3. Check constraints
269
+ const constraintResult = checkConstraints(entity, changes);
270
+ if (!constraintResult.success) {
271
+ return constraintResult;
272
+ }
273
+ // 4. Check capabilities
274
+ if (actionDef.requiredCapabilities) {
275
+ const capabilityResult = checkCapabilities(agent, actionDef.requiredCapabilities);
276
+ if (!capabilityResult.success) {
277
+ return capabilityResult;
278
+ }
279
+ }
280
+ // 5. Check permissions
281
+ const permissionResult = checkPermissions(permissions, actionDef);
282
+ if (!permissionResult.success) {
283
+ return permissionResult;
284
+ }
285
+ // All checks passed
286
+ return { success: true, allowed: true };
287
+ }
288
+ //# sourceMappingURL=action-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-validator.js","sourceRoot":"","sources":["../../src/actions/action-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @revealui/contracts/actions
3
+ *
4
+ * Action validation layer - validates actions against entity constraints
5
+ */
6
+ export { type ActionValidationContext, type ActionValidationError, type ActionValidationFailure, type ActionValidationResult, type ActionValidationSuccess, validateAction, } from './action-validator.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,cAAc,GACf,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @revealui/contracts/actions
3
+ *
4
+ * Action validation layer - validates actions against entity constraints
5
+ */
6
+ export { validateAction, } from './action-validator.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAML,cAAc,GACf,MAAM,uBAAuB,CAAA"}