待审队列
- {rows}
#!/usr/bin/env python3 """人审工作台:只读 muse.db,写面仅 reviews / revisions / adopt。""" from __future__ import annotations import json import sys from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path from urllib.parse import parse_qs, urlparse PROJECT_ROOT = next( parent for parent in (Path(__file__).resolve().parent, *Path(__file__).resolve().parents) if (parent / "AGENTS.md").is_file() and (parent / ".git").exists() ) if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from muse.flow.adopt import adopt_candidate # noqa: E402 from muse.store import add_review, connect, default_db_path # noqa: E402 WRITE_ACTIONS = frozenset({"reviews", "revisions", "adopt"}) def _db(): return connect(default_db_path()) def queue_payload() -> list[dict]: with _db() as conn: rows = conn.execute( "SELECT id, kind, created_at, output_text FROM runs ORDER BY created_at DESC LIMIT 50" ).fetchall() return [dict(row) for row in rows] def adopt(run_id: str, reviewer: str, reason: str) -> int: """采纳必须调用 muse.flow,不在 web 层直接写 reviews。""" return adopt_candidate(run_id, reviewer, reason) def revise(run_id: str, reviewer: str, reason: str, before_text: str, after_text: str) -> int: return add_review( run_id=run_id, target="candidate", action="revise", reviewer=reviewer, reason=reason, before_text=before_text, after_text=after_text, ) class Handler(BaseHTTPRequestHandler): def _send(self, code: int, body: str, content_type: str = "text/html; charset=utf-8") -> None: data = body.encode("utf-8") self.send_response(code) self.send_header("Content-Type", content_type) self.send_header("Content-Length", str(len(data))) self.end_headers() self.wfile.write(data) def do_GET(self) -> None: # noqa: N802 parsed = urlparse(self.path) if parsed.path in {"/", "/queue"}: items = queue_payload() rows = "".join( f"