@prenta/core 8.9.2 → 8.10.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 +96 -0
- package/dist/actions.d.ts +25 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +51 -4
- package/dist/actions.js.map +1 -1
- package/dist/ai/batch-links.d.ts +105 -0
- package/dist/ai/batch-links.d.ts.map +1 -0
- package/dist/ai/batch-links.js +667 -0
- package/dist/ai/batch-links.js.map +1 -0
- package/dist/ai/batch-list.d.ts +127 -4
- package/dist/ai/batch-list.d.ts.map +1 -1
- package/dist/ai/batch-list.js +250 -14
- package/dist/ai/batch-list.js.map +1 -1
- package/dist/ai/providers/http.d.ts +4 -0
- package/dist/ai/providers/http.d.ts.map +1 -1
- package/dist/ai/providers/http.js +9 -8
- package/dist/ai/providers/http.js.map +1 -1
- package/dist/ai/tasks/editor-text.d.ts +39 -0
- package/dist/ai/tasks/editor-text.d.ts.map +1 -0
- package/dist/ai/tasks/editor-text.js +45 -0
- package/dist/ai/tasks/editor-text.js.map +1 -0
- package/dist/ai/tasks/link-embeddings.d.ts +22 -0
- package/dist/ai/tasks/link-embeddings.d.ts.map +1 -1
- package/dist/ai/tasks/link-embeddings.js +24 -10
- package/dist/ai/tasks/link-embeddings.js.map +1 -1
- package/dist/ai/usage.d.ts +7 -0
- package/dist/ai/usage.d.ts.map +1 -1
- package/dist/ai/usage.js +11 -0
- package/dist/ai/usage.js.map +1 -1
- package/dist/api/guarded-db.d.ts +6 -0
- package/dist/api/guarded-db.d.ts.map +1 -1
- package/dist/api/guarded-db.js +13 -1
- package/dist/api/guarded-db.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/openapi.d.ts.map +1 -1
- package/dist/api/openapi.js +47 -0
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/route-helpers/forms.d.ts.map +1 -1
- package/dist/api/route-helpers/forms.js +7 -1
- package/dist/api/route-helpers/forms.js.map +1 -1
- package/dist/api/routes/ai-authoring.d.ts.map +1 -1
- package/dist/api/routes/ai-authoring.js +1 -0
- 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 +20 -18
- package/dist/api/routes/ai-seo.js.map +1 -1
- package/dist/api/routes/media.d.ts.map +1 -1
- package/dist/api/routes/media.js +3 -1
- package/dist/api/routes/media.js.map +1 -1
- package/dist/api/routes/scheduling.d.ts.map +1 -1
- package/dist/api/routes/scheduling.js +33 -2
- package/dist/api/routes/scheduling.js.map +1 -1
- package/dist/appearance/color.d.ts +17 -0
- package/dist/appearance/color.d.ts.map +1 -1
- package/dist/appearance/color.js +162 -1
- package/dist/appearance/color.js.map +1 -1
- package/dist/appearance/index.d.ts +3 -3
- package/dist/appearance/index.d.ts.map +1 -1
- package/dist/appearance/index.js +2 -2
- package/dist/appearance/index.js.map +1 -1
- package/dist/appearance/resolve.d.ts.map +1 -1
- package/dist/appearance/resolve.js +4 -2
- package/dist/appearance/resolve.js.map +1 -1
- package/dist/appearance/theme-tokens.d.ts +60 -11
- package/dist/appearance/theme-tokens.d.ts.map +1 -1
- package/dist/appearance/theme-tokens.js +184 -175
- package/dist/appearance/theme-tokens.js.map +1 -1
- package/dist/appearance/types.d.ts +16 -2
- package/dist/appearance/types.d.ts.map +1 -1
- package/dist/astro-site.d.ts +1 -11
- package/dist/astro-site.d.ts.map +1 -1
- package/dist/astro-site.js +4 -0
- package/dist/astro-site.js.map +1 -1
- package/dist/auth/team.d.ts +1 -0
- package/dist/auth/team.d.ts.map +1 -1
- package/dist/auth/team.js +1 -1
- package/dist/auth/team.js.map +1 -1
- package/dist/cache/http.d.ts +20 -0
- package/dist/cache/http.d.ts.map +1 -1
- package/dist/cache/http.js +42 -0
- package/dist/cache/http.js.map +1 -1
- package/dist/chrome/announcement.d.ts +30 -0
- package/dist/chrome/announcement.d.ts.map +1 -0
- package/dist/chrome/announcement.js +190 -0
- package/dist/chrome/announcement.js.map +1 -0
- package/dist/chrome/codegen.d.ts +17 -0
- package/dist/chrome/codegen.d.ts.map +1 -0
- package/dist/chrome/codegen.js +96 -0
- package/dist/chrome/codegen.js.map +1 -0
- package/dist/chrome/contract.d.ts +142 -0
- package/dist/chrome/contract.d.ts.map +1 -0
- package/dist/chrome/contract.js +2 -0
- package/dist/chrome/contract.js.map +1 -0
- package/dist/chrome/memory-store.d.ts +15 -0
- package/dist/chrome/memory-store.d.ts.map +1 -0
- package/dist/chrome/memory-store.js +54 -0
- package/dist/chrome/memory-store.js.map +1 -0
- package/dist/chrome/parse.d.ts +36 -0
- package/dist/chrome/parse.d.ts.map +1 -0
- package/dist/chrome/parse.js +277 -0
- package/dist/chrome/parse.js.map +1 -0
- package/dist/chrome/prisma-store.d.ts +11 -0
- package/dist/chrome/prisma-store.d.ts.map +1 -0
- package/dist/chrome/prisma-store.js +48 -0
- package/dist/chrome/prisma-store.js.map +1 -0
- package/dist/chrome/public.d.ts +22 -0
- package/dist/chrome/public.d.ts.map +1 -0
- package/dist/chrome/public.js +181 -0
- package/dist/chrome/public.js.map +1 -0
- package/dist/chrome/resolve.d.ts +36 -0
- package/dist/chrome/resolve.d.ts.map +1 -0
- package/dist/chrome/resolve.js +165 -0
- package/dist/chrome/resolve.js.map +1 -0
- package/dist/chrome/revalidate.d.ts +9 -0
- package/dist/chrome/revalidate.d.ts.map +1 -0
- package/dist/chrome/revalidate.js +51 -0
- package/dist/chrome/revalidate.js.map +1 -0
- package/dist/chrome/routes.d.ts +14 -0
- package/dist/chrome/routes.d.ts.map +1 -0
- package/dist/chrome/routes.js +306 -0
- package/dist/chrome/routes.js.map +1 -0
- package/dist/chrome/schema.d.ts +231 -0
- package/dist/chrome/schema.d.ts.map +1 -0
- package/dist/chrome/schema.js +73 -0
- package/dist/chrome/schema.js.map +1 -0
- package/dist/chrome/service.d.ts +76 -0
- package/dist/chrome/service.d.ts.map +1 -0
- package/dist/chrome/service.js +286 -0
- package/dist/chrome/service.js.map +1 -0
- package/dist/chrome/settings.d.ts +14 -0
- package/dist/chrome/settings.d.ts.map +1 -0
- package/dist/chrome/settings.js +142 -0
- package/dist/chrome/settings.js.map +1 -0
- package/dist/chrome/store.d.ts +48 -0
- package/dist/chrome/store.d.ts.map +1 -0
- package/dist/chrome/store.js +26 -0
- package/dist/chrome/store.js.map +1 -0
- package/dist/chrome/values.d.ts +98 -0
- package/dist/chrome/values.d.ts.map +1 -0
- package/dist/chrome/values.js +491 -0
- package/dist/chrome/values.js.map +1 -0
- package/dist/config/define.d.ts +2 -0
- package/dist/config/define.d.ts.map +1 -1
- package/dist/config/define.js +2 -0
- package/dist/config/define.js.map +1 -1
- package/dist/db/model-types.d.ts +62 -0
- package/dist/db/model-types.d.ts.map +1 -1
- package/dist/forms/attribution-settings.d.ts +23 -0
- package/dist/forms/attribution-settings.d.ts.map +1 -0
- package/dist/forms/attribution-settings.js +42 -0
- package/dist/forms/attribution-settings.js.map +1 -0
- package/dist/forms/attribution.d.ts +5 -1
- package/dist/forms/attribution.d.ts.map +1 -1
- package/dist/forms/attribution.js +6 -4
- package/dist/forms/attribution.js.map +1 -1
- package/dist/forms/client-validation.d.ts.map +1 -1
- package/dist/forms/client-validation.js +3 -0
- package/dist/forms/client-validation.js.map +1 -1
- package/dist/forms/form-model.d.ts +109 -0
- package/dist/forms/form-model.d.ts.map +1 -0
- package/dist/forms/form-model.js +192 -0
- package/dist/forms/form-model.js.map +1 -0
- package/dist/forms/index.d.ts +2 -2
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/service.d.ts +19 -1
- package/dist/forms/service.d.ts.map +1 -1
- package/dist/forms/service.js +152 -0
- package/dist/forms/service.js.map +1 -1
- package/dist/forms/spam.d.ts +0 -12
- package/dist/forms/spam.d.ts.map +1 -1
- package/dist/forms/spam.js +30 -0
- package/dist/forms/spam.js.map +1 -1
- package/dist/forms/submission.d.ts +7 -0
- package/dist/forms/submission.d.ts.map +1 -1
- package/dist/forms/submission.js +33 -0
- package/dist/forms/submission.js.map +1 -1
- package/dist/forms/types.d.ts +26 -1
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/types.js +9 -1
- package/dist/forms/types.js.map +1 -1
- package/dist/generated/browser.d.ts +35 -3
- package/dist/generated/client.d.ts +35 -3
- package/dist/generated/internal/class.d.ts +44 -0
- package/dist/generated/internal/class.js +4 -4
- package/dist/generated/internal/prismaNamespace.d.ts +403 -1
- package/dist/generated/internal/prismaNamespace.js +95 -1
- package/dist/generated/internal/prismaNamespaceBrowser.d.ts +102 -0
- package/dist/generated/internal/prismaNamespaceBrowser.js +95 -1
- package/dist/generated/models/ChromeRegion.d.ts +1203 -0
- package/dist/generated/models/ChromeRegion.js +1 -0
- package/dist/generated/models/Job.d.ts +732 -5
- package/dist/generated/models/JobEvent.d.ts +1339 -0
- package/dist/generated/models/JobEvent.js +1 -0
- package/dist/generated/models/JobReviewItem.d.ts +1470 -0
- package/dist/generated/models/JobReviewItem.js +1 -0
- package/dist/generated/models/SystemSetting.d.ts +952 -0
- package/dist/generated/models/SystemSetting.js +1 -0
- package/dist/generated/models.d.ts +4 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/jobs/batch-ai.d.ts +53 -0
- package/dist/jobs/batch-ai.d.ts.map +1 -0
- package/dist/jobs/batch-ai.js +314 -0
- package/dist/jobs/batch-ai.js.map +1 -0
- package/dist/jobs/contract.d.ts +186 -0
- package/dist/jobs/contract.d.ts.map +1 -0
- package/dist/jobs/contract.js +2 -0
- package/dist/jobs/contract.js.map +1 -0
- package/dist/jobs/error-text.d.ts +23 -0
- package/dist/jobs/error-text.d.ts.map +1 -0
- package/dist/jobs/error-text.js +110 -0
- package/dist/jobs/error-text.js.map +1 -0
- package/dist/jobs/handlers.d.ts.map +1 -1
- package/dist/jobs/handlers.js +48 -7
- package/dist/jobs/handlers.js.map +1 -1
- package/dist/jobs/memory-store.d.ts +26 -2
- package/dist/jobs/memory-store.d.ts.map +1 -1
- package/dist/jobs/memory-store.js +157 -3
- package/dist/jobs/memory-store.js.map +1 -1
- package/dist/jobs/outcomes.d.ts +46 -0
- package/dist/jobs/outcomes.d.ts.map +1 -0
- package/dist/jobs/outcomes.js +251 -0
- package/dist/jobs/outcomes.js.map +1 -0
- package/dist/jobs/prisma-store.d.ts +14 -2
- package/dist/jobs/prisma-store.d.ts.map +1 -1
- package/dist/jobs/prisma-store.js +257 -15
- package/dist/jobs/prisma-store.js.map +1 -1
- package/dist/jobs/queue.d.ts +62 -2
- package/dist/jobs/queue.d.ts.map +1 -1
- package/dist/jobs/queue.js +412 -36
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/retention.d.ts +11 -0
- package/dist/jobs/retention.d.ts.map +1 -0
- package/dist/jobs/retention.js +18 -0
- package/dist/jobs/retention.js.map +1 -0
- package/dist/jobs/review.d.ts +111 -0
- package/dist/jobs/review.d.ts.map +1 -0
- package/dist/jobs/review.js +461 -0
- package/dist/jobs/review.js.map +1 -0
- package/dist/jobs/routes.d.ts.map +1 -1
- package/dist/jobs/routes.js +491 -16
- package/dist/jobs/routes.js.map +1 -1
- package/dist/jobs/serialize.d.ts +40 -0
- package/dist/jobs/serialize.d.ts.map +1 -0
- package/dist/jobs/serialize.js +270 -0
- package/dist/jobs/serialize.js.map +1 -0
- package/dist/jobs/types.d.ts +141 -2
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs/worker-status.d.ts +27 -0
- package/dist/jobs/worker-status.d.ts.map +1 -0
- package/dist/jobs/worker-status.js +66 -0
- package/dist/jobs/worker-status.js.map +1 -0
- package/dist/media/optimize.d.ts.map +1 -1
- package/dist/media/optimize.js +4 -2
- package/dist/media/optimize.js.map +1 -1
- package/dist/next-site.d.ts +1 -0
- package/dist/next-site.d.ts.map +1 -1
- package/dist/next-site.js +3 -0
- package/dist/next-site.js.map +1 -1
- package/dist/seo/audit-runner.d.ts.map +1 -1
- package/dist/seo/audit-runner.js +23 -2
- package/dist/seo/audit-runner.js.map +1 -1
- package/dist/seo/issue-fix-link-insert.d.ts +11 -0
- package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
- package/dist/seo/issue-fix-link-insert.js +122 -8
- package/dist/seo/issue-fix-link-insert.js.map +1 -1
- package/dist/server-site.d.ts.map +1 -1
- package/dist/server-site.js +15 -0
- package/dist/server-site.js.map +1 -1
- package/dist/site.d.ts +8 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +6 -0
- package/dist/site.js.map +1 -1
- package/dist/webhooks/index.d.ts +3 -1
- package/dist/webhooks/index.d.ts.map +1 -1
- package/dist/webhooks/index.js.map +1 -1
- package/package.json +6 -1
- package/prisma/migrations/0025_job_cancel_review/down.sql +60 -0
- package/prisma/migrations/0025_job_cancel_review/migration.sql +56 -0
- package/prisma/migrations/0026_job_creator_system_settings/down.sql +30 -0
- package/prisma/migrations/0026_job_creator_system_settings/migration.sql +14 -0
- package/prisma/migrations/0027_chrome_regions/down.sql +24 -0
- package/prisma/migrations/0027_chrome_regions/migration.sql +16 -0
- package/prisma/schema.prisma +105 -15
|
@@ -1,6 +1,18 @@
|
|
|
1
|
+
import { withinRows } from './retention.js';
|
|
2
|
+
const FINISHED = new Set(['succeeded', 'dead', 'cancelled']);
|
|
1
3
|
/** In-process store for the queue tests. Production uses {@link PrismaJobStore}. */
|
|
2
4
|
export class MemoryJobStore {
|
|
5
|
+
reviewItems;
|
|
3
6
|
jobs = new Map();
|
|
7
|
+
events = [];
|
|
8
|
+
/**
|
|
9
|
+
* @param reviewItems The live `job_review_items` rows (`jobId`, `status`,
|
|
10
|
+
* `decidedAt`) of a test that drives review items, so retention keeps a
|
|
11
|
+
* job for them like the Prisma store does, and deletes them with it.
|
|
12
|
+
*/
|
|
13
|
+
constructor(reviewItems = () => []) {
|
|
14
|
+
this.reviewItems = reviewItems;
|
|
15
|
+
}
|
|
4
16
|
async insert(job) {
|
|
5
17
|
this.jobs.set(job.id, { ...job, payload: { ...job.payload }, progress: { ...job.progress } });
|
|
6
18
|
}
|
|
@@ -31,15 +43,155 @@ export class MemoryJobStore {
|
|
|
31
43
|
job.lockedAt.getTime() < cutoff.getTime())
|
|
32
44
|
.map((job) => this.clone(job));
|
|
33
45
|
}
|
|
46
|
+
/** Keeps the stored cancel fields and creator, like {@link PrismaJobStore.save}. */
|
|
34
47
|
async save(job) {
|
|
35
|
-
this.jobs.
|
|
48
|
+
const stored = this.jobs.get(job.id);
|
|
49
|
+
this.jobs.set(job.id, {
|
|
50
|
+
...job,
|
|
51
|
+
payload: { ...job.payload },
|
|
52
|
+
progress: { ...job.progress },
|
|
53
|
+
cancelRequestedAt: stored?.cancelRequestedAt ?? null,
|
|
54
|
+
cancelledById: stored?.cancelledById ?? null,
|
|
55
|
+
createdById: stored?.createdById ?? null,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async requestCancel(id, at, byId) {
|
|
59
|
+
const job = this.jobs.get(id);
|
|
60
|
+
if (!job || job.cancelRequestedAt)
|
|
61
|
+
return false;
|
|
62
|
+
if (job.status !== 'queued' && job.status !== 'running')
|
|
63
|
+
return false;
|
|
64
|
+
job.cancelRequestedAt = at;
|
|
65
|
+
job.cancelledById = byId;
|
|
66
|
+
job.updatedAt = at;
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
async finishCancel(job) {
|
|
70
|
+
const stored = this.jobs.get(job.id);
|
|
71
|
+
if (!stored?.cancelRequestedAt || !job.cancelRequestedAt)
|
|
72
|
+
return false;
|
|
73
|
+
if (stored.cancelRequestedAt.getTime() !== job.cancelRequestedAt.getTime())
|
|
74
|
+
return false;
|
|
75
|
+
if (stored.status !== 'queued' && stored.status !== 'running')
|
|
76
|
+
return false;
|
|
77
|
+
await this.save(job);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
async findPendingNotes(since, summaryTypes, limit) {
|
|
81
|
+
return [...this.jobs.values()]
|
|
82
|
+
.filter((job) => job.finishedAt && job.finishedAt.getTime() >= since.getTime())
|
|
83
|
+
.filter((job) => (job.status === 'dead' && job.explain == null) ||
|
|
84
|
+
(job.status === 'succeeded' && summaryTypes.includes(job.type) && job.summary == null))
|
|
85
|
+
.sort((a, b) => a.finishedAt.getTime() - b.finishedAt.getTime())
|
|
86
|
+
.slice(0, limit)
|
|
87
|
+
.map((job) => this.clone(job));
|
|
88
|
+
}
|
|
89
|
+
async claimNote(id, note, finishedAt) {
|
|
90
|
+
const job = this.sameFinish(id, note, finishedAt);
|
|
91
|
+
if (!job || job[note] != null)
|
|
92
|
+
return false;
|
|
93
|
+
job[note] = '';
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
async writeNote(id, note, finishedAt, text, usage) {
|
|
97
|
+
const stored = this.jobs.get(id);
|
|
98
|
+
if (stored && usage) {
|
|
99
|
+
stored.tokensIn = (stored.tokensIn ?? 0) + usage.tokensIn;
|
|
100
|
+
stored.tokensOut = (stored.tokensOut ?? 0) + usage.tokensOut;
|
|
101
|
+
}
|
|
102
|
+
const job = this.sameFinish(id, note, finishedAt);
|
|
103
|
+
if (!text || !job || job[note] !== '')
|
|
104
|
+
return false;
|
|
105
|
+
job[note] = text;
|
|
106
|
+
return true;
|
|
36
107
|
}
|
|
37
|
-
async
|
|
108
|
+
async retry(id, now) {
|
|
109
|
+
const job = this.jobs.get(id);
|
|
110
|
+
if (!job)
|
|
111
|
+
return false;
|
|
112
|
+
if (job.status !== 'dead' && !(job.status === 'queued' && job.lastError !== null))
|
|
113
|
+
return false;
|
|
114
|
+
Object.assign(job, {
|
|
115
|
+
status: 'queued',
|
|
116
|
+
attempts: 0,
|
|
117
|
+
lastError: null,
|
|
118
|
+
explain: null,
|
|
119
|
+
runAt: now,
|
|
120
|
+
lockedAt: null,
|
|
121
|
+
finishedAt: null,
|
|
122
|
+
cancelRequestedAt: null,
|
|
123
|
+
cancelledById: null,
|
|
124
|
+
updatedAt: now,
|
|
125
|
+
});
|
|
126
|
+
return true;
|
|
127
|
+
}
|
|
128
|
+
async get(id) {
|
|
129
|
+
const job = this.jobs.get(id);
|
|
130
|
+
return job ? this.clone(job) : null;
|
|
131
|
+
}
|
|
132
|
+
async findCancelRequested() {
|
|
133
|
+
return [...this.jobs.values()]
|
|
134
|
+
.filter((job) => job.status === 'queued' && job.cancelRequestedAt)
|
|
135
|
+
.map((job) => this.clone(job));
|
|
136
|
+
}
|
|
137
|
+
async pruneFinished(cutoff, limit) {
|
|
138
|
+
const before = cutoff.getTime();
|
|
139
|
+
const items = this.reviewItems();
|
|
140
|
+
const held = (job) => items.some((item) => item.jobId === job.id &&
|
|
141
|
+
(item.status === 'pending' ||
|
|
142
|
+
(item.decidedAt instanceof Date && item.decidedAt.getTime() >= before)));
|
|
143
|
+
const old = [...this.jobs.values()]
|
|
144
|
+
.filter((job) => FINISHED.has(job.status) &&
|
|
145
|
+
job.createdAt.getTime() < before &&
|
|
146
|
+
(job.finishedAt ?? job.updatedAt).getTime() < before &&
|
|
147
|
+
!held(job))
|
|
148
|
+
.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
|
|
149
|
+
.slice(0, limit.jobs);
|
|
150
|
+
const rowsOf = (id) => this.events.filter((event) => event.jobId === id).length +
|
|
151
|
+
items.filter((item) => item.jobId === id).length;
|
|
152
|
+
const ids = new Set(withinRows(old.map((job) => ({ id: job.id, rows: rowsOf(job.id) })), limit.rows));
|
|
153
|
+
for (const id of ids)
|
|
154
|
+
this.jobs.delete(id);
|
|
155
|
+
this.removeEvents((event) => ids.has(event.jobId));
|
|
156
|
+
const keptItems = items.filter((item) => !ids.has(String(item.jobId)));
|
|
157
|
+
items.splice(0, items.length, ...keptItems);
|
|
158
|
+
return ids.size;
|
|
159
|
+
}
|
|
160
|
+
async list(limit, filter = {}) {
|
|
38
161
|
return [...this.jobs.values()]
|
|
39
|
-
.
|
|
162
|
+
.filter((job) => !filter.type || job.type === filter.type)
|
|
163
|
+
.filter((job) => !filter.statuses?.length || filter.statuses.includes(job.status))
|
|
164
|
+
.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
|
|
40
165
|
.slice(0, limit)
|
|
41
166
|
.map((job) => this.clone(job));
|
|
42
167
|
}
|
|
168
|
+
async addEvent(event) {
|
|
169
|
+
this.events.push({ ...event });
|
|
170
|
+
}
|
|
171
|
+
async listEvents(jobId, limit) {
|
|
172
|
+
return this.events
|
|
173
|
+
.filter((event) => event.jobId === jobId)
|
|
174
|
+
.reverse()
|
|
175
|
+
.slice(0, limit)
|
|
176
|
+
.map((event) => ({ ...event }));
|
|
177
|
+
}
|
|
178
|
+
async trimEvents(jobId, keep) {
|
|
179
|
+
const own = this.events.filter((event) => event.jobId === jobId);
|
|
180
|
+
const old = new Set(own.slice(0, Math.max(own.length - keep, 0)));
|
|
181
|
+
this.removeEvents((event) => old.has(event));
|
|
182
|
+
return old.size;
|
|
183
|
+
}
|
|
184
|
+
removeEvents(drop) {
|
|
185
|
+
const kept = this.events.filter((event) => !drop(event));
|
|
186
|
+
this.events.splice(0, this.events.length, ...kept);
|
|
187
|
+
}
|
|
188
|
+
/** The stored job if it is still the finish a note belongs to. */
|
|
189
|
+
sameFinish(id, note, finishedAt) {
|
|
190
|
+
const job = this.jobs.get(id);
|
|
191
|
+
if (!job || job.status !== (note === 'explain' ? 'dead' : 'succeeded'))
|
|
192
|
+
return null;
|
|
193
|
+
return job.finishedAt?.getTime() === finishedAt.getTime() ? job : null;
|
|
194
|
+
}
|
|
43
195
|
clone(job) {
|
|
44
196
|
return {
|
|
45
197
|
...job,
|
|
@@ -47,6 +199,8 @@ export class MemoryJobStore {
|
|
|
47
199
|
progress: { ...job.progress },
|
|
48
200
|
runAt: new Date(job.runAt),
|
|
49
201
|
lockedAt: job.lockedAt ? new Date(job.lockedAt) : null,
|
|
202
|
+
cancelRequestedAt: job.cancelRequestedAt ? new Date(job.cancelRequestedAt) : null,
|
|
203
|
+
finishedAt: job.finishedAt ? new Date(job.finishedAt) : null,
|
|
50
204
|
createdAt: new Date(job.createdAt),
|
|
51
205
|
updatedAt: new Date(job.updatedAt),
|
|
52
206
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/jobs/memory-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/jobs/memory-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker rules 3 and 4 (DATA_CONTRACTS.md §1): a finished scan's `results`,
|
|
3
|
+
* read from the database as the scan ends, and the AI notes the worker writes
|
|
4
|
+
* afterwards: a scan's `summary` and a dead job's `explain`. Every AI call goes
|
|
5
|
+
* through the governed runtime within the time the queue gives it and is best
|
|
6
|
+
* effort: a missing feature, a spent cap or a slow provider leaves the note empty.
|
|
7
|
+
*/
|
|
8
|
+
import type { PrentaDB } from '../db/client-types.js';
|
|
9
|
+
import type { DigestSendResult } from '../seo/digest.js';
|
|
10
|
+
import type { ScanResults } from './contract.js';
|
|
11
|
+
import type { JobNotes, NoteText } from './queue.js';
|
|
12
|
+
import type { JobRecord } from './types.js';
|
|
13
|
+
/** The error line without server paths or email addresses. */
|
|
14
|
+
export declare function redactForAi(text: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Rule 3 for an SEO scan, after the digest was attempted: the run's score
|
|
17
|
+
* against the last one, the issues it found, the issues it resolved, the open
|
|
18
|
+
* issues by kind, and the digest. Undefined when the run can't be read; the
|
|
19
|
+
* scan itself still succeeded.
|
|
20
|
+
*/
|
|
21
|
+
export declare function seoScanResults(db: PrentaDB, runId: string, digest: DigestSendResult, now: Date): Promise<ScanResults | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* Rule 3 for a content health scan, after unseen issues were resolved: the new
|
|
24
|
+
* and resolved counts and the open issues by kind, as the dashboard counts
|
|
25
|
+
* them. Content health sends no digest.
|
|
26
|
+
*/
|
|
27
|
+
export declare function contentHealthResults(db: PrentaDB, counts: {
|
|
28
|
+
found: number;
|
|
29
|
+
resolved: number;
|
|
30
|
+
}): Promise<ScanResults | undefined>;
|
|
31
|
+
/**
|
|
32
|
+
* Rule 3's summary of a finished scan, from the `results` saved with its
|
|
33
|
+
* success and, for SEO, the issues open now. No text for a scan without
|
|
34
|
+
* results, such as one that found another audit already running.
|
|
35
|
+
*/
|
|
36
|
+
export declare function summarizeScan(db: PrentaDB, job: JobRecord, timeoutMs: number): Promise<NoteText>;
|
|
37
|
+
/**
|
|
38
|
+
* Rule 4: a plain-language account of why a job died and what to do next.
|
|
39
|
+
* Built from the one-line error summary, never the stack, so it shows no more
|
|
40
|
+
* than every caller already sees, with server paths and email addresses taken
|
|
41
|
+
* out before it goes to the AI provider. No text when AI is unavailable or fails.
|
|
42
|
+
*/
|
|
43
|
+
export declare function explainJobFailure(db: PrentaDB, job: JobRecord, timeoutMs: number): Promise<NoteText>;
|
|
44
|
+
/** The worker's AI notes: `explain` on any dead job, `summary` on finished scans. */
|
|
45
|
+
export declare function createJobNotes(db: PrentaDB): JobNotes;
|
|
46
|
+
//# sourceMappingURL=outcomes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.d.ts","sourceRoot":"","sources":["../../src/jobs/outcomes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,YAAY,CAAA;AA4CrD,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAoED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA+BlC;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAmBlC;AAYD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAyBnB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,QAAQ,CAMrD"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker rules 3 and 4 (DATA_CONTRACTS.md §1): a finished scan's `results`,
|
|
3
|
+
* read from the database as the scan ends, and the AI notes the worker writes
|
|
4
|
+
* afterwards: a scan's `summary` and a dead job's `explain`. Every AI call goes
|
|
5
|
+
* through the governed runtime within the time the queue gives it and is best
|
|
6
|
+
* effort: a missing feature, a spent cap or a slow provider leaves the note empty.
|
|
7
|
+
*/
|
|
8
|
+
import { explainToEditor, seoIssueLine, summarizeIssues } from '../ai/tasks/editor-text.js';
|
|
9
|
+
import { sortIssuesBySeverity } from '../api/routes/seo/handlers/shared.js';
|
|
10
|
+
import { errorSummary } from './error-text.js';
|
|
11
|
+
const TEXT_MAX = 2000;
|
|
12
|
+
/** The Results tab lists this many issue kinds. */
|
|
13
|
+
const CATEGORY_LIMIT = 8;
|
|
14
|
+
const OPEN = { in: ['open', 'recurring'] };
|
|
15
|
+
/** Where each kind of SEO issue gets fixed in the admin. */
|
|
16
|
+
const SEO_CATEGORY_HREFS = {
|
|
17
|
+
content: '/seo/content',
|
|
18
|
+
technical: '/seo/technical',
|
|
19
|
+
redirects: '/seo/redirects',
|
|
20
|
+
media: '/media',
|
|
21
|
+
performance: '/seo/technical',
|
|
22
|
+
schema: '/seo/content',
|
|
23
|
+
social: '/seo/content',
|
|
24
|
+
indexing: '/seo/technical',
|
|
25
|
+
};
|
|
26
|
+
/** Content health's issue kinds, labelled as the dashboard labels them. */
|
|
27
|
+
const CONTENT_ISSUES = {
|
|
28
|
+
MISSING_META_DESCRIPTION: { label: 'Missing meta descriptions', href: '/seo/content' },
|
|
29
|
+
BROKEN_INTERNAL_LINK: { label: 'Broken internal links', href: '/seo/link-health' },
|
|
30
|
+
MISSING_ALT_TEXT: { label: 'Missing alt text', href: '/media' },
|
|
31
|
+
OUTDATED_CONTENT: { label: 'Outdated content (90+ days)', href: '/posts' },
|
|
32
|
+
};
|
|
33
|
+
const JOB_LABELS = {
|
|
34
|
+
'seo-scan': 'SEO scan',
|
|
35
|
+
'content-health': 'Content health check',
|
|
36
|
+
'batch-ai': 'Batch AI changes',
|
|
37
|
+
};
|
|
38
|
+
/** Server file paths and email addresses in an error line, which the AI provider needn't see. */
|
|
39
|
+
const PRIVATE_TEXT = [
|
|
40
|
+
[/[\w.%+-]+@[\w-]+(?:\.[\w-]+)*\.[a-z]{2,}/gi, '[email]'],
|
|
41
|
+
[/file:\/\/\S+/gi, '[path]'],
|
|
42
|
+
[/\b[a-z]:\\[^\s'"`]+/gi, '[path]'],
|
|
43
|
+
[
|
|
44
|
+
/(?<![\w.:/])\/(?:srv|var|home|usr|opt|tmp|etc|root|app|mnt|private|proc|workspace|Users)\/[^\s'"`()]+/g,
|
|
45
|
+
'[path]',
|
|
46
|
+
],
|
|
47
|
+
];
|
|
48
|
+
/** The error line without server paths or email addresses. */
|
|
49
|
+
export function redactForAi(text) {
|
|
50
|
+
return PRIVATE_TEXT.reduce((out, [pattern, label]) => out.replace(pattern, label), text);
|
|
51
|
+
}
|
|
52
|
+
function clip(text) {
|
|
53
|
+
const trimmed = text.trim();
|
|
54
|
+
return trimmed.length > TEXT_MAX ? `${trimmed.slice(0, TEXT_MAX - 1)}…` : trimmed;
|
|
55
|
+
}
|
|
56
|
+
function usageOf(out) {
|
|
57
|
+
return { tokensIn: out.usage.promptTokens, tokensOut: out.usage.completionTokens };
|
|
58
|
+
}
|
|
59
|
+
/** `missing_meta_description` → `Missing meta description`. */
|
|
60
|
+
function humanize(type) {
|
|
61
|
+
const words = type.replace(/[_-]+/g, ' ').trim().toLowerCase();
|
|
62
|
+
return words ? words[0].toUpperCase() + words.slice(1) : type;
|
|
63
|
+
}
|
|
64
|
+
function topCategories(categories) {
|
|
65
|
+
return categories
|
|
66
|
+
.filter((category) => category.count > 0)
|
|
67
|
+
.sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))
|
|
68
|
+
.slice(0, CATEGORY_LIMIT);
|
|
69
|
+
}
|
|
70
|
+
/** The AI summary of a scan, or no text when AI is unavailable or there is nothing to summarize. */
|
|
71
|
+
async function summarize(db, input) {
|
|
72
|
+
if (input.issueLines.length === 0)
|
|
73
|
+
return { text: null };
|
|
74
|
+
try {
|
|
75
|
+
const out = await summarizeIssues(db, input);
|
|
76
|
+
if (!out.ok)
|
|
77
|
+
return { text: null };
|
|
78
|
+
return { text: clip(out.text) || null, usage: usageOf(out) };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return { text: null };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Open SEO issues grouped by kind. A kind whose issues all share a title is
|
|
86
|
+
* labelled with it; one whose titles vary (they name a page or keyword) gets a
|
|
87
|
+
* readable form of its type.
|
|
88
|
+
*/
|
|
89
|
+
function seoCategories(groups) {
|
|
90
|
+
const byType = new Map();
|
|
91
|
+
for (const group of groups) {
|
|
92
|
+
const entry = byType.get(group.type) ?? {
|
|
93
|
+
category: group.category,
|
|
94
|
+
titles: new Set(),
|
|
95
|
+
count: 0,
|
|
96
|
+
};
|
|
97
|
+
entry.titles.add(group.title);
|
|
98
|
+
entry.count += group._count._all;
|
|
99
|
+
byType.set(group.type, entry);
|
|
100
|
+
}
|
|
101
|
+
return topCategories([...byType.entries()].map(([type, entry]) => ({
|
|
102
|
+
key: type,
|
|
103
|
+
label: entry.titles.size === 1 ? [...entry.titles][0] : humanize(type),
|
|
104
|
+
count: entry.count,
|
|
105
|
+
href: SEO_CATEGORY_HREFS[entry.category] ?? '/seo',
|
|
106
|
+
})));
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Rule 3 for an SEO scan, after the digest was attempted: the run's score
|
|
110
|
+
* against the last one, the issues it found, the issues it resolved, the open
|
|
111
|
+
* issues by kind, and the digest. Undefined when the run can't be read; the
|
|
112
|
+
* scan itself still succeeded.
|
|
113
|
+
*/
|
|
114
|
+
export async function seoScanResults(db, runId, digest, now) {
|
|
115
|
+
try {
|
|
116
|
+
const run = await db.seoAuditRun.findFirst({ where: { id: runId } });
|
|
117
|
+
if (!run)
|
|
118
|
+
return undefined;
|
|
119
|
+
const [resolved, groups] = await Promise.all([
|
|
120
|
+
// The run resolves what it no longer finds, with no person attached.
|
|
121
|
+
db.seoIssue.count({
|
|
122
|
+
where: { status: 'resolved', resolvedById: null, resolvedAt: { gte: run.startedAt } },
|
|
123
|
+
}),
|
|
124
|
+
db.seoIssue.groupBy({
|
|
125
|
+
by: ['type', 'category', 'title'],
|
|
126
|
+
where: { status: OPEN },
|
|
127
|
+
_count: { _all: true },
|
|
128
|
+
}),
|
|
129
|
+
]);
|
|
130
|
+
return {
|
|
131
|
+
...(typeof run.siteScoreAfter === 'number' ? { score: run.siteScoreAfter } : {}),
|
|
132
|
+
...(typeof run.siteScoreBefore === 'number' ? { prevScore: run.siteScoreBefore } : {}),
|
|
133
|
+
found: run.issuesFound,
|
|
134
|
+
resolved,
|
|
135
|
+
categories: seoCategories(groups),
|
|
136
|
+
digest: digest.sent
|
|
137
|
+
? {
|
|
138
|
+
sentAt: now.toISOString(),
|
|
139
|
+
recipients: Math.max(0, (digest.recipients ?? 0) - (digest.failed ?? 0)),
|
|
140
|
+
}
|
|
141
|
+
: null,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Rule 3 for a content health scan, after unseen issues were resolved: the new
|
|
150
|
+
* and resolved counts and the open issues by kind, as the dashboard counts
|
|
151
|
+
* them. Content health sends no digest.
|
|
152
|
+
*/
|
|
153
|
+
export async function contentHealthResults(db, counts) {
|
|
154
|
+
try {
|
|
155
|
+
const rows = await db.contentIssue.groupBy({ by: ['type'], _sum: { count: true } });
|
|
156
|
+
return {
|
|
157
|
+
found: counts.found,
|
|
158
|
+
resolved: counts.resolved,
|
|
159
|
+
categories: topCategories(rows.map((row) => ({
|
|
160
|
+
key: row.type,
|
|
161
|
+
label: CONTENT_ISSUES[row.type]?.label ?? humanize(row.type),
|
|
162
|
+
count: row._sum.count ?? 0,
|
|
163
|
+
href: CONTENT_ISSUES[row.type]?.href ?? '/',
|
|
164
|
+
}))),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/** Open SEO issues as summary lines, most severe first, as `/ai/seo/summarize` lists them. */
|
|
172
|
+
async function openSeoIssueLines(db) {
|
|
173
|
+
const open = await db.seoIssue.findMany({
|
|
174
|
+
where: { status: OPEN },
|
|
175
|
+
orderBy: { lastDetectedAt: 'desc' },
|
|
176
|
+
take: 40,
|
|
177
|
+
});
|
|
178
|
+
return sortIssuesBySeverity(open).slice(0, 25).map(seoIssueLine);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Rule 3's summary of a finished scan, from the `results` saved with its
|
|
182
|
+
* success and, for SEO, the issues open now. No text for a scan without
|
|
183
|
+
* results, such as one that found another audit already running.
|
|
184
|
+
*/
|
|
185
|
+
export async function summarizeScan(db, job, timeoutMs) {
|
|
186
|
+
const results = job.results;
|
|
187
|
+
if (!results)
|
|
188
|
+
return { text: null };
|
|
189
|
+
try {
|
|
190
|
+
if (job.type === 'seo-scan') {
|
|
191
|
+
const score = results.score === undefined
|
|
192
|
+
? ''
|
|
193
|
+
: `Site score ${results.score}${results.prevScore === undefined ? '' : ` (was ${results.prevScore})`}. `;
|
|
194
|
+
return await summarize(db, {
|
|
195
|
+
subject: 'SEO',
|
|
196
|
+
issueLines: await openSeoIssueLines(db),
|
|
197
|
+
context: `This scan: ${score}${results.found} issues found, ${results.resolved} fixed since the last scan.`,
|
|
198
|
+
timeoutMs,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return await summarize(db, {
|
|
202
|
+
subject: 'content health',
|
|
203
|
+
issueLines: results.categories.map((category) => `- ${category.label}: ${category.count}`),
|
|
204
|
+
context: `This scan: ${job.progress.completed} documents scanned, ${results.found} new issues, ${results.resolved} resolved since the last scan.`,
|
|
205
|
+
timeoutMs,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return { text: null };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Rule 4: a plain-language account of why a job died and what to do next.
|
|
214
|
+
* Built from the one-line error summary, never the stack, so it shows no more
|
|
215
|
+
* than every caller already sees, with server paths and email addresses taken
|
|
216
|
+
* out before it goes to the AI provider. No text when AI is unavailable or fails.
|
|
217
|
+
*/
|
|
218
|
+
export async function explainJobFailure(db, job, timeoutMs) {
|
|
219
|
+
const error = errorSummary(job.lastError);
|
|
220
|
+
if (!error)
|
|
221
|
+
return { text: null };
|
|
222
|
+
const { completed, total } = job.progress;
|
|
223
|
+
try {
|
|
224
|
+
const out = await explainToEditor(db, {
|
|
225
|
+
subject: 'why this background job failed',
|
|
226
|
+
ask: 'one concrete next step',
|
|
227
|
+
facts: [
|
|
228
|
+
['Job', JOB_LABELS[job.type] ?? job.type, 100],
|
|
229
|
+
['Attempts', `${job.attempts} of ${job.maxAttempts}`, 50],
|
|
230
|
+
['Progress', total > 0 ? `${completed} of ${total} done` : 'not started', 100],
|
|
231
|
+
],
|
|
232
|
+
description: redactForAi(error),
|
|
233
|
+
timeoutMs,
|
|
234
|
+
});
|
|
235
|
+
if (!out.ok)
|
|
236
|
+
return { text: null };
|
|
237
|
+
return { text: clip(out.text) || null, usage: usageOf(out) };
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return { text: null };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/** The worker's AI notes: `explain` on any dead job, `summary` on finished scans. */
|
|
244
|
+
export function createJobNotes(db) {
|
|
245
|
+
return {
|
|
246
|
+
summaryTypes: ['seo-scan', 'content-health'],
|
|
247
|
+
explain: (job, timeoutMs) => explainJobFailure(db, job, timeoutMs),
|
|
248
|
+
summarize: (job, timeoutMs) => summarizeScan(db, job, timeoutMs),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=outcomes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcomes.js","sourceRoot":"","sources":["../../src/jobs/outcomes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PrentaDB } from '../db/client-types.js';
|
|
2
|
-
import type { JobRecord, JobStore } from './types.js';
|
|
2
|
+
import type { JobEventRecord, JobListFilter, JobNote, JobRecord, JobStore, JobUsage, PruneLimit } from './types.js';
|
|
3
3
|
export declare class PrismaJobStore implements JobStore {
|
|
4
4
|
private readonly db;
|
|
5
5
|
constructor(db: PrentaDB);
|
|
@@ -8,6 +8,18 @@ export declare class PrismaJobStore implements JobStore {
|
|
|
8
8
|
claimNext(now: Date): Promise<JobRecord | null>;
|
|
9
9
|
findStaleRunning(cutoff: Date): Promise<JobRecord[]>;
|
|
10
10
|
save(job: JobRecord): Promise<void>;
|
|
11
|
-
|
|
11
|
+
finishCancel(job: JobRecord): Promise<boolean>;
|
|
12
|
+
requestCancel(id: string, at: Date, byId: string | null): Promise<boolean>;
|
|
13
|
+
findPendingNotes(since: Date, summaryTypes: readonly string[], limit: number): Promise<JobRecord[]>;
|
|
14
|
+
claimNote(id: string, note: JobNote, finishedAt: Date): Promise<boolean>;
|
|
15
|
+
writeNote(id: string, note: JobNote, finishedAt: Date, text: string, usage?: JobUsage): Promise<boolean>;
|
|
16
|
+
retry(id: string, now: Date): Promise<boolean>;
|
|
17
|
+
get(id: string): Promise<JobRecord | null>;
|
|
18
|
+
findCancelRequested(): Promise<JobRecord[]>;
|
|
19
|
+
pruneFinished(cutoff: Date, limit: PruneLimit): Promise<number>;
|
|
20
|
+
list(limit: number, filter?: JobListFilter): Promise<JobRecord[]>;
|
|
21
|
+
addEvent(event: JobEventRecord): Promise<void>;
|
|
22
|
+
listEvents(jobId: string, limit: number): Promise<JobEventRecord[]>;
|
|
23
|
+
trimEvents(jobId: string, keep: number): Promise<number>;
|
|
12
24
|
}
|
|
13
25
|
//# sourceMappingURL=prisma-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-store.d.ts","sourceRoot":"","sources":["../../src/jobs/prisma-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"prisma-store.d.ts","sourceRoot":"","sources":["../../src/jobs/prisma-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAEV,cAAc,EACd,aAAa,EACb,OAAO,EAEP,SAAS,EAET,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,YAAY,CAAA;AAiLnB,qBAAa,cAAe,YAAW,QAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEnC,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAQnD,SAAS,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAc/C,gBAAgB,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQpD,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9C,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ1E,gBAAgB,CACpB,KAAK,EAAE,IAAI,EACX,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,EAAE,CAAC;IAejB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxE,SAAS,CACb,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,IAAI,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,QAAQ,GACf,OAAO,CAAC,OAAO,CAAC;IAkBb,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB9C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAK1C,mBAAmB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAQ3C,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB/D,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAarE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAUnE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAe/D"}
|