import type { Kysely } from "kysely"; import { dropTables, execDdl, oneOf } from "../src/migration-helpers.ts"; // @umt/tasks 的三张自有表并入统一迁移(W1 审查 S2;原 packages/tasks/migrations/0001_tasks_tables)。 // 表结构与原迁移一致,tasks 包通过注入的 Kysely 访问: // - tasks_run_meta:引擎 run 的业务侧元数据(traceId/优先级/取消标志),取消标志是 abortSignal 的来源 // - tasks_fact:signal 之前先落库的事实;waitForFact 以它为准,信号只用来加速唤醒 // - tasks_op_ledger:操作账本(fencing),记录 attempt_token,旧 attempt 的提交会被拒绝 // 用 if not exists:W1 期间用 migrateTasksTables 建过表的库可以直接接管;顺手删掉旧的独立迁移记录表。 // biome-ignore lint/suspicious/noExplicitAny: 迁移不依赖应用表类型 export async function up(db: Kysely): Promise { await execDdl( db, ` create table if not exists tasks_run_meta ( run_id text primary key, task_name text not null, task_version integer not null, idempotency_key text not null, trace_id text, priority integer not null default 0, cancel_requested_at timestamptz, cancel_reason text, created_at timestamptz not null default now() ); create index if not exists tasks_run_meta_task_idx on tasks_run_meta (task_name, created_at); create table if not exists tasks_fact ( id bigserial primary key, run_id text not null, name text not null, payload jsonb, created_at timestamptz not null default now() ); create index if not exists tasks_fact_run_name_idx on tasks_fact (run_id, name, id); create table if not exists tasks_op_ledger ( op_key text primary key, run_id text, attempt_token uuid not null, attempts integer not null default 1, status text not null ${oneOf("status", ["started", "succeeded"])}, result jsonb, last_error text, started_at timestamptz not null default now(), completed_at timestamptz ); do $$ begin execute format('drop table if exists %I.tasks_migration, %I.tasks_migration_lock', current_schema(), current_schema()); end $$; `, ); } // biome-ignore lint/suspicious/noExplicitAny: 同上 export async function down(db: Kysely): Promise { await execDdl(db, dropTables(["tasks_op_ledger", "tasks_fact", "tasks_run_meta"])); }