@prenta/core 5.4.1 → 5.6.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 (70) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/ai/governance.d.ts +6 -0
  3. package/dist/ai/governance.d.ts.map +1 -1
  4. package/dist/ai/governance.js +19 -0
  5. package/dist/ai/governance.js.map +1 -1
  6. package/dist/api/route-helpers.d.ts +1 -0
  7. package/dist/api/route-helpers.d.ts.map +1 -1
  8. package/dist/api/route-helpers.js +6 -0
  9. package/dist/api/route-helpers.js.map +1 -1
  10. package/dist/api/routes/redirects.d.ts.map +1 -1
  11. package/dist/api/routes/redirects.js +17 -65
  12. package/dist/api/routes/redirects.js.map +1 -1
  13. package/dist/api/routes/scheduling.d.ts.map +1 -1
  14. package/dist/api/routes/scheduling.js +47 -5
  15. package/dist/api/routes/scheduling.js.map +1 -1
  16. package/dist/api/routes/seo-public.d.ts.map +1 -1
  17. package/dist/api/routes/seo-public.js +142 -1
  18. package/dist/api/routes/seo-public.js.map +1 -1
  19. package/dist/api/routes/seo.d.ts.map +1 -1
  20. package/dist/api/routes/seo.js +195 -360
  21. package/dist/api/routes/seo.js.map +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/redirects/suggestion-accept.d.ts +28 -0
  27. package/dist/redirects/suggestion-accept.d.ts.map +1 -0
  28. package/dist/redirects/suggestion-accept.js +98 -0
  29. package/dist/redirects/suggestion-accept.js.map +1 -0
  30. package/dist/seo/audit-runner.d.ts +16 -0
  31. package/dist/seo/audit-runner.d.ts.map +1 -1
  32. package/dist/seo/audit-runner.js +39 -3
  33. package/dist/seo/audit-runner.js.map +1 -1
  34. package/dist/seo/config-store.d.ts +8 -0
  35. package/dist/seo/config-store.d.ts.map +1 -1
  36. package/dist/seo/config-store.js +4 -0
  37. package/dist/seo/config-store.js.map +1 -1
  38. package/dist/seo/digest.d.ts +87 -0
  39. package/dist/seo/digest.d.ts.map +1 -0
  40. package/dist/seo/digest.js +316 -0
  41. package/dist/seo/digest.js.map +1 -0
  42. package/dist/seo/index.d.ts +7 -3
  43. package/dist/seo/index.d.ts.map +1 -1
  44. package/dist/seo/index.js +6 -2
  45. package/dist/seo/index.js.map +1 -1
  46. package/dist/seo/issue-fix-ai.d.ts +40 -1
  47. package/dist/seo/issue-fix-ai.d.ts.map +1 -1
  48. package/dist/seo/issue-fix-ai.js +53 -1
  49. package/dist/seo/issue-fix-ai.js.map +1 -1
  50. package/dist/seo/issue-fix-apply.d.ts +85 -0
  51. package/dist/seo/issue-fix-apply.d.ts.map +1 -0
  52. package/dist/seo/issue-fix-apply.js +400 -0
  53. package/dist/seo/issue-fix-apply.js.map +1 -0
  54. package/dist/seo/issue-fix.d.ts +9 -0
  55. package/dist/seo/issue-fix.d.ts.map +1 -1
  56. package/dist/seo/issue-fix.js +1 -0
  57. package/dist/seo/issue-fix.js.map +1 -1
  58. package/dist/seo/proposals-bulk-apply.d.ts +52 -0
  59. package/dist/seo/proposals-bulk-apply.d.ts.map +1 -0
  60. package/dist/seo/proposals-bulk-apply.js +183 -0
  61. package/dist/seo/proposals-bulk-apply.js.map +1 -0
  62. package/dist/seo/proposals-generate.d.ts +43 -0
  63. package/dist/seo/proposals-generate.d.ts.map +1 -0
  64. package/dist/seo/proposals-generate.js +138 -0
  65. package/dist/seo/proposals-generate.js.map +1 -0
  66. package/dist/seo/proposals.d.ts +116 -0
  67. package/dist/seo/proposals.d.ts.map +1 -0
  68. package/dist/seo/proposals.js +236 -0
  69. package/dist/seo/proposals.js.map +1 -0
  70. package/package.json +1 -1
@@ -0,0 +1,316 @@
1
+ import { getPrentaConfig } from '../config/runtime.js';
2
+ import { resolveEmailSenderAsync } from '../email/resolve.js';
3
+ import { buildQuickWins } from './audit-engine.js';
4
+ import { getSeoOverrides, patchSeoModuleSettings, resolveSeoModuleSettings, } from './config-store.js';
5
+ import { pendingFixFromMetadata } from './issue-fix-ai.js';
6
+ import { gradeForSeoScore } from './score.js';
7
+ /** Latest COMPLETED run older than this ⇒ prominent staleness callout. */
8
+ const STALE_AFTER_MS = 8 * 24 * 60 * 60 * 1000;
9
+ const DAY_MS = 24 * 60 * 60 * 1000;
10
+ const SEVERITY_RANK = { critical: 3, warning: 2, info: 1 };
11
+ export async function buildSeoDigest(db, options = {}) {
12
+ const now = options.now ?? new Date();
13
+ if (!db?.seoAuditRun?.findFirst)
14
+ return null;
15
+ const lastCompleted = await db.seoAuditRun.findFirst({
16
+ where: { status: 'COMPLETED' },
17
+ orderBy: { startedAt: 'desc' },
18
+ });
19
+ if (!lastCompleted)
20
+ return null;
21
+ const mostRecent = await db.seoAuditRun.findFirst({ orderBy: { startedAt: 'desc' } });
22
+ const prevCompleted = await db.seoAuditRun.findFirst({
23
+ where: { status: 'COMPLETED', startedAt: { lt: lastCompleted.startedAt } },
24
+ orderBy: { startedAt: 'desc' },
25
+ });
26
+ const dataAsOf = new Date(lastCompleted.startedAt);
27
+ const score = lastCompleted.siteScoreAfter ?? 0;
28
+ const delta = lastCompleted.siteScoreAfter != null && lastCompleted.siteScoreBefore != null
29
+ ? lastCompleted.siteScoreAfter - lastCompleted.siteScoreBefore
30
+ : null;
31
+ // Open issues (the /seo/overview recipe) — fetched once, reused for the
32
+ // new-issue window, quick wins, and pendingFix counting.
33
+ let openIssues = [];
34
+ if (db?.seoIssue?.findMany) {
35
+ openIssues = await db.seoIssue.findMany({
36
+ where: { status: { in: ['open', 'recurring'] } },
37
+ orderBy: { lastDetectedAt: 'desc' },
38
+ take: 200,
39
+ });
40
+ }
41
+ const windowStart = prevCompleted
42
+ ? new Date(prevCompleted.startedAt)
43
+ : new Date(dataAsOf.getTime() - 7 * DAY_MS);
44
+ const newIssueRows = openIssues
45
+ .filter((i) => new Date(i.firstDetectedAt).getTime() >= windowStart.getTime())
46
+ .sort((a, b) => (SEVERITY_RANK[b.severity] ?? 0) - (SEVERITY_RANK[a.severity] ?? 0));
47
+ // Impression weighting for quick wins (optional — synced search data).
48
+ const impressionsByEntityId = {};
49
+ if (db?.searchPageInsight?.findMany) {
50
+ try {
51
+ const rows = (await db.searchPageInsight.findMany({
52
+ where: { entityId: { not: null }, impressions28d: { gt: 0 } },
53
+ select: { entityId: true, impressions28d: true },
54
+ take: 2000,
55
+ }));
56
+ for (const r of rows)
57
+ if (r.entityId)
58
+ impressionsByEntityId[r.entityId] = r.impressions28d;
59
+ }
60
+ catch {
61
+ /* weighting is optional */
62
+ }
63
+ }
64
+ const quickWins = buildQuickWins(openIssues.map((i) => ({
65
+ issueKey: i.issueKey ?? '',
66
+ entityType: i.entityType ?? null,
67
+ entityId: i.entityId ?? null,
68
+ entityTitle: i.entityTitle ?? null,
69
+ url: i.url ?? null,
70
+ severity: i.severity,
71
+ category: i.category ?? 'content',
72
+ type: i.type,
73
+ title: i.title,
74
+ description: i.description ?? '',
75
+ impact: i.impact ?? 'Low',
76
+ recommendation: i.recommendation ?? '',
77
+ fixable: i.fixable ?? false,
78
+ fixActionType: i.fixActionType ?? null,
79
+ relatedEntityIds: Array.isArray(i.relatedEntityIds) ? i.relatedEntityIds : [],
80
+ })), { impressionsByEntityId }).map((w) => ({ title: w.title, explanation: w.explanation, impact: w.impact, count: w.count }));
81
+ // Search performance: last 7 days vs prior 7, anchored to the newest synced
82
+ // date (GSC data lags ~2 days; anchoring avoids empty "current" windows).
83
+ let search = null;
84
+ if (db?.searchPerfDaily?.findFirst && db?.searchPerfDaily?.aggregate) {
85
+ const newest = await db.searchPerfDaily.findFirst({
86
+ orderBy: { date: 'desc' },
87
+ select: { date: true },
88
+ });
89
+ if (newest?.date) {
90
+ const anchor = new Date(newest.date);
91
+ const daysBack = (n) => new Date(anchor.getTime() - n * DAY_MS);
92
+ const sumWindow = async (gte, lte) => {
93
+ const agg = await db.searchPerfDaily.aggregate({
94
+ where: { date: { gte, lte } },
95
+ _sum: { clicks: true, impressions: true },
96
+ });
97
+ return {
98
+ clicks: agg?._sum?.clicks ?? 0,
99
+ impressions: agg?._sum?.impressions ?? 0,
100
+ };
101
+ };
102
+ const current = await sumWindow(daysBack(6), anchor);
103
+ const prior = await sumWindow(daysBack(13), daysBack(7));
104
+ search = {
105
+ clicks7d: current.clicks,
106
+ clicksPrev7d: prior.clicks,
107
+ impressions7d: current.impressions,
108
+ impressionsPrev7d: prior.impressions,
109
+ };
110
+ }
111
+ }
112
+ let redirectSuggestions = 0;
113
+ if (db?.redirectSuggestion?.count) {
114
+ redirectSuggestions = (await db.redirectSuggestion.count({ where: { status: 'open' } })) ?? 0;
115
+ }
116
+ const issueFixes = openIssues.filter((i) => pendingFixFromMetadata(i.metadata) !== null).length;
117
+ return {
118
+ generatedAt: now.toISOString(),
119
+ audit: {
120
+ runId: lastCompleted.id,
121
+ dataAsOf: dataAsOf.toISOString(),
122
+ score,
123
+ grade: gradeForSeoScore(score),
124
+ delta,
125
+ pagesScanned: lastCompleted.pagesScanned ?? 0,
126
+ critical: lastCompleted.criticalCount ?? 0,
127
+ warning: lastCompleted.warningCount ?? 0,
128
+ info: lastCompleted.infoCount ?? 0,
129
+ stale: now.getTime() - dataAsOf.getTime() > STALE_AFTER_MS,
130
+ lastRunFailed: mostRecent?.status === 'FAILED',
131
+ lastRunError: mostRecent?.status === 'FAILED' ? (mostRecent.errorMessage ?? null) : null,
132
+ },
133
+ search,
134
+ newIssues: {
135
+ count: newIssueRows.length,
136
+ top: newIssueRows.slice(0, 5).map((i) => ({
137
+ title: i.title,
138
+ severity: i.severity,
139
+ entityTitle: i.entityTitle ?? null,
140
+ url: i.url ?? null,
141
+ })),
142
+ },
143
+ quickWins,
144
+ pending: { redirectSuggestions, issueFixes },
145
+ };
146
+ }
147
+ // ── Email rendering ─────────────────────────────────────────────────────────
148
+ function escapeHtml(s) {
149
+ return s
150
+ .replace(/&/g, '&')
151
+ .replace(/</g, '&lt;')
152
+ .replace(/>/g, '&gt;')
153
+ .replace(/"/g, '&quot;');
154
+ }
155
+ function pct(current, prev) {
156
+ if (prev <= 0)
157
+ return null;
158
+ const change = Math.round(((current - prev) / prev) * 100);
159
+ return `${change >= 0 ? '+' : ''}${change}%`;
160
+ }
161
+ function fmtDate(iso) {
162
+ return new Date(iso).toISOString().slice(0, 10);
163
+ }
164
+ /** Admin SEO dashboard URL (deep-link base), or null when no siteUrl is set. */
165
+ export function seoAdminUrl() {
166
+ const config = getPrentaConfig();
167
+ const siteUrl = config?.seo?.siteUrl;
168
+ if (!siteUrl)
169
+ return null;
170
+ const adminPath = config?.admin?.path ?? '/admin';
171
+ return `${siteUrl.replace(/\/$/, '')}${adminPath}/seo`;
172
+ }
173
+ export function renderSeoDigestEmail(digest, opts) {
174
+ const { audit, search, newIssues, quickWins, pending } = digest;
175
+ const alert = audit.stale || audit.lastRunFailed;
176
+ const deltaPart = audit.delta !== null ? ` (${audit.delta >= 0 ? '+' : ''}${audit.delta})` : '';
177
+ const winsPart = `${quickWins.length} quick win${quickWins.length === 1 ? '' : 's'}`;
178
+ const subject = `${opts.subjectPrefix ?? ''}${alert ? '⚠ ' : ''}SEO digest: score ${audit.score}${deltaPart} — ${winsPart}`;
179
+ const link = (path, label) => opts.adminSeoUrl
180
+ ? `<a href="${escapeHtml(opts.adminSeoUrl + path)}" style="color:#3b82f6;text-decoration:none;">${label}</a>`
181
+ : escapeHtml(label);
182
+ const sections = [];
183
+ const textParts = [];
184
+ if (alert) {
185
+ const msg = audit.lastRunFailed
186
+ ? `The most recent audit run failed${audit.lastRunError ? `: ${escapeHtml(audit.lastRunError)}` : ''}.`
187
+ : '';
188
+ const staleMsg = audit.stale
189
+ ? `Audit data is stale — the numbers below are from ${fmtDate(audit.dataAsOf)}.`
190
+ : '';
191
+ sections.push(`<div style="margin:0 0 20px;padding:12px 16px;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;font-size:14px;color:#991b1b;">${[msg, staleMsg].filter(Boolean).join(' ')}</div>`);
192
+ textParts.push(`ALERT: ${[audit.lastRunFailed ? `last audit run failed${audit.lastRunError ? ` (${audit.lastRunError})` : ''}` : '', audit.stale ? 'audit data is stale' : ''].filter(Boolean).join('; ')}`);
193
+ }
194
+ sections.push(`<h2 style="margin:0 0 4px;font-size:28px;color:#111827;">Score ${audit.score}${deltaPart}</h2>
195
+ <p style="margin:0 0 16px;font-size:13px;color:#6b7280;">Grade: ${escapeHtml(audit.grade)} · ${audit.pagesScanned} pages scanned · ${audit.critical} critical / ${audit.warning} warning / ${audit.info} info · data as of ${fmtDate(audit.dataAsOf)} · ${link('?tab=audit', 'View audit →')}</p>`);
196
+ textParts.push(`Score ${audit.score}${deltaPart} (grade ${audit.grade}) — ${audit.pagesScanned} pages, ${audit.critical} critical / ${audit.warning} warning / ${audit.info} info (data as of ${fmtDate(audit.dataAsOf)})`);
197
+ if (search) {
198
+ const clicksPct = pct(search.clicks7d, search.clicksPrev7d);
199
+ const imprPct = pct(search.impressions7d, search.impressionsPrev7d);
200
+ sections.push(`<h3 style="margin:20px 0 8px;font-size:13px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:0.04em;">Search performance (7 days)</h3>
201
+ <p style="margin:0;font-size:14px;color:#374151;">Clicks: <strong>${search.clicks7d}</strong>${clicksPct ? ` (${clicksPct})` : ''} · Impressions: <strong>${search.impressions7d}</strong>${imprPct ? ` (${imprPct})` : ''}</p>`);
202
+ textParts.push(`Search (7d): ${search.clicks7d} clicks${clicksPct ? ` (${clicksPct})` : ''}, ${search.impressions7d} impressions${imprPct ? ` (${imprPct})` : ''}`);
203
+ }
204
+ if (quickWins.length > 0) {
205
+ const rows = quickWins
206
+ .map((w) => `<li style="margin:0 0 6px;font-size:14px;color:#374151;"><strong>${escapeHtml(w.title)}</strong> — ${escapeHtml(w.explanation)} <span style="color:#9ca3af;">(${escapeHtml(w.impact)} impact)</span></li>`)
207
+ .join('');
208
+ sections.push(`<h3 style="margin:20px 0 8px;font-size:13px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:0.04em;">Quick wins</h3><ul style="margin:0;padding-left:20px;">${rows}</ul>`);
209
+ textParts.push(`Quick wins:\n${quickWins.map((w) => `- ${w.title} (${w.impact})`).join('\n')}`);
210
+ }
211
+ if (newIssues.count > 0) {
212
+ const rows = newIssues.top
213
+ .map((i) => `<li style="margin:0 0 6px;font-size:14px;color:#374151;"><span style="font-weight:600;color:${i.severity === 'critical' ? '#dc2626' : i.severity === 'warning' ? '#d97706' : '#6b7280'};">[${escapeHtml(i.severity)}]</span> ${escapeHtml(i.title)}${i.entityTitle ? ` — ${escapeHtml(i.entityTitle)}` : ''}</li>`)
214
+ .join('');
215
+ sections.push(`<h3 style="margin:20px 0 8px;font-size:13px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:0.04em;">New issues (${newIssues.count})</h3><ul style="margin:0;padding-left:20px;">${rows}</ul>`);
216
+ textParts.push(`New issues (${newIssues.count}):\n${newIssues.top.map((i) => `- [${i.severity}] ${i.title}`).join('\n')}`);
217
+ }
218
+ const pendingTotal = pending.redirectSuggestions + pending.issueFixes;
219
+ if (pendingTotal > 0) {
220
+ sections.push(`<h3 style="margin:20px 0 8px;font-size:13px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:0.04em;">Pending proposals</h3>
221
+ <p style="margin:0;font-size:14px;color:#374151;">${pending.redirectSuggestions} redirect suggestion${pending.redirectSuggestions === 1 ? '' : 's'} (${link('?tab=redirects', 'review →')}) · ${pending.issueFixes} cached issue fix${pending.issueFixes === 1 ? '' : 'es'} (${link('?tab=audit', 'review →')})</p>`);
222
+ textParts.push(`Pending: ${pending.redirectSuggestions} redirect suggestions, ${pending.issueFixes} cached issue fixes`);
223
+ }
224
+ const html = `<!DOCTYPE html>
225
+ <html>
226
+ <head><meta charset="utf-8"></head>
227
+ <body style="margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#f9fafb;">
228
+ <table width="100%" cellpadding="0" cellspacing="0" style="max-width:560px;margin:40px auto;background:#fff;border-radius:8px;border:1px solid #e5e7eb;">
229
+ <tr>
230
+ <td style="padding:32px;">
231
+ <p style="margin:0 0 16px;font-size:13px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:0.04em;">Weekly SEO digest</p>
232
+ ${sections.join('\n')}
233
+ <p style="margin:28px 0 0;font-size:12px;color:#9ca3af;">You're receiving this because your address is listed in Settings → SEO → Weekly digest.</p>
234
+ </td>
235
+ </tr>
236
+ </table>
237
+ </body>
238
+ </html>`;
239
+ if (opts.adminSeoUrl)
240
+ textParts.push(`Open the SEO dashboard: ${opts.adminSeoUrl}`);
241
+ textParts.push("You're receiving this because your address is listed in Settings → SEO → Weekly digest.");
242
+ return { subject, html, text: textParts.join('\n\n') };
243
+ }
244
+ // ── Send orchestration ──────────────────────────────────────────────────────
245
+ /** Double-send guard: skip when a digest went out within this window. */
246
+ const RESEND_GUARD_MS = 20 * 60 * 60 * 1000;
247
+ /** Best-effort `digestLastError` stamp — stamping must never mask the real result. */
248
+ async function stampDigestError(db, message) {
249
+ try {
250
+ await patchSeoModuleSettings(db, { digestLastError: message }, 'system');
251
+ }
252
+ catch {
253
+ /* stamping is best-effort */
254
+ }
255
+ }
256
+ /**
257
+ * Send the weekly digest when enabled + configured. Never throws — the cron
258
+ * tick must not fail because email did. Every skip returns a machine-readable
259
+ * reason, and any build/send failure is contained here: stamped to
260
+ * `digestLastError` and returned in-band as `{ sent: false, error }`.
261
+ * `digestLastSentAt` is only stamped when at least one send succeeded, so a
262
+ * total failure never consumes the week's digest via the double-send guard.
263
+ */
264
+ export async function maybeSendSeoDigest(db, options = {}) {
265
+ const now = options.now ?? new Date();
266
+ const settings = resolveSeoModuleSettings(await getSeoOverrides(db).catch(() => null));
267
+ if (!settings.digestEnabled)
268
+ return { sent: false, reason: 'disabled' };
269
+ const recipients = settings.digestRecipients.filter((r) => r.trim().length > 0);
270
+ if (recipients.length === 0)
271
+ return { sent: false, reason: 'no-recipients' };
272
+ if (settings.digestLastSentAt) {
273
+ const last = Date.parse(settings.digestLastSentAt);
274
+ if (Number.isFinite(last) && now.getTime() - last < RESEND_GUARD_MS) {
275
+ return { sent: false, reason: 'already-sent' };
276
+ }
277
+ }
278
+ try {
279
+ const digest = await buildSeoDigest(db, { now });
280
+ if (!digest)
281
+ return { sent: false, reason: 'no-audit' };
282
+ const sender = await resolveEmailSenderAsync(db);
283
+ if (!sender) {
284
+ await stampDigestError(db, 'No email adapter configured');
285
+ return { sent: false, reason: 'no-email-adapter' };
286
+ }
287
+ const email = renderSeoDigestEmail(digest, { adminSeoUrl: seoAdminUrl() });
288
+ const results = await Promise.allSettled(recipients.map((to) => sender.send({ to, subject: email.subject, html: email.html, text: email.text })));
289
+ const failed = results.filter((r) => r.status === 'rejected').length;
290
+ if (failed >= recipients.length) {
291
+ // Total send failure: leave digestLastSentAt untouched so the 20-hour
292
+ // double-send guard doesn't swallow the retry after a full outage.
293
+ const message = `${failed}/${recipients.length} digest sends failed`;
294
+ await stampDigestError(db, message);
295
+ return { sent: false, recipients: recipients.length, failed, error: message };
296
+ }
297
+ try {
298
+ await patchSeoModuleSettings(db, {
299
+ digestLastSentAt: now.toISOString(),
300
+ digestLastError: failed > 0 ? `${failed}/${recipients.length} digest sends failed` : null,
301
+ }, 'system');
302
+ }
303
+ catch {
304
+ /* stamping is best-effort */
305
+ }
306
+ return { sent: true, recipients: recipients.length, failed };
307
+ }
308
+ catch (err) {
309
+ // Contain unexpected failures (e.g. a DB rejection inside buildSeoDigest)
310
+ // so the never-throws contract holds for the cron tick.
311
+ const message = String(err instanceof Error ? err.message : err);
312
+ await stampDigestError(db, message);
313
+ return { sent: false, error: message };
314
+ }
315
+ }
316
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/seo/digest.ts"],"names":[],"mappings":"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"}
@@ -43,7 +43,7 @@ export { calculatePageSeoScore, calculateSiteSeoScore, gradeForSeoScore, countH1
43
43
  export type { SeoGrade, SeoCheckStatus, SeoScoreCheck, PageSeoScoreResult, PageSeoScoreInput, SiteSeoScoreInput, SiteSeoScoreResult, SiteSeoScoreBreakdownItem, } from './score.js';
44
44
  export { runSeoAuditAnalysis, buildQuickWins, issueKeyFor } from './audit-engine.js';
45
45
  export type { AuditEntityInput, AuditExtraSignals, DetectedIssue, AuditPageRecord, QuickWin, SeoAuditResult, } from './audit-engine.js';
46
- export { runAndPersistAudit, gatherAuditEntities, countAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, AUDIT_MAX_ENTITIES, } from './audit-runner.js';
46
+ export { runAndPersistAudit, AuditAlreadyRunningError, gatherAuditEntities, countAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, AUDIT_MAX_ENTITIES, } from './audit-runner.js';
47
47
  export { migrateStructuredDataFields } from './migrate-schema.js';
48
48
  export type { MigrateStructuredDataOptions, MigrateStructuredDataResult } from './migrate-schema.js';
49
49
  export { migrateMetaFields } from './migrate-meta.js';
@@ -56,8 +56,12 @@ export { computeSiteIndexStatus, getSiteIndexStatus, robotsTxtBlocksEntireSite,
56
56
  export type { SiteIndexStatus, IndexStatusLevel, IndexStatusSeverity, IndexCheck, IndexCheckStatus, IndexAction, IndexStatusInputs, } from './index-status.js';
57
57
  export { suggestDeterministicFix, suggestIssueFix, truncateAtWordBoundary, excerptForMetaDescription, buildFixFingerprint, DETERMINISTIC_FIX_TYPES, META_TITLE_MAX, META_TITLE_MIN, META_DESC_MAX, META_DESC_MIN, } from './issue-fix.js';
58
58
  export type { SeoFixFieldChange, SeoIssueFixSuggestion, SeoIssueFixInput, SeoIssueFixContext, SuggestIssueFixResult, } from './issue-fix.js';
59
- export { suggestAiFix, AI_FIX_TYPES, pendingFixFromMetadata, pendingFixToMetadata, } from './issue-fix-ai.js';
60
- export type { AiFixDeps, AiFixResult, PendingFixCache } from './issue-fix-ai.js';
59
+ export { suggestAiFix, AI_FIX_TYPES, pendingFixFromMetadata, pendingFixToMetadata, scoreFixBrandAlignment, stickyFingerprintsFromMetadata, } from './issue-fix-ai.js';
60
+ export type { AiFixDeps, AiFixResult, PendingFixCache, PendingFixStamp, StickyFingerprints, } from './issue-fix-ai.js';
61
+ export { listSeoProposals, countPendingProposals, selectEligibleForGeneration, dismissalFingerprintFor, ISSUE_FIX_FEATURE_KEY, REDIRECT_FEATURE_KEY, type SeoProposal, type SeoProposalsPayload, } from './proposals.js';
62
+ export { generateSeoProposals, PROPOSAL_GENERATE_BATCH_MAX, PROPOSAL_GENERATE_CONCURRENCY, PROPOSAL_BATCH_TIME_BUDGET_MS, type GenerateProposalsResult, } from './proposals-generate.js';
63
+ export { bulkApplySeoProposals, PROPOSAL_BULK_APPLY_MAX, type BulkApplyItem, type BulkApplyItemResult, type BulkApplyResult, } from './proposals-bulk-apply.js';
64
+ export { applyIssueFix, type ApplyIssueFixResult } from './issue-fix-apply.js';
61
65
  export { applyInternalLinkInsert, suggestOrphanLinkFix, verifyInternalLinkInsert, } from './issue-fix-link-insert.js';
62
66
  export type { ApplyInternalLinkInsertInput, ApplyInternalLinkInsertResult, VerifyInternalLinkInsertInput, LinkInsertDeps, SuggestOrphanLinkFixDeps, } from './issue-fix-link-insert.js';
63
67
  export { gatherNavigationLinkTargets } from './nav-link-targets.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"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"}
package/dist/seo/index.js CHANGED
@@ -21,14 +21,18 @@ export { SEO_CONFIG_COLLECTION, getSeoOverrides, putSeoOverrides, applySeoOverri
21
21
  export { notifySitemapOnPublish, buildSitemapUrl, buildSearchEnginePings, buildIndexNowSubmission, INDEXNOW_ENDPOINT, DEFAULT_SITEMAP_DEBOUNCE_MS, } from './sitemap-notify.js';
22
22
  export { calculatePageSeoScore, calculateSiteSeoScore, gradeForSeoScore, countH1, PAGE_SEO_WEIGHTS, SITE_SEO_WEIGHTS, } from './score.js';
23
23
  export { runSeoAuditAnalysis, buildQuickWins, issueKeyFor } from './audit-engine.js';
24
- export { runAndPersistAudit, gatherAuditEntities, countAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, AUDIT_MAX_ENTITIES, } from './audit-runner.js';
24
+ export { runAndPersistAudit, AuditAlreadyRunningError, gatherAuditEntities, countAuditEntities, documentToAuditEntity, frontEndContentCollectionTypes, isInternalCollection, AUDIT_MAX_ENTITIES, } from './audit-runner.js';
25
25
  export { migrateStructuredDataFields } from './migrate-schema.js';
26
26
  export { migrateMetaFields } from './migrate-meta.js';
27
27
  export { gatherAuditSignals, gatherRedirectSignals, detectBrokenInternalLinks, } from './audit-signals.js';
28
28
  export { confirmBrokenLinksOverHttp, filterConfirmedDeadRecoveryPaths, probeSitePathStatus, } from './confirm-broken-links.js';
29
29
  export { computeSiteIndexStatus, getSiteIndexStatus, robotsTxtBlocksEntireSite, } from './index-status.js';
30
30
  export { suggestDeterministicFix, suggestIssueFix, truncateAtWordBoundary, excerptForMetaDescription, buildFixFingerprint, DETERMINISTIC_FIX_TYPES, META_TITLE_MAX, META_TITLE_MIN, META_DESC_MAX, META_DESC_MIN, } from './issue-fix.js';
31
- export { suggestAiFix, AI_FIX_TYPES, pendingFixFromMetadata, pendingFixToMetadata, } from './issue-fix-ai.js';
31
+ export { suggestAiFix, AI_FIX_TYPES, pendingFixFromMetadata, pendingFixToMetadata, scoreFixBrandAlignment, stickyFingerprintsFromMetadata, } from './issue-fix-ai.js';
32
+ export { listSeoProposals, countPendingProposals, selectEligibleForGeneration, dismissalFingerprintFor, ISSUE_FIX_FEATURE_KEY, REDIRECT_FEATURE_KEY, } from './proposals.js';
33
+ export { generateSeoProposals, PROPOSAL_GENERATE_BATCH_MAX, PROPOSAL_GENERATE_CONCURRENCY, PROPOSAL_BATCH_TIME_BUDGET_MS, } from './proposals-generate.js';
34
+ export { bulkApplySeoProposals, PROPOSAL_BULK_APPLY_MAX, } from './proposals-bulk-apply.js';
35
+ export { applyIssueFix } from './issue-fix-apply.js';
32
36
  export { applyInternalLinkInsert, suggestOrphanLinkFix, verifyInternalLinkInsert, } from './issue-fix-link-insert.js';
33
37
  export { gatherNavigationLinkTargets } from './nav-link-targets.js';
34
38
  export { suggestInboundLinks } from './link-suggest.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/seo/index.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import type { PrentaDB } from '../db/client-types.js';
8
8
  import { type SeoFixFieldChange, type SeoIssueFixContext, type SeoIssueFixInput, type SeoIssueFixSuggestion } from './issue-fix.js';
9
+ import type { BrandVoiceProfile } from '../ai/types.js';
9
10
  export declare const AI_FIX_TYPES: Set<string>;
10
11
  export interface AiFixDeps {
11
12
  db: PrentaDB;
@@ -33,7 +34,45 @@ export interface PendingFixCache {
33
34
  justification: string;
34
35
  source: 'ai';
35
36
  autoFixable: boolean;
37
+ /** 0–100 minimum brand-voice score across proposed text fields; null when unscored. */
38
+ brandAlignment: number | null;
39
+ /** ISO timestamp of generation; null for caches written before this field existed. */
40
+ generatedAt: string | null;
36
41
  }
42
+ export interface PendingFixStamp {
43
+ brandAlignment?: number | null;
44
+ generatedAt?: Date;
45
+ }
46
+ /**
47
+ * Sticky per-issue markers that live beside the cache in `SeoIssue.metadata`.
48
+ * Both are fingerprints (`entityId:updatedAtMs:issueType`), so any edit to the
49
+ * document invalidates them automatically.
50
+ *
51
+ * - `dismissed`: an editor rejected the proposal for this document state;
52
+ * batch generation must not recreate it.
53
+ * - `generateSkipped`: batch generation ran and found nothing cacheable for
54
+ * this document state; without this marker the same issue would be
55
+ * re-attempted on every pass and `remaining` would never drain.
56
+ */
57
+ export interface StickyFingerprints {
58
+ dismissed: string | null;
59
+ generateSkipped: string | null;
60
+ }
61
+ export declare function stickyFingerprintsFromMetadata(metadata: unknown): StickyFingerprints;
37
62
  export declare function pendingFixFromMetadata(metadata: unknown): PendingFixCache | null;
38
- export declare function pendingFixToMetadata(suggestion: SeoIssueFixSuggestion): Record<string, unknown>;
63
+ /**
64
+ * Metadata patch that stores a fresh proposal. A new proposal supersedes any
65
+ * earlier rejection or skip of this issue, so both sticky markers are cleared
66
+ * in the same write (callers spread this over the existing metadata).
67
+ */
68
+ export declare function pendingFixToMetadata(suggestion: SeoIssueFixSuggestion, stamp?: PendingFixStamp): Record<string, unknown>;
69
+ /**
70
+ * Minimum brand-voice score across the text fields a fix proposes. Minimum,
71
+ * not average: a future auto-apply gate must see the worst field. `null` when
72
+ * there is no scorable brand profile or the fix changes no prose.
73
+ *
74
+ * Never throws: the badge is advisory, so a malformed stored profile must not
75
+ * cost the caller a working suggestion. Scoring failures log and yield `null`.
76
+ */
77
+ export declare function scoreFixBrandAlignment(changes: SeoFixFieldChange[], profile: BrandVoiceProfile | null | undefined): number | null;
39
78
  //# sourceMappingURL=issue-fix-ai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"issue-fix-ai.d.ts","sourceRoot":"","sources":["../../src/seo/issue-fix-ai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAOrD,OAAO,EAOL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAA;AAOvB,eAAO,MAAM,YAAY,aAQvB,CAAA;AAKF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,QAAQ,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,qBAAqB,CAAA;CAAE,GAC/C;IACE,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAA;IACvF,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAiKL;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,WAAW,CAAC,CAyJtB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,IAAI,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAehF;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAW/F"}
1
+ {"version":3,"file":"issue-fix-ai.d.ts","sourceRoot":"","sources":["../../src/seo/issue-fix-ai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAOrD,OAAO,EAOL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAA;AAOvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,eAAO,MAAM,YAAY,aAQvB,CAAA;AAKF,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,QAAQ,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,qBAAqB,CAAA;CAAE,GAC/C;IACE,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAA;IACvF,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAiKL;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,WAAW,CAAC,CAyJtB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,IAAI,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,uFAAuF;IACvF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sFAAsF;IACtF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,EAAE,IAAI,CAAA;CACnB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,CAUpF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAoBhF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,qBAAqB,EACjC,KAAK,GAAE,eAAoB,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB;AAID;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,OAAO,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAC5C,MAAM,GAAG,IAAI,CAmBf"}
@@ -5,6 +5,7 @@ import { detectSchemaType } from './page-meta.js';
5
5
  import { stripHtmlTags } from './analysis.js';
6
6
  import { META_DESC_MAX, META_DESC_MIN, META_TITLE_MAX, META_TITLE_MIN, truncateAtWordBoundary, buildFixFingerprint, } from './issue-fix.js';
7
7
  import { maxPageTitleLengthForTemplate, resolveRenderedMetaTitle, stripSiteSuffixFromPageTitle, } from './title-templates.js';
8
+ import { alignContentWithBrandVoice, seoFieldToBrandChannel } from '../ai/brand-voice-alignment.js';
8
9
  export const AI_FIX_TYPES = new Set([
9
10
  'missing-meta-title',
10
11
  'meta-title-length',
@@ -288,6 +289,15 @@ export async function suggestAiFix(issue, ctx, deps) {
288
289
  };
289
290
  }
290
291
  }
292
+ export function stickyFingerprintsFromMetadata(metadata) {
293
+ const m = metadata && typeof metadata === 'object' && !Array.isArray(metadata)
294
+ ? metadata
295
+ : {};
296
+ return {
297
+ dismissed: typeof m.dismissedFingerprint === 'string' ? m.dismissedFingerprint : null,
298
+ generateSkipped: typeof m.generateSkippedFingerprint === 'string' ? m.generateSkippedFingerprint : null,
299
+ };
300
+ }
291
301
  export function pendingFixFromMetadata(metadata) {
292
302
  if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata))
293
303
  return null;
@@ -306,9 +316,18 @@ export function pendingFixFromMetadata(metadata) {
306
316
  justification: typeof p.justification === 'string' ? p.justification : '',
307
317
  source: 'ai',
308
318
  autoFixable: p.autoFixable !== false,
319
+ brandAlignment: typeof p.brandAlignment === 'number' && Number.isFinite(p.brandAlignment)
320
+ ? p.brandAlignment
321
+ : null,
322
+ generatedAt: typeof p.generatedAt === 'string' ? p.generatedAt : null,
309
323
  };
310
324
  }
311
- export function pendingFixToMetadata(suggestion) {
325
+ /**
326
+ * Metadata patch that stores a fresh proposal. A new proposal supersedes any
327
+ * earlier rejection or skip of this issue, so both sticky markers are cleared
328
+ * in the same write (callers spread this over the existing metadata).
329
+ */
330
+ export function pendingFixToMetadata(suggestion, stamp = {}) {
312
331
  return {
313
332
  pendingFix: {
314
333
  fingerprint: suggestion.fingerprint,
@@ -317,7 +336,40 @@ export function pendingFixToMetadata(suggestion) {
317
336
  justification: suggestion.justification,
318
337
  source: suggestion.source ?? 'ai',
319
338
  autoFixable: suggestion.autoFixable,
339
+ brandAlignment: typeof stamp.brandAlignment === 'number' ? stamp.brandAlignment : null,
340
+ generatedAt: (stamp.generatedAt ?? new Date()).toISOString(),
320
341
  },
342
+ dismissedFingerprint: null,
343
+ generateSkippedFingerprint: null,
321
344
  };
322
345
  }
346
+ const UNSCORED_FIELDS = new Set(['structuredData', 'structuredDataType', 'schemaType']);
347
+ /**
348
+ * Minimum brand-voice score across the text fields a fix proposes. Minimum,
349
+ * not average: a future auto-apply gate must see the worst field. `null` when
350
+ * there is no scorable brand profile or the fix changes no prose.
351
+ *
352
+ * Never throws: the badge is advisory, so a malformed stored profile must not
353
+ * cost the caller a working suggestion. Scoring failures log and yield `null`.
354
+ */
355
+ export function scoreFixBrandAlignment(changes, profile) {
356
+ try {
357
+ let min = null;
358
+ for (const change of changes) {
359
+ if (UNSCORED_FIELDS.has(change.field))
360
+ continue;
361
+ if (typeof change.after !== 'string' || !change.after.trim())
362
+ continue;
363
+ const result = alignContentWithBrandVoice(change.after, profile, seoFieldToBrandChannel(change.field));
364
+ if (!result)
365
+ continue;
366
+ min = min === null ? result.score : Math.min(min, result.score);
367
+ }
368
+ return min;
369
+ }
370
+ catch (err) {
371
+ console.warn('[seo/issue-fix-ai] brand alignment unscored', err);
372
+ return null;
373
+ }
374
+ }
323
375
  //# sourceMappingURL=issue-fix-ai.js.map