feat: add Clear History button to delete all consumed instructions

- Backend: instruction_service.clear_consumed() bulk-deletes consumed rows
- Backend: DELETE /api/instructions/consumed route (preserves pending)
- Frontend: Clear button in consumed panel header (hidden when empty)
- Frontend: SSE handler for history.cleared event - instant UI update
- Frontend: api.clearConsumed() fetch wrapper
This commit is contained in:
2026-03-27 04:16:24 +08:00
parent 86eba27a24
commit 256a445e2f
6 changed files with 57 additions and 7 deletions

View File

@@ -57,6 +57,14 @@ def update_instruction(instruction_id: str, body: UpdateInstructionRequest):
return InstructionCreateResponse(item=item)
@router.delete("/consumed", status_code=200)
def clear_consumed_instructions():
"""Delete all consumed instructions. Pending instructions are never affected."""
count = instruction_service.clear_consumed()
event_service.broadcast("history.cleared", {"count": count})
return {"cleared": count}
@router.delete("/{instruction_id}", status_code=204)
def delete_instruction(instruction_id: str):
try:

View File

@@ -168,6 +168,19 @@ def delete_instruction(instruction_id: str) -> None:
logger.info("Instruction deleted id=%s", instruction_id)
def clear_consumed() -> int:
"""Delete all consumed instructions. Returns the number of rows deleted."""
with get_write_conn() as conn:
row = conn.execute(
"SELECT COUNT(*) FROM instructions WHERE status = 'consumed'"
).fetchone()
count = row[0] if row else 0
conn.execute("DELETE FROM instructions WHERE status = 'consumed'")
logger.info("Consumed instructions cleared count=%d", count)
return count
def consume_next(agent_id: str = "unknown") -> Optional[InstructionItem]:
"""
Atomically claim and return the next pending instruction.