openclaw/src/tasks/task-registry.store.ts

95 lines
2.9 KiB
TypeScript

import {
closeTaskRegistrySqliteStore,
deleteTaskAndDeliveryStateFromSqlite,
deleteTaskDeliveryStateFromSqlite,
deleteTaskRegistryRecordFromSqlite,
loadTaskRegistryStateFromSqlite,
saveTaskRegistryStateToSqlite,
upsertTaskWithDeliveryStateToSqlite,
upsertTaskDeliveryStateToSqlite,
upsertTaskRegistryRecordToSqlite,
} from "./task-registry.store.sqlite.js";
import type { TaskDeliveryState, TaskRecord } from "./task-registry.types.js";
export type TaskRegistryStoreSnapshot = {
tasks: Map<string, TaskRecord>;
deliveryStates: Map<string, TaskDeliveryState>;
};
export type TaskRegistryStore = {
loadSnapshot: () => TaskRegistryStoreSnapshot;
saveSnapshot: (snapshot: TaskRegistryStoreSnapshot) => void;
upsertTaskWithDeliveryState?: (params: {
task: TaskRecord;
deliveryState?: TaskDeliveryState;
}) => void;
upsertTask?: (task: TaskRecord) => void;
deleteTaskWithDeliveryState?: (taskId: string) => void;
deleteTask?: (taskId: string) => void;
upsertDeliveryState?: (state: TaskDeliveryState) => void;
deleteDeliveryState?: (taskId: string) => void;
close?: () => void;
};
export type TaskRegistryHookEvent =
| {
kind: "restored";
tasks: TaskRecord[];
}
| {
kind: "upserted";
task: TaskRecord;
previous?: TaskRecord;
}
| {
kind: "deleted";
taskId: string;
previous: TaskRecord;
};
export type TaskRegistryHooks = {
// Hooks are incremental/observational. Snapshot persistence belongs to TaskRegistryStore.
onEvent?: (event: TaskRegistryHookEvent) => void;
};
const defaultTaskRegistryStore: TaskRegistryStore = {
loadSnapshot: loadTaskRegistryStateFromSqlite,
saveSnapshot: saveTaskRegistryStateToSqlite,
upsertTaskWithDeliveryState: upsertTaskWithDeliveryStateToSqlite,
upsertTask: upsertTaskRegistryRecordToSqlite,
deleteTaskWithDeliveryState: deleteTaskAndDeliveryStateFromSqlite,
deleteTask: deleteTaskRegistryRecordFromSqlite,
upsertDeliveryState: upsertTaskDeliveryStateToSqlite,
deleteDeliveryState: deleteTaskDeliveryStateFromSqlite,
close: closeTaskRegistrySqliteStore,
};
let configuredTaskRegistryStore: TaskRegistryStore = defaultTaskRegistryStore;
let configuredTaskRegistryHooks: TaskRegistryHooks | null = null;
export function getTaskRegistryStore(): TaskRegistryStore {
return configuredTaskRegistryStore;
}
export function getTaskRegistryHooks(): TaskRegistryHooks | null {
return configuredTaskRegistryHooks;
}
export function configureTaskRegistryRuntime(params: {
store?: TaskRegistryStore;
hooks?: TaskRegistryHooks | null;
}) {
if (params.store) {
configuredTaskRegistryStore = params.store;
}
if ("hooks" in params) {
configuredTaskRegistryHooks = params.hooks ?? null;
}
}
export function resetTaskRegistryRuntimeForTests() {
configuredTaskRegistryStore.close?.();
configuredTaskRegistryStore = defaultTaskRegistryStore;
configuredTaskRegistryHooks = null;
}