diff --git a/src/blackboard/operations.py b/src/blackboard/operations.py index 7e29054..671359b 100644 --- a/src/blackboard/operations.py +++ b/src/blackboard/operations.py @@ -616,3 +616,69 @@ class Blackboard: finally: conn.close() + # =================================================================== + # Archive (v2.8) + # =================================================================== + + def archive_task(self, task_id: str) -> bool: + """归档单个任务""" + conn = self._conn() + try: + conn.execute("BEGIN IMMEDIATE") + conn.execute( + "UPDATE tasks SET archived=1, archived_at=datetime('now'), " + "updated_at=datetime('now') WHERE id=?", + (task_id,), + ) + conn.execute( + "INSERT INTO events (task_id, agent, event_type, detail) VALUES (?,?,?,?)", + (task_id, "daemon", "task_archived", + json.dumps({"action": "archive"})), + ) + conn.commit() + return True + finally: + conn.close() + + def unarchive_task(self, task_id: str) -> bool: + """取消归档""" + conn = self._conn() + try: + conn.execute("BEGIN IMMEDIATE") + conn.execute( + "UPDATE tasks SET archived=0, archived_at=NULL, " + "updated_at=datetime('now') WHERE id=?", + (task_id,), + ) + conn.execute( + "INSERT INTO events (task_id, agent, event_type, detail) VALUES (?,?,?,?)", + (task_id, "daemon", "task_unarchived", + json.dumps({"action": "unarchive"})), + ) + conn.commit() + return True + finally: + conn.close() + + def archive_done_tasks(self) -> int: + """一键归档所有 done 状态的任务""" + conn = self._conn() + try: + conn.execute("BEGIN IMMEDIATE") + cursor = conn.execute( + "UPDATE tasks SET archived=1, archived_at=datetime('now'), " + "updated_at=datetime('now') " + "WHERE status='done' AND archived=0" + ) + count = cursor.rowcount + if count > 0: + conn.execute( + "INSERT INTO events (task_id, agent, event_type, detail) VALUES (?,?,?,?)", + (None, "daemon", "task_archived", + json.dumps({"action": "archive_done_batch", "count": count})), + ) + conn.commit() + return count + finally: + conn.close() +