diff --git a/src/blackboard/db.py b/src/blackboard/db.py index 2d9edd6..e1b9ab3 100644 --- a/src/blackboard/db.py +++ b/src/blackboard/db.py @@ -48,7 +48,7 @@ def _migrate_v27(conn: sqlite3.Connection) -> None: def _migrate_v28(conn: sqlite3.Connection) -> None: - """v2.8 数据迁移:3 新状态 + 归档字段 + CHECK 约束更新""" + """v2.8 数据迁移:3 新状态 + 归档字段 + CHECK 约束更新 + checkpoints 表""" # 1. 添加归档字段 _safe_add_column(conn, "tasks", "archived", "INTEGER DEFAULT 0") _safe_add_column(conn, "tasks", "archived_at", "TEXT") @@ -104,6 +104,29 @@ def _migrate_v28(conn: sqlite3.Connection) -> None: CREATE INDEX IF NOT EXISTS idx_tasks_current_agent ON tasks(current_agent); """) + # 3. checkpoints 表(M3) + conn.execute("""CREATE TABLE IF NOT EXISTS checkpoints ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL REFERENCES tasks(id), + type TEXT NOT NULL CHECK (type IN ('verify', 'decision', 'action')), + title TEXT NOT NULL, + description TEXT, + status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected')), + payload TEXT NOT NULL, + created_at TEXT NOT NULL DEFAULT (datetime('now')), + resolved_at TEXT, + resolved_by TEXT, + resolve_note TEXT + )""") + conn.execute("CREATE INDEX IF NOT EXISTS idx_checkpoints_task ON checkpoints(task_id)") + conn.execute("CREATE INDEX IF NOT EXISTS idx_checkpoints_status ON checkpoints(status)") + + # 4. outputs 扩展字段(M3 成果物) + _safe_add_column(conn, "outputs", "file_name", "TEXT") + _safe_add_column(conn, "outputs", "file_size", "INTEGER") + _safe_add_column(conn, "outputs", "file_path", "TEXT") + _safe_add_column(conn, "outputs", "mime_type", "TEXT") + def _safe_add_column(conn: sqlite3.Connection, table: str, column: str, col_type: str) -> None: