@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,406 @@
1
+ /**
2
+ * PageRevision Entity Contract
3
+ *
4
+ * Manages page version history with content snapshots and change tracking.
5
+ * Revisions are immutable records capturing the state of a page at a specific point in time.
6
+ *
7
+ * Business Rules:
8
+ * - Revisions are immutable (no updates after creation)
9
+ * - Revision numbers auto-increment per page
10
+ * - Content snapshot includes title, blocks, and SEO metadata
11
+ * - Change descriptions are optional but recommended
12
+ * - Cascading deletion when parent page is deleted
13
+ * - createdBy tracks who made the change
14
+ */
15
+ import { z } from 'zod/v4';
16
+ // =============================================================================
17
+ // Constants
18
+ // =============================================================================
19
+ export const PAGE_REVISION_SCHEMA_VERSION = 1;
20
+ // Change types for categorizing revisions
21
+ export const CHANGE_TYPES = [
22
+ 'create',
23
+ 'edit',
24
+ 'publish',
25
+ 'unpublish',
26
+ 'archive',
27
+ 'restore',
28
+ 'reorder',
29
+ 'seo_update',
30
+ 'block_add',
31
+ 'block_remove',
32
+ 'block_edit',
33
+ 'manual_save',
34
+ ];
35
+ // Revision retention policies
36
+ export const REVISION_RETENTION = {
37
+ MAX_REVISIONS_PER_PAGE: 100,
38
+ DAYS_TO_KEEP: 90,
39
+ ALWAYS_KEEP_PUBLISHED: true,
40
+ };
41
+ // =============================================================================
42
+ // Base Schemas
43
+ // =============================================================================
44
+ /**
45
+ * Block schema (simplified, matches Page blocks)
46
+ */
47
+ export const BlockSchema = z.object({
48
+ id: z.string(),
49
+ type: z.string(),
50
+ data: z.record(z.string(), z.unknown()).optional(),
51
+ });
52
+ /**
53
+ * SEO metadata schema (matches Page seo)
54
+ */
55
+ export const SeoMetadataSchema = z.object({
56
+ title: z.string().optional(),
57
+ description: z.string().optional(),
58
+ keywords: z.array(z.string()).optional(),
59
+ ogImage: z.string().optional(),
60
+ noIndex: z.boolean().optional(),
61
+ canonicalUrl: z.string().optional(),
62
+ });
63
+ // =============================================================================
64
+ // Base PageRevision Schema
65
+ // =============================================================================
66
+ /**
67
+ * Page Revision object schema
68
+ */
69
+ export const PageRevisionObjectSchema = z.object({
70
+ id: z.string().min(1),
71
+ pageId: z.string().min(1, 'Page ID is required'),
72
+ createdBy: z.string().nullable().optional(),
73
+ revisionNumber: z.number().int().positive('Revision number must be positive'),
74
+ title: z.string().min(1, 'Title is required'),
75
+ blocks: z.array(BlockSchema).default([]),
76
+ seo: SeoMetadataSchema.nullable().optional(),
77
+ changeDescription: z.string().nullable().optional(),
78
+ createdAt: z.date(),
79
+ });
80
+ /**
81
+ * Page Revision schema with validation rules
82
+ */
83
+ export const PageRevisionBaseSchema = PageRevisionObjectSchema.refine((data) => {
84
+ // Revision number must be >= 1
85
+ return data.revisionNumber >= 1;
86
+ }, {
87
+ message: 'Revision number must be at least 1',
88
+ path: ['revisionNumber'],
89
+ });
90
+ export const PageRevisionSchema = PageRevisionBaseSchema;
91
+ // =============================================================================
92
+ // Insert Schema
93
+ // =============================================================================
94
+ /**
95
+ * Schema for creating new page revisions
96
+ */
97
+ export const PageRevisionInsertSchema = PageRevisionObjectSchema.omit({
98
+ createdAt: true,
99
+ }).extend({
100
+ createdAt: z.date().optional(),
101
+ });
102
+ // =============================================================================
103
+ // Revision Number Helpers
104
+ // =============================================================================
105
+ /**
106
+ * Check if this is the first revision
107
+ */
108
+ export function isFirstRevision(revision) {
109
+ return revision.revisionNumber === 1;
110
+ }
111
+ /**
112
+ * Get next revision number
113
+ */
114
+ export function getNextRevisionNumber(currentRevision) {
115
+ return currentRevision.revisionNumber + 1;
116
+ }
117
+ /**
118
+ * Calculate revision number from count
119
+ */
120
+ export function calculateRevisionNumber(existingCount) {
121
+ return existingCount + 1;
122
+ }
123
+ // =============================================================================
124
+ // Content Helpers
125
+ // =============================================================================
126
+ /**
127
+ * Count blocks in revision
128
+ */
129
+ export function getBlockCount(revision) {
130
+ return revision.blocks.length;
131
+ }
132
+ /**
133
+ * Check if revision has blocks
134
+ */
135
+ export function hasBlocks(revision) {
136
+ return revision.blocks.length > 0;
137
+ }
138
+ /**
139
+ * Check if revision has SEO metadata
140
+ */
141
+ export function hasSeoMetadata(revision) {
142
+ return revision.seo !== null && revision.seo !== undefined;
143
+ }
144
+ /**
145
+ * Estimate word count from blocks (simplified)
146
+ */
147
+ export function estimateWordCount(revision) {
148
+ let wordCount = 0;
149
+ // Count words in title
150
+ wordCount += revision.title.split(/\s+/).length;
151
+ // Count words in blocks (rough estimate from JSON)
152
+ for (const block of revision.blocks) {
153
+ if (block.data) {
154
+ const blockText = JSON.stringify(block.data);
155
+ wordCount += blockText.split(/\s+/).length / 2; // Rough estimate
156
+ }
157
+ }
158
+ return Math.floor(wordCount);
159
+ }
160
+ /**
161
+ * Get block by ID
162
+ */
163
+ export function getBlockById(revision, blockId) {
164
+ return revision.blocks.find((block) => block.id === blockId);
165
+ }
166
+ /**
167
+ * Get blocks by type
168
+ */
169
+ export function getBlocksByType(revision, type) {
170
+ return revision.blocks.filter((block) => block.type === type);
171
+ }
172
+ // =============================================================================
173
+ // Change Description Helpers
174
+ // =============================================================================
175
+ /**
176
+ * Check if revision has change description
177
+ */
178
+ export function hasChangeDescription(revision) {
179
+ return (revision.changeDescription !== null &&
180
+ revision.changeDescription !== undefined &&
181
+ revision.changeDescription.length > 0);
182
+ }
183
+ /**
184
+ * Parse change type from description
185
+ */
186
+ export function inferChangeType(revision) {
187
+ if (!hasChangeDescription(revision))
188
+ return 'unknown';
189
+ const description = revision.changeDescription?.toLowerCase() ?? '';
190
+ if (description.includes('publish'))
191
+ return 'publish';
192
+ if (description.includes('unpublish'))
193
+ return 'unpublish';
194
+ if (description.includes('archive'))
195
+ return 'archive';
196
+ if (description.includes('restore'))
197
+ return 'restore';
198
+ if (description.includes('seo'))
199
+ return 'seo_update';
200
+ if (description.includes('add') && description.includes('block'))
201
+ return 'block_add';
202
+ if (description.includes('remove') && description.includes('block'))
203
+ return 'block_remove';
204
+ if (description.includes('edit') && description.includes('block'))
205
+ return 'block_edit';
206
+ if (description.includes('create'))
207
+ return 'create';
208
+ if (description.includes('reorder'))
209
+ return 'reorder';
210
+ return 'edit';
211
+ }
212
+ /**
213
+ * Generate change description
214
+ */
215
+ export function generateChangeDescription(changeType, details) {
216
+ const descriptions = {
217
+ create: 'Created page',
218
+ edit: 'Edited content',
219
+ publish: 'Published page',
220
+ unpublish: 'Unpublished page',
221
+ archive: 'Archived page',
222
+ restore: 'Restored page',
223
+ reorder: 'Reordered blocks',
224
+ seo_update: 'Updated SEO metadata',
225
+ block_add: 'Added block',
226
+ block_remove: 'Removed block',
227
+ block_edit: 'Edited block',
228
+ manual_save: 'Manual save',
229
+ };
230
+ const baseDescription = descriptions[changeType];
231
+ return details ? `${baseDescription}: ${details}` : baseDescription;
232
+ }
233
+ // =============================================================================
234
+ // Comparison Helpers
235
+ // =============================================================================
236
+ /**
237
+ * Compare two revisions to detect changes
238
+ */
239
+ export function compareRevisions(oldRevision, newRevision) {
240
+ return {
241
+ titleChanged: oldRevision.title !== newRevision.title,
242
+ blocksChanged: JSON.stringify(oldRevision.blocks) !== JSON.stringify(newRevision.blocks),
243
+ seoChanged: JSON.stringify(oldRevision.seo) !== JSON.stringify(newRevision.seo),
244
+ blockCountChanged: oldRevision.blocks.length !== newRevision.blocks.length,
245
+ };
246
+ }
247
+ /**
248
+ * Detect what changed between revisions
249
+ */
250
+ export function detectChanges(oldRevision, newRevision) {
251
+ const changes = [];
252
+ const comparison = compareRevisions(oldRevision, newRevision);
253
+ if (comparison.titleChanged) {
254
+ changes.push(`Title: "${oldRevision.title}" → "${newRevision.title}"`);
255
+ }
256
+ if (comparison.blockCountChanged) {
257
+ changes.push(`Blocks: ${oldRevision.blocks.length} → ${newRevision.blocks.length}`);
258
+ }
259
+ if (comparison.seoChanged) {
260
+ changes.push('SEO metadata updated');
261
+ }
262
+ return changes;
263
+ }
264
+ // =============================================================================
265
+ // Age & Timing Helpers
266
+ // =============================================================================
267
+ /**
268
+ * Get revision age in milliseconds
269
+ */
270
+ export function getRevisionAge(revision) {
271
+ return Date.now() - revision.createdAt.getTime();
272
+ }
273
+ /**
274
+ * Get revision age in days
275
+ */
276
+ export function getRevisionAgeInDays(revision) {
277
+ return Math.floor(getRevisionAge(revision) / (1000 * 60 * 60 * 24));
278
+ }
279
+ /**
280
+ * Check if revision is recent (< 24 hours)
281
+ */
282
+ export function isRecentRevision(revision, hoursThreshold = 24) {
283
+ const ageInHours = getRevisionAge(revision) / (1000 * 60 * 60);
284
+ return ageInHours < hoursThreshold;
285
+ }
286
+ /**
287
+ * Check if revision is old enough to be cleaned up
288
+ */
289
+ export function isEligibleForCleanup(revision, daysThreshold = REVISION_RETENTION.DAYS_TO_KEEP) {
290
+ return getRevisionAgeInDays(revision) > daysThreshold;
291
+ }
292
+ // =============================================================================
293
+ // Authorship Helpers
294
+ // =============================================================================
295
+ /**
296
+ * Check if revision has known author
297
+ */
298
+ export function hasAuthor(revision) {
299
+ return revision.createdBy !== null && revision.createdBy !== undefined;
300
+ }
301
+ /**
302
+ * Check if revision was created by specific user
303
+ */
304
+ export function isCreatedBy(revision, userId) {
305
+ return revision.createdBy === userId;
306
+ }
307
+ // =============================================================================
308
+ // Revision Creation
309
+ // =============================================================================
310
+ /**
311
+ * Create page revision insert data
312
+ */
313
+ export function createPageRevisionInsert(pageId, revisionNumber, title, blocks, options) {
314
+ return {
315
+ id: options?.id ?? crypto.randomUUID(),
316
+ pageId,
317
+ revisionNumber,
318
+ title,
319
+ blocks,
320
+ seo: options?.seo ?? null,
321
+ changeDescription: options?.changeDescription ?? null,
322
+ createdBy: options?.createdBy ?? null,
323
+ createdAt: new Date(),
324
+ };
325
+ }
326
+ /**
327
+ * Create revision from page snapshot
328
+ */
329
+ export function createRevisionFromSnapshot(pageId, revisionNumber, snapshot, options) {
330
+ const changeDescription = options?.changeDescription ??
331
+ (options?.changeType ? generateChangeDescription(options.changeType) : null);
332
+ return createPageRevisionInsert(pageId, revisionNumber, snapshot.title, snapshot.blocks, {
333
+ seo: snapshot.seo,
334
+ changeDescription,
335
+ createdBy: options?.createdBy,
336
+ });
337
+ }
338
+ /**
339
+ * Convert page revision to format with computed fields
340
+ */
341
+ export function pageRevisionToHuman(revision) {
342
+ return {
343
+ ...revision,
344
+ _computed: {
345
+ isFirstRevision: isFirstRevision(revision),
346
+ blockCount: getBlockCount(revision),
347
+ hasBlocks: hasBlocks(revision),
348
+ hasSeoMetadata: hasSeoMetadata(revision),
349
+ hasChangeDescription: hasChangeDescription(revision),
350
+ hasAuthor: hasAuthor(revision),
351
+ estimatedWordCount: estimateWordCount(revision),
352
+ ageInDays: getRevisionAgeInDays(revision),
353
+ isRecent: isRecentRevision(revision),
354
+ inferredChangeType: inferChangeType(revision),
355
+ },
356
+ };
357
+ }
358
+ /**
359
+ * Convert page revision to agent-compatible format
360
+ */
361
+ export function pageRevisionToAgent(revision) {
362
+ return {
363
+ ...revision,
364
+ metadata: {
365
+ revisionNumber: revision.revisionNumber,
366
+ isFirstRevision: isFirstRevision(revision),
367
+ blockCount: getBlockCount(revision),
368
+ wordCount: estimateWordCount(revision),
369
+ hasAuthor: hasAuthor(revision),
370
+ ageMs: getRevisionAge(revision),
371
+ changeType: inferChangeType(revision),
372
+ },
373
+ };
374
+ }
375
+ /**
376
+ * Zod schema for page revision with computed fields
377
+ */
378
+ export const PageRevisionWithComputedSchema = PageRevisionSchema.and(z.object({
379
+ _computed: z.object({
380
+ isFirstRevision: z.boolean(),
381
+ blockCount: z.number().int(),
382
+ hasBlocks: z.boolean(),
383
+ hasSeoMetadata: z.boolean(),
384
+ hasChangeDescription: z.boolean(),
385
+ hasAuthor: z.boolean(),
386
+ estimatedWordCount: z.number().int(),
387
+ ageInDays: z.number(),
388
+ isRecent: z.boolean(),
389
+ inferredChangeType: z.enum([...CHANGE_TYPES, 'unknown']),
390
+ }),
391
+ }));
392
+ /**
393
+ * Zod schema for page revision with agent metadata
394
+ */
395
+ export const PageRevisionAgentSchema = PageRevisionSchema.and(z.object({
396
+ metadata: z.object({
397
+ revisionNumber: z.number().int(),
398
+ isFirstRevision: z.boolean(),
399
+ blockCount: z.number().int(),
400
+ wordCount: z.number().int(),
401
+ hasAuthor: z.boolean(),
402
+ ageMs: z.number(),
403
+ changeType: z.enum([...CHANGE_TYPES, 'unknown']),
404
+ }),
405
+ }));
406
+ //# sourceMappingURL=page-revision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-revision.js","sourceRoot":"","sources":["../../src/entities/page-revision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE1B,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAE7C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ;IACR,MAAM;IACN,SAAS;IACT,WAAW;IACX,SAAS;IACT,SAAS;IACT,SAAS;IACT,YAAY;IACZ,WAAW;IACX,cAAc;IACd,YAAY;IACZ,aAAa;CACL,CAAA;AAIV,8BAA8B;AAC9B,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,sBAAsB,EAAE,GAAG;IAC3B,YAAY,EAAE,EAAE;IAChB,qBAAqB,EAAE,IAAI;CACnB,CAAA;AAEV,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAA;AAIF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAA;AAIF,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC;IAChD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC7E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACnD,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;CACpB,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC,MAAM,CACnE,CAAC,IAAI,EAAE,EAAE;IACP,+BAA+B;IAC/B,OAAO,IAAI,CAAC,cAAc,IAAI,CAAC,CAAA;AACjC,CAAC,EACD;IACE,OAAO,EAAE,oCAAoC;IAC7C,IAAI,EAAE,CAAC,gBAAgB,CAAC;CACzB,CACF,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAA;AAExD,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,wBAAwB,CAAC,IAAI,CAAC;IACpE,SAAS,EAAE,IAAI;CAChB,CAAC,CAAC,MAAM,CAAC;IACR,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAA;AASF,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,OAAO,QAAQ,CAAC,cAAc,KAAK,CAAC,CAAA;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAA6B;IACjE,OAAO,eAAe,CAAC,cAAc,GAAG,CAAC,CAAA;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAqB;IAC3D,OAAO,aAAa,GAAG,CAAC,CAAA;AAC1B,CAAC;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAsB;IAC9C,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAsB;IACnD,OAAO,QAAQ,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS,CAAA;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAsB;IACtD,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,uBAAuB;IACvB,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;IAE/C,mDAAmD;IACnD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC5C,SAAS,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA,CAAC,iBAAiB;QAClE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAsB,EAAE,OAAe;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAA;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAsB,EAAE,IAAY;IAClE,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAC/D,CAAC;AAED,gFAAgF;AAChF,6BAA6B;AAC7B,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,OAAO,CACL,QAAQ,CAAC,iBAAiB,KAAK,IAAI;QACnC,QAAQ,CAAC,iBAAiB,KAAK,SAAS;QACxC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CACtC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAA;IAErD,MAAM,WAAW,GAAG,QAAQ,CAAC,iBAAiB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAEnE,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACrD,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAA;IACzD,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACrD,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACrD,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAA;IACpD,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,WAAW,CAAA;IACpF,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,cAAc,CAAA;IAC1F,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,YAAY,CAAA;IACtF,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IACnD,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IAErD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAsB,EAAE,OAAgB;IAChF,MAAM,YAAY,GAA+B;QAC/C,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,kBAAkB;QAC3B,UAAU,EAAE,sBAAsB;QAClC,SAAS,EAAE,aAAa;QACxB,YAAY,EAAE,eAAe;QAC7B,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,aAAa;KAC3B,CAAA;IAED,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,eAAe,CAAA;AACrE,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAyB,EACzB,WAAyB;IAOzB,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK;QACrD,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;QACxF,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;QAC/E,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,MAAM;KAC3E,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAyB,EAAE,WAAyB;IAChF,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAE7D,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,KAAK,QAAQ,WAAW,CAAC,KAAK,GAAG,CAAC,CAAA;IACxE,CAAC;IAED,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,MAAM,CAAC,MAAM,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAsB;IACnD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAA;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAsB;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;AACrE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAsB,EAAE,cAAc,GAAG,EAAE;IAC1E,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IAC9D,OAAO,UAAU,GAAG,cAAc,CAAA;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAsB,EACtB,aAAa,GAAG,kBAAkB,CAAC,YAAY;IAE/C,OAAO,oBAAoB,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAA;AACvD,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAsB;IAC9C,OAAO,QAAQ,CAAC,SAAS,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAA;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAsB,EAAE,MAAc;IAChE,OAAO,QAAQ,CAAC,SAAS,KAAK,MAAM,CAAA;AACtC,CAAC;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAc,EACd,cAAsB,EACtB,KAAa,EACb,MAAe,EACf,OAKC;IAED,OAAO;QACL,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE;QACtC,MAAM;QACN,cAAc;QACd,KAAK;QACL,MAAM;QACN,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI;QACzB,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,IAAI;QACrD,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;QACrC,SAAS,EAAE,IAAI,IAAI,EAAE;KACtB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,cAAsB,EACtB,QAIC,EACD,OAIC;IAED,MAAM,iBAAiB,GACrB,OAAO,EAAE,iBAAiB;QAC1B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAE9E,OAAO,wBAAwB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE;QACvF,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,iBAAiB;QACjB,SAAS,EAAE,OAAO,EAAE,SAAS;KAC9B,CAAC,CAAA;AACJ,CAAC;AAwBD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAsB;IACxD,OAAO;QACL,GAAG,QAAQ;QACX,SAAS,EAAE;YACT,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;YAC1C,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC;YACnC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC9B,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC;YACxC,oBAAoB,EAAE,oBAAoB,CAAC,QAAQ,CAAC;YACpD,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC9B,kBAAkB,EAAE,iBAAiB,CAAC,QAAQ,CAAC;YAC/C,SAAS,EAAE,oBAAoB,CAAC,QAAQ,CAAC;YACzC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC;YACpC,kBAAkB,EAAE,eAAe,CAAC,QAAQ,CAAC;SAC9C;KACF,CAAA;AACH,CAAC;AAiBD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAsB;IACxD,OAAO;QACL,GAAG,QAAQ;QACX,QAAQ,EAAE;YACR,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,eAAe,EAAE,eAAe,CAAC,QAAQ,CAAC;YAC1C,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC;YACnC,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC;YACtC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;YAC9B,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC;YAC/B,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC;SACtC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,kBAAkB,CAAC,GAAG,CAClE,CAAC,CAAC,MAAM,CAAC;IACP,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;QAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QAC5B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;QAC3B,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE;QACjC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC;KACzD,CAAC;CACH,CAAC,CACH,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,GAAG,CAC3D,CAAC,CAAC,MAAM,CAAC;IACP,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QAChC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;QAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,YAAY,EAAE,SAAS,CAAC,CAAC;KACjD,CAAC;CACH,CAAC,CACH,CAAA"}