@prenta/core 5.3.0 → 5.4.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 +32 -0
- package/dist/ai/content-writing-generate.d.ts.map +1 -1
- package/dist/ai/content-writing-generate.js +3 -0
- package/dist/ai/content-writing-generate.js.map +1 -1
- package/dist/ai/feature-defaults.d.ts +1 -1
- package/dist/ai/feature-defaults.d.ts.map +1 -1
- package/dist/ai/feature-defaults.js +3 -13
- package/dist/ai/feature-defaults.js.map +1 -1
- package/dist/ai/governance.d.ts +31 -0
- package/dist/ai/governance.d.ts.map +1 -0
- package/dist/ai/governance.js +56 -0
- package/dist/ai/governance.js.map +1 -0
- package/dist/ai/index.d.ts +2 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -1
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/providers/custom.d.ts +2 -1
- package/dist/ai/providers/custom.d.ts.map +1 -1
- package/dist/ai/providers/custom.js +7 -1
- package/dist/ai/providers/custom.js.map +1 -1
- package/dist/ai/providers/http.d.ts +13 -0
- package/dist/ai/providers/http.d.ts.map +1 -1
- package/dist/ai/providers/http.js +33 -0
- package/dist/ai/providers/http.js.map +1 -1
- package/dist/ai/providers/index.d.ts +5 -2
- package/dist/ai/providers/index.d.ts.map +1 -1
- package/dist/ai/providers/index.js +10 -0
- package/dist/ai/providers/index.js.map +1 -1
- package/dist/ai/providers/openai.d.ts +2 -1
- package/dist/ai/providers/openai.d.ts.map +1 -1
- package/dist/ai/providers/openai.js +4 -1
- package/dist/ai/providers/openai.js.map +1 -1
- package/dist/ai/runtime.d.ts +28 -1
- package/dist/ai/runtime.d.ts.map +1 -1
- package/dist/ai/runtime.js +73 -2
- package/dist/ai/runtime.js.map +1 -1
- package/dist/ai/usage.d.ts +6 -0
- package/dist/ai/usage.d.ts.map +1 -1
- package/dist/ai/usage.js +29 -0
- package/dist/ai/usage.js.map +1 -1
- package/dist/api/route-helpers.d.ts +2 -0
- package/dist/api/route-helpers.d.ts.map +1 -1
- package/dist/api/route-helpers.js +14 -0
- package/dist/api/route-helpers.js.map +1 -1
- package/dist/api/routes/ai-authoring.js +1 -1
- package/dist/api/routes/ai-authoring.js.map +1 -1
- package/dist/api/routes/ai-seo.d.ts.map +1 -1
- package/dist/api/routes/ai-seo.js +13 -5
- package/dist/api/routes/ai-seo.js.map +1 -1
- package/dist/api/routes/ai-settings.d.ts.map +1 -1
- package/dist/api/routes/ai-settings.js +39 -1
- package/dist/api/routes/ai-settings.js.map +1 -1
- package/dist/api/routes/redirects.d.ts.map +1 -1
- package/dist/api/routes/redirects.js +3 -2
- 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 +17 -0
- package/dist/api/routes/scheduling.js.map +1 -1
- package/dist/api/routes/sections.d.ts.map +1 -1
- package/dist/api/routes/sections.js +9 -40
- package/dist/api/routes/sections.js.map +1 -1
- package/dist/api/routes/seo-public.d.ts.map +1 -1
- package/dist/api/routes/seo-public.js +205 -1
- package/dist/api/routes/seo-public.js.map +1 -1
- package/dist/api/routes/seo.d.ts.map +1 -1
- package/dist/api/routes/seo.js +216 -16
- package/dist/api/routes/seo.js.map +1 -1
- package/dist/db/model-types.d.ts +32 -0
- package/dist/db/model-types.d.ts.map +1 -1
- package/dist/generated/browser.d.ts +17 -0
- package/dist/generated/client.d.ts +17 -0
- package/dist/generated/commonInputTypes.d.ts +30 -30
- package/dist/generated/internal/class.d.ts +22 -0
- package/dist/generated/internal/class.js +4 -4
- package/dist/generated/internal/prismaNamespace.d.ts +198 -1
- package/dist/generated/internal/prismaNamespace.js +43 -0
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +47 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +43 -0
- package/dist/generated/models/ApiRequestMetric.d.ts +0 -7
- package/dist/generated/models/SearchPageInsight.d.ts +1460 -0
- package/dist/generated/models/SearchPageInsight.js +1 -0
- package/dist/generated/models/SearchPerfDaily.d.ts +1167 -0
- package/dist/generated/models/SearchPerfDaily.js +1 -0
- package/dist/generated/models.d.ts +2 -0
- package/dist/redirects/recovery.d.ts +12 -0
- package/dist/redirects/recovery.d.ts.map +1 -1
- package/dist/redirects/recovery.js +42 -2
- package/dist/redirects/recovery.js.map +1 -1
- package/dist/redirects/rerank.d.ts +14 -1
- package/dist/redirects/rerank.d.ts.map +1 -1
- package/dist/redirects/rerank.js +66 -37
- package/dist/redirects/rerank.js.map +1 -1
- package/dist/seo/audit-engine.d.ts +21 -3
- package/dist/seo/audit-engine.d.ts.map +1 -1
- package/dist/seo/audit-engine.js +51 -6
- package/dist/seo/audit-engine.js.map +1 -1
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +18 -0
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/config-store.d.ts +13 -0
- package/dist/seo/config-store.d.ts.map +1 -1
- package/dist/seo/config-store.js +6 -0
- package/dist/seo/config-store.js.map +1 -1
- package/dist/seo/crux.d.ts +58 -0
- package/dist/seo/crux.d.ts.map +1 -0
- package/dist/seo/crux.js +101 -0
- package/dist/seo/crux.js.map +1 -0
- package/dist/seo/issue-content-brief.d.ts.map +1 -1
- package/dist/seo/issue-content-brief.js +11 -0
- package/dist/seo/issue-content-brief.js.map +1 -1
- package/dist/seo/issue-content-research.d.ts.map +1 -1
- package/dist/seo/issue-content-research.js +3 -0
- package/dist/seo/issue-content-research.js.map +1 -1
- package/dist/seo/issue-fix-ai.d.ts.map +1 -1
- package/dist/seo/issue-fix-ai.js +3 -0
- package/dist/seo/issue-fix-ai.js.map +1 -1
- package/dist/seo/issue-fix-redirect.d.ts.map +1 -1
- package/dist/seo/issue-fix-redirect.js +1 -0
- package/dist/seo/issue-fix-redirect.js.map +1 -1
- package/dist/seo/search-console/client.d.ts +39 -0
- package/dist/seo/search-console/client.d.ts.map +1 -0
- package/dist/seo/search-console/client.js +226 -0
- package/dist/seo/search-console/client.js.map +1 -0
- package/dist/seo/search-console/prompt-context.d.ts +21 -0
- package/dist/seo/search-console/prompt-context.d.ts.map +1 -0
- package/dist/seo/search-console/prompt-context.js +93 -0
- package/dist/seo/search-console/prompt-context.js.map +1 -0
- package/dist/seo/search-console/sync.d.ts +67 -0
- package/dist/seo/search-console/sync.d.ts.map +1 -0
- package/dist/seo/search-console/sync.js +469 -0
- package/dist/seo/search-console/sync.js.map +1 -0
- package/dist/seo/search-console/types.d.ts +75 -0
- package/dist/seo/search-console/types.d.ts.map +1 -0
- package/dist/seo/search-console/types.js +16 -0
- package/dist/seo/search-console/types.js.map +1 -0
- package/dist/seo/search-insight-signals.d.ts +29 -0
- package/dist/seo/search-insight-signals.d.ts.map +1 -0
- package/dist/seo/search-insight-signals.js +103 -0
- package/dist/seo/search-insight-signals.js.map +1 -0
- package/package.json +1 -1
- package/prisma/migrations/0016_search_console_tables/migration.sql +56 -0
- package/prisma/schema.prisma +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -16,6 +16,8 @@ export type * from './models/SeoAuditRun.js';
|
|
|
16
16
|
export type * from './models/SeoIssue.js';
|
|
17
17
|
export type * from './models/Redirect404Hit.js';
|
|
18
18
|
export type * from './models/AiCrawlerHit.js';
|
|
19
|
+
export type * from './models/SearchPerfDaily.js';
|
|
20
|
+
export type * from './models/SearchPageInsight.js';
|
|
19
21
|
export type * from './models/RedirectSuggestion.js';
|
|
20
22
|
export type * from './models/FormSchemaVersion.js';
|
|
21
23
|
export type * from './models/FormSubmission.js';
|
|
@@ -33,6 +33,8 @@ export interface RecoveryPlanOptions {
|
|
|
33
33
|
semanticRerank?: import('./rerank.js').SemanticRerankFn | null;
|
|
34
34
|
/** Test seam for live source-URL probes. */
|
|
35
35
|
fetchFn?: typeof safeFetch;
|
|
36
|
+
/** DB handle for the governed semantic rerank. Omitted = heuristic only. */
|
|
37
|
+
db?: unknown;
|
|
36
38
|
}
|
|
37
39
|
/** Merge 404 hit paths and audit broken-link hrefs into one deduped map. */
|
|
38
40
|
export declare function collectRecoveryPaths(hits: Array<{
|
|
@@ -48,6 +50,12 @@ type RecoveryHitRow = {
|
|
|
48
50
|
hits?: number;
|
|
49
51
|
};
|
|
50
52
|
type RecoverySuggestionDb = {
|
|
53
|
+
document?: {
|
|
54
|
+
findFirst?: (args: unknown) => Promise<unknown>;
|
|
55
|
+
};
|
|
56
|
+
auditLog?: {
|
|
57
|
+
create?: (args: unknown) => Promise<unknown>;
|
|
58
|
+
};
|
|
51
59
|
redirect404Hit?: {
|
|
52
60
|
findMany: (args: unknown) => Promise<RecoveryHitRow[]>;
|
|
53
61
|
updateMany?: (args: unknown) => Promise<unknown>;
|
|
@@ -89,10 +97,14 @@ export declare function generateRecoverySuggestions(db: RecoverySuggestionDb, op
|
|
|
89
97
|
autoApplyUserId?: string;
|
|
90
98
|
semanticRerank?: import('./rerank.js').SemanticRerankFn | null;
|
|
91
99
|
fetchFn?: typeof safeFetch;
|
|
100
|
+
/** DB handle for the governed semantic rerank; defaults to the positional `db`. */
|
|
101
|
+
db?: unknown;
|
|
92
102
|
}): Promise<{
|
|
93
103
|
created: number;
|
|
94
104
|
planned: number;
|
|
95
105
|
autoApplied: number;
|
|
106
|
+
/** Set when governance vetoed a requested auto-apply; plans became suggestions. */
|
|
107
|
+
governanceBlocked?: string;
|
|
96
108
|
}>;
|
|
97
109
|
export {};
|
|
98
110
|
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/redirects/recovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/redirects/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { resolveRedirectMatch } from './rerank.js';
|
|
|
8
8
|
import { validateRedirectDestination } from './validate-destination.js';
|
|
9
9
|
import { filterConfirmedDeadRecoveryPaths, probeSitePathStatus, } from '../seo/confirm-broken-links.js';
|
|
10
10
|
import { isConfirmedDeadLinkStatus } from '../seo/link-probe.js';
|
|
11
|
+
import { assertAutoApplyAllowed } from '../ai/governance.js';
|
|
11
12
|
function normalizeBrokenHref(href, siteUrl) {
|
|
12
13
|
const trimmed = href.trim();
|
|
13
14
|
if (!trimmed ||
|
|
@@ -61,6 +62,7 @@ export async function planRecoveryRedirect(fromPath, signals, options) {
|
|
|
61
62
|
minConfidence: options.minConfidence ?? 30,
|
|
62
63
|
enableAiRerank: options.enableAiRerank,
|
|
63
64
|
semanticRerank: options.semanticRerank,
|
|
65
|
+
db: options.db,
|
|
64
66
|
});
|
|
65
67
|
if (!match)
|
|
66
68
|
return null;
|
|
@@ -200,15 +202,48 @@ export async function generateRecoverySuggestions(db, options) {
|
|
|
200
202
|
pathPrefixes: options.pathPrefixes,
|
|
201
203
|
enableAiRerank: options.enableAiRerank,
|
|
202
204
|
semanticRerank: options.semanticRerank,
|
|
205
|
+
db: options.db ?? db,
|
|
203
206
|
siteUrl,
|
|
204
207
|
fetchFn: options.fetchFn,
|
|
205
208
|
});
|
|
206
209
|
const autoMin = options.autoApplyMinConfidence ?? 85;
|
|
210
|
+
let autoApply = options.autoApply === true;
|
|
211
|
+
let governanceBlocked;
|
|
212
|
+
if (autoApply) {
|
|
213
|
+
const eligible = plans.filter((p) => p.confidence >= autoMin).length;
|
|
214
|
+
if (eligible > 0) {
|
|
215
|
+
const decision = await assertAutoApplyAllowed(db, 'ai.features.seo404Recovery', {
|
|
216
|
+
count: eligible,
|
|
217
|
+
});
|
|
218
|
+
if (!decision.ok) {
|
|
219
|
+
autoApply = false;
|
|
220
|
+
governanceBlocked = decision.reason;
|
|
221
|
+
try {
|
|
222
|
+
await db.auditLog?.create?.({
|
|
223
|
+
data: {
|
|
224
|
+
event: 'ai_auto_apply_blocked',
|
|
225
|
+
userId: options.autoApplyUserId ?? 'system',
|
|
226
|
+
timestamp: new Date(),
|
|
227
|
+
details: {
|
|
228
|
+
source: 'redirect-recovery',
|
|
229
|
+
feature: 'ai.features.seo404Recovery',
|
|
230
|
+
reason: decision.reason,
|
|
231
|
+
eligible,
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Audit is observational — never block the pipeline.
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
207
242
|
let created = 0;
|
|
208
243
|
let autoApplied = 0;
|
|
209
244
|
const pending = [];
|
|
210
245
|
for (const plan of plans) {
|
|
211
|
-
if (
|
|
246
|
+
if (autoApply && plan.confidence >= autoMin) {
|
|
212
247
|
try {
|
|
213
248
|
await createRecoveryRedirect(db, plan, options.autoApplyUserId, {
|
|
214
249
|
siteUrl,
|
|
@@ -224,6 +259,11 @@ export async function generateRecoverySuggestions(db, options) {
|
|
|
224
259
|
pending.push(plan);
|
|
225
260
|
}
|
|
226
261
|
created = await upsertRedirectSuggestions(db, pending);
|
|
227
|
-
return {
|
|
262
|
+
return {
|
|
263
|
+
created,
|
|
264
|
+
planned: plans.length,
|
|
265
|
+
autoApplied,
|
|
266
|
+
...(governanceBlocked ? { governanceBlocked } : {}),
|
|
267
|
+
};
|
|
228
268
|
}
|
|
229
269
|
//# sourceMappingURL=recovery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/redirects/recovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EACL,gCAAgC,EAChC,mBAAmB,GACpB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/redirects/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,10 +13,23 @@ export interface ResolveRedirectMatchOptions {
|
|
|
13
13
|
enableAiRerank?: boolean;
|
|
14
14
|
ambiguousLow?: number;
|
|
15
15
|
ambiguousHigh?: number;
|
|
16
|
-
/** Injected semantic ranker (for tests).
|
|
16
|
+
/** Injected semantic ranker (for tests). Overrides the governed default. */
|
|
17
17
|
semanticRerank?: SemanticRerankFn | null;
|
|
18
|
+
/** DB handle for the governed embeddings ranker. Omitted = heuristic only. */
|
|
19
|
+
db?: unknown;
|
|
18
20
|
}
|
|
19
21
|
export type SemanticRerankFn = (fromPath: string, shortlist: SuggestCandidate[]) => Promise<RedirectSuggestionResult | null>;
|
|
22
|
+
/** Cosine similarity; returns 0 for mismatched dimensions or zero-norm vectors. */
|
|
23
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
24
|
+
/**
|
|
25
|
+
* Semantic ranker backed by the governed AI runtime. All enforcement (feature
|
|
26
|
+
* toggle, monthly budget, daily cap, usage metering) happens inside
|
|
27
|
+
* `embedForFeature`; any governed refusal or provider failure returns null so
|
|
28
|
+
* the caller falls back to the heuristic match.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildGovernedRerank(db: unknown, opts?: {
|
|
31
|
+
fetchImpl?: typeof fetch;
|
|
32
|
+
}): SemanticRerankFn;
|
|
20
33
|
/**
|
|
21
34
|
* Resolve the best redirect target — heuristic first, semantic re-rank when ambiguous.
|
|
22
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerank.d.ts","sourceRoot":"","sources":["../../src/redirects/rerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"rerank.d.ts","sourceRoot":"","sources":["../../src/redirects/rerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAA;AAGrB,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,UAAU,CAAA;AAE1D,MAAM,MAAM,mBAAmB,GAAG,wBAAwB,GAAG;IAC3D,WAAW,EAAE,mBAAmB,CAAA;CACjC,CAAA;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACxC,8EAA8E;IAC9E,EAAE,CAAC,EAAE,OAAO,CAAA;CACb;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,gBAAgB,EAAE,KAC1B,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAA;AAO7C,mFAAmF;AACnF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAcjE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,OAAO,EACX,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACtC,gBAAgB,CAiClB;AASD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,gBAAgB,EAAE,EAC9B,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA4CrC"}
|
package/dist/redirects/rerank.js
CHANGED
|
@@ -3,45 +3,70 @@
|
|
|
3
3
|
* Constrained to published candidate URLs only — the model never invents paths.
|
|
4
4
|
*/
|
|
5
5
|
import { rankRedirectCandidates, suggestRedirectTarget, } from './suggest.js';
|
|
6
|
+
import { embedForFeature } from '../ai/runtime.js';
|
|
6
7
|
const CLEAR_MATCH = 85;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const RECOVERY_FEATURE_KEY = 'ai.features.seo404Recovery';
|
|
9
|
+
const SEMANTIC_THRESHOLD = 0.42;
|
|
10
|
+
/** Cosine similarity; returns 0 for mismatched dimensions or zero-norm vectors. */
|
|
11
|
+
export function cosineSimilarity(a, b) {
|
|
12
|
+
if (a.length !== b.length || a.length === 0)
|
|
13
|
+
return 0;
|
|
14
|
+
let dot = 0;
|
|
15
|
+
let normA = 0;
|
|
16
|
+
let normB = 0;
|
|
17
|
+
for (let i = 0; i < a.length; i++) {
|
|
18
|
+
const x = a[i] ?? 0;
|
|
19
|
+
const y = b[i] ?? 0;
|
|
20
|
+
dot += x * y;
|
|
21
|
+
normA += x * x;
|
|
22
|
+
normB += y * y;
|
|
23
|
+
}
|
|
24
|
+
if (normA === 0 || normB === 0)
|
|
25
|
+
return 0;
|
|
26
|
+
return dot / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Semantic ranker backed by the governed AI runtime. All enforcement (feature
|
|
30
|
+
* toggle, monthly budget, daily cap, usage metering) happens inside
|
|
31
|
+
* `embedForFeature`; any governed refusal or provider failure returns null so
|
|
32
|
+
* the caller falls back to the heuristic match.
|
|
33
|
+
*/
|
|
34
|
+
export function buildGovernedRerank(db, opts = {}) {
|
|
35
|
+
return async (fromPath, shortlist) => {
|
|
36
|
+
if (shortlist.length === 0)
|
|
37
|
+
return null;
|
|
38
|
+
const query = `Best replacement page for broken URL path: ${fromPath}`;
|
|
39
|
+
const texts = [query, ...shortlist.map((c) => `${c.title ?? ''} ${c.url}`.trim())];
|
|
40
|
+
const res = await embedForFeature(db, RECOVERY_FEATURE_KEY, texts, {
|
|
41
|
+
fetchImpl: opts.fetchImpl,
|
|
42
|
+
});
|
|
43
|
+
if (!res.ok)
|
|
44
|
+
return null;
|
|
45
|
+
const [queryVec, ...candidateVecs] = res.vectors;
|
|
46
|
+
if (!queryVec)
|
|
12
47
|
return null;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return null;
|
|
34
|
-
const confidence = Math.round(Math.min(1, Math.max(0, top.score)) * 100);
|
|
35
|
-
return {
|
|
36
|
-
toPath: matched.url,
|
|
37
|
-
confidence,
|
|
38
|
-
reason: `Semantic match to "${matched.title ?? matched.url}"`,
|
|
39
|
-
};
|
|
48
|
+
let best = null;
|
|
49
|
+
for (let i = 0; i < candidateVecs.length; i++) {
|
|
50
|
+
const vec = candidateVecs[i];
|
|
51
|
+
if (!vec)
|
|
52
|
+
continue;
|
|
53
|
+
const score = cosineSimilarity(queryVec, vec);
|
|
54
|
+
if (score >= SEMANTIC_THRESHOLD && (!best || score > best.score)) {
|
|
55
|
+
best = { index: i, score };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!best)
|
|
59
|
+
return null;
|
|
60
|
+
const matched = shortlist[best.index];
|
|
61
|
+
if (!matched)
|
|
62
|
+
return null;
|
|
63
|
+
const confidence = Math.round(Math.min(1, Math.max(0, best.score)) * 100);
|
|
64
|
+
return {
|
|
65
|
+
toPath: matched.url,
|
|
66
|
+
confidence,
|
|
67
|
+
reason: `Semantic match to "${matched.title ?? matched.url}"`,
|
|
40
68
|
};
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
69
|
+
};
|
|
45
70
|
}
|
|
46
71
|
function withSource(match, matchSource) {
|
|
47
72
|
return { ...match, matchSource };
|
|
@@ -62,7 +87,11 @@ export async function resolveRedirectMatch(fromPath, candidates, options = {}) {
|
|
|
62
87
|
if (heuristic && heuristic.confidence >= CLEAR_MATCH) {
|
|
63
88
|
return withSource(heuristic, 'heuristic');
|
|
64
89
|
}
|
|
65
|
-
const rerank = options.semanticRerank
|
|
90
|
+
const rerank = options.semanticRerank !== undefined
|
|
91
|
+
? options.semanticRerank
|
|
92
|
+
: options.db != null
|
|
93
|
+
? buildGovernedRerank(options.db)
|
|
94
|
+
: null;
|
|
66
95
|
if (!rerank) {
|
|
67
96
|
return heuristic ? withSource(heuristic, 'heuristic') : null;
|
|
68
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rerank.js","sourceRoot":"","sources":["../../src/redirects/rerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,GAGtB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"rerank.js","sourceRoot":"","sources":["../../src/redirects/rerank.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,6 +71,17 @@ export interface AuditExtraSignals {
|
|
|
71
71
|
url: string;
|
|
72
72
|
note?: string;
|
|
73
73
|
}[];
|
|
74
|
+
/** Pages whose 28-day clicks dropped sharply vs the prior window (synced GSC data). */
|
|
75
|
+
decliningPages?: Array<{
|
|
76
|
+
entityId: string;
|
|
77
|
+
entityType: 'page' | 'post';
|
|
78
|
+
title: string;
|
|
79
|
+
url: string;
|
|
80
|
+
clicks28d: number;
|
|
81
|
+
clicksPrev28d: number;
|
|
82
|
+
}>;
|
|
83
|
+
/** Trailing-28d impressions per entity (synced GSC data) — weights quick wins. */
|
|
84
|
+
impressionsByEntityId?: Record<string, number>;
|
|
74
85
|
redirectChains?: number;
|
|
75
86
|
redirectLoops?: number;
|
|
76
87
|
sitemapEnabled?: boolean;
|
|
@@ -133,9 +144,16 @@ export declare function issueKeyFor(type: string, identifier: string): string;
|
|
|
133
144
|
export declare function runSeoAuditAnalysis(entities: AuditEntityInput[], signals?: AuditExtraSignals): SeoAuditResult;
|
|
134
145
|
/**
|
|
135
146
|
* Derive priority-ranked quick wins by grouping issues by type and ranking by
|
|
136
|
-
* (impact,
|
|
137
|
-
*
|
|
147
|
+
* (impact, weight). Never hardcoded — purely a function of detected issues,
|
|
148
|
+
* so the Overview "Quick Wins" card always reflects reality.
|
|
149
|
+
*
|
|
150
|
+
* When synced search data exists, `impressionsByEntityId` weights each group
|
|
151
|
+
* by the real traffic of the affected pages, so a missing meta description on
|
|
152
|
+
* a 10k-impression page outranks ten on pages nobody sees. Without search
|
|
153
|
+
* data the weight degrades to the plain issue count (previous behavior).
|
|
138
154
|
*/
|
|
139
|
-
export declare function buildQuickWins(issues: DetectedIssue[]
|
|
155
|
+
export declare function buildQuickWins(issues: DetectedIssue[], options?: {
|
|
156
|
+
impressionsByEntityId?: Record<string, number>;
|
|
157
|
+
}): QuickWin[];
|
|
140
158
|
export { gradeForSeoScore };
|
|
141
159
|
//# sourceMappingURL=audit-engine.d.ts.map
|
|
@@ -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
|
@@ -486,6 +486,34 @@ export function runSeoAuditAnalysis(entities, signals = {}) {
|
|
|
486
486
|
relatedEntityIds: [],
|
|
487
487
|
});
|
|
488
488
|
}
|
|
489
|
+
// -- Declining search performance (synced GSC data) -----------------------
|
|
490
|
+
for (const declining of signals.decliningPages ?? []) {
|
|
491
|
+
const dropPercent = declining.clicksPrev28d > 0
|
|
492
|
+
? Math.round((1 - declining.clicks28d / declining.clicksPrev28d) * 100)
|
|
493
|
+
: 0;
|
|
494
|
+
issues.push({
|
|
495
|
+
entityType: declining.entityType,
|
|
496
|
+
entityId: declining.entityId,
|
|
497
|
+
entityTitle: declining.title,
|
|
498
|
+
url: declining.url,
|
|
499
|
+
issueKey: issueKeyFor('declining-performance', declining.entityId),
|
|
500
|
+
severity: 'warning',
|
|
501
|
+
category: 'content',
|
|
502
|
+
type: 'declining-performance',
|
|
503
|
+
title: 'Search clicks dropped sharply',
|
|
504
|
+
description: `${declining.title} received ${declining.clicks28d} clicks in the last 28 days, down ${dropPercent}% from ${declining.clicksPrev28d} in the prior window.`,
|
|
505
|
+
impact: 'High',
|
|
506
|
+
recommendation: 'Review the page against the queries it ranks for — refresh outdated content, strengthen the meta title/description, and check for new competing pages.',
|
|
507
|
+
fixable: false,
|
|
508
|
+
fixActionType: 'content-brief',
|
|
509
|
+
relatedEntityIds: [],
|
|
510
|
+
metadata: {
|
|
511
|
+
clicks28d: declining.clicks28d,
|
|
512
|
+
clicksPrev28d: declining.clicksPrev28d,
|
|
513
|
+
dropPercent,
|
|
514
|
+
},
|
|
515
|
+
});
|
|
516
|
+
}
|
|
489
517
|
// -- Site score (explainable category sub-scores) ------------------------
|
|
490
518
|
const total = entities.length;
|
|
491
519
|
const ratio = (count) => (total === 0 ? 100 : Math.round((count / total) * 100));
|
|
@@ -538,17 +566,25 @@ export function runSeoAuditAnalysis(entities, signals = {}) {
|
|
|
538
566
|
warning: issues.filter((i) => i.severity === 'warning').length,
|
|
539
567
|
info: issues.filter((i) => i.severity === 'info').length,
|
|
540
568
|
};
|
|
541
|
-
const quickWins = buildQuickWins(issues
|
|
569
|
+
const quickWins = buildQuickWins(issues, {
|
|
570
|
+
impressionsByEntityId: signals.impressionsByEntityId,
|
|
571
|
+
});
|
|
542
572
|
return { pages, issues, siteScore, counts, quickWins };
|
|
543
573
|
}
|
|
544
574
|
const IMPACT_RANK = { High: 3, Medium: 2, Low: 1 };
|
|
545
575
|
const SEVERITY_RANK = { critical: 3, warning: 2, info: 1 };
|
|
546
576
|
/**
|
|
547
577
|
* Derive priority-ranked quick wins by grouping issues by type and ranking by
|
|
548
|
-
* (impact,
|
|
549
|
-
*
|
|
578
|
+
* (impact, weight). Never hardcoded — purely a function of detected issues,
|
|
579
|
+
* so the Overview "Quick Wins" card always reflects reality.
|
|
580
|
+
*
|
|
581
|
+
* When synced search data exists, `impressionsByEntityId` weights each group
|
|
582
|
+
* by the real traffic of the affected pages, so a missing meta description on
|
|
583
|
+
* a 10k-impression page outranks ten on pages nobody sees. Without search
|
|
584
|
+
* data the weight degrades to the plain issue count (previous behavior).
|
|
550
585
|
*/
|
|
551
|
-
export function buildQuickWins(issues) {
|
|
586
|
+
export function buildQuickWins(issues, options = {}) {
|
|
587
|
+
const impressions = options.impressionsByEntityId ?? {};
|
|
552
588
|
const byType = new Map();
|
|
553
589
|
for (const i of issues) {
|
|
554
590
|
if (!i.fixable)
|
|
@@ -561,6 +597,14 @@ export function buildQuickWins(issues) {
|
|
|
561
597
|
for (const [type, group] of byType) {
|
|
562
598
|
const first = group[0];
|
|
563
599
|
const count = group.length;
|
|
600
|
+
const seen = new Set();
|
|
601
|
+
let impressionWeight = 0;
|
|
602
|
+
for (const issue of group) {
|
|
603
|
+
if (!issue.entityId || seen.has(issue.entityId))
|
|
604
|
+
continue;
|
|
605
|
+
seen.add(issue.entityId);
|
|
606
|
+
impressionWeight += impressions[issue.entityId] ?? 0;
|
|
607
|
+
}
|
|
564
608
|
wins.push({
|
|
565
609
|
id: `qw-${type}`,
|
|
566
610
|
title: quickWinTitle(type, count),
|
|
@@ -569,6 +613,7 @@ export function buildQuickWins(issues) {
|
|
|
569
613
|
issueType: type,
|
|
570
614
|
fixActionType: first.fixActionType,
|
|
571
615
|
count,
|
|
616
|
+
weight: count + impressionWeight,
|
|
572
617
|
});
|
|
573
618
|
}
|
|
574
619
|
wins.sort((a, b) => {
|
|
@@ -576,9 +621,9 @@ export function buildQuickWins(issues) {
|
|
|
576
621
|
const bi = IMPACT_RANK[b.impact];
|
|
577
622
|
if (ai !== bi)
|
|
578
623
|
return bi - ai;
|
|
579
|
-
return b.
|
|
624
|
+
return b.weight - a.weight;
|
|
580
625
|
});
|
|
581
|
-
return wins.slice(0, 5);
|
|
626
|
+
return wins.slice(0, 5).map(({ weight: _weight, ...win }) => win);
|
|
582
627
|
}
|
|
583
628
|
function quickWinTitle(type, count) {
|
|
584
629
|
switch (type) {
|