@prenta/core 5.5.0 → 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.
- package/CHANGELOG.md +21 -0
- package/dist/ai/governance.d.ts +6 -0
- package/dist/ai/governance.d.ts.map +1 -1
- package/dist/ai/governance.js +19 -0
- package/dist/ai/governance.js.map +1 -1
- package/dist/api/routes/redirects.d.ts.map +1 -1
- package/dist/api/routes/redirects.js +17 -65
- package/dist/api/routes/redirects.js.map +1 -1
- package/dist/api/routes/seo.d.ts.map +1 -1
- package/dist/api/routes/seo.js +195 -360
- package/dist/api/routes/seo.js.map +1 -1
- package/dist/redirects/suggestion-accept.d.ts +28 -0
- package/dist/redirects/suggestion-accept.d.ts.map +1 -0
- package/dist/redirects/suggestion-accept.js +98 -0
- package/dist/redirects/suggestion-accept.js.map +1 -0
- package/dist/seo/index.d.ts +6 -2
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +5 -1
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/issue-fix-ai.d.ts +40 -1
- package/dist/seo/issue-fix-ai.d.ts.map +1 -1
- package/dist/seo/issue-fix-ai.js +53 -1
- package/dist/seo/issue-fix-ai.js.map +1 -1
- package/dist/seo/issue-fix-apply.d.ts +85 -0
- package/dist/seo/issue-fix-apply.d.ts.map +1 -0
- package/dist/seo/issue-fix-apply.js +400 -0
- package/dist/seo/issue-fix-apply.js.map +1 -0
- package/dist/seo/issue-fix.d.ts +9 -0
- package/dist/seo/issue-fix.d.ts.map +1 -1
- package/dist/seo/issue-fix.js +1 -0
- package/dist/seo/issue-fix.js.map +1 -1
- package/dist/seo/proposals-bulk-apply.d.ts +52 -0
- package/dist/seo/proposals-bulk-apply.d.ts.map +1 -0
- package/dist/seo/proposals-bulk-apply.js +183 -0
- package/dist/seo/proposals-bulk-apply.js.map +1 -0
- package/dist/seo/proposals-generate.d.ts +43 -0
- package/dist/seo/proposals-generate.d.ts.map +1 -0
- package/dist/seo/proposals-generate.js +138 -0
- package/dist/seo/proposals-generate.js.map +1 -0
- package/dist/seo/proposals.d.ts +116 -0
- package/dist/seo/proposals.d.ts.map +1 -0
- package/dist/seo/proposals.js +236 -0
- package/dist/seo/proposals.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { getFeatureGovernance } from '../ai/governance.js';
|
|
2
|
+
import { buildFixFingerprint } from './issue-fix.js';
|
|
3
|
+
import { pendingFixFromMetadata, stickyFingerprintsFromMetadata, } from './issue-fix-ai.js';
|
|
4
|
+
import { INSERT_LINK_FIX_TYPES, buildInsertLinkFingerprint } from './issue-fix-link-insert.js';
|
|
5
|
+
export const ISSUE_FIX_FEATURE_KEY = 'ai.features.seoMetaGeneration';
|
|
6
|
+
export const REDIRECT_FEATURE_KEY = 'ai.features.seo404Recovery';
|
|
7
|
+
const SEVERITY_RANK = { critical: 0, warning: 1, info: 2 };
|
|
8
|
+
function severityOf(value) {
|
|
9
|
+
return value === 'critical' || value === 'warning' || value === 'info' ? value : null;
|
|
10
|
+
}
|
|
11
|
+
function toDate(value) {
|
|
12
|
+
return value instanceof Date ? value : new Date(String(value));
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Open/recurring issues (any fixability) plus the documents they reference, in
|
|
16
|
+
* two queries. "Reference" covers the issue entity AND, for cached insert-link
|
|
17
|
+
* fixes, the SOURCE document named by `pendingFix.patch.sourceEntityId` — that
|
|
18
|
+
* is the document the fix writes to and the one its fingerprint is built from,
|
|
19
|
+
* so without it `liveFingerprintFor` could never detect a stale link proposal.
|
|
20
|
+
*/
|
|
21
|
+
export async function loadOpenFixableIssuesWithDocs(db) {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- optional-model guard
|
|
23
|
+
const d = db;
|
|
24
|
+
const issues = d?.seoIssue?.findMany
|
|
25
|
+
? await d.seoIssue.findMany({
|
|
26
|
+
where: { status: { in: ['open', 'recurring'] } },
|
|
27
|
+
orderBy: { lastDetectedAt: 'desc' },
|
|
28
|
+
take: 500,
|
|
29
|
+
})
|
|
30
|
+
: [];
|
|
31
|
+
const docIds = new Set();
|
|
32
|
+
for (const issue of issues) {
|
|
33
|
+
if (typeof issue.entityId === 'string' && issue.entityId.length > 0) {
|
|
34
|
+
docIds.add(issue.entityId);
|
|
35
|
+
}
|
|
36
|
+
const sourceId = pendingFixFromMetadata(issue.metadata)?.patch.sourceEntityId;
|
|
37
|
+
if (typeof sourceId === 'string' && sourceId.length > 0)
|
|
38
|
+
docIds.add(sourceId);
|
|
39
|
+
}
|
|
40
|
+
const docsById = new Map();
|
|
41
|
+
if (docIds.size > 0 && d?.document?.findMany) {
|
|
42
|
+
const docs = (await d.document.findMany({
|
|
43
|
+
where: { id: { in: [...docIds] }, deletedAt: null },
|
|
44
|
+
select: { id: true, updatedAt: true, title: true, slug: true, collection: true },
|
|
45
|
+
}));
|
|
46
|
+
for (const doc of docs) {
|
|
47
|
+
docsById.set(String(doc.id), {
|
|
48
|
+
id: String(doc.id),
|
|
49
|
+
updatedAt: toDate(doc.updatedAt),
|
|
50
|
+
title: typeof doc.title === 'string' ? doc.title : null,
|
|
51
|
+
slug: typeof doc.slug === 'string' ? doc.slug : null,
|
|
52
|
+
collection: String(doc.collection ?? ''),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { issues, docsById };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The fingerprint a fresh suggestion for this issue would carry right now.
|
|
60
|
+
* Insert-link fixes are fingerprinted on the SOURCE document (the one that
|
|
61
|
+
* gets written), so their live value needs the cache to know the source.
|
|
62
|
+
* `loadOpenFixableIssuesWithDocs` loads sources alongside entities; if one is
|
|
63
|
+
* still missing (deleted since generation) we fall back to the cached value
|
|
64
|
+
* rather than guessing.
|
|
65
|
+
*/
|
|
66
|
+
export function liveFingerprintFor(issue, cache, docsById) {
|
|
67
|
+
const entityId = typeof issue.entityId === 'string' ? issue.entityId : null;
|
|
68
|
+
if (!entityId)
|
|
69
|
+
return null;
|
|
70
|
+
if (cache &&
|
|
71
|
+
(INSERT_LINK_FIX_TYPES.has(issue.type) || cache.patch.fixStrategy === 'insert-link')) {
|
|
72
|
+
const sourceId = typeof cache.patch.sourceEntityId === 'string' ? cache.patch.sourceEntityId : null;
|
|
73
|
+
const source = sourceId ? docsById.get(sourceId) : undefined;
|
|
74
|
+
if (!source)
|
|
75
|
+
return cache.fingerprint;
|
|
76
|
+
return buildInsertLinkFingerprint(sourceId, typeof cache.patch.targetEntityId === 'string' ? cache.patch.targetEntityId : entityId, typeof cache.patch.anchorText === 'string' ? cache.patch.anchorText : '', source.updatedAt);
|
|
77
|
+
}
|
|
78
|
+
const doc = docsById.get(entityId);
|
|
79
|
+
if (!doc)
|
|
80
|
+
return null;
|
|
81
|
+
return buildFixFingerprint(entityId, issue.type, doc.updatedAt);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The marker `dismiss-fix` stores. After a dismissal there is no cache, so
|
|
85
|
+
* `selectEligibleForGeneration` compares the marker against the ENTITY-based
|
|
86
|
+
* live fingerprint. Insert-link caches are fingerprinted on the source
|
|
87
|
+
* document instead, so for them we store the entity-based value the no-cache
|
|
88
|
+
* path will compute; for every other type the cached fingerprint already is
|
|
89
|
+
* that value.
|
|
90
|
+
*/
|
|
91
|
+
export function dismissalFingerprintFor(issue, cache, entityUpdatedAt) {
|
|
92
|
+
const isInsertLink = INSERT_LINK_FIX_TYPES.has(issue.type) || cache.patch.fixStrategy === 'insert-link';
|
|
93
|
+
if (!isInsertLink || !entityUpdatedAt || typeof issue.entityId !== 'string') {
|
|
94
|
+
return cache.fingerprint;
|
|
95
|
+
}
|
|
96
|
+
return buildFixFingerprint(issue.entityId, issue.type, entityUpdatedAt);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Issues batch generation should attempt: fixable, open, document present,
|
|
100
|
+
* no LIVE cache (a stale one counts as none), and neither sticky marker
|
|
101
|
+
* equals the live fingerprint. Ordered critical → warning → info.
|
|
102
|
+
*/
|
|
103
|
+
export function selectEligibleForGeneration(issues, docsById) {
|
|
104
|
+
const out = [];
|
|
105
|
+
for (const issue of issues) {
|
|
106
|
+
if (issue.fixable !== true)
|
|
107
|
+
continue;
|
|
108
|
+
if (issue.status !== 'open' && issue.status !== 'recurring')
|
|
109
|
+
continue;
|
|
110
|
+
const cache = pendingFixFromMetadata(issue.metadata);
|
|
111
|
+
const live = liveFingerprintFor(issue, cache, docsById);
|
|
112
|
+
if (!live)
|
|
113
|
+
continue;
|
|
114
|
+
if (cache && cache.fingerprint === live)
|
|
115
|
+
continue;
|
|
116
|
+
const sticky = stickyFingerprintsFromMetadata(issue.metadata);
|
|
117
|
+
if (sticky.dismissed === live || sticky.generateSkipped === live)
|
|
118
|
+
continue;
|
|
119
|
+
out.push({ issue, liveFingerprint: live });
|
|
120
|
+
}
|
|
121
|
+
out.sort((a, b) => (SEVERITY_RANK[String(a.issue.severity)] ?? 99) -
|
|
122
|
+
(SEVERITY_RANK[String(b.issue.severity)] ?? 99));
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
function issueFixProposal(issue, cache, docsById) {
|
|
126
|
+
const live = liveFingerprintFor(issue, cache, docsById);
|
|
127
|
+
const doc = typeof issue.entityId === 'string' ? docsById.get(issue.entityId) : undefined;
|
|
128
|
+
return {
|
|
129
|
+
id: `issue:${issue.id}`,
|
|
130
|
+
kind: 'issue-fix',
|
|
131
|
+
title: String(issue.title ?? issue.type),
|
|
132
|
+
entity: {
|
|
133
|
+
type: typeof issue.entityType === 'string' ? issue.entityType : null,
|
|
134
|
+
id: typeof issue.entityId === 'string' ? issue.entityId : null,
|
|
135
|
+
title: (typeof issue.entityTitle === 'string' ? issue.entityTitle : null) ?? doc?.title ?? null,
|
|
136
|
+
url: typeof issue.url === 'string' ? issue.url : null,
|
|
137
|
+
},
|
|
138
|
+
changes: cache.changes,
|
|
139
|
+
justification: cache.justification,
|
|
140
|
+
source: cache.source,
|
|
141
|
+
confidence: null,
|
|
142
|
+
brandAlignment: cache.brandAlignment,
|
|
143
|
+
generatedAt: cache.generatedAt,
|
|
144
|
+
fingerprint: cache.fingerprint,
|
|
145
|
+
stale: live !== null && live !== cache.fingerprint,
|
|
146
|
+
issueType: String(issue.type),
|
|
147
|
+
severity: severityOf(issue.severity),
|
|
148
|
+
issueId: String(issue.id),
|
|
149
|
+
suggestionId: null,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function redirectProposal(s) {
|
|
153
|
+
const fromPath = String(s.fromPath ?? '');
|
|
154
|
+
const toPath = String(s.toPath ?? '');
|
|
155
|
+
return {
|
|
156
|
+
id: `redirect:${String(s.id)}`,
|
|
157
|
+
kind: 'redirect',
|
|
158
|
+
title: `Redirect ${fromPath} → ${toPath}`,
|
|
159
|
+
entity: { type: null, id: null, title: null, url: fromPath },
|
|
160
|
+
changes: [{ field: 'redirect', label: 'Redirect', before: fromPath, after: toPath }],
|
|
161
|
+
justification: typeof s.reason === 'string' ? s.reason : '',
|
|
162
|
+
source: 'ai-404-recovery',
|
|
163
|
+
// Stored as a 0-100 Int; the UI contract is a 0-1 fraction.
|
|
164
|
+
confidence: Number(s.confidence ?? 0) / 100,
|
|
165
|
+
brandAlignment: null,
|
|
166
|
+
generatedAt: s.createdAt ? toDate(s.createdAt).toISOString() : null,
|
|
167
|
+
fingerprint: null,
|
|
168
|
+
stale: false,
|
|
169
|
+
issueType: null,
|
|
170
|
+
severity: null,
|
|
171
|
+
issueId: null,
|
|
172
|
+
suggestionId: String(s.id),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export async function listSeoProposals(db) {
|
|
176
|
+
const { issues, docsById } = await loadOpenFixableIssuesWithDocs(db);
|
|
177
|
+
const fixes = [];
|
|
178
|
+
for (const issue of issues) {
|
|
179
|
+
const cache = pendingFixFromMetadata(issue.metadata);
|
|
180
|
+
if (!cache)
|
|
181
|
+
continue;
|
|
182
|
+
fixes.push(issueFixProposal(issue, cache, docsById));
|
|
183
|
+
}
|
|
184
|
+
fixes.sort((a, b) => {
|
|
185
|
+
const band = (SEVERITY_RANK[String(a.severity)] ?? 99) - (SEVERITY_RANK[String(b.severity)] ?? 99);
|
|
186
|
+
if (band !== 0)
|
|
187
|
+
return band;
|
|
188
|
+
return Number(a.stale) - Number(b.stale);
|
|
189
|
+
});
|
|
190
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- optional-model guard
|
|
191
|
+
const d = db;
|
|
192
|
+
const redirectRows = d?.redirectSuggestion?.findMany
|
|
193
|
+
? await d.redirectSuggestion.findMany({
|
|
194
|
+
where: { status: 'open' },
|
|
195
|
+
orderBy: { confidence: 'desc' },
|
|
196
|
+
})
|
|
197
|
+
: [];
|
|
198
|
+
// Sort defensively: the DB already orders by confidence, but the shape of the
|
|
199
|
+
// payload should not depend on that (fakes in tests do not honor orderBy).
|
|
200
|
+
const redirects = redirectRows
|
|
201
|
+
.map(redirectProposal)
|
|
202
|
+
.sort((a, b) => (b.confidence ?? 0) - (a.confidence ?? 0));
|
|
203
|
+
const [issueGov, redirectGov] = await Promise.all([
|
|
204
|
+
getFeatureGovernance(db, ISSUE_FIX_FEATURE_KEY),
|
|
205
|
+
getFeatureGovernance(db, REDIRECT_FEATURE_KEY),
|
|
206
|
+
]);
|
|
207
|
+
const stale = fixes.filter((p) => p.stale).length;
|
|
208
|
+
return {
|
|
209
|
+
proposals: [...fixes, ...redirects],
|
|
210
|
+
counts: {
|
|
211
|
+
issueFixes: fixes.length - stale,
|
|
212
|
+
redirects: redirects.length,
|
|
213
|
+
stale,
|
|
214
|
+
eligibleForGeneration: selectEligibleForGeneration(issues, docsById).length,
|
|
215
|
+
},
|
|
216
|
+
governance: {
|
|
217
|
+
issueFixBulk: issueGov.allowBulkApply,
|
|
218
|
+
redirectBulk: redirectGov.allowBulkApply,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Cheap counts for the overview badge: every cached fix (stale ones are still
|
|
224
|
+
* rows in the inbox) + open redirect suggestions. Callers pass the open issues
|
|
225
|
+
* they already loaded so this adds at most one `count` query.
|
|
226
|
+
*/
|
|
227
|
+
export async function countPendingProposals(db, openIssues) {
|
|
228
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- optional-model guard
|
|
229
|
+
const d = db;
|
|
230
|
+
const redirects = d?.redirectSuggestion?.count
|
|
231
|
+
? ((await d.redirectSuggestion.count({ where: { status: 'open' } })) ?? 0)
|
|
232
|
+
: 0;
|
|
233
|
+
const issueFixes = openIssues.filter((i) => pendingFixFromMetadata(i.metadata) !== null).length;
|
|
234
|
+
return { issueFixes, redirects };
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=proposals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../src/seo/proposals.ts"],"names":[],"mappings":"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"}
|