From 84b59567b14a498d91842bc7da5b03fa5c8c0682 Mon Sep 17 00:00:00 2001 From: arkon Date: Tue, 9 Jun 2026 00:50:34 +0200 Subject: [PATCH] fix(sse): sync frontend SSE_EVENTS registry with backend Add the 30 SSE event constants that existed in the backend src/web/sse-events.ts but were missing from the frontend SSE_EVENTS object in constants.js, bringing both registries to an exact 120-event match: - Session lifecycle: autoCompact, message, interactive, running - Session: Plan (new): planTaskUpdate, planCheckpoint, planRollback, planTaskAdded - Respawn: cycleCompleted, stepSent, stepCompleted, aiCheck* (4), planCheck* (3), log, configUpdated - Scheduled: log, deleted - Teams (new): created, updated, removed, taskUpdated - Transcript (new): complete, plan_mode, tool_start, tool_end Purely additive registry constants (none were referenced by raw string in the frontend, so no behavior changes). Also refresh the now-accurate event-count JSDoc on both files, and fix the files() route handler count in CLAUDE.md (5 -> 6). Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 2 +- src/web/public/constants.js | 42 ++++++++++++++++++++++++++++++++++--- src/web/sse-events.ts | 8 ++++--- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 4fcc71ca..618ce37e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -199,7 +199,7 @@ Frontend JS modules have `@fileoverview` with `@dependency`/`@loadorder` tags. L ### API Routes -~130 handlers across 15 route files in `src/web/routes/`: system (37, incl. `POST /api/system/span-displays` → spawns `scripts/span-codeman.sh`), sessions (28), orchestrator (10), cases (9), ralph (9), plan (8), respawn (7), files (5), mux (5), push (4), scheduled (4), teams (2), hooks (1), clipboard (1), ws (1 WebSocket). Each file has `@fileoverview` with endpoint details. +~130 handlers across 15 route files in `src/web/routes/`: system (37, incl. `POST /api/system/span-displays` → spawns `scripts/span-codeman.sh`), sessions (28), orchestrator (10), cases (9), ralph (9), plan (8), respawn (7), files (6), mux (5), push (4), scheduled (4), teams (2), hooks (1), clipboard (1), ws (1 WebSocket). Each file has `@fileoverview` with endpoint details. ## Adding Features diff --git a/src/web/public/constants.js b/src/web/public/constants.js index 9375853b..9e5b7723 100644 --- a/src/web/public/constants.js +++ b/src/web/public/constants.js @@ -10,7 +10,7 @@ * @globals {function} scheduleBackground - scheduler.postTask wrapper (background priority) * @globals {function} getEventCoords - Unified mouse/touch coordinate extractor * @globals {function} escapeHtml - XSS-safe HTML escaping - * @globals {object} SSE_EVENTS - Centralized SSE event type constants (~73 event types) + * @globals {object} SSE_EVENTS - Centralized SSE event type constants (120 event types; must match backend src/web/sse-events.ts) * @globals {Array} BUILTIN_RESPAWN_PRESETS - Built-in respawn configuration presets * * @dependency None (first in load order) @@ -241,27 +241,45 @@ const SSE_EVENTS = { SESSION_IDLE: 'session:idle', SESSION_WORKING: 'session:working', SESSION_AUTO_CLEAR: 'session:autoClear', + SESSION_AUTO_COMPACT: 'session:autoCompact', SESSION_CLI_INFO: 'session:cliInfo', + SESSION_MESSAGE: 'session:message', + SESSION_INTERACTIVE: 'session:interactive', + SESSION_RUNNING: 'session:running', // Scheduled runs SCHEDULED_CREATED: 'scheduled:created', SCHEDULED_UPDATED: 'scheduled:updated', SCHEDULED_COMPLETED: 'scheduled:completed', SCHEDULED_STOPPED: 'scheduled:stopped', + SCHEDULED_LOG: 'scheduled:log', + SCHEDULED_DELETED: 'scheduled:deleted', // Respawn RESPAWN_STARTED: 'respawn:started', RESPAWN_STOPPED: 'respawn:stopped', RESPAWN_STATE_CHANGED: 'respawn:stateChanged', RESPAWN_CYCLE_STARTED: 'respawn:cycleStarted', + RESPAWN_CYCLE_COMPLETED: 'respawn:cycleCompleted', RESPAWN_BLOCKED: 'respawn:blocked', - RESPAWN_AUTO_ACCEPT_SENT: 'respawn:autoAcceptSent', + RESPAWN_STEP_SENT: 'respawn:stepSent', + RESPAWN_STEP_COMPLETED: 'respawn:stepCompleted', RESPAWN_DETECTION_UPDATE: 'respawn:detectionUpdate', + RESPAWN_AUTO_ACCEPT_SENT: 'respawn:autoAcceptSent', + RESPAWN_AI_CHECK_STARTED: 'respawn:aiCheckStarted', + RESPAWN_AI_CHECK_COMPLETED: 'respawn:aiCheckCompleted', + RESPAWN_AI_CHECK_FAILED: 'respawn:aiCheckFailed', + RESPAWN_AI_CHECK_COOLDOWN: 'respawn:aiCheckCooldown', + RESPAWN_PLAN_CHECK_STARTED: 'respawn:planCheckStarted', + RESPAWN_PLAN_CHECK_COMPLETED: 'respawn:planCheckCompleted', + RESPAWN_PLAN_CHECK_FAILED: 'respawn:planCheckFailed', RESPAWN_TIMER_STARTED: 'respawn:timerStarted', RESPAWN_TIMER_CANCELLED: 'respawn:timerCancelled', RESPAWN_TIMER_COMPLETED: 'respawn:timerCompleted', - RESPAWN_ERROR: 'respawn:error', RESPAWN_ACTION_LOG: 'respawn:actionLog', + RESPAWN_LOG: 'respawn:log', + RESPAWN_ERROR: 'respawn:error', + RESPAWN_CONFIG_UPDATED: 'respawn:configUpdated', // Tasks TASK_CREATED: 'task:created', @@ -288,6 +306,12 @@ const SSE_EVENTS = { SESSION_BASH_TOOL_END: 'session:bashToolEnd', SESSION_BASH_TOOLS_UPDATE: 'session:bashToolsUpdate', + // Session: Plan + SESSION_PLAN_TASK_UPDATE: 'session:planTaskUpdate', + SESSION_PLAN_CHECKPOINT: 'session:planCheckpoint', + SESSION_PLAN_ROLLBACK: 'session:planRollback', + SESSION_PLAN_TASK_ADDED: 'session:planTaskAdded', + // Hooks (Claude Code hook events) HOOK_IDLE_PROMPT: 'hook:idle_prompt', HOOK_PERMISSION_PROMPT: 'hook:permission_prompt', @@ -338,6 +362,18 @@ const SSE_EVENTS = { ORCHESTRATOR_COMPLETED: 'orchestrator:completed', ORCHESTRATOR_ERROR: 'orchestrator:error', + // Teams (agent teams) + TEAM_CREATED: 'team:created', + TEAM_UPDATED: 'team:updated', + TEAM_REMOVED: 'team:removed', + TEAM_TASK_UPDATED: 'team:taskUpdated', + + // Transcript + TRANSCRIPT_COMPLETE: 'transcript:complete', + TRANSCRIPT_PLAN_MODE: 'transcript:plan_mode', + TRANSCRIPT_TOOL_START: 'transcript:tool_start', + TRANSCRIPT_TOOL_END: 'transcript:tool_end', + // Clipboard CLIPBOARD_WRITE: 'clipboard:write', diff --git a/src/web/sse-events.ts b/src/web/sse-events.ts index b6c8d7a7..3924021c 100644 --- a/src/web/sse-events.ts +++ b/src/web/sse-events.ts @@ -5,7 +5,7 @@ * and referenced by the frontend (`SSE_EVENTS` in `constants.js`). * Both files MUST be kept in sync. * - * ~117 event constants organized by category: + * 120 event constants organized by category: * - **Core** (1): init * - **Session lifecycle** (17): created, updated, deleted, terminal, idle, working, ... * - **Session: Ralph** (6): ralphLoopUpdate, todoUpdate, completionDetected, ... @@ -13,7 +13,7 @@ * - **Session: Plan** (4): planTaskUpdate, planCheckpoint, planRollback, planTaskAdded * - **Tasks** (4): created, completed, failed, updated * - **Mux** (4): created, killed, died, statsUpdated - * - **Respawn** (17): stateChanged, cycleStarted, aiCheck*, timer*, log, ... + * - **Respawn** (24): stateChanged, cycleStarted/Completed, step*, aiCheck*, planCheck*, timer*, log, ... * - **Subagents** (7): discovered, updated, tool_call, tool_result, progress, message, completed * - **Scheduled** (6): created, updated, completed, stopped, log, deleted * - **Teams** (4): created, updated, removed, taskUpdated @@ -22,7 +22,9 @@ * - **Tunnel** (7): started, stopped, progress, error, qrRotated, qrRegenerated, qrAuthUsed * - **Image** (1): detected * - **Hooks** (6): idle_prompt, permission_prompt, elicitation_dialog, stop, teammate_idle, task_completed - * - **Cases** (2): created, linked + * - **Orchestrator** (12): stateChanged, planProgress, planReady, phase*, verification, task*, completed, error + * - **Clipboard** (1): write + * - **Cases** (4): created, linked, deleted, order-changed * * Naming convention: `domain:action` (e.g., `session:created`, `respawn:stateChanged`) *