@prenta/core 5.5.0 → 5.7.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 +31 -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/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +2 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/api/routes/redirects.d.ts.map +1 -1
- package/dist/api/routes/redirects.js +89 -93
- package/dist/api/routes/redirects.js.map +1 -1
- package/dist/api/routes/seo-autopilot.d.ts +12 -0
- package/dist/api/routes/seo-autopilot.d.ts.map +1 -0
- package/dist/api/routes/seo-autopilot.js +257 -0
- package/dist/api/routes/seo-autopilot.js.map +1 -0
- 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/db/model-types.d.ts +26 -0
- package/dist/db/model-types.d.ts.map +1 -1
- package/dist/generated/browser.d.ts +8 -0
- package/dist/generated/client.d.ts +8 -0
- package/dist/generated/internal/class.d.ts +11 -0
- package/dist/generated/internal/class.js +4 -4
- package/dist/generated/internal/prismaNamespace.d.ts +120 -1
- package/dist/generated/internal/prismaNamespace.js +42 -0
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +44 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +42 -0
- package/dist/generated/models/SeoAutoApply.d.ts +1495 -0
- package/dist/generated/models/SeoAutoApply.js +1 -0
- package/dist/generated/models.d.ts +1 -0
- package/dist/redirects/recovery.d.ts +15 -9
- package/dist/redirects/recovery.d.ts.map +1 -1
- package/dist/redirects/recovery.js +15 -61
- package/dist/redirects/recovery.js.map +1 -1
- package/dist/redirects/suggestion-accept.d.ts +29 -0
- package/dist/redirects/suggestion-accept.d.ts.map +1 -0
- package/dist/redirects/suggestion-accept.js +108 -0
- package/dist/redirects/suggestion-accept.js.map +1 -0
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +0 -2
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/autopilot-gate.d.ts +101 -0
- package/dist/seo/autopilot-gate.d.ts.map +1 -0
- package/dist/seo/autopilot-gate.js +272 -0
- package/dist/seo/autopilot-gate.js.map +1 -0
- package/dist/seo/autopilot-ledger.d.ts +74 -0
- package/dist/seo/autopilot-ledger.d.ts.map +1 -0
- package/dist/seo/autopilot-ledger.js +118 -0
- package/dist/seo/autopilot-ledger.js.map +1 -0
- package/dist/seo/autopilot-outcome.d.ts +93 -0
- package/dist/seo/autopilot-outcome.d.ts.map +1 -0
- package/dist/seo/autopilot-outcome.js +206 -0
- package/dist/seo/autopilot-outcome.js.map +1 -0
- package/dist/seo/autopilot-policy.d.ts +169 -0
- package/dist/seo/autopilot-policy.d.ts.map +1 -0
- package/dist/seo/autopilot-policy.js +267 -0
- package/dist/seo/autopilot-policy.js.map +1 -0
- package/dist/seo/autopilot-revert.d.ts +40 -0
- package/dist/seo/autopilot-revert.d.ts.map +1 -0
- package/dist/seo/autopilot-revert.js +155 -0
- package/dist/seo/autopilot-revert.js.map +1 -0
- package/dist/seo/autopilot.d.ts +91 -0
- package/dist/seo/autopilot.d.ts.map +1 -0
- package/dist/seo/autopilot.js +1060 -0
- package/dist/seo/autopilot.js.map +1 -0
- package/dist/seo/config-store.d.ts +35 -2
- package/dist/seo/config-store.d.ts.map +1 -1
- package/dist/seo/config-store.js +58 -1
- package/dist/seo/config-store.js.map +1 -1
- package/dist/seo/deep-equal.d.ts +12 -0
- package/dist/seo/deep-equal.d.ts.map +1 -0
- package/dist/seo/deep-equal.js +42 -0
- package/dist/seo/deep-equal.js.map +1 -0
- package/dist/seo/digest.d.ts +27 -0
- package/dist/seo/digest.d.ts.map +1 -1
- package/dist/seo/digest.js +77 -1
- package/dist/seo/digest.js.map +1 -1
- package/dist/seo/index.d.ts +20 -2
- package/dist/seo/index.d.ts.map +1 -1
- package/dist/seo/index.js +12 -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 +104 -0
- package/dist/seo/issue-fix-apply.d.ts.map +1 -0
- package/dist/seo/issue-fix-apply.js +406 -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 +45 -0
- package/dist/seo/proposals-generate.d.ts.map +1 -0
- package/dist/seo/proposals-generate.js +144 -0
- package/dist/seo/proposals-generate.js.map +1 -0
- package/dist/seo/proposals.d.ts +125 -0
- package/dist/seo/proposals.d.ts.map +1 -0
- package/dist/seo/proposals.js +270 -0
- package/dist/seo/proposals.js.map +1 -0
- package/package.json +1 -1
- package/prisma/migrations/0017_seo_auto_applies/migration.sql +35 -0
- package/prisma/schema.prisma +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot-policy.js","sourceRoot":"","sources":["../../src/seo/autopilot-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-level undo for an autopilot change (spec §4). Issue fixes restore the
|
|
3
|
+
* `before` values through `updateDocumentSeoFields` (a normal write: Version
|
|
4
|
+
* row, hooks, webhooks). Redirects are deleted (autopilot never overwrites an
|
|
5
|
+
* existing rule, so `before` is always null) and the suggestion reopened.
|
|
6
|
+
*/
|
|
7
|
+
import type { PrentaDB } from '../db/client-types.js';
|
|
8
|
+
import type { SeoAutoApply } from '../db/model-types.js';
|
|
9
|
+
import type { SeoAutoApplyRevertReason } from './autopilot-ledger.js';
|
|
10
|
+
export type RevertResult = {
|
|
11
|
+
status: 'reverted';
|
|
12
|
+
row: SeoAutoApply;
|
|
13
|
+
} | {
|
|
14
|
+
status: 'not-found';
|
|
15
|
+
} | {
|
|
16
|
+
status: 'not-revertible';
|
|
17
|
+
current: string;
|
|
18
|
+
} | {
|
|
19
|
+
status: 'conflict';
|
|
20
|
+
fields: string[];
|
|
21
|
+
};
|
|
22
|
+
export interface RevertSeoAutoApplyOptions {
|
|
23
|
+
actor: {
|
|
24
|
+
userId: string;
|
|
25
|
+
role: string;
|
|
26
|
+
};
|
|
27
|
+
reason: SeoAutoApplyRevertReason;
|
|
28
|
+
/** Restore `before` even when a human has changed a field since the apply. */
|
|
29
|
+
force?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Revert one ledger row. Returns a `RevertResult` for every expected outcome
|
|
33
|
+
* (not found, not revertible, conflict, reverted).
|
|
34
|
+
*
|
|
35
|
+
* Throws when the document write, redirect delete (non-P2025), or ledger
|
|
36
|
+
* update fails — callers in unattended loops must catch per row. On a throw
|
|
37
|
+
* the ledger row is left `applied`, so the revert can be retried.
|
|
38
|
+
*/
|
|
39
|
+
export declare function revertSeoAutoApply(db: PrentaDB, id: string, opts: RevertSeoAutoApplyOptions): Promise<RevertResult>;
|
|
40
|
+
//# sourceMappingURL=autopilot-revert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot-revert.d.ts","sourceRoot":"","sources":["../../src/seo/autopilot-revert.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAIxD,OAAO,KAAK,EAAE,wBAAwB,EAAsB,MAAM,uBAAuB,CAAA;AAEzF,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,GACvB;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7C;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAE5C,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACvC,MAAM,EAAE,wBAAwB,CAAA;IAChC,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AA4GD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAqCvB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { updateDocumentSeoFields } from '../actions.js';
|
|
2
|
+
import { logEvent } from '../security/audit.js';
|
|
3
|
+
function asRecord(v) {
|
|
4
|
+
return v && typeof v === 'object' && !Array.isArray(v) ? v : {};
|
|
5
|
+
}
|
|
6
|
+
function sameValue(a, b) {
|
|
7
|
+
if (a === b)
|
|
8
|
+
return true;
|
|
9
|
+
if (a == null && b == null)
|
|
10
|
+
return true;
|
|
11
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
12
|
+
}
|
|
13
|
+
/** Prisma "record not found" (thrown by `update`/`delete` on a missing row). */
|
|
14
|
+
function isRecordNotFound(err) {
|
|
15
|
+
return typeof err === 'object' && err !== null && err.code === 'P2025';
|
|
16
|
+
}
|
|
17
|
+
function statusForReason(reason) {
|
|
18
|
+
switch (reason) {
|
|
19
|
+
case 'outcome_regression':
|
|
20
|
+
return 'outcome_reverted';
|
|
21
|
+
case 'manual':
|
|
22
|
+
case 'verify_failed':
|
|
23
|
+
return 'reverted';
|
|
24
|
+
default: {
|
|
25
|
+
const exhaustive = reason;
|
|
26
|
+
return exhaustive;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Undo an issue fix: verify the live document still carries the autopilot
|
|
32
|
+
* `after` values (otherwise a human edited since → conflict unless forced),
|
|
33
|
+
* then write `before` back and reopen the originating issue.
|
|
34
|
+
*
|
|
35
|
+
* Keys are the union of `before` and `after`: a key autopilot introduced that
|
|
36
|
+
* had no prior value (absent from `before`, since JSON drops `undefined`) is
|
|
37
|
+
* restored to `null`. A field whose live value already equals `before` is not
|
|
38
|
+
* a conflict — a previous partial revert (doc write ok, ledger flip failed)
|
|
39
|
+
* already restored it, so retrying is idempotent.
|
|
40
|
+
*/
|
|
41
|
+
async function revertIssueFix(db, row, ctx, force) {
|
|
42
|
+
if (!row.entityId || !row.collection) {
|
|
43
|
+
return { status: 'not-revertible', current: 'missing-entity' };
|
|
44
|
+
}
|
|
45
|
+
const before = asRecord(row.before);
|
|
46
|
+
const after = asRecord(row.after);
|
|
47
|
+
const doc = await db.document.findFirst({
|
|
48
|
+
where: { id: row.entityId, deletedAt: null },
|
|
49
|
+
select: { id: true, collection: true, data: true },
|
|
50
|
+
});
|
|
51
|
+
if (!doc)
|
|
52
|
+
return { status: 'not-revertible', current: 'document-missing' };
|
|
53
|
+
const live = asRecord(doc.data);
|
|
54
|
+
const fields = [...new Set([...Object.keys(after), ...Object.keys(before)])];
|
|
55
|
+
const conflicts = fields.filter((field) => !sameValue(live[field], after[field]) && !sameValue(live[field], before[field]));
|
|
56
|
+
if (conflicts.length > 0 && !force)
|
|
57
|
+
return { status: 'conflict', fields: conflicts };
|
|
58
|
+
const restore = {};
|
|
59
|
+
for (const field of fields)
|
|
60
|
+
restore[field] = before[field] ?? null;
|
|
61
|
+
await updateDocumentSeoFields(row.collection, row.entityId, restore, ctx);
|
|
62
|
+
if (row.issueId) {
|
|
63
|
+
try {
|
|
64
|
+
await db.seoIssue.update({
|
|
65
|
+
where: { id: row.issueId },
|
|
66
|
+
data: { status: 'open', resolvedAt: null, resolvedById: null },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// The audit may have removed the issue since; the field restore is what matters.
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Undo a redirect: delete the rule autopilot created and reopen the suggestion.
|
|
77
|
+
* Only "record not found" (P2025 — a human already deleted it) is tolerated;
|
|
78
|
+
* any other delete failure propagates so the ledger row stays `applied`.
|
|
79
|
+
*/
|
|
80
|
+
async function revertRedirect(db, row) {
|
|
81
|
+
if (!row.redirectId)
|
|
82
|
+
return { status: 'not-revertible', current: 'missing-redirect' };
|
|
83
|
+
try {
|
|
84
|
+
await db.redirect.delete({ where: { id: row.redirectId } });
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
if (!isRecordNotFound(err))
|
|
88
|
+
throw err;
|
|
89
|
+
// Already deleted by a human — the desired end state holds.
|
|
90
|
+
}
|
|
91
|
+
const suggestionId = asRecord(row.after).suggestionId;
|
|
92
|
+
if (typeof suggestionId === 'string') {
|
|
93
|
+
try {
|
|
94
|
+
await db.redirectSuggestion.update({
|
|
95
|
+
where: { id: suggestionId },
|
|
96
|
+
data: { status: 'open' },
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Suggestion rows are advisory; never fail the revert on them.
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Revert one ledger row. Returns a `RevertResult` for every expected outcome
|
|
107
|
+
* (not found, not revertible, conflict, reverted).
|
|
108
|
+
*
|
|
109
|
+
* Throws when the document write, redirect delete (non-P2025), or ledger
|
|
110
|
+
* update fails — callers in unattended loops must catch per row. On a throw
|
|
111
|
+
* the ledger row is left `applied`, so the revert can be retried.
|
|
112
|
+
*/
|
|
113
|
+
export async function revertSeoAutoApply(db, id, opts) {
|
|
114
|
+
const row = await db.seoAutoApply.findUnique({ where: { id } });
|
|
115
|
+
if (!row)
|
|
116
|
+
return { status: 'not-found' };
|
|
117
|
+
if (row.status !== 'applied')
|
|
118
|
+
return { status: 'not-revertible', current: row.status };
|
|
119
|
+
const ctx = { userId: opts.actor.userId, role: opts.actor.role, db };
|
|
120
|
+
// `kind` is a String column; anything outside the known union is refused.
|
|
121
|
+
if (row.kind === 'issue-fix') {
|
|
122
|
+
const early = await revertIssueFix(db, row, ctx, opts.force === true);
|
|
123
|
+
if (early)
|
|
124
|
+
return early;
|
|
125
|
+
}
|
|
126
|
+
else if (row.kind === 'redirect') {
|
|
127
|
+
const early = await revertRedirect(db, row);
|
|
128
|
+
if (early)
|
|
129
|
+
return early;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
return { status: 'not-revertible', current: `unknown-kind:${row.kind}` };
|
|
133
|
+
}
|
|
134
|
+
const updated = await db.seoAutoApply.update({
|
|
135
|
+
where: { id },
|
|
136
|
+
data: {
|
|
137
|
+
status: statusForReason(opts.reason),
|
|
138
|
+
revertedAt: new Date(),
|
|
139
|
+
revertedById: opts.actor.userId,
|
|
140
|
+
revertReason: opts.reason,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
try {
|
|
144
|
+
await logEvent({
|
|
145
|
+
event: 'seo_autopilot_reverted',
|
|
146
|
+
userId: opts.actor.userId,
|
|
147
|
+
details: { id, kind: row.kind, reason: opts.reason, force: opts.force === true },
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* audit-log failures never block */
|
|
152
|
+
}
|
|
153
|
+
return { status: 'reverted', row: updated };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=autopilot-revert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot-revert.js","sourceRoot":"","sources":["../../src/seo/autopilot-revert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEO Autopilot run (spec §3): preflight → outcome watch → generate → gate →
|
|
3
|
+
* apply → verify → ledger → summary. Reuses the inbox pipeline end to end so
|
|
4
|
+
* anything the gate refuses simply waits in the Proposals tab for a human.
|
|
5
|
+
*
|
|
6
|
+
* Every write the engine performs lands in the `SeoAutoApply` ledger with the
|
|
7
|
+
* prior values (`before`), the values written (`after`), the gate snapshot,
|
|
8
|
+
* and the policy owner as `appliedById`. Snapshots are keyed on the fix's
|
|
9
|
+
* PATCH keys (document data-layer names such as `canonical`), not on the
|
|
10
|
+
* display `changes[].field` names (`canonicalUrl`, rendered `metaTitle`), so
|
|
11
|
+
* the verify-failed restore writes the right keys and a later
|
|
12
|
+
* `revertSeoAutoApply` conflict check compares like with like.
|
|
13
|
+
*
|
|
14
|
+
* Invariant: the value written is the value the gate approved. AI-tier
|
|
15
|
+
* candidates are applied with `preferCached` so `applyIssueFix` writes the
|
|
16
|
+
* cached text the gate scored, and every apply is re-read and compared to the
|
|
17
|
+
* gated patch; drift is a verify failure (`applyOutcomes.gate_mismatch`), and
|
|
18
|
+
* so is a re-read that fails (`applyOutcomes.after_unreadable`).
|
|
19
|
+
*/
|
|
20
|
+
import type { PrentaDB } from '../db/client-types.js';
|
|
21
|
+
import { acceptRedirectSuggestion } from '../redirects/suggestion-accept.js';
|
|
22
|
+
import { type AutopilotRunSummary } from './autopilot-policy.js';
|
|
23
|
+
import { runOutcomeWatch } from './autopilot-outcome.js';
|
|
24
|
+
import { type SeoConfigOverrides } from './config-store.js';
|
|
25
|
+
import { applyIssueFix } from './issue-fix-apply.js';
|
|
26
|
+
import { generateSeoProposals } from './proposals-generate.js';
|
|
27
|
+
import { listSeoProposals, type SeoProposal } from './proposals.js';
|
|
28
|
+
/** Whole-tick wall clock, inside the 30 s function ceiling. */
|
|
29
|
+
export declare const AUTOPILOT_BUDGET_MS = 20000;
|
|
30
|
+
/**
|
|
31
|
+
* Grace added to the run budget before a held run lease is considered abandoned
|
|
32
|
+
* (a tick that died without reaching its `finally`). Below this age a second
|
|
33
|
+
* tick halts `already_running`; at or above it the lease is taken over.
|
|
34
|
+
*/
|
|
35
|
+
export declare const AUTOPILOT_LEASE_STALE_MARGIN_MS = 10000;
|
|
36
|
+
/** Cap on the AI generate phase. */
|
|
37
|
+
export declare const AUTOPILOT_GENERATE_BUDGET_MS = 10000;
|
|
38
|
+
/** Wall clock that must remain for the apply phase after generate. */
|
|
39
|
+
export declare const AUTOPILOT_APPLY_RESERVE_MS = 5000;
|
|
40
|
+
/**
|
|
41
|
+
* Budget for the outcome watch, passed to `runOutcomeWatch` as its `deadline`:
|
|
42
|
+
* it stops judging rows once reached (the rest stay `pending` for the next
|
|
43
|
+
* tick). The in-flight row may still overrun slightly — that is logged and
|
|
44
|
+
* shrinks the generate window; the apply reserve holds.
|
|
45
|
+
*/
|
|
46
|
+
export declare const AUTOPILOT_OUTCOME_BUDGET_MS = 3000;
|
|
47
|
+
/** Max issue contexts loaded per tick while scanning for deterministic-tier fixes. */
|
|
48
|
+
export declare const AUTOPILOT_DETERMINISTIC_SCAN_MAX = 50;
|
|
49
|
+
/**
|
|
50
|
+
* The deterministic scan stops loading issue contexts this long before the
|
|
51
|
+
* run deadline so the gate context build and at least one apply still fit.
|
|
52
|
+
*/
|
|
53
|
+
export declare const AUTOPILOT_SCAN_DEADLINE_MARGIN_MS = 1000;
|
|
54
|
+
export type RestoreFieldsFn = (db: PrentaDB, collection: string, entityId: string, fields: Record<string, unknown>, actor: {
|
|
55
|
+
userId: string;
|
|
56
|
+
role: string;
|
|
57
|
+
}) => Promise<unknown>;
|
|
58
|
+
/**
|
|
59
|
+
* A deterministic-tier proposal carries the data-layer `patch` its suggestion
|
|
60
|
+
* produced, so the run can snapshot `before` without a cache lookup, and the
|
|
61
|
+
* issue's sticky dismissal marker so the gate can refuse it (`dismissed`).
|
|
62
|
+
*/
|
|
63
|
+
export type DeterministicCandidate = SeoProposal & {
|
|
64
|
+
patch: Record<string, unknown>;
|
|
65
|
+
dismissedFingerprint?: string | null;
|
|
66
|
+
};
|
|
67
|
+
export interface DeterministicScanOptions {
|
|
68
|
+
now: () => number;
|
|
69
|
+
/** Absolute `now()` value the run must finish by; the scan stops a margin before it. */
|
|
70
|
+
deadline: number;
|
|
71
|
+
/** SEO overrides the run already loaded (`null` = no row) — never re-read per issue. */
|
|
72
|
+
overrides: SeoConfigOverrides | null;
|
|
73
|
+
}
|
|
74
|
+
export interface RunAutopilotDeps {
|
|
75
|
+
generate?: typeof generateSeoProposals;
|
|
76
|
+
listProposals?: typeof listSeoProposals;
|
|
77
|
+
applyFix?: typeof applyIssueFix;
|
|
78
|
+
acceptRedirect?: typeof acceptRedirectSuggestion;
|
|
79
|
+
restoreFields?: RestoreFieldsFn;
|
|
80
|
+
deterministicCandidates?: (db: PrentaDB, types: ReadonlySet<string>, opts: DeterministicScanOptions) => Promise<DeterministicCandidate[]>;
|
|
81
|
+
outcomeWatch?: typeof runOutcomeWatch;
|
|
82
|
+
}
|
|
83
|
+
export interface RunAutopilotOptions {
|
|
84
|
+
budgetMs?: number;
|
|
85
|
+
now?: () => number;
|
|
86
|
+
deps?: RunAutopilotDeps;
|
|
87
|
+
}
|
|
88
|
+
/** Ledger `path`: pathname only, no origin / query / hash, no trailing slash, root kept. */
|
|
89
|
+
export declare function normalizeAutopilotPath(url: string | null): string | null;
|
|
90
|
+
export declare function runSeoAutopilot(db: PrentaDB, opts?: RunAutopilotOptions): Promise<AutopilotRunSummary>;
|
|
91
|
+
//# sourceMappingURL=autopilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autopilot.d.ts","sourceRoot":"","sources":["../../src/seo/autopilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAWrD,OAAO,EACL,wBAAwB,EAEzB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAIL,KAAK,mBAAmB,EAGzB,MAAM,uBAAuB,CAAA;AAe9B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,aAAa,EAAiD,MAAM,sBAAsB,CAAA;AAGnG,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAGL,gBAAgB,EAGhB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAA;AAGvB,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,QAAS,CAAA;AACzC;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,QAAS,CAAA;AACrD,oCAAoC;AACpC,eAAO,MAAM,4BAA4B,QAAS,CAAA;AAClD,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,OAAQ,CAAA;AAC/C;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,OAAQ,CAAA;AAChD,sFAAsF;AACtF,eAAO,MAAM,gCAAgC,KAAK,CAAA;AAClD;;;GAGG;AACH,eAAO,MAAM,iCAAiC,OAAQ,CAAA;AAuBtD,MAAM,MAAM,eAAe,GAAG,CAC5B,EAAE,EAAE,QAAQ,EACZ,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,KACpC,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG;IACjD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrC,CAAA;AAED,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,MAAM,CAAA;IACjB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAA;IAChB,wFAAwF;IACxF,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAA;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,oBAAoB,CAAA;IACtC,aAAa,CAAC,EAAE,OAAO,gBAAgB,CAAA;IACvC,QAAQ,CAAC,EAAE,OAAO,aAAa,CAAA;IAC/B,cAAc,CAAC,EAAE,OAAO,wBAAwB,CAAA;IAChD,aAAa,CAAC,EAAE,eAAe,CAAA;IAC/B,uBAAuB,CAAC,EAAE,CACxB,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAC1B,IAAI,EAAE,wBAAwB,KAC3B,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAA;IACtC,YAAY,CAAC,EAAE,OAAO,eAAe,CAAA;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,gBAAgB,CAAA;CACxB;AAyBD,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAkBxE;AA0uBD,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,EACZ,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA8I9B"}
|