@prenta/core 5.3.1 → 5.4.1
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/actions.d.ts.map +1 -1
- package/dist/actions.js +19 -2
- package/dist/actions.js.map +1 -1
- 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/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/security/strip-dangerous-keys.d.ts +33 -0
- package/dist/security/strip-dangerous-keys.d.ts.map +1 -0
- package/dist/security/strip-dangerous-keys.js +71 -0
- package/dist/security/strip-dangerous-keys.js.map +1 -0
- 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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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write-time JSON shape sanitization: strip prototype-pollution vectors from
|
|
3
|
+
* author-supplied payloads before they are stored.
|
|
4
|
+
*
|
|
5
|
+
* SECURITY: stored document JSON is later merged/spread by consumers that are
|
|
6
|
+
* not all pollution-safe. The concrete driver is Tiptap 2.x's
|
|
7
|
+
* `mergeAttributes()` (GHSA — "mergeAttributes() turns an own __proto__ key
|
|
8
|
+
* into inherited executable DOM attributes"): a document whose node/mark
|
|
9
|
+
* attrs carry an own `__proto__` key becomes stored XSS when it renders in
|
|
10
|
+
* another user's editor session, i.e. an editor-role account can hijack an
|
|
11
|
+
* admin session. The patch exists only in Tiptap 3, which cms-admin has not
|
|
12
|
+
* adopted yet, so the write gate removes the vector at the source instead:
|
|
13
|
+
* `__proto__`, `constructor`, and `prototype` keys are dropped from every
|
|
14
|
+
* plain object in the payload, recursively.
|
|
15
|
+
*
|
|
16
|
+
* JSON.parse creates `__proto__` as an OWN key (no setter fires), so these
|
|
17
|
+
* keys survive transport and arrive in request bodies verbatim. They have no
|
|
18
|
+
* legitimate use in content payloads.
|
|
19
|
+
*
|
|
20
|
+
* Wired into every document write action (`createDocument`, `updateDocument`,
|
|
21
|
+
* `updateDocumentSeoFields`, `updateGlobal`) and into `sanitizeDocumentData`,
|
|
22
|
+
* so a save of a document stored before this mitigation also scrubs the
|
|
23
|
+
* merged legacy data.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Return a deep copy of `value` with every own `__proto__` / `constructor` /
|
|
27
|
+
* `prototype` key removed from plain objects (recursively, arrays included).
|
|
28
|
+
* Primitives and non-plain objects pass through unchanged; the input is never
|
|
29
|
+
* mutated. Cycles (impossible in JSON bodies, possible from programmatic
|
|
30
|
+
* callers) are returned as-is instead of recursing forever.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stripDangerousKeys<T>(value: T): T;
|
|
33
|
+
//# sourceMappingURL=strip-dangerous-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip-dangerous-keys.d.ts","sourceRoot":"","sources":["../../src/security/strip-dangerous-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAqCH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAEjD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write-time JSON shape sanitization: strip prototype-pollution vectors from
|
|
3
|
+
* author-supplied payloads before they are stored.
|
|
4
|
+
*
|
|
5
|
+
* SECURITY: stored document JSON is later merged/spread by consumers that are
|
|
6
|
+
* not all pollution-safe. The concrete driver is Tiptap 2.x's
|
|
7
|
+
* `mergeAttributes()` (GHSA — "mergeAttributes() turns an own __proto__ key
|
|
8
|
+
* into inherited executable DOM attributes"): a document whose node/mark
|
|
9
|
+
* attrs carry an own `__proto__` key becomes stored XSS when it renders in
|
|
10
|
+
* another user's editor session, i.e. an editor-role account can hijack an
|
|
11
|
+
* admin session. The patch exists only in Tiptap 3, which cms-admin has not
|
|
12
|
+
* adopted yet, so the write gate removes the vector at the source instead:
|
|
13
|
+
* `__proto__`, `constructor`, and `prototype` keys are dropped from every
|
|
14
|
+
* plain object in the payload, recursively.
|
|
15
|
+
*
|
|
16
|
+
* JSON.parse creates `__proto__` as an OWN key (no setter fires), so these
|
|
17
|
+
* keys survive transport and arrive in request bodies verbatim. They have no
|
|
18
|
+
* legitimate use in content payloads.
|
|
19
|
+
*
|
|
20
|
+
* Wired into every document write action (`createDocument`, `updateDocument`,
|
|
21
|
+
* `updateDocumentSeoFields`, `updateGlobal`) and into `sanitizeDocumentData`,
|
|
22
|
+
* so a save of a document stored before this mitigation also scrubs the
|
|
23
|
+
* merged legacy data.
|
|
24
|
+
*/
|
|
25
|
+
const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
26
|
+
/**
|
|
27
|
+
* Only recurse into null-prototype or plain `Object.prototype` objects.
|
|
28
|
+
* Dates, buffers, and class instances pass through by reference — rebuilding
|
|
29
|
+
* them key-by-key would destroy them, and they cannot carry JSON-parsed
|
|
30
|
+
* `__proto__` own keys in the first place.
|
|
31
|
+
*/
|
|
32
|
+
function isPlainObject(value) {
|
|
33
|
+
if (typeof value !== 'object' || value === null)
|
|
34
|
+
return false;
|
|
35
|
+
const proto = Object.getPrototypeOf(value);
|
|
36
|
+
return proto === Object.prototype || proto === null;
|
|
37
|
+
}
|
|
38
|
+
function walk(value, seen) {
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
if (seen.has(value))
|
|
41
|
+
return value;
|
|
42
|
+
seen.add(value);
|
|
43
|
+
return value.map((item) => walk(item, seen));
|
|
44
|
+
}
|
|
45
|
+
if (isPlainObject(value)) {
|
|
46
|
+
if (seen.has(value))
|
|
47
|
+
return value;
|
|
48
|
+
seen.add(value);
|
|
49
|
+
const out = {};
|
|
50
|
+
for (const key of Object.keys(value)) {
|
|
51
|
+
if (DANGEROUS_KEYS.has(key))
|
|
52
|
+
continue;
|
|
53
|
+
// Safe: dangerous keys are skipped above, so this assignment can never
|
|
54
|
+
// hit the Object.prototype `__proto__` setter.
|
|
55
|
+
out[key] = walk(value[key], seen);
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Return a deep copy of `value` with every own `__proto__` / `constructor` /
|
|
63
|
+
* `prototype` key removed from plain objects (recursively, arrays included).
|
|
64
|
+
* Primitives and non-plain objects pass through unchanged; the input is never
|
|
65
|
+
* mutated. Cycles (impossible in JSON bodies, possible from programmatic
|
|
66
|
+
* callers) are returned as-is instead of recursing forever.
|
|
67
|
+
*/
|
|
68
|
+
export function stripDangerousKeys(value) {
|
|
69
|
+
return walk(value, new WeakSet());
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=strip-dangerous-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strip-dangerous-keys.js","sourceRoot":"","sources":["../../src/security/strip-dangerous-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;AAEzE;;;;;GAKG;AACH,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,KAAK,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IACnD,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAA;AACrD,CAAC;AAED,SAAS,IAAI,CAAC,KAAc,EAAE,IAAqB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACf,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9C,CAAC;IACD,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACf,MAAM,GAAG,GAA4B,EAAE,CAAA;QACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAQ;YACrC,uEAAuE;YACvE,+CAA+C;YAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;QACnC,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAI,KAAQ;IAC5C,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,OAAO,EAAE,CAAM,CAAA;AACxC,CAAC"}
|
|
@@ -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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"}
|