Yash030/claude-code-proxy
2
1"""CLI event handling for a single queued node (transcript + session + errors)."""2 3from __future__ import annotations4 5from collections.abc import Awaitable, Callable6from typing import Any7 8from loguru import logger9 10from .cli_event_constants import TRANSCRIPT_EVENT_TYPES, get_status_for_event11from .platforms.base import SessionManagerInterface12from .safe_diagnostics import text_len_hint13from .session import SessionStore14from .transcript import TranscriptBuffer15from .trees.queue_manager import MessageState, MessageTree16 17 18async def handle_session_info_event(19 event_data: dict[str, Any],20 tree: MessageTree | None,21 node_id: str,22 captured_session_id: str | None,23 temp_session_id: str | None,24 *,25 cli_manager: SessionManagerInterface,26 session_store: SessionStore,27) -> tuple[str | None, str | None]:28 """Handle session_info event; return updated (captured_session_id, temp_session_id)."""29 if event_data.get("type") != "session_info":30 return captured_session_id, temp_session_id31 32 real_session_id = event_data.get("session_id")33 if not real_session_id or not temp_session_id:34 return captured_session_id, temp_session_id35 36 await cli_manager.register_real_session_id(temp_session_id, real_session_id)37 if tree and real_session_id:38 await tree.update_state(39 node_id,40 MessageState.IN_PROGRESS,41 session_id=real_session_id,42 )43 session_store.save_tree(tree.root_id, tree.to_dict())44 45 return real_session_id, None46 47 48async def process_parsed_cli_event(49 parsed: dict[str, Any],50 transcript: TranscriptBuffer,51 update_ui: Callable[..., Awaitable[None]],52 last_status: str | None,53 had_transcript_events: bool,54 tree: MessageTree | None,55 node_id: str,56 captured_session_id: str | None,57 *,58 session_store: SessionStore,59 format_status: Callable[..., str],60 propagate_error_to_children: Callable[[str, str, str], Awaitable[None]],61 log_messaging_error_details: bool = False,62) -> tuple[str | None, bool]:63 """Process a single parsed CLI event. Returns (last_status, had_transcript_events)."""64 ptype = parsed.get("type") or ""65 66 if ptype in TRANSCRIPT_EVENT_TYPES:67 transcript.apply(parsed)68 had_transcript_events = True69 70 status = get_status_for_event(ptype, parsed, format_status)71 if status is not None:72 await update_ui(status)73 last_status = status74 elif ptype == "block_stop":75 await update_ui(last_status, force=True)76 elif ptype == "complete":77 if not had_transcript_events:78 transcript.apply({"type": "text_chunk", "text": "Done."})79 logger.info("HANDLER: Task complete, updating UI")80 await update_ui(format_status("✅", "Complete"), force=True)81 if tree and captured_session_id:82 await tree.update_state(83 node_id,84 MessageState.COMPLETED,85 session_id=captured_session_id,86 )87 session_store.save_tree(tree.root_id, tree.to_dict())88 elif ptype == "error":89 error_msg = parsed.get("message", "Unknown error")90 if log_messaging_error_details:91 logger.error("HANDLER: Error event received: {}", error_msg)92 else:93 em = error_msg if isinstance(error_msg, str) else str(error_msg)94 logger.error(95 "HANDLER: Error event received: message_chars={}",96 text_len_hint(em),97 )98 logger.info("HANDLER: Updating UI with error status")99 await update_ui(format_status("❌", "Error"), force=True)100 if tree:101 await propagate_error_to_children(node_id, error_msg, "Parent task failed")102 103 return last_status, had_transcript_events104 