@prenta/core 7.7.0 → 7.7.1

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 (58) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/api/routes/seo/handlers/analysis.d.ts +4 -0
  3. package/dist/api/routes/seo/handlers/analysis.d.ts.map +1 -0
  4. package/dist/api/routes/seo/handlers/analysis.js +131 -0
  5. package/dist/api/routes/seo/handlers/analysis.js.map +1 -0
  6. package/dist/api/routes/seo/handlers/audits.d.ts +5 -0
  7. package/dist/api/routes/seo/handlers/audits.d.ts.map +1 -0
  8. package/dist/api/routes/seo/handlers/audits.js +121 -0
  9. package/dist/api/routes/seo/handlers/audits.js.map +1 -0
  10. package/dist/api/routes/seo/handlers/content.d.ts +4 -0
  11. package/dist/api/routes/seo/handlers/content.d.ts.map +1 -0
  12. package/dist/api/routes/seo/handlers/content.js +330 -0
  13. package/dist/api/routes/seo/handlers/content.js.map +1 -0
  14. package/dist/api/routes/seo/handlers/issue-helpers.d.ts +37 -0
  15. package/dist/api/routes/seo/handlers/issue-helpers.d.ts.map +1 -0
  16. package/dist/api/routes/seo/handlers/issue-helpers.js +72 -0
  17. package/dist/api/routes/seo/handlers/issue-helpers.js.map +1 -0
  18. package/dist/api/routes/seo/handlers/issues-briefs.d.ts +7 -0
  19. package/dist/api/routes/seo/handlers/issues-briefs.d.ts.map +1 -0
  20. package/dist/api/routes/seo/handlers/issues-briefs.js +341 -0
  21. package/dist/api/routes/seo/handlers/issues-briefs.js.map +1 -0
  22. package/dist/api/routes/seo/handlers/issues-fixes.d.ts +4 -0
  23. package/dist/api/routes/seo/handlers/issues-fixes.d.ts.map +1 -0
  24. package/dist/api/routes/seo/handlers/issues-fixes.js +233 -0
  25. package/dist/api/routes/seo/handlers/issues-fixes.js.map +1 -0
  26. package/dist/api/routes/seo/handlers/issues-list.d.ts +7 -0
  27. package/dist/api/routes/seo/handlers/issues-list.d.ts.map +1 -0
  28. package/dist/api/routes/seo/handlers/issues-list.js +191 -0
  29. package/dist/api/routes/seo/handlers/issues-list.js.map +1 -0
  30. package/dist/api/routes/seo/handlers/links.d.ts +6 -0
  31. package/dist/api/routes/seo/handlers/links.d.ts.map +1 -0
  32. package/dist/api/routes/seo/handlers/links.js +383 -0
  33. package/dist/api/routes/seo/handlers/links.js.map +1 -0
  34. package/dist/api/routes/seo/handlers/overview.d.ts +4 -0
  35. package/dist/api/routes/seo/handlers/overview.d.ts.map +1 -0
  36. package/dist/api/routes/seo/handlers/overview.js +348 -0
  37. package/dist/api/routes/seo/handlers/overview.js.map +1 -0
  38. package/dist/api/routes/seo/handlers/pages.d.ts +2 -0
  39. package/dist/api/routes/seo/handlers/pages.d.ts.map +1 -0
  40. package/dist/api/routes/seo/handlers/pages.js +38 -0
  41. package/dist/api/routes/seo/handlers/pages.js.map +1 -0
  42. package/dist/api/routes/seo/handlers/proposals.d.ts +4 -0
  43. package/dist/api/routes/seo/handlers/proposals.d.ts.map +1 -0
  44. package/dist/api/routes/seo/handlers/proposals.js +93 -0
  45. package/dist/api/routes/seo/handlers/proposals.js.map +1 -0
  46. package/dist/api/routes/seo/handlers/public-files.d.ts +6 -0
  47. package/dist/api/routes/seo/handlers/public-files.d.ts.map +1 -0
  48. package/dist/api/routes/seo/handlers/public-files.js +328 -0
  49. package/dist/api/routes/seo/handlers/public-files.js.map +1 -0
  50. package/dist/api/routes/seo/handlers/shared.d.ts +24 -0
  51. package/dist/api/routes/seo/handlers/shared.d.ts.map +1 -0
  52. package/dist/api/routes/seo/handlers/shared.js +67 -0
  53. package/dist/api/routes/seo/handlers/shared.js.map +1 -0
  54. package/dist/api/routes/seo.d.ts +5 -5
  55. package/dist/api/routes/seo.d.ts.map +1 -1
  56. package/dist/api/routes/seo.js +56 -2610
  57. package/dist/api/routes/seo.js.map +1 -1
  58. package/package.json +1 -1
@@ -0,0 +1,383 @@
1
+ import { logEvent } from '../../../../security/audit.js';
2
+ import { isResolvedIp } from '../../../../security/client-ip.js';
3
+ import { classifyLinkHealthIssue, extractOutboundUrlsFromDocumentData, probeOutboundLink, } from '../../../../seo/link-probe.js';
4
+ import { documentPublicPath, resolveTrailingSlashPolicy, trailingSlashMismatchTarget, } from '../../../../seo/document-path.js';
5
+ import { getPrentaConfig } from '../../../../config/runtime.js';
6
+ import { assertPlanFeature } from '../../../../plan/features.js';
7
+ import { json, errorResponse, internalError, asRecord, hasModel, requireAuth, buildActionContext, WRITE_ROLES, requireRole, linkHealthLimiter, aiGenerateLimiter, checkRateLimitAsync, clientIp, } from '../../../route-helpers.js';
8
+ import { gatherNavigationLinkTargets } from '../../../../seo/nav-link-targets.js';
9
+ import { suggestInboundLinks } from '../../../../seo/link-suggest.js';
10
+ import { seoLinkApplyBodySchema, validateBody } from '../../../validate-body.js';
11
+ import { db, planRequiredResponse, mapInternalLinkInsertError } from './shared.js';
12
+ export async function getSeoLinkHealth(request) {
13
+ try {
14
+ const auth = await requireAuth(request);
15
+ if (auth.error)
16
+ return auth.error;
17
+ // EDITOR+ only — this endpoint hits arbitrary URLs and can be expensive.
18
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
19
+ if (roleErr)
20
+ return roleErr;
21
+ // Tight rate limit because each call fans out to many outbound requests.
22
+ const ip = clientIp(request);
23
+ const rateKey = isResolvedIp(ip)
24
+ ? `link-health:${ip}`
25
+ : `link-health-user:${auth.session.userId}`;
26
+ if (!(await checkRateLimitAsync(linkHealthLimiter, rateKey))) {
27
+ return errorResponse('Too many link-health scans. Please try again later.', 429);
28
+ }
29
+ const MAX_LINKS_PER_PAGE = 50;
30
+ const MAX_TOTAL_LINKS = 500;
31
+ const DOC_BATCH_SIZE = 100;
32
+ const PER_LINK_TIMEOUT_MS = 4000;
33
+ const CONCURRENCY = 8;
34
+ const siteSeo = getPrentaConfig()?.seo;
35
+ const siteUrl = (siteSeo?.siteUrl ?? process.env.NEXT_PUBLIC_SITE_URL ?? '').replace(/\/+$/, '');
36
+ const trailingSlash = resolveTrailingSlashPolicy(siteSeo?.trailingSlash);
37
+ const queue = [];
38
+ const seenGlobal = new Set();
39
+ let docsScanned = 0;
40
+ let skip = 0;
41
+ scanLoop: while (queue.length < MAX_TOTAL_LINKS) {
42
+ const batch = await db().document.findMany({
43
+ where: { deletedAt: null, status: 'PUBLISHED' },
44
+ select: { id: true, title: true, data: true, collection: true },
45
+ orderBy: { updatedAt: 'desc' },
46
+ skip,
47
+ take: DOC_BATCH_SIZE,
48
+ });
49
+ if (batch.length === 0)
50
+ break;
51
+ docsScanned += batch.length;
52
+ skip += batch.length;
53
+ for (const doc of batch) {
54
+ const pageTitle = doc.title ?? doc.data?.title ?? doc.id;
55
+ // Walk unescaped string fields — never JSON.stringify (captures `\`
56
+ // from `\"` and produces mass false positives).
57
+ const urls = extractOutboundUrlsFromDocumentData(doc.data ?? {}, { siteUrl });
58
+ let countInPage = 0;
59
+ for (const clean of urls) {
60
+ if (seenGlobal.has(clean))
61
+ continue;
62
+ seenGlobal.add(clean);
63
+ if (countInPage >= MAX_LINKS_PER_PAGE)
64
+ break;
65
+ if (queue.length >= MAX_TOTAL_LINKS)
66
+ break scanLoop;
67
+ const isInternal = !!siteUrl && clean.startsWith(siteUrl);
68
+ queue.push({ docId: doc.id, pageTitle, clean, isInternal });
69
+ countInPage++;
70
+ }
71
+ }
72
+ }
73
+ const linkResults = [];
74
+ let cursor = 0;
75
+ const worker = async () => {
76
+ while (cursor < queue.length) {
77
+ const idx = cursor++;
78
+ const job = queue[idx];
79
+ // GET + browser UA. safeFetch rejects private/loopback IPs and
80
+ // disables redirect following so 302→internal can't bypass SSRF.
81
+ // Retry once on status 0 — a single timeout was a known false
82
+ // positive on otherwise-200 pages.
83
+ const probed = await probeOutboundLink(job.clean, {
84
+ timeoutMs: PER_LINK_TIMEOUT_MS,
85
+ retryUnreachable: true,
86
+ });
87
+ const kind = classifyLinkHealthIssue(probed.status);
88
+ const slashTarget = job.isInternal && !kind ? trailingSlashMismatchTarget(job.clean, trailingSlash) : null;
89
+ if (!kind && !slashTarget)
90
+ continue;
91
+ linkResults.push({
92
+ id: `${job.docId}-${idx}`,
93
+ page: job.pageTitle,
94
+ url: job.clean,
95
+ status: kind ? probed.status : 308,
96
+ type: job.isInternal ? 'internal' : 'external',
97
+ kind: kind ?? 'redirected',
98
+ ...(probed.redirectTarget || slashTarget
99
+ ? { redirectTarget: probed.redirectTarget ?? slashTarget ?? undefined }
100
+ : {}),
101
+ });
102
+ }
103
+ };
104
+ await Promise.all(Array.from({ length: Math.min(CONCURRENCY, queue.length) }, worker));
105
+ return json({
106
+ data: {
107
+ truncated: queue.length >= MAX_TOTAL_LINKS,
108
+ docsScanned,
109
+ checked: queue.length,
110
+ issues: linkResults,
111
+ },
112
+ });
113
+ }
114
+ catch (err) {
115
+ return internalError(err);
116
+ }
117
+ }
118
+ export async function getSeoLinkSnapshot(request) {
119
+ try {
120
+ const auth = await requireAuth(request);
121
+ if (auth.error)
122
+ return auth.error;
123
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
124
+ if (roleErr)
125
+ return roleErr;
126
+ const { gatherAuditEntities, frontEndContentCollectionTypes } = await import('../../../../seo/audit-runner.js');
127
+ const { buildLinkGraphSnapshot } = await import('../../../../seo/link-graph.js');
128
+ const { getSeoOverrides, resolveSeoModuleSettings } = await import('../../../../seo/config-store.js');
129
+ const cfg = getPrentaConfig();
130
+ const collectionTypes = frontEndContentCollectionTypes(cfg);
131
+ const siteUrl = cfg?.seo?.siteUrl?.replace(/\/+$/, '') ?? '';
132
+ const entities = await gatherAuditEntities(db(), { collectionTypes });
133
+ const docRows = await db()
134
+ .document.findMany({
135
+ where: {
136
+ deletedAt: null,
137
+ status: 'PUBLISHED',
138
+ collection: { in: Object.keys(collectionTypes) },
139
+ },
140
+ select: { id: true, collection: true },
141
+ })
142
+ .catch(() => []);
143
+ const collections = Object.fromEntries(docRows.map((d) => [d.id, d.collection]));
144
+ let brokenLinkCount = 0;
145
+ if (hasModel(db(), 'seoIssue')) {
146
+ brokenLinkCount = await db()
147
+ .seoIssue.count({
148
+ where: {
149
+ status: { in: ['open', 'recurring'] },
150
+ type: 'broken-internal-link',
151
+ },
152
+ })
153
+ .catch(() => 0);
154
+ }
155
+ const overrides = await getSeoOverrides(db()).catch(() => null);
156
+ const moduleSettings = resolveSeoModuleSettings(overrides);
157
+ // Global nav/footer menus link to top-level pages from site chrome, not
158
+ // from document bodies. Feed those targets in so nav-only reachable pages
159
+ // are not mis-reported as orphaned. Best-effort: no-op when the navigation
160
+ // plugin isn't installed.
161
+ const navLinks = await gatherNavigationLinkTargets(db());
162
+ const snapshot = buildLinkGraphSnapshot({
163
+ entities,
164
+ siteUrl,
165
+ collections,
166
+ brokenLinkCount,
167
+ aiIndexLastRunAt: moduleSettings.linkAiIndexLastRunAt,
168
+ navLinks,
169
+ });
170
+ return json({ data: snapshot });
171
+ }
172
+ catch (err) {
173
+ return internalError(err, 'seo/links/snapshot');
174
+ }
175
+ }
176
+ export async function postSeoLinkAiIndex(request) {
177
+ try {
178
+ const auth = await requireAuth(request);
179
+ if (auth.error)
180
+ return auth.error;
181
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
182
+ if (roleErr)
183
+ return roleErr;
184
+ if (!(await checkRateLimitAsync(aiGenerateLimiter, `link-ai-index:${auth.session.userId}`))) {
185
+ return errorResponse('AI link index rate limit reached. Try again later.', 429);
186
+ }
187
+ const { gatherAuditEntities, frontEndContentCollectionTypes } = await import('../../../../seo/audit-runner.js');
188
+ const { patchSeoModuleSettings } = await import('../../../../seo/config-store.js');
189
+ const cfg = getPrentaConfig();
190
+ const collectionTypes = frontEndContentCollectionTypes(cfg);
191
+ const entities = await gatherAuditEntities(db(), { collectionTypes });
192
+ // Availability = the governed runtime can serve the link feature right
193
+ // now (toggle on, model + key resolvable, budget/cap not exhausted) AND
194
+ // the resolved provider has an embeddings API in the runtime. A
195
+ // text-only provider (Anthropic, xAI) resolves fine but `embedForFeature`
196
+ // would refuse with `no_model`, so suggestions stay on phrase matching.
197
+ const { embeddingsAvailableForProvider, resolveFeatureRuntime } = await import('../../../../ai/index.js');
198
+ const probe = await resolveFeatureRuntime(db(), 'ai.features.seoInternalLinks');
199
+ const aiAvailable = probe.ok && embeddingsAvailableForProvider(probe.providerKey);
200
+ const now = new Date().toISOString();
201
+ await patchSeoModuleSettings(db(), { linkAiIndexLastRunAt: now }, auth.session.userId);
202
+ await logEvent({
203
+ event: 'seo_link_ai_index',
204
+ userId: auth.session.userId,
205
+ details: { entitiesIndexed: entities.length, aiAvailable },
206
+ });
207
+ return json({
208
+ data: {
209
+ indexedAt: now,
210
+ entitiesIndexed: entities.length,
211
+ aiAvailable,
212
+ // No standing index/embeddings are persisted here — /seo/links/suggest
213
+ // rebuilds the corpus on demand and works with or without this run.
214
+ // Keep the copy honest: this refreshes the link corpus and records the
215
+ // run; it does not "build" anything suggestions depend on.
216
+ message: aiAvailable
217
+ ? 'Link corpus refreshed. AI link suggestions are generated on demand — run them on orphaned or under-linked pages.'
218
+ : 'Link corpus refreshed. Connect an AI provider in Settings > AI to enable semantic link suggestions; phrase matching is active meanwhile.',
219
+ },
220
+ });
221
+ }
222
+ catch (err) {
223
+ return internalError(err, 'seo/links/ai-index');
224
+ }
225
+ }
226
+ export async function postSeoLinkSuggest(request) {
227
+ try {
228
+ const auth = await requireAuth(request);
229
+ if (auth.error)
230
+ return auth.error;
231
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
232
+ if (roleErr)
233
+ return roleErr;
234
+ if (!(await checkRateLimitAsync(aiGenerateLimiter, `link-suggest:${auth.session.userId}`))) {
235
+ return errorResponse('Link suggestion rate limit reached. Try again later.', 429);
236
+ }
237
+ const body = (await request.json());
238
+ if (!body.targetEntityId || !body.targetEntityType) {
239
+ return errorResponse('targetEntityId and targetEntityType are required', 400);
240
+ }
241
+ const limit = Math.max(1, Math.min(20, typeof body.limit === 'number' ? body.limit : 8));
242
+ let result;
243
+ try {
244
+ result = await suggestInboundLinks({
245
+ db: db(),
246
+ targetEntityId: body.targetEntityId,
247
+ targetEntityType: body.targetEntityType,
248
+ limit,
249
+ userId: auth.session.userId,
250
+ });
251
+ }
252
+ catch (err) {
253
+ if (err instanceof Error && err.message === 'TARGET_NOT_FOUND') {
254
+ return errorResponse('Target document not found in link graph', 404);
255
+ }
256
+ throw err;
257
+ }
258
+ return json({
259
+ data: {
260
+ target: result.target,
261
+ suggestions: result.suggestions,
262
+ },
263
+ });
264
+ }
265
+ catch (err) {
266
+ return internalError(err, 'seo/links/suggest');
267
+ }
268
+ }
269
+ export async function postSeoLinkApply(request) {
270
+ try {
271
+ const auth = await requireAuth(request);
272
+ if (auth.error)
273
+ return auth.error;
274
+ const roleErr = requireRole(auth.session.role, WRITE_ROLES);
275
+ if (roleErr)
276
+ return roleErr;
277
+ const inlinePlanErr = assertPlanFeature('seo.inlineApply');
278
+ if (inlinePlanErr)
279
+ return planRequiredResponse(inlinePlanErr);
280
+ if (!(await checkRateLimitAsync(aiGenerateLimiter, `link-apply:${auth.session.userId}`))) {
281
+ return errorResponse('Link apply rate limit reached. Try again later.', 429);
282
+ }
283
+ const parsed = await validateBody(request, seoLinkApplyBodySchema);
284
+ if (!parsed.ok)
285
+ return parsed.error;
286
+ const { sourceEntityId, targetEntityId, anchorText, fingerprint } = parsed.data;
287
+ const source = await db().document.findFirst({
288
+ where: { id: sourceEntityId, deletedAt: null },
289
+ select: {
290
+ id: true,
291
+ collection: true,
292
+ updatedAt: true,
293
+ data: true,
294
+ slug: true,
295
+ status: true,
296
+ },
297
+ });
298
+ if (!source)
299
+ return errorResponse('Source document not found', 404);
300
+ const target = await db().document.findFirst({
301
+ where: { id: targetEntityId, deletedAt: null },
302
+ select: { id: true, collection: true, data: true, slug: true, status: true },
303
+ });
304
+ if (!target)
305
+ return errorResponse('Target document not found', 404);
306
+ const targetData = asRecord(target.data);
307
+ const targetSlug = (typeof targetData.slug === 'string' && targetData.slug) ||
308
+ (typeof target.slug === 'string' && target.slug) ||
309
+ target.id;
310
+ const collectionDef = getPrentaConfig()?.collections?.[target.collection];
311
+ const targetPath = documentPublicPath({
312
+ urlPrefix: collectionDef?.urlPrefix,
313
+ slug: targetSlug,
314
+ data: targetData,
315
+ });
316
+ const { applyAndVerifyInternalLinkInsert, buildInsertLinkFingerprint } = await import('../../../../seo/issue-fix-link-insert.js');
317
+ const liveFingerprint = buildInsertLinkFingerprint(sourceEntityId, targetEntityId, anchorText, source.updatedAt instanceof Date ? source.updatedAt : new Date(source.updatedAt));
318
+ if (fingerprint !== liveFingerprint) {
319
+ return errorResponse('This fix is stale — the page changed since the suggestion was loaded. Expand the row again.', 409);
320
+ }
321
+ const ctx = buildActionContext(auth.session, db());
322
+ let verified;
323
+ try {
324
+ const result = await applyAndVerifyInternalLinkInsert({
325
+ db: db(),
326
+ ctx,
327
+ sourceEntityId,
328
+ targetEntityId,
329
+ anchorText,
330
+ targetPath,
331
+ siteUrl: getPrentaConfig()?.seo?.siteUrl ?? '',
332
+ navLinks: await gatherNavigationLinkTargets(db()),
333
+ });
334
+ verified = result.verify;
335
+ }
336
+ catch (err) {
337
+ const mapped = mapInternalLinkInsertError(err);
338
+ if (mapped)
339
+ return mapped;
340
+ throw err;
341
+ }
342
+ if (!verified.ok) {
343
+ return json({ error: 'Fix applied but verification failed.', reason: verified.reason }, 409);
344
+ }
345
+ if (hasModel(db(), 'seoIssue')) {
346
+ await db().seoIssue.updateMany({
347
+ where: {
348
+ type: 'orphan-page',
349
+ entityId: targetEntityId,
350
+ status: { in: ['open', 'recurring'] },
351
+ },
352
+ data: {
353
+ status: 'resolved',
354
+ resolvedAt: new Date(),
355
+ resolvedById: auth.session.userId,
356
+ },
357
+ });
358
+ }
359
+ try {
360
+ await logEvent({
361
+ event: 'document_updated',
362
+ userId: auth.session.userId,
363
+ details: {
364
+ action: 'seo_internal_link_applied',
365
+ seoFix: 'insert-link',
366
+ sourceEntityId,
367
+ targetEntityId,
368
+ targetPath,
369
+ },
370
+ });
371
+ }
372
+ catch {
373
+ /* noop */
374
+ }
375
+ return json({
376
+ data: { sourceEntityId, targetEntityId, targetPath, applied: true },
377
+ });
378
+ }
379
+ catch (err) {
380
+ return internalError(err, 'seo/links/apply');
381
+ }
382
+ }
383
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../../../../src/api/routes/seo/handlers/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function getSeoOverview(request: Request): Promise<Response>;
2
+ export declare function getSeoSearchPerformance(request: Request): Promise<Response>;
3
+ export declare function getSeoSearchInsights(request: Request, params: Record<string, string>): Promise<Response>;
4
+ //# sourceMappingURL=overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../../../src/api/routes/seo/handlers/overview.ts"],"names":[],"mappings":"AA6HA,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA8LxE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAcjF;AAID,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAoDnB"}