@prenta/core 8.13.0 → 8.13.3
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.
- package/CHANGELOG.md +22 -0
- package/dist/ai/batch-list.d.ts +1 -1
- package/dist/ai/batch-list.d.ts.map +1 -1
- package/dist/ai/batch-list.js +45 -3
- package/dist/ai/batch-list.js.map +1 -1
- package/dist/api/routes/documents.d.ts.map +1 -1
- package/dist/api/routes/documents.js +12 -2
- package/dist/api/routes/documents.js.map +1 -1
- package/dist/api/routes/mcp-oauth.d.ts.map +1 -1
- package/dist/api/routes/mcp-oauth.js +7 -0
- package/dist/api/routes/mcp-oauth.js.map +1 -1
- package/dist/api/routes/redirects.d.ts.map +1 -1
- package/dist/api/routes/redirects.js +6 -0
- package/dist/api/routes/redirects.js.map +1 -1
- package/dist/api/routes/scheduling.d.ts.map +1 -1
- package/dist/api/routes/scheduling.js +33 -13
- package/dist/api/routes/scheduling.js.map +1 -1
- package/dist/api/routes/seo/handlers/links.d.ts.map +1 -1
- package/dist/api/routes/seo/handlers/links.js +8 -1
- package/dist/api/routes/seo/handlers/links.js.map +1 -1
- package/dist/api/routes/site-replace.d.ts.map +1 -1
- package/dist/api/routes/site-replace.js +20 -0
- package/dist/api/routes/site-replace.js.map +1 -1
- package/dist/content/site-replace.d.ts.map +1 -1
- package/dist/content/site-replace.js +77 -13
- package/dist/content/site-replace.js.map +1 -1
- package/dist/i18n/localize-draft.d.ts +12 -1
- package/dist/i18n/localize-draft.d.ts.map +1 -1
- package/dist/i18n/localize-draft.js +51 -14
- package/dist/i18n/localize-draft.js.map +1 -1
- package/dist/jobs/handlers.d.ts.map +1 -1
- package/dist/jobs/handlers.js +24 -4
- package/dist/jobs/handlers.js.map +1 -1
- package/dist/seo/audit-engine.d.ts +8 -1
- package/dist/seo/audit-engine.d.ts.map +1 -1
- package/dist/seo/audit-engine.js +108 -102
- package/dist/seo/audit-engine.js.map +1 -1
- package/dist/seo/audit-runner.d.ts +20 -6
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +53 -11
- package/dist/seo/audit-runner.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fill a locale sibling with a governed AI translation and leave it a DRAFT.
|
|
3
|
-
* Published
|
|
3
|
+
* Published siblings are not overwritten. In-review and approved siblings stay
|
|
4
|
+
* `status: DRAFT` and are protected by `workflowStage`. A plain draft that
|
|
5
|
+
* changes while the model is running is left untouched. The patch never
|
|
4
6
|
* includes `status`, so publish still goes through the review workflow.
|
|
5
7
|
*/
|
|
6
8
|
import { z } from 'zod';
|
|
@@ -10,8 +12,12 @@ import { createTranslationDraft } from './translations.js';
|
|
|
10
12
|
interface DraftRow {
|
|
11
13
|
id: string;
|
|
12
14
|
status: string;
|
|
15
|
+
/** Missing on older callers. Treated as DRAFT, matching the column default. */
|
|
16
|
+
workflowStage?: string | null;
|
|
13
17
|
title: string | null;
|
|
14
18
|
data: unknown;
|
|
19
|
+
/** ISO timestamp from the document row. Used to detect a save during the AI call. */
|
|
20
|
+
updatedAt?: string | null;
|
|
15
21
|
}
|
|
16
22
|
interface LocalizeDraftResult {
|
|
17
23
|
id: string;
|
|
@@ -19,6 +25,11 @@ interface LocalizeDraftResult {
|
|
|
19
25
|
created: boolean;
|
|
20
26
|
applied: boolean;
|
|
21
27
|
status: string;
|
|
28
|
+
/**
|
|
29
|
+
* Set when the write was refused. `protected` is a published, in-review, or
|
|
30
|
+
* approved sibling. `changed` is a draft that was saved while translating.
|
|
31
|
+
*/
|
|
32
|
+
blocked?: 'protected' | 'changed';
|
|
22
33
|
}
|
|
23
34
|
export type LocalizeOutcome = {
|
|
24
35
|
ok: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localize-draft.d.ts","sourceRoot":"","sources":["../../src/i18n/localize-draft.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"localize-draft.d.ts","sourceRoot":"","sources":["../../src/i18n/localize-draft.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAiD,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEnG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAwB1D,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,OAAO,CAAA;IACb,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,UAAU,mBAAmB;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAClC;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAA;AAEtC,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG,YAAY,CAAC,CAAA;IACnF,WAAW,CAAC,EAAE,OAAO,sBAAsB,CAAA;IAC3C,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACjF,QAAQ,CAAC,EAAE,CACT,EAAE,EAAE,OAAO,EACX,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAA;KAAE,KAC7D,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,GAAG,YAAY,CAAC,CAAA;IACvE,KAAK,CAAC,EAAE,CACN,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjC;AAiHD,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE;IACL,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;CACtB,EACD,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,eAAe,CAAC,CAiG1B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Fill a locale sibling with a governed AI translation and leave it a DRAFT.
|
|
3
|
-
* Published
|
|
3
|
+
* Published siblings are not overwritten. In-review and approved siblings stay
|
|
4
|
+
* `status: DRAFT` and are protected by `workflowStage`. A plain draft that
|
|
5
|
+
* changes while the model is running is left untouched. The patch never
|
|
4
6
|
* includes `status`, so publish still goes through the review workflow.
|
|
5
7
|
*/
|
|
6
8
|
import { z } from 'zod';
|
|
@@ -72,13 +74,51 @@ function applyStrings(data, slots, strings) {
|
|
|
72
74
|
});
|
|
73
75
|
return title;
|
|
74
76
|
}
|
|
77
|
+
/** A translation may be filled only while it is still an editable draft. */
|
|
78
|
+
function isPlainDraft(row) {
|
|
79
|
+
if (row.status !== 'DRAFT')
|
|
80
|
+
return false;
|
|
81
|
+
return (row.workflowStage ?? 'DRAFT') === 'DRAFT';
|
|
82
|
+
}
|
|
83
|
+
function sameRevision(before, after) {
|
|
84
|
+
if (!before.updatedAt || !after.updatedAt)
|
|
85
|
+
return true;
|
|
86
|
+
return before.updatedAt === after.updatedAt;
|
|
87
|
+
}
|
|
88
|
+
function revisionStamp(value) {
|
|
89
|
+
if (value instanceof Date)
|
|
90
|
+
return value.toISOString();
|
|
91
|
+
if (typeof value === 'string' && value.length > 0)
|
|
92
|
+
return value;
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function skipped(draft, row, blocked) {
|
|
96
|
+
return {
|
|
97
|
+
ok: true,
|
|
98
|
+
result: {
|
|
99
|
+
id: draft.id,
|
|
100
|
+
locale: draft.locale,
|
|
101
|
+
created: draft.created,
|
|
102
|
+
applied: false,
|
|
103
|
+
status: row.status,
|
|
104
|
+
blocked,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
75
108
|
async function defaultLoad(db, collection, id) {
|
|
76
109
|
const row = await db.document.findFirst({
|
|
77
110
|
where: { id, collection, deletedAt: null },
|
|
78
111
|
});
|
|
79
112
|
if (!row)
|
|
80
113
|
return null;
|
|
81
|
-
return {
|
|
114
|
+
return {
|
|
115
|
+
id: row.id,
|
|
116
|
+
status: row.status,
|
|
117
|
+
workflowStage: row.workflowStage,
|
|
118
|
+
title: row.title,
|
|
119
|
+
data: row.data,
|
|
120
|
+
updatedAt: revisionStamp(row.updatedAt),
|
|
121
|
+
};
|
|
82
122
|
}
|
|
83
123
|
async function defaultWrite(db, collection, id, patch, userId, role, locale) {
|
|
84
124
|
const updated = await updateDocument(collection, id, patch, { userId, role, locale, db });
|
|
@@ -102,18 +142,8 @@ export async function localizeTranslationDraft(db, input, deps = {}) {
|
|
|
102
142
|
const row = await load(db, input.collection, draft.id);
|
|
103
143
|
if (!row)
|
|
104
144
|
throw new Error(`Document "${draft.id}" not found`);
|
|
105
|
-
if (row
|
|
106
|
-
return
|
|
107
|
-
ok: true,
|
|
108
|
-
result: {
|
|
109
|
-
id: draft.id,
|
|
110
|
-
locale: draft.locale,
|
|
111
|
-
created: draft.created,
|
|
112
|
-
applied: false,
|
|
113
|
-
status: row.status,
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
}
|
|
145
|
+
if (!isPlainDraft(row))
|
|
146
|
+
return skipped(draft, row, 'protected');
|
|
117
147
|
const data = row.data && typeof row.data === 'object' && !Array.isArray(row.data)
|
|
118
148
|
? JSON.parse(JSON.stringify(row.data))
|
|
119
149
|
: {};
|
|
@@ -150,6 +180,13 @@ export async function localizeTranslationDraft(db, input, deps = {}) {
|
|
|
150
180
|
});
|
|
151
181
|
if (!generated.ok)
|
|
152
182
|
return { ok: false, error: generated };
|
|
183
|
+
// The model call is the long window. Re-read before writing so a review
|
|
184
|
+
// submission or a concurrent save is not replaced by the stale snapshot.
|
|
185
|
+
const fresh = await load(db, input.collection, draft.id);
|
|
186
|
+
if (!fresh || !isPlainDraft(fresh))
|
|
187
|
+
return skipped(draft, fresh ?? row, 'protected');
|
|
188
|
+
if (!sameRevision(row, fresh))
|
|
189
|
+
return skipped(draft, fresh, 'changed');
|
|
153
190
|
const title = applyStrings(data, slots, generated.value.strings);
|
|
154
191
|
const patch = {};
|
|
155
192
|
if (title)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localize-draft.js","sourceRoot":"","sources":["../../src/i18n/localize-draft.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"localize-draft.js","sourceRoot":"","sources":["../../src/i18n/localize-draft.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAUrD,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAA;AAgBnE,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAUrD,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAA;AAgBnE,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA6J1E"}
|
package/dist/jobs/handlers.js
CHANGED
|
@@ -22,16 +22,26 @@ export function createJobHandlers(db) {
|
|
|
22
22
|
const linkTargets = linkTargetLoader(db);
|
|
23
23
|
return {
|
|
24
24
|
'seo-scan': async (job) => {
|
|
25
|
-
const skip = typeof job.payload.skip === 'number' ? job.payload.skip : 0;
|
|
26
25
|
const runId = typeof job.payload.runId === 'string' ? job.payload.runId : null;
|
|
27
|
-
|
|
26
|
+
// Jobs started before the id cursor stored only an offset. Finish those
|
|
27
|
+
// on the offset path so a deploy does not rescan pages into the same run.
|
|
28
|
+
const legacyOffset = typeof job.payload.skip === 'number' &&
|
|
29
|
+
job.payload.skip > 0 &&
|
|
30
|
+
typeof job.payload.afterId !== 'string';
|
|
31
|
+
if (!runId)
|
|
28
32
|
await sweepStaleAuditRuns(db);
|
|
33
|
+
const scanned = typeof job.payload.scanned === 'number' ? job.payload.scanned : 0;
|
|
29
34
|
const slice = await runAuditSlice(db, {
|
|
30
35
|
runId,
|
|
31
|
-
skip,
|
|
32
36
|
take: AUDIT_QUEUE_SLICE,
|
|
33
37
|
startedById: null,
|
|
34
38
|
collectionTypes: frontEndContentCollectionTypes(getPrentaConfig()),
|
|
39
|
+
...(legacyOffset
|
|
40
|
+
? { skip: job.payload.skip }
|
|
41
|
+
: {
|
|
42
|
+
afterId: typeof job.payload.afterId === 'string' ? job.payload.afterId : null,
|
|
43
|
+
skip: scanned,
|
|
44
|
+
}),
|
|
35
45
|
});
|
|
36
46
|
const total = Math.max(slice.total, slice.pagesScanned);
|
|
37
47
|
const progress = {
|
|
@@ -47,7 +57,17 @@ export function createJobHandlers(db) {
|
|
|
47
57
|
return {
|
|
48
58
|
done: false,
|
|
49
59
|
progress,
|
|
50
|
-
|
|
60
|
+
// An offset run keeps its offset to the end. A cursor saved here
|
|
61
|
+
// would move it onto the id walk partway, skipping pages it never
|
|
62
|
+
// audited, and the last slice would resolve their issues.
|
|
63
|
+
payload: legacyOffset
|
|
64
|
+
? { ...job.payload, runId: slice.runId, skip: slice.pagesScanned }
|
|
65
|
+
: {
|
|
66
|
+
...job.payload,
|
|
67
|
+
runId: slice.runId,
|
|
68
|
+
afterId: slice.lastId,
|
|
69
|
+
scanned: slice.pagesScanned,
|
|
70
|
+
},
|
|
51
71
|
};
|
|
52
72
|
}
|
|
53
73
|
// Another audit was already running, so this job has no run of its own to report.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AAChG,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EACL,iBAAiB,EACjB,8BAA8B,EAC9B,aAAa,EACb,mBAAmB,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAGpD,2FAA2F;AAC3F,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAE/B,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,eAAe,EAAoE,CAAA;IAClG,OAAO,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAA;AAC9F,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;QAClE,CAAC,CAAC,EAAE,CAAA;AACR,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAY;IAC5C,kFAAkF;IAClF,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACxC,OAAO;QACL,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxB,MAAM,
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/jobs/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -146,7 +146,14 @@ export declare function issueKeyFor(type: string, identifier: string): string;
|
|
|
146
146
|
/**
|
|
147
147
|
* Run the full SEO audit analysis over a set of entities + signals.
|
|
148
148
|
*/
|
|
149
|
-
export declare function runSeoAuditAnalysis(entities: AuditEntityInput[], signals?: AuditExtraSignals
|
|
149
|
+
export declare function runSeoAuditAnalysis(entities: AuditEntityInput[], signals?: AuditExtraSignals, options?: {
|
|
150
|
+
/**
|
|
151
|
+
* When false, skip duplicate-title, duplicate-description, and topic-overlap
|
|
152
|
+
* checks. A queued audit slice does not hold the whole corpus, so those
|
|
153
|
+
* comparisons would both miss real pairs and invent pairs from one page.
|
|
154
|
+
*/
|
|
155
|
+
crossEntity?: boolean;
|
|
156
|
+
}): SeoAuditResult;
|
|
150
157
|
/**
|
|
151
158
|
* Derive priority-ranked quick wins by grouping issues by type and ranking by
|
|
152
159
|
* (impact, weight). Never hardcoded — purely a function of detected issues,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-engine.d.ts","sourceRoot":"","sources":["../../src/seo/audit-engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"audit-engine.d.ts","sourceRoot":"","sources":["../../src/seo/audit-engine.ts"],"names":[],"mappings":"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"}
|
package/dist/seo/audit-engine.js
CHANGED
|
@@ -106,7 +106,7 @@ export function issueKeyFor(type, identifier) {
|
|
|
106
106
|
/**
|
|
107
107
|
* Run the full SEO audit analysis over a set of entities + signals.
|
|
108
108
|
*/
|
|
109
|
-
export function runSeoAuditAnalysis(entities, signals = {}) {
|
|
109
|
+
export function runSeoAuditAnalysis(entities, signals = {}, options) {
|
|
110
110
|
const issues = [];
|
|
111
111
|
const pages = [];
|
|
112
112
|
// -- Per-entity content checks -------------------------------------------
|
|
@@ -406,107 +406,113 @@ export function runSeoAuditAnalysis(entities, signals = {}) {
|
|
|
406
406
|
});
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
|
-
//
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
const
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
const
|
|
450
|
-
const
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
const
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
const
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
409
|
+
// Cross-entity checks compare the whole corpus. A single queue slice must
|
|
410
|
+
// not emit them: two pages that share a title only when the rest of the
|
|
411
|
+
// site is invisible would open a partial issue, and the final reconcile
|
|
412
|
+
// would close the real one.
|
|
413
|
+
if (options?.crossEntity !== false) {
|
|
414
|
+
// -- Duplicate meta titles (cross-entity) --------------------------------
|
|
415
|
+
const titleGroups = new Map();
|
|
416
|
+
for (const e of entities) {
|
|
417
|
+
const rendered = resolveRenderedInputs(e);
|
|
418
|
+
if (rendered.unverified || !present(rendered.metaTitle))
|
|
419
|
+
continue;
|
|
420
|
+
const key = normalizeTitle(rendered.metaTitle);
|
|
421
|
+
const arr = titleGroups.get(key) ?? [];
|
|
422
|
+
arr.push(e);
|
|
423
|
+
titleGroups.set(key, arr);
|
|
424
|
+
}
|
|
425
|
+
for (const group of titleGroups.values()) {
|
|
426
|
+
if (group.length < 2)
|
|
427
|
+
continue;
|
|
428
|
+
const ids = group.map((g) => g.entityId).sort();
|
|
429
|
+
const urls = group.map((g) => g.url).join(', ');
|
|
430
|
+
issues.push({
|
|
431
|
+
entityType: group[0].entityType,
|
|
432
|
+
entityId: group[0].entityId,
|
|
433
|
+
entityTitle: group[0].title,
|
|
434
|
+
url: urls,
|
|
435
|
+
issueKey: issueKeyFor('duplicate-meta-title', ids.join(',')),
|
|
436
|
+
severity: 'critical',
|
|
437
|
+
category: 'content',
|
|
438
|
+
type: 'duplicate-meta-title',
|
|
439
|
+
title: 'Duplicate meta title detected',
|
|
440
|
+
description: `Each page must have a unique meta title. ${urls} share the same title.`,
|
|
441
|
+
impact: 'High',
|
|
442
|
+
recommendation: 'Differentiate the meta titles so each page targets distinct intent.',
|
|
443
|
+
fixable: true,
|
|
444
|
+
fixActionType: 'edit-metadata',
|
|
445
|
+
relatedEntityIds: ids,
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
// -- Duplicate meta descriptions (cross-entity) --------------------------
|
|
449
|
+
const descGroups = new Map();
|
|
450
|
+
for (const e of entities) {
|
|
451
|
+
const rendered = resolveRenderedInputs(e);
|
|
452
|
+
if (rendered.unverified || !present(rendered.metaDescription))
|
|
453
|
+
continue;
|
|
454
|
+
const key = normalizeTitle(rendered.metaDescription);
|
|
455
|
+
const arr = descGroups.get(key) ?? [];
|
|
456
|
+
arr.push(e);
|
|
457
|
+
descGroups.set(key, arr);
|
|
458
|
+
}
|
|
459
|
+
for (const group of descGroups.values()) {
|
|
460
|
+
if (group.length < 2)
|
|
461
|
+
continue;
|
|
462
|
+
const ids = group.map((g) => g.entityId).sort();
|
|
463
|
+
const urls = group.map((g) => g.url).join(', ');
|
|
464
|
+
issues.push({
|
|
465
|
+
entityType: group[0].entityType,
|
|
466
|
+
entityId: group[0].entityId,
|
|
467
|
+
entityTitle: group[0].title,
|
|
468
|
+
url: urls,
|
|
469
|
+
issueKey: issueKeyFor('duplicate-meta-description', ids.join(',')),
|
|
470
|
+
severity: 'warning',
|
|
471
|
+
category: 'content',
|
|
472
|
+
type: 'duplicate-meta-description',
|
|
473
|
+
title: 'Duplicate meta description detected',
|
|
474
|
+
description: `Each page should have a unique meta description. ${urls} share the same text.`,
|
|
475
|
+
impact: 'Medium',
|
|
476
|
+
recommendation: 'Write distinct descriptions that match each page’s unique intent.',
|
|
477
|
+
fixable: true,
|
|
478
|
+
fixActionType: 'edit-metadata',
|
|
479
|
+
relatedEntityIds: ids,
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
// -- Overlapping topics (same focus keyword, cross-entity) ---------------
|
|
483
|
+
const topicGroups = new Map();
|
|
484
|
+
for (const e of entities) {
|
|
485
|
+
if (!present(e.focusKeyword))
|
|
486
|
+
continue;
|
|
487
|
+
const key = normalizeTitle(e.focusKeyword);
|
|
488
|
+
const arr = topicGroups.get(key) ?? [];
|
|
489
|
+
arr.push(e);
|
|
490
|
+
topicGroups.set(key, arr);
|
|
491
|
+
}
|
|
492
|
+
for (const [keyword, group] of topicGroups) {
|
|
493
|
+
if (group.length < 2)
|
|
494
|
+
continue;
|
|
495
|
+
const ids = group.map((g) => g.entityId).sort();
|
|
496
|
+
const urls = group.map((g) => g.url).join(', ');
|
|
497
|
+
const names = group.map((g) => g.title).join(', ');
|
|
498
|
+
issues.push({
|
|
499
|
+
entityType: group[0].entityType,
|
|
500
|
+
entityId: group[0].entityId,
|
|
501
|
+
entityTitle: group[0].title,
|
|
502
|
+
url: urls,
|
|
503
|
+
issueKey: issueKeyFor('topic-overlap', ids.join(',')),
|
|
504
|
+
severity: 'warning',
|
|
505
|
+
category: 'content',
|
|
506
|
+
type: 'topic-overlap',
|
|
507
|
+
title: `Overlapping topic: ${keyword}`,
|
|
508
|
+
description: `${names} (${urls}) all target “${keyword}”, so they can compete with each other in search.`,
|
|
509
|
+
impact: 'Medium',
|
|
510
|
+
recommendation: `Choose one primary URL for “${keyword}”. Change the focus keyword on the other pages, or consolidate them into the primary page.`,
|
|
511
|
+
fixable: false,
|
|
512
|
+
fixActionType: 'edit-metadata',
|
|
513
|
+
relatedEntityIds: ids,
|
|
514
|
+
});
|
|
515
|
+
}
|
|
510
516
|
}
|
|
511
517
|
// -- Broken internal links -----------------------------------------------
|
|
512
518
|
for (const link of signals.brokenLinks ?? []) {
|