feat(operations): מסך "סוכנים פעילים" + ניהול ריצות (live-runs/log/cancel) (G12/X15, #119) #185
Reference in New Issue
Block a user
Delete Branch "worktree-agent-live-ops"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
מה ולמה
פאנל חדש ב-/operations → "סוכנים פעילים" שמראה אילו סוכני Paperclip עובדים כעת (רצים+בתור), הפלט החי שלהם, ושליטה מבוקרת: עצירת ריצה ואיפוס session.
סוגר נקודה-עיוורת אמיתית: drain מונע-סוכן (למשל ריקון תור ההלכות ע"י ה-CEO heartbeat) הוא לא שירות pm2 ולא קשור-לתיק, ולכן לא מופיע כתהליך ניתן-לשליטה ב-/operations (רק המונה זז); והפלט הגולמי נגיש היום רק ב-Paperclip UI.
מקור-נתונים — Paperclip heartbeat-runs API (אומת חי מול localhost:3100)
GET /api/companies/{cid}/live-runsGET /api/heartbeat-runs/{id}/logGET /api/heartbeat-runs/{id}/eventsPOST /api/heartbeat-runs/{id}/cancelPOST /api/agents/{id}/runtime-state/reset-sessionשינויים
Backend (דרך השער בלבד):
web/paperclip_client.py(shell):list_live_runs/get_run_log/get_run_events/cancel_run/reset_agent_sessionweb/agent_platform_port.py: re-exportpc_list_live_runs/pc_get_run_log/pc_get_run_events/pc_cancel_run/pc_reset_agent_sessionweb/app.py:GET /api/operations/agents(אגרגציה CMP+CMPA, עמיד לכשל-חברה) +…/runs/{id}/log+…/runs/{id}/events+POST …/runs/{id}/cancel+POST …/agents/{id}/reset-sessionFrontend:
/operations(polling 4s) + dialog ללוג חי (פרסור NDJSON→טקסט קריא) + כפתורי עצור/אפסoperations.tsInvariants (פרוטוקול כתיבת-קוד)
agent_platform_port.pyבלבד.scripts/leak_guard.pyעובר (seam שלם). אסור kill ישיר עלprocess_pid— עוקף את השער + את ה-watchdog/checkpoint.npm run api:typesיורץ אחרי deploy (נשען עלopenapi.jsonהחי).בטיחות
cancelעל דריינר ההלכות בטוח — החילוץ checkpointed per-chunk + resumable + self-heal לשורותprocessing; עצירה מאבדת לכל היותר chunk אחד.בדיקות
python -m py_compile✓ (שלושת קבצי ה-backend)scripts/leak_guard.py✓ (G12 שלם)tsc --noEmit✓ · eslint על הקבצים שנגעו ✓TaskMaster: legal-ai #119
🤖 Generated with Claude Code
פאנל ב-/operations שמראה אילו סוכני Paperclip עובדים כעת (רצים+בתור), הפלט החי שלהם, ושליטה מבוקרת: עצירת ריצה, איפוס session. סוגר את הנקודה-העיוורת שבה drain מונע-סוכן (למשל ריקון תור הלכות ע"י ה-CEO heartbeat) עוקף את בקרת /operations שמכירה רק שירותי pm2, והפלט הגולמי נגיש רק ב-Paperclip UI. מקור-נתונים: Paperclip heartbeat-runs API (אומת חי): GET /api/companies/{cid}/live-runs — רצים+בתור (agentName/status/issue/outputSilence) GET /api/heartbeat-runs/{id}/log — NDJSON של פלט הסוכן GET /api/heartbeat-runs/{id}/events — timeline POST /api/heartbeat-runs/{id}/cancel — עצירה מבוקרת (לא kill — מכבד watchdog+checkpoint) POST /api/agents/{id}/runtime-state/reset-session ארכיטקטורה (G12/INV-PORT1): כל המגע החדש עם Paperclip דרך השער בלבד — web/paperclip_client.py (shell) → re-export ב-web/agent_platform_port.py → web/app.py צורך מהשער. leak_guard.py עובר (seam שלם). אסור kill ישיר על process_pid (עוקף את השער). Backend: - paperclip_client: list_live_runs / get_run_log / get_run_events / cancel_run / reset_agent_session - agent_platform_port: re-export pc_list_live_runs / pc_get_run_log / pc_get_run_events / pc_cancel_run / pc_reset_agent_session - app.py: GET /api/operations/agents (אגרגציה CMP+CMPA, עמיד לכשל-חברה), GET .../runs/{id}/log, GET .../runs/{id}/events, POST .../runs/{id}/cancel, POST .../agents/{id}/reset-session Frontend: פאנל "סוכנים פעילים" ב-/operations (polling 4s) + dialog ללוג חי (פרסור NDJSON→טקסט קריא) + כפתורי עצור/אפס. הוספת hooks ל-operations.ts. בטיחות: cancel על דריינר הלכות בטוח — חילוץ checkpointed per-chunk + resumable + self-heal לשורות processing. Invariants: מקיים G12/INV-PORT1 (שער-הפלטפורמה). נוגע X6 (UI↔API). api:types יורץ אחרי deploy (openapi.json חי). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>