Files
PaperClipAI/server/src/services/provider-trace-retention-work.ts
T
2026-11-03 15:40:56 -06:00

43 lines
1.4 KiB
TypeScript

import type { Db } from "@paperclipai/db";
import { providerTraceStore } from "./provider-trace-store.js";
import { DELIVERY_QUEUES } from "./delivery-work-notifications.js";
import { registerDeadlineWork } from "./deadline-work.js";
import type { createDeliveryWorkCoordinator } from "./delivery-work-coordinator.js";
import { registerIdleLocalWorkProbe } from "./idle-local-work.js";
export function registerProviderTraceRetentionWork(
db: Db,
coordinator: ReturnType<typeof createDeliveryWorkCoordinator>,
canRun: () => boolean,
) {
const traces = providerTraceStore(db);
let deadline: number | null | undefined;
const unregister = registerIdleLocalWorkProbe((options = {}) => {
if (deadline === undefined) return "unknown";
if (deadline === null) return "none";
return options.deadlineCapability?.deadlineCatalog === "domain_deadlines_v1" && deadline > Date.now()
? "none" : "present";
});
const worker = registerDeadlineWork(coordinator, DELIVERY_QUEUES.providerTraceRetention, {
canRun,
retryMs: 30_000,
onSettled: () => {
deadline = undefined;
},
run: (signal) =>
signal.aborted ? Promise.resolve() : traces.cleanupExpired(new Date(), signal).then(() => undefined),
next: async () => {
deadline = await traces.nextRetentionDeadline();
return deadline;
},
});
return {
...worker,
stop: async () => {
unregister();
await worker.stop();
},
};
}