@actuate-media/cms-core 0.19.0 → 0.21.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 (72) hide show
  1. package/LICENSE +21 -21
  2. package/dist/__tests__/api/ai-quality.test.d.ts +2 -0
  3. package/dist/__tests__/api/ai-quality.test.d.ts.map +1 -0
  4. package/dist/__tests__/api/ai-quality.test.js +470 -0
  5. package/dist/__tests__/api/ai-quality.test.js.map +1 -0
  6. package/dist/__tests__/fields/component-block.test.d.ts +2 -0
  7. package/dist/__tests__/fields/component-block.test.d.ts.map +1 -0
  8. package/dist/__tests__/fields/component-block.test.js +129 -0
  9. package/dist/__tests__/fields/component-block.test.js.map +1 -0
  10. package/dist/__tests__/seo/config-store.test.d.ts +2 -0
  11. package/dist/__tests__/seo/config-store.test.d.ts.map +1 -0
  12. package/dist/__tests__/seo/config-store.test.js +167 -0
  13. package/dist/__tests__/seo/config-store.test.js.map +1 -0
  14. package/dist/api/handler-factory.d.ts.map +1 -1
  15. package/dist/api/handler-factory.js +4 -0
  16. package/dist/api/handler-factory.js.map +1 -1
  17. package/dist/api/handlers.d.ts.map +1 -1
  18. package/dist/api/handlers.js +566 -21
  19. package/dist/api/handlers.js.map +1 -1
  20. package/dist/config/types.d.ts +61 -1
  21. package/dist/config/types.d.ts.map +1 -1
  22. package/dist/fields/component-block.d.ts +23 -0
  23. package/dist/fields/component-block.d.ts.map +1 -0
  24. package/dist/fields/component-block.js +137 -0
  25. package/dist/fields/component-block.js.map +1 -0
  26. package/dist/fields/index.d.ts.map +1 -1
  27. package/dist/fields/index.js +2 -0
  28. package/dist/fields/index.js.map +1 -1
  29. package/dist/seo/config-store.d.ts +61 -0
  30. package/dist/seo/config-store.d.ts.map +1 -0
  31. package/dist/seo/config-store.js +158 -0
  32. package/dist/seo/config-store.js.map +1 -0
  33. package/dist/seo/index.d.ts +2 -0
  34. package/dist/seo/index.d.ts.map +1 -1
  35. package/dist/seo/index.js +1 -0
  36. package/dist/seo/index.js.map +1 -1
  37. package/package.json +1 -1
  38. package/prisma/cms-schema.prisma +306 -306
  39. package/prisma/migrations/0001_init/migration.sql +384 -384
  40. package/prisma/migrations/0002_folders/migration.sql +39 -39
  41. package/prisma/migrations/0003_search_and_webhooks/migration.sql +50 -50
  42. package/prisma/migrations/0004_script_tags/migration.sql +21 -21
  43. package/prisma/migrations/0005_password_reset_tokens/migration.sql +20 -20
  44. package/prisma/migrations/0006_page_builder/migration.sql +38 -38
  45. package/prisma/migrations/migration_lock.toml +3 -3
  46. package/prisma/schema.prisma +549 -549
  47. package/generated/browser.ts +0 -109
  48. package/generated/client.ts +0 -133
  49. package/generated/commonInputTypes.ts +0 -709
  50. package/generated/enums.ts +0 -125
  51. package/generated/internal/class.ts +0 -376
  52. package/generated/internal/prismaNamespace.ts +0 -2617
  53. package/generated/internal/prismaNamespaceBrowser.ts +0 -611
  54. package/generated/models/ApiKey.ts +0 -1550
  55. package/generated/models/AuditLog.ts +0 -1206
  56. package/generated/models/BackupRecord.ts +0 -1250
  57. package/generated/models/ContentLock.ts +0 -1472
  58. package/generated/models/ContentTemplate.ts +0 -1416
  59. package/generated/models/Document.ts +0 -3005
  60. package/generated/models/Folder.ts +0 -1904
  61. package/generated/models/FormSubmission.ts +0 -1200
  62. package/generated/models/InAppNotification.ts +0 -1457
  63. package/generated/models/Media.ts +0 -2340
  64. package/generated/models/MediaUsage.ts +0 -1472
  65. package/generated/models/OAuthAccount.ts +0 -1463
  66. package/generated/models/Redirect.ts +0 -1284
  67. package/generated/models/Session.ts +0 -1492
  68. package/generated/models/Site.ts +0 -1206
  69. package/generated/models/User.ts +0 -3513
  70. package/generated/models/Version.ts +0 -1511
  71. package/generated/models/WorkflowState.ts +0 -1514
  72. package/generated/models.ts +0 -29
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Actuate Media
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Actuate Media
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ai-quality.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-quality.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/api/ai-quality.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,470 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ // vi.mock is hoisted. Mock @actuate-media/plugin-ai so handlers.ts'
3
+ // dynamic import resolves to deterministic stubs — we want to verify the
4
+ // HTTP wiring (auth, validation, branching, response shape) without
5
+ // pulling in the real scoring pipeline (covered by plugin-ai's own tests).
6
+ vi.mock('@actuate-media/plugin-ai', () => ({
7
+ rewrite: vi.fn(async (text, style, tone) => `[rewrite style=${style ?? ''} tone=${tone ?? ''}] ${text}`),
8
+ expand: vi.fn(async (text, instructions) => `[expand ${instructions ?? ''}] ${text} (more detail)`),
9
+ compress: vi.fn(async (text, target) => `[compress target=${target ?? ''}] ${text.slice(0, Math.min(text.length, target ?? 40))}`),
10
+ proofread: vi.fn(async (text) => ({
11
+ corrected: text.replace(/teh/g, 'the'),
12
+ changes: text.includes('teh') ? [{ original: 'teh', corrected: 'the', type: 'spelling' }] : [],
13
+ })),
14
+ auditDocument: vi.fn((input) => ({
15
+ composite: { overall: 78, grade: 'C', breakdown: {} },
16
+ scores: { seo: 80, readability: 75, accessibility: 90 },
17
+ readability: { averageGradeLevel: 9.2, difficulty: 'moderate' },
18
+ issues: [
19
+ {
20
+ severity: 'warning',
21
+ category: 'structure',
22
+ rule: 'missing-meta-description',
23
+ message: 'Document is missing a meta description.',
24
+ field: 'metaDescription',
25
+ },
26
+ ],
27
+ diagnostics: {
28
+ seoBreakdown: [{ criterion: 'Title length', score: 15, maxScore: 15 }],
29
+ accessibilityIssues: [],
30
+ },
31
+ __echo: input,
32
+ })),
33
+ suggestInternalLinks: vi.fn(async (content, pages) => {
34
+ // Return one fake suggestion per page so the test can verify candidate
35
+ // assembly worked.
36
+ return pages.map((p, i) => ({
37
+ anchorText: p.title,
38
+ targetPage: p,
39
+ confidence: 0.9 - i * 0.1,
40
+ position: { start: 0, end: p.title.length },
41
+ }));
42
+ }),
43
+ }));
44
+ import { handleActuateAPI } from '../../api/index.js';
45
+ import { initDB } from '../../db.js';
46
+ import { generateApiKey } from '../../security/api-key-enhanced.js';
47
+ const VALID_SECRET = 'a'.repeat(48);
48
+ function createMockDB(opts) {
49
+ const apiKey = opts.apiKey;
50
+ const documents = opts.documents ?? [];
51
+ const dbMock = {
52
+ apiKey: {
53
+ findMany: async () => (apiKey ? [apiKey] : []),
54
+ findUnique: async ({ where }) => {
55
+ if (!apiKey)
56
+ return null;
57
+ if (apiKey.keyHash !== where.keyHash)
58
+ return null;
59
+ return apiKey;
60
+ },
61
+ update: async () => apiKey,
62
+ },
63
+ document: {
64
+ findMany: async ({ where }) => {
65
+ if (!where)
66
+ return documents;
67
+ return documents.filter((d) => {
68
+ if (where.collection && d.collection !== where.collection)
69
+ return false;
70
+ if (where.status && d.status !== where.status)
71
+ return false;
72
+ if (where.deletedAt === null && d.deletedAt)
73
+ return false;
74
+ return true;
75
+ });
76
+ },
77
+ findFirst: async ({ where }) => {
78
+ return (documents.find((d) => {
79
+ if (where.id && d.id !== where.id)
80
+ return false;
81
+ if (where.collection && d.collection !== where.collection)
82
+ return false;
83
+ if (where.deletedAt === null && d.deletedAt)
84
+ return false;
85
+ return true;
86
+ }) ?? null);
87
+ },
88
+ count: async () => documents.length,
89
+ },
90
+ auditLog: { create: async () => ({}) },
91
+ };
92
+ dbMock.$transaction = async (arg) => {
93
+ if (typeof arg === 'function')
94
+ return await arg(dbMock);
95
+ if (Array.isArray(arg))
96
+ return Promise.all(arg);
97
+ return arg;
98
+ };
99
+ return dbMock;
100
+ }
101
+ async function makeKey(scopes) {
102
+ const { key, keyHash, keyPrefix } = await generateApiKey({ prefix: 'act_sk', scopes });
103
+ return {
104
+ key,
105
+ record: {
106
+ id: 'apikey-ai-quality',
107
+ keyHash,
108
+ keyPrefix,
109
+ userId: 'user-1',
110
+ scopes,
111
+ ipRestrictions: null,
112
+ expiresAt: null,
113
+ lastUsedAt: null,
114
+ revokedAt: null,
115
+ },
116
+ };
117
+ }
118
+ const postsCollection = {
119
+ slug: 'posts',
120
+ labels: { singular: 'Post', plural: 'Posts' },
121
+ type: 'post',
122
+ fields: {
123
+ title: { type: 'text', label: 'Title', required: true },
124
+ slug: { type: 'slug', label: 'Slug', required: true },
125
+ body: { type: 'richText', label: 'Body' },
126
+ metaDescription: { type: 'text', label: 'Meta description' },
127
+ },
128
+ };
129
+ describe('POST /ai/audit-document', () => {
130
+ beforeEach(() => {
131
+ delete globalThis.__actuateConfig;
132
+ process.env.CMS_SECRET = VALID_SECRET;
133
+ });
134
+ it('audits ad-hoc content when title+body are supplied', async () => {
135
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
136
+ const db = createMockDB({ apiKey: record });
137
+ initDB(db);
138
+ const handler = handleActuateAPI({
139
+ prismaClient: db,
140
+ config: { collections: { posts: postsCollection } },
141
+ });
142
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
143
+ method: 'POST',
144
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
145
+ body: JSON.stringify({
146
+ title: 'How to brew pour-over coffee',
147
+ body: 'Pour-over coffee is one of the cleanest ways to extract flavor from beans. Start with fresh roasted whole beans, grind them medium-fine right before brewing, and use water just off the boil.',
148
+ metaDescription: 'Learn the essentials of pour-over coffee: bean selection, grind size, and water temperature.',
149
+ targetKeyword: 'pour-over coffee',
150
+ }),
151
+ }));
152
+ expect(response.status).toBe(200);
153
+ const body = await response.json();
154
+ expect(body.data.composite.grade).toBe('C');
155
+ expect(body.data.scores.seo).toBe(80);
156
+ expect(body.data.issues[0].rule).toBe('missing-meta-description');
157
+ });
158
+ it('audits a stored document when { collection, id } is supplied', async () => {
159
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
160
+ const db = createMockDB({
161
+ apiKey: record,
162
+ documents: [
163
+ {
164
+ id: 'doc-1',
165
+ collection: 'posts',
166
+ title: 'Stored doc',
167
+ slug: 'stored-doc',
168
+ status: 'PUBLISHED',
169
+ deletedAt: null,
170
+ data: {
171
+ title: 'Stored doc',
172
+ body: 'Stored body content from the database.',
173
+ metaDescription: 'Stored meta',
174
+ },
175
+ publishedAt: new Date('2026-01-01'),
176
+ updatedAt: new Date('2026-02-01'),
177
+ },
178
+ ],
179
+ });
180
+ initDB(db);
181
+ const handler = handleActuateAPI({
182
+ prismaClient: db,
183
+ config: { collections: { posts: postsCollection } },
184
+ });
185
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
186
+ method: 'POST',
187
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
188
+ body: JSON.stringify({ collection: 'posts', id: 'doc-1' }),
189
+ }));
190
+ expect(response.status).toBe(200);
191
+ const body = await response.json();
192
+ // The mocked auditor echoes its input back so we can verify the
193
+ // handler extracted the right fields from the persisted document.
194
+ expect(body.data.__echo.title).toBe('Stored doc');
195
+ expect(body.data.__echo.body).toBe('Stored body content from the database.');
196
+ expect(body.data.__echo.metaDescription).toBe('Stored meta');
197
+ });
198
+ it('returns 404 when the referenced document does not exist', async () => {
199
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
200
+ const db = createMockDB({ apiKey: record, documents: [] });
201
+ initDB(db);
202
+ const handler = handleActuateAPI({
203
+ prismaClient: db,
204
+ config: { collections: { posts: postsCollection } },
205
+ });
206
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
207
+ method: 'POST',
208
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
209
+ body: JSON.stringify({ collection: 'posts', id: 'nope' }),
210
+ }));
211
+ expect(response.status).toBe(404);
212
+ });
213
+ it('returns 400 when neither id+collection nor content is supplied', async () => {
214
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
215
+ const db = createMockDB({ apiKey: record });
216
+ initDB(db);
217
+ const handler = handleActuateAPI({
218
+ prismaClient: db,
219
+ config: { collections: { posts: postsCollection } },
220
+ });
221
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
222
+ method: 'POST',
223
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
224
+ body: JSON.stringify({}),
225
+ }));
226
+ expect(response.status).toBe(400);
227
+ });
228
+ it('requires authentication', async () => {
229
+ const db = createMockDB({});
230
+ initDB(db);
231
+ const handler = handleActuateAPI({
232
+ prismaClient: db,
233
+ config: { collections: { posts: postsCollection } },
234
+ });
235
+ const response = await handler(new Request('https://example.com/api/cms/ai/audit-document', {
236
+ method: 'POST',
237
+ headers: { 'Content-Type': 'application/json' },
238
+ body: JSON.stringify({ title: 'x', body: 'y' }),
239
+ }));
240
+ expect(response.status).toBeGreaterThanOrEqual(401);
241
+ expect(response.status).toBeLessThan(500);
242
+ });
243
+ });
244
+ describe('POST /ai/suggest-internal-links', () => {
245
+ beforeEach(() => {
246
+ delete globalThis.__actuateConfig;
247
+ process.env.CMS_SECRET = VALID_SECRET;
248
+ });
249
+ it('suggests links based on published documents in the requested collection', async () => {
250
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
251
+ const db = createMockDB({
252
+ apiKey: record,
253
+ documents: [
254
+ {
255
+ id: 'doc-1',
256
+ collection: 'posts',
257
+ title: 'Coffee grinders explained',
258
+ slug: 'coffee-grinders',
259
+ status: 'PUBLISHED',
260
+ deletedAt: null,
261
+ data: { title: 'Coffee grinders explained', tags: ['grinder', 'brewing'] },
262
+ },
263
+ {
264
+ id: 'doc-2',
265
+ collection: 'posts',
266
+ title: 'Pour-over basics',
267
+ slug: 'pour-over-basics',
268
+ status: 'PUBLISHED',
269
+ deletedAt: null,
270
+ data: { title: 'Pour-over basics' },
271
+ },
272
+ {
273
+ id: 'doc-3',
274
+ collection: 'posts',
275
+ title: 'Draft post',
276
+ slug: 'draft',
277
+ status: 'DRAFT',
278
+ deletedAt: null,
279
+ data: { title: 'Draft post' },
280
+ },
281
+ ],
282
+ });
283
+ initDB(db);
284
+ const handler = handleActuateAPI({
285
+ prismaClient: db,
286
+ config: { collections: { posts: postsCollection } },
287
+ });
288
+ const response = await handler(new Request('https://example.com/api/cms/ai/suggest-internal-links', {
289
+ method: 'POST',
290
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
291
+ body: JSON.stringify({
292
+ content: 'A great brew starts with the right grind. See coffee grinders explained for more.',
293
+ collection: 'posts',
294
+ }),
295
+ }));
296
+ expect(response.status).toBe(200);
297
+ const body = await response.json();
298
+ // Only PUBLISHED docs are passed to the suggester — the DRAFT post is filtered.
299
+ expect(body.data.candidatesScanned).toBe(2);
300
+ expect(body.data.suggestions).toHaveLength(2);
301
+ expect(body.data.suggestions[0].targetPage.title).toBe('Coffee grinders explained');
302
+ });
303
+ it('honors the excludeId option to skip the doc being edited', async () => {
304
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
305
+ const db = createMockDB({
306
+ apiKey: record,
307
+ documents: [
308
+ {
309
+ id: 'doc-1',
310
+ collection: 'posts',
311
+ title: 'First',
312
+ slug: 'first',
313
+ status: 'PUBLISHED',
314
+ deletedAt: null,
315
+ data: { title: 'First' },
316
+ },
317
+ {
318
+ id: 'doc-2',
319
+ collection: 'posts',
320
+ title: 'Second',
321
+ slug: 'second',
322
+ status: 'PUBLISHED',
323
+ deletedAt: null,
324
+ data: { title: 'Second' },
325
+ },
326
+ ],
327
+ });
328
+ initDB(db);
329
+ const handler = handleActuateAPI({
330
+ prismaClient: db,
331
+ config: { collections: { posts: postsCollection } },
332
+ });
333
+ const response = await handler(new Request('https://example.com/api/cms/ai/suggest-internal-links', {
334
+ method: 'POST',
335
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
336
+ body: JSON.stringify({
337
+ content: 'Some content.',
338
+ collection: 'posts',
339
+ excludeId: 'doc-1',
340
+ }),
341
+ }));
342
+ expect(response.status).toBe(200);
343
+ const body = await response.json();
344
+ expect(body.data.candidatesScanned).toBe(1);
345
+ expect(body.data.suggestions[0].targetPage.id).toBe('doc-2');
346
+ });
347
+ it('returns 400 when content is missing', async () => {
348
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
349
+ const db = createMockDB({ apiKey: record });
350
+ initDB(db);
351
+ const handler = handleActuateAPI({
352
+ prismaClient: db,
353
+ config: { collections: { posts: postsCollection } },
354
+ });
355
+ const response = await handler(new Request('https://example.com/api/cms/ai/suggest-internal-links', {
356
+ method: 'POST',
357
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
358
+ body: JSON.stringify({}),
359
+ }));
360
+ expect(response.status).toBe(400);
361
+ });
362
+ });
363
+ describe('POST /ai/coauthor', () => {
364
+ beforeEach(() => {
365
+ delete globalThis.__actuateConfig;
366
+ process.env.CMS_SECRET = VALID_SECRET;
367
+ process.env.ACTUATE_DISABLE_RATE_LIMIT = '1';
368
+ });
369
+ it('rewrites text with style + tone hints', async () => {
370
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
371
+ const db = createMockDB({ apiKey: record });
372
+ initDB(db);
373
+ const handler = handleActuateAPI({
374
+ prismaClient: db,
375
+ config: { collections: { posts: postsCollection } },
376
+ });
377
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
378
+ method: 'POST',
379
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
380
+ body: JSON.stringify({
381
+ action: 'rewrite',
382
+ text: 'Original content here.',
383
+ style: 'casual',
384
+ tone: 'friendly',
385
+ }),
386
+ }));
387
+ expect(response.status).toBe(200);
388
+ const body = await response.json();
389
+ expect(body.data.action).toBe('rewrite');
390
+ expect(body.data.text).toContain('Original content here.');
391
+ expect(body.data.text).toContain('casual');
392
+ expect(body.data.text).toContain('friendly');
393
+ });
394
+ it('expands and compresses text', async () => {
395
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
396
+ const db = createMockDB({ apiKey: record });
397
+ initDB(db);
398
+ const handler = handleActuateAPI({
399
+ prismaClient: db,
400
+ config: { collections: { posts: postsCollection } },
401
+ });
402
+ const expandRes = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
403
+ method: 'POST',
404
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
405
+ body: JSON.stringify({ action: 'expand', text: 'Short.', instructions: 'add detail' }),
406
+ }));
407
+ expect(expandRes.status).toBe(200);
408
+ expect((await expandRes.json()).data.text).toContain('more detail');
409
+ const compressRes = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
410
+ method: 'POST',
411
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
412
+ body: JSON.stringify({
413
+ action: 'compress',
414
+ text: 'Lorem ipsum dolor sit amet consectetur adipiscing elit.',
415
+ targetLength: 20,
416
+ }),
417
+ }));
418
+ expect(compressRes.status).toBe(200);
419
+ expect((await compressRes.json()).data.text.length).toBeLessThanOrEqual(60);
420
+ });
421
+ it('proofreads and surfaces structured changes', async () => {
422
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
423
+ const db = createMockDB({ apiKey: record });
424
+ initDB(db);
425
+ const handler = handleActuateAPI({
426
+ prismaClient: db,
427
+ config: { collections: { posts: postsCollection } },
428
+ });
429
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
430
+ method: 'POST',
431
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
432
+ body: JSON.stringify({ action: 'proofread', text: 'teh quick brown fox' }),
433
+ }));
434
+ expect(response.status).toBe(200);
435
+ const body = await response.json();
436
+ expect(body.data.text).toBe('the quick brown fox');
437
+ expect(body.data.changes).toEqual([{ original: 'teh', corrected: 'the', type: 'spelling' }]);
438
+ });
439
+ it('returns 400 when text is missing', async () => {
440
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
441
+ const db = createMockDB({ apiKey: record });
442
+ initDB(db);
443
+ const handler = handleActuateAPI({
444
+ prismaClient: db,
445
+ config: { collections: { posts: postsCollection } },
446
+ });
447
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
448
+ method: 'POST',
449
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
450
+ body: JSON.stringify({ action: 'rewrite' }),
451
+ }));
452
+ expect(response.status).toBe(400);
453
+ });
454
+ it('returns 400 for unknown action', async () => {
455
+ const { key, record } = await makeKey({ collections: ['posts'], actions: ['read'] });
456
+ const db = createMockDB({ apiKey: record });
457
+ initDB(db);
458
+ const handler = handleActuateAPI({
459
+ prismaClient: db,
460
+ config: { collections: { posts: postsCollection } },
461
+ });
462
+ const response = await handler(new Request('https://example.com/api/cms/ai/coauthor', {
463
+ method: 'POST',
464
+ headers: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' },
465
+ body: JSON.stringify({ action: 'translate', text: 'x' }),
466
+ }));
467
+ expect(response.status).toBe(400);
468
+ });
469
+ });
470
+ //# sourceMappingURL=ai-quality.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-quality.test.js","sourceRoot":"","sources":["../../../src/__tests__/api/ai-quality.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=component-block.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-block.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fields/component-block.test.ts"],"names":[],"mappings":""}