tasks_run_meta/tasks_fact/tasks_op_ledger move into packages/db (if not exists, old tasks_migration tables dropped); packages/tasks/migrations and migrateTasksTables removed, tests migrate their schema with @umt/db. agent_run_event(run_id, seq, type, at, payload) with (run_id, seq) primary key; types regenerated, db-sync covers it. Co-Authored-By: Claude Opus 5.5 <[email protected]>
61 lines
2.3 KiB
TypeScript
61 lines
2.3 KiB
TypeScript
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<any>): Promise<void> {
|
|
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<any>): Promise<void> {
|
|
await execDdl(db, dropTables(["tasks_op_ledger", "tasks_fact", "tasks_run_meta"]));
|
|
}
|