@prenta/core 5.4.1 → 5.5.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.
@@ -233,6 +233,42 @@ function buildNotAttemptedRenderedResult(count, reason, originSource) {
233
233
  },
234
234
  };
235
235
  }
236
+ /**
237
+ * A RUNNING run older than this is treated as crashed: the concurrency guard
238
+ * ignores it, and {@link sweepStaleAuditRuns} marks it FAILED.
239
+ */
240
+ const STALE_RUN_MS = 15 * 60 * 1000;
241
+ /**
242
+ * Thrown by {@link runAndPersistAudit} when the concurrency guard refuses to
243
+ * start because another audit is already RUNNING. A deliberate skip, not a
244
+ * failure — callers (e.g. the weekly cron) report it as `skipped` while any
245
+ * other rejection is a real error.
246
+ */
247
+ export class AuditAlreadyRunningError extends Error {
248
+ constructor() {
249
+ super('An audit is already running');
250
+ this.name = 'AuditAlreadyRunningError';
251
+ }
252
+ }
253
+ /**
254
+ * Mark RUNNING runs older than the concurrency-guard window as FAILED. A
255
+ * function timeout mid-audit leaves a zombie RUNNING row: the guard ignores
256
+ * it after 15 minutes, but the audit history UI shows it running forever.
257
+ * Called by the weekly cron before starting a new run.
258
+ */
259
+ export async function sweepStaleAuditRuns(db, nowMs = Date.now()) {
260
+ if (!db?.seoAuditRun?.updateMany)
261
+ return 0;
262
+ const res = await db.seoAuditRun.updateMany({
263
+ where: { status: 'RUNNING', startedAt: { lt: new Date(nowMs - STALE_RUN_MS) } },
264
+ data: {
265
+ status: 'FAILED',
266
+ finishedAt: new Date(nowMs),
267
+ errorMessage: 'Timed out (stale RUNNING run swept by cron)',
268
+ },
269
+ });
270
+ return res?.count ?? 0;
271
+ }
236
272
  /**
237
273
  * Run an audit and persist the run + issue snapshot. Returns the run summary.
238
274
  * Throws if the SEO models aren't available (caller maps to 501).
@@ -250,8 +286,8 @@ export async function runAndPersistAudit(db, options = {}) {
250
286
  // Refuse to start when another audit is already RUNNING. Two concurrent
251
287
  // runs both reconcile the shared SeoIssue table and can create duplicate
252
288
  // rows for the same issueKey (it carries an index, not a unique constraint).
253
- // A run older than the stale window is treated as crashed and ignored.
254
- const STALE_RUN_MS = 15 * 60 * 1000;
289
+ // A run older than the stale window (STALE_RUN_MS) is treated as crashed
290
+ // and ignored.
255
291
  const inFlight = await db.seoAuditRun
256
292
  .findFirst({
257
293
  where: { status: 'RUNNING' },
@@ -260,7 +296,7 @@ export async function runAndPersistAudit(db, options = {}) {
260
296
  })
261
297
  .catch(() => null);
262
298
  if (inFlight?.startedAt && Date.now() - new Date(inFlight.startedAt).getTime() < STALE_RUN_MS) {
263
- throw new Error('An audit is already running');
299
+ throw new AuditAlreadyRunningError();
264
300
  }
265
301
  // Previous run's after-score becomes this run's before-score.
266
302
  const prev = await db.seoAuditRun.findFirst({
@@ -1 +1 @@
1
- {"version":3,"file":"audit-runner.js","sourceRoot":"","sources":["../../src/seo/audit-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-runner.js","sourceRoot":"","sources":["../../src/seo/audit-runner.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,14 @@ export interface SeoModuleSettings {
78
78
  searchSyncStatus: SearchSyncStatus | null;
79
79
  /** Rotation offset into the impressions-ordered page list for the per-run CrUX cap. */
80
80
  searchSyncCruxCursor: number;
81
+ /** Send the weekly SEO digest email from the Monday cron. Off by default. */
82
+ digestEnabled: boolean;
83
+ /** Explicit digest recipient list (max 10, validated at the API). */
84
+ digestRecipients: string[];
85
+ /** ISO timestamp of the last digest send (also the double-send guard). */
86
+ digestLastSentAt: string | null;
87
+ /** Human-readable summary of the last send failure; null after a clean send. */
88
+ digestLastError: string | null;
81
89
  }
82
90
  /** Safe defaults applied when the overrides document has no `module` block. */
83
91
  export declare const DEFAULT_SEO_MODULE_SETTINGS: SeoModuleSettings;
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/seo/config-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/seo/config-store.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,10 @@ export const DEFAULT_SEO_MODULE_SETTINGS = {
40
40
  searchSyncLastRunAt: null,
41
41
  searchSyncStatus: null,
42
42
  searchSyncCruxCursor: 0,
43
+ digestEnabled: false,
44
+ digestRecipients: [],
45
+ digestLastSentAt: null,
46
+ digestLastError: null,
43
47
  };
44
48
  /** Merge stored module settings over the defaults (field-by-field). */
45
49
  export function resolveSeoModuleSettings(overrides) {
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/seo/config-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/seo/config-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Weekly SEO digest: data gathering, email rendering, and send orchestration
3
+ * for the Monday cron (see /cron/seo-scan in api/routes/scheduling.ts).
4
+ *
5
+ * Report-only by design: no AI calls here — per-issue AI fix generation stays
6
+ * on-demand (roadmap items 4–5 own batch generation). The digest reads what
7
+ * the persisted audit pipeline and the nightly search sync already wrote.
8
+ */
9
+ import type { PrentaDB } from '../db/client-types.js';
10
+ export interface SeoDigestAudit {
11
+ runId: string;
12
+ dataAsOf: string;
13
+ score: number;
14
+ grade: string;
15
+ delta: number | null;
16
+ pagesScanned: number;
17
+ critical: number;
18
+ warning: number;
19
+ info: number;
20
+ stale: boolean;
21
+ lastRunFailed: boolean;
22
+ lastRunError: string | null;
23
+ }
24
+ export interface SeoDigestSearch {
25
+ clicks7d: number;
26
+ clicksPrev7d: number;
27
+ impressions7d: number;
28
+ impressionsPrev7d: number;
29
+ }
30
+ export interface SeoDigestNewIssue {
31
+ title: string;
32
+ severity: string;
33
+ entityTitle: string | null;
34
+ url: string | null;
35
+ }
36
+ export interface SeoDigestQuickWin {
37
+ title: string;
38
+ explanation: string;
39
+ impact: string;
40
+ count: number;
41
+ }
42
+ export interface SeoDigest {
43
+ generatedAt: string;
44
+ audit: SeoDigestAudit;
45
+ search: SeoDigestSearch | null;
46
+ newIssues: {
47
+ count: number;
48
+ top: SeoDigestNewIssue[];
49
+ };
50
+ quickWins: SeoDigestQuickWin[];
51
+ pending: {
52
+ redirectSuggestions: number;
53
+ issueFixes: number;
54
+ };
55
+ }
56
+ export declare function buildSeoDigest(db: PrentaDB, options?: {
57
+ now?: Date;
58
+ }): Promise<SeoDigest | null>;
59
+ /** Admin SEO dashboard URL (deep-link base), or null when no siteUrl is set. */
60
+ export declare function seoAdminUrl(): string | null;
61
+ export declare function renderSeoDigestEmail(digest: SeoDigest, opts: {
62
+ adminSeoUrl: string | null;
63
+ subjectPrefix?: string;
64
+ }): {
65
+ subject: string;
66
+ html: string;
67
+ text: string;
68
+ };
69
+ export interface DigestSendResult {
70
+ sent: boolean;
71
+ reason?: 'disabled' | 'no-recipients' | 'already-sent' | 'no-audit' | 'no-email-adapter';
72
+ recipients?: number;
73
+ failed?: number;
74
+ error?: string;
75
+ }
76
+ /**
77
+ * Send the weekly digest when enabled + configured. Never throws — the cron
78
+ * tick must not fail because email did. Every skip returns a machine-readable
79
+ * reason, and any build/send failure is contained here: stamped to
80
+ * `digestLastError` and returned in-band as `{ sent: false, error }`.
81
+ * `digestLastSentAt` is only stamped when at least one send succeeded, so a
82
+ * total failure never consumes the week's digest via the double-send guard.
83
+ */
84
+ export declare function maybeSendSeoDigest(db: PrentaDB, options?: {
85
+ now?: Date;
86
+ }): Promise<DigestSendResult>;
87
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/seo/digest.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAcrD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AACD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AACD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AACD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AACD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,eAAe,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,iBAAiB,EAAE,CAAA;KAAE,CAAA;IACtD,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,OAAO,EAAE;QAAE,mBAAmB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7D;AAOD,wBAAsB,cAAc,CAClC,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAgJ3B;AAsBD,gFAAgF;AAChF,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAM3C;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+GjD;AAOD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,UAAU,GAAG,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,kBAAkB,CAAA;IACxF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAWD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,EACZ,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAA;CAAO,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CA8D3B"}
@@ -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, '&amp;')
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