@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,555 @@
1
+ /**
2
+ * Post Entity Contract
3
+ *
4
+ * Manages blog posts and articles with publishing workflow, content management,
5
+ * and SEO optimization. Posts support Lexical editor content, featured images,
6
+ * categories, and publication scheduling.
7
+ *
8
+ * Business Rules:
9
+ * - Slug must be unique across all posts
10
+ * - Status values: draft, published, archived
11
+ * - Published flag mirrors published status
12
+ * - publishedAt timestamp set when publishing
13
+ * - Content stored as Lexical editor JSON
14
+ * - Categories stored as string array
15
+ * - Author cascades to null on user deletion
16
+ */
17
+ import { z } from 'zod/v4';
18
+ // =============================================================================
19
+ // Constants
20
+ // =============================================================================
21
+ export const POST_SCHEMA_VERSION = 1;
22
+ // Post status values
23
+ export const POST_STATUSES = ['draft', 'published', 'archived'];
24
+ // Lexical editor node types
25
+ export const LEXICAL_NODE_TYPES = [
26
+ 'paragraph',
27
+ 'heading',
28
+ 'list',
29
+ 'listitem',
30
+ 'quote',
31
+ 'code',
32
+ 'text',
33
+ 'link',
34
+ 'image',
35
+ ];
36
+ // Post limits
37
+ export const POST_LIMITS = {
38
+ MIN_TITLE_LENGTH: 1,
39
+ MAX_TITLE_LENGTH: 200,
40
+ MIN_SLUG_LENGTH: 1,
41
+ MAX_SLUG_LENGTH: 200,
42
+ MAX_EXCERPT_LENGTH: 500,
43
+ MAX_CATEGORIES: 10,
44
+ };
45
+ // =============================================================================
46
+ // Base Schemas
47
+ // =============================================================================
48
+ /**
49
+ * Lexical editor content schema (simplified)
50
+ */
51
+ export const LexicalContentSchema = z.object({
52
+ root: z.object({
53
+ children: z.array(z.unknown()),
54
+ direction: z.enum(['ltr', 'rtl']).optional(),
55
+ format: z.string().optional(),
56
+ indent: z.number().optional(),
57
+ type: z.string(),
58
+ version: z.number().optional(),
59
+ }),
60
+ });
61
+ /**
62
+ * Post meta (SEO) schema
63
+ */
64
+ export const PostMetaSchema = z.object({
65
+ title: z.string().optional(),
66
+ description: z.string().optional(),
67
+ keywords: z.array(z.string()).optional(),
68
+ ogImage: z.string().optional(),
69
+ ogTitle: z.string().optional(),
70
+ ogDescription: z.string().optional(),
71
+ twitterCard: z.enum(['summary', 'summary_large_image', 'app', 'player']).optional(),
72
+ canonicalUrl: z.string().optional(),
73
+ noIndex: z.boolean().optional(),
74
+ noFollow: z.boolean().optional(),
75
+ });
76
+ // =============================================================================
77
+ // Base Post Schema
78
+ // =============================================================================
79
+ /**
80
+ * Post object schema
81
+ */
82
+ export const PostObjectSchema = z.object({
83
+ id: z.string().min(1),
84
+ schemaVersion: z.string().default(String(POST_SCHEMA_VERSION)),
85
+ title: z
86
+ .string()
87
+ .min(POST_LIMITS.MIN_TITLE_LENGTH, 'Title is required')
88
+ .max(POST_LIMITS.MAX_TITLE_LENGTH, `Title cannot exceed ${POST_LIMITS.MAX_TITLE_LENGTH} characters`),
89
+ slug: z
90
+ .string()
91
+ .min(POST_LIMITS.MIN_SLUG_LENGTH, 'Slug is required')
92
+ .max(POST_LIMITS.MAX_SLUG_LENGTH, `Slug cannot exceed ${POST_LIMITS.MAX_SLUG_LENGTH} characters`)
93
+ .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, 'Slug must be lowercase with hyphens'),
94
+ excerpt: z.string().max(POST_LIMITS.MAX_EXCERPT_LENGTH).nullable().optional(),
95
+ content: LexicalContentSchema.nullable().optional(),
96
+ featuredImageId: z.string().nullable().optional(),
97
+ authorId: z.string().nullable().optional(),
98
+ status: z.enum(POST_STATUSES),
99
+ published: z.boolean().default(false),
100
+ meta: PostMetaSchema.nullable().optional(),
101
+ categories: z.array(z.string()).max(POST_LIMITS.MAX_CATEGORIES).default([]),
102
+ createdAt: z.date(),
103
+ updatedAt: z.date(),
104
+ publishedAt: z.date().nullable().optional(),
105
+ });
106
+ /**
107
+ * Post schema with validation rules
108
+ */
109
+ export const PostBaseSchema = PostObjectSchema.refine((data) => {
110
+ // If published, must have publishedAt timestamp
111
+ if (data.status === 'published' && data.published) {
112
+ return data.publishedAt !== null && data.publishedAt !== undefined;
113
+ }
114
+ return true;
115
+ }, {
116
+ message: 'Published posts must have a publishedAt timestamp',
117
+ path: ['publishedAt'],
118
+ }).refine((data) => {
119
+ // Published flag should match status
120
+ if (data.status === 'published') {
121
+ return data.published === true;
122
+ }
123
+ if (data.status === 'draft' || data.status === 'archived') {
124
+ return data.published === false;
125
+ }
126
+ return true;
127
+ }, {
128
+ message: 'Published flag must match status',
129
+ path: ['published'],
130
+ });
131
+ export const PostSchema = PostBaseSchema;
132
+ // =============================================================================
133
+ // Insert Schema
134
+ // =============================================================================
135
+ /**
136
+ * Schema for creating new posts
137
+ */
138
+ export const PostInsertSchema = PostObjectSchema.omit({
139
+ createdAt: true,
140
+ updatedAt: true,
141
+ }).extend({
142
+ createdAt: z.date().optional(),
143
+ updatedAt: z.date().optional(),
144
+ });
145
+ // =============================================================================
146
+ // Status Helpers
147
+ // =============================================================================
148
+ /**
149
+ * Check if post is draft
150
+ */
151
+ export function isDraft(post) {
152
+ return post.status === 'draft';
153
+ }
154
+ /**
155
+ * Check if post is published
156
+ */
157
+ export function isPublished(post) {
158
+ return post.status === 'published' && post.published === true;
159
+ }
160
+ /**
161
+ * Check if post is archived
162
+ */
163
+ export function isArchived(post) {
164
+ return post.status === 'archived';
165
+ }
166
+ /**
167
+ * Check if post is publishable (has required fields)
168
+ */
169
+ export function isPublishable(post) {
170
+ return (post.title.length > 0 &&
171
+ post.slug.length > 0 &&
172
+ post.content !== null &&
173
+ post.content !== undefined);
174
+ }
175
+ /**
176
+ * Get status display label
177
+ */
178
+ export function getStatusLabel(status) {
179
+ const labels = {
180
+ draft: 'Draft',
181
+ published: 'Published',
182
+ archived: 'Archived',
183
+ };
184
+ return labels[status];
185
+ }
186
+ // =============================================================================
187
+ // Publishing Helpers
188
+ // =============================================================================
189
+ /**
190
+ * Create publish update
191
+ */
192
+ export function createPublishUpdate() {
193
+ return {
194
+ status: 'published',
195
+ published: true,
196
+ publishedAt: new Date(),
197
+ updatedAt: new Date(),
198
+ };
199
+ }
200
+ /**
201
+ * Create unpublish update
202
+ */
203
+ export function createUnpublishUpdate() {
204
+ return {
205
+ status: 'draft',
206
+ published: false,
207
+ updatedAt: new Date(),
208
+ };
209
+ }
210
+ /**
211
+ * Create archive update
212
+ */
213
+ export function createArchiveUpdate() {
214
+ return {
215
+ status: 'archived',
216
+ published: false,
217
+ updatedAt: new Date(),
218
+ };
219
+ }
220
+ /**
221
+ * Create restore update (from archive)
222
+ */
223
+ export function createRestoreUpdate() {
224
+ return {
225
+ status: 'draft',
226
+ published: false,
227
+ updatedAt: new Date(),
228
+ };
229
+ }
230
+ // =============================================================================
231
+ // Content Helpers
232
+ // =============================================================================
233
+ /**
234
+ * Check if post has content
235
+ */
236
+ export function hasContent(post) {
237
+ return post.content !== null && post.content !== undefined;
238
+ }
239
+ /**
240
+ * Check if post has excerpt
241
+ */
242
+ export function hasExcerpt(post) {
243
+ return post.excerpt !== null && post.excerpt !== undefined && post.excerpt.length > 0;
244
+ }
245
+ /**
246
+ * Check if post has featured image
247
+ */
248
+ export function hasFeaturedImage(post) {
249
+ return post.featuredImageId !== null && post.featuredImageId !== undefined;
250
+ }
251
+ /**
252
+ * Estimate reading time in minutes
253
+ */
254
+ export function estimateReadingTime(post) {
255
+ if (!hasContent(post))
256
+ return 0;
257
+ // Rough estimate: 200 words per minute
258
+ const wordCount = estimateWordCount(post);
259
+ return Math.max(1, Math.ceil(wordCount / 200));
260
+ }
261
+ /**
262
+ * Estimate word count from content
263
+ */
264
+ export function estimateWordCount(post) {
265
+ if (!hasContent(post))
266
+ return 0;
267
+ // Count words in title
268
+ let wordCount = post.title.split(/\s+/).length;
269
+ // Count words in excerpt
270
+ if (hasExcerpt(post)) {
271
+ wordCount += (post.excerpt ?? '').split(/\s+/).length;
272
+ }
273
+ // Rough estimate from content JSON
274
+ if (post.content) {
275
+ const contentText = JSON.stringify(post.content.root.children);
276
+ wordCount += contentText.split(/\s+/).length / 2; // Rough estimate
277
+ }
278
+ return Math.floor(wordCount);
279
+ }
280
+ // =============================================================================
281
+ // Author Helpers
282
+ // =============================================================================
283
+ /**
284
+ * Check if post has author
285
+ */
286
+ export function hasAuthor(post) {
287
+ return post.authorId !== null && post.authorId !== undefined;
288
+ }
289
+ /**
290
+ * Check if post is authored by specific user
291
+ */
292
+ export function isAuthoredBy(post, userId) {
293
+ return post.authorId === userId;
294
+ }
295
+ // =============================================================================
296
+ // Category Helpers
297
+ // =============================================================================
298
+ /**
299
+ * Check if post has categories
300
+ */
301
+ export function hasCategories(post) {
302
+ return post.categories.length > 0;
303
+ }
304
+ /**
305
+ * Check if post has specific category
306
+ */
307
+ export function hasCategory(post, category) {
308
+ return post.categories.includes(category);
309
+ }
310
+ /**
311
+ * Add category to post
312
+ */
313
+ export function addCategory(post, category) {
314
+ if (hasCategory(post, category))
315
+ return post.categories;
316
+ if (post.categories.length >= POST_LIMITS.MAX_CATEGORIES) {
317
+ throw new Error(`Cannot exceed ${POST_LIMITS.MAX_CATEGORIES} categories`);
318
+ }
319
+ return [...post.categories, category];
320
+ }
321
+ /**
322
+ * Remove category from post
323
+ */
324
+ export function removeCategory(post, category) {
325
+ return post.categories.filter((c) => c !== category);
326
+ }
327
+ // =============================================================================
328
+ // SEO Helpers
329
+ // =============================================================================
330
+ /**
331
+ * Check if post has SEO meta
332
+ */
333
+ export function hasMeta(post) {
334
+ return post.meta !== null && post.meta !== undefined;
335
+ }
336
+ /**
337
+ * Get effective SEO title (meta.title or post.title)
338
+ */
339
+ export function getEffectiveSeoTitle(post) {
340
+ return post.meta?.title ?? post.title;
341
+ }
342
+ /**
343
+ * Get effective SEO description (meta.description or excerpt)
344
+ */
345
+ export function getEffectiveSeoDescription(post) {
346
+ return post.meta?.description ?? post.excerpt ?? null;
347
+ }
348
+ /**
349
+ * Check if post is indexed by search engines
350
+ */
351
+ export function isIndexable(post) {
352
+ return !(post.meta?.noIndex === true);
353
+ }
354
+ // =============================================================================
355
+ // Slug Helpers
356
+ // =============================================================================
357
+ /**
358
+ * Generate slug from title
359
+ */
360
+ export function generateSlug(title) {
361
+ return title
362
+ .toLowerCase()
363
+ .trim()
364
+ .replace(/[^\w\s-]/g, '') // Remove special chars
365
+ .replace(/[\s_-]+/g, '-') // Replace spaces and underscores with hyphens
366
+ .replace(/^-+|-+$/g, '') // Remove leading/trailing hyphens
367
+ .slice(0, POST_LIMITS.MAX_SLUG_LENGTH);
368
+ }
369
+ /**
370
+ * Validate slug format
371
+ */
372
+ export function isValidSlug(slug) {
373
+ return /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug);
374
+ }
375
+ // =============================================================================
376
+ // Timing Helpers
377
+ // =============================================================================
378
+ /**
379
+ * Get post age in milliseconds
380
+ */
381
+ export function getPostAge(post) {
382
+ return Date.now() - post.createdAt.getTime();
383
+ }
384
+ /**
385
+ * Get post age in days
386
+ */
387
+ export function getPostAgeInDays(post) {
388
+ return Math.floor(getPostAge(post) / (1000 * 60 * 60 * 24));
389
+ }
390
+ /**
391
+ * Get time since last update in milliseconds
392
+ */
393
+ export function getTimeSinceUpdate(post) {
394
+ return Date.now() - post.updatedAt.getTime();
395
+ }
396
+ /**
397
+ * Get time since publication in milliseconds
398
+ */
399
+ export function getTimeSincePublication(post) {
400
+ if (!post.publishedAt)
401
+ return null;
402
+ return Date.now() - post.publishedAt.getTime();
403
+ }
404
+ /**
405
+ * Check if post is recent (< 7 days old)
406
+ */
407
+ export function isRecentPost(post, daysThreshold = 7) {
408
+ return getPostAgeInDays(post) < daysThreshold;
409
+ }
410
+ /**
411
+ * Check if post was recently updated (< 24 hours)
412
+ */
413
+ export function isRecentlyUpdated(post, hoursThreshold = 24) {
414
+ const hoursSinceUpdate = getTimeSinceUpdate(post) / (1000 * 60 * 60);
415
+ return hoursSinceUpdate < hoursThreshold;
416
+ }
417
+ // =============================================================================
418
+ // Post Creation
419
+ // =============================================================================
420
+ /**
421
+ * Create post insert data
422
+ */
423
+ export function createPostInsert(title, slug, options) {
424
+ const now = new Date();
425
+ const status = options?.status ?? 'draft';
426
+ return {
427
+ id: options?.id ?? crypto.randomUUID(),
428
+ schemaVersion: String(POST_SCHEMA_VERSION),
429
+ title,
430
+ slug,
431
+ excerpt: options?.excerpt ?? null,
432
+ content: options?.content ?? null,
433
+ featuredImageId: options?.featuredImageId ?? null,
434
+ authorId: options?.authorId ?? null,
435
+ status,
436
+ published: status === 'published',
437
+ meta: options?.meta ?? null,
438
+ categories: options?.categories ?? [],
439
+ createdAt: now,
440
+ updatedAt: now,
441
+ publishedAt: status === 'published' ? now : null,
442
+ };
443
+ }
444
+ /**
445
+ * Update post data
446
+ */
447
+ export function updatePost(updates) {
448
+ const result = {
449
+ updatedAt: new Date(),
450
+ };
451
+ if (updates.title !== undefined)
452
+ result.title = updates.title;
453
+ if (updates.slug !== undefined)
454
+ result.slug = updates.slug;
455
+ if (updates.excerpt !== undefined)
456
+ result.excerpt = updates.excerpt;
457
+ if (updates.content !== undefined)
458
+ result.content = updates.content;
459
+ if (updates.featuredImageId !== undefined)
460
+ result.featuredImageId = updates.featuredImageId;
461
+ if (updates.meta !== undefined)
462
+ result.meta = updates.meta;
463
+ if (updates.categories !== undefined)
464
+ result.categories = updates.categories;
465
+ return result;
466
+ }
467
+ /**
468
+ * Convert post to format with computed fields
469
+ */
470
+ export function postToHuman(post) {
471
+ return {
472
+ ...post,
473
+ _computed: {
474
+ isDraft: isDraft(post),
475
+ isPublished: isPublished(post),
476
+ isArchived: isArchived(post),
477
+ isPublishable: isPublishable(post),
478
+ hasContent: hasContent(post),
479
+ hasExcerpt: hasExcerpt(post),
480
+ hasFeaturedImage: hasFeaturedImage(post),
481
+ hasAuthor: hasAuthor(post),
482
+ hasCategories: hasCategories(post),
483
+ hasMeta: hasMeta(post),
484
+ isIndexable: isIndexable(post),
485
+ estimatedWordCount: estimateWordCount(post),
486
+ estimatedReadingTime: estimateReadingTime(post),
487
+ ageInDays: getPostAgeInDays(post),
488
+ isRecent: isRecentPost(post),
489
+ isRecentlyUpdated: isRecentlyUpdated(post),
490
+ effectiveSeoTitle: getEffectiveSeoTitle(post),
491
+ effectiveSeoDescription: getEffectiveSeoDescription(post),
492
+ },
493
+ };
494
+ }
495
+ /**
496
+ * Convert post to agent-compatible format
497
+ */
498
+ export function postToAgent(post) {
499
+ return {
500
+ ...post,
501
+ metadata: {
502
+ status: post.status,
503
+ published: post.published,
504
+ hasContent: hasContent(post),
505
+ wordCount: estimateWordCount(post),
506
+ readingTimeMinutes: estimateReadingTime(post),
507
+ categoryCount: post.categories.length,
508
+ ageMs: getPostAge(post),
509
+ timeSincePublicationMs: getTimeSincePublication(post),
510
+ isIndexable: isIndexable(post),
511
+ },
512
+ };
513
+ }
514
+ /**
515
+ * Zod schema for post with computed fields
516
+ */
517
+ export const PostWithComputedSchema = PostSchema.and(z.object({
518
+ _computed: z.object({
519
+ isDraft: z.boolean(),
520
+ isPublished: z.boolean(),
521
+ isArchived: z.boolean(),
522
+ isPublishable: z.boolean(),
523
+ hasContent: z.boolean(),
524
+ hasExcerpt: z.boolean(),
525
+ hasFeaturedImage: z.boolean(),
526
+ hasAuthor: z.boolean(),
527
+ hasCategories: z.boolean(),
528
+ hasMeta: z.boolean(),
529
+ isIndexable: z.boolean(),
530
+ estimatedWordCount: z.number().int(),
531
+ estimatedReadingTime: z.number().int(),
532
+ ageInDays: z.number(),
533
+ isRecent: z.boolean(),
534
+ isRecentlyUpdated: z.boolean(),
535
+ effectiveSeoTitle: z.string(),
536
+ effectiveSeoDescription: z.string().nullable(),
537
+ }),
538
+ }));
539
+ /**
540
+ * Zod schema for post with agent metadata
541
+ */
542
+ export const PostAgentSchema = PostSchema.and(z.object({
543
+ metadata: z.object({
544
+ status: z.enum(POST_STATUSES),
545
+ published: z.boolean(),
546
+ hasContent: z.boolean(),
547
+ wordCount: z.number().int(),
548
+ readingTimeMinutes: z.number().int(),
549
+ categoryCount: z.number().int(),
550
+ ageMs: z.number(),
551
+ timeSincePublicationMs: z.number().nullable(),
552
+ isIndexable: z.boolean(),
553
+ }),
554
+ }));
555
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/entities/post.ts"],"names":[],"mappings":"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"}