fix(api): WS index frames accept both camelCase and snake_case keys (Electron toSnakeCase compat)

This commit is contained in:
Roberto
2026-05-13 08:58:46 +02:00
parent 12e203e63d
commit cc0e258e8c

View File

@@ -598,9 +598,9 @@ async def _handle_index_session_start(
frame: dict,
) -> None:
"""Register a new folder index session. No response sent — client is declaring intent."""
session_id: str = frame.get("sessionId") or frame.get("session_id", "")
session_id: str = frame.get("sessionId") or frame.get("session_id") or ""
project_id: str | None = frame.get("projectId") or frame.get("project_id")
total: int = int(frame.get("totalFiles", 0))
total: int = int(frame.get("totalFiles") or frame.get("total_files") or 0)
if not session_id:
logger.warning("device_ws: index_session_start missing sessionId user=%s", user_id)
@@ -624,7 +624,7 @@ async def _handle_index_session_cancel(
frame: dict,
) -> None:
"""Mark a session as cancelled and emit index_session_done(cancelled)."""
session_id: str = frame.get("sessionId") or frame.get("session_id", "")
session_id: str = frame.get("sessionId") or frame.get("session_id") or ""
session = _index_sessions.get(session_id)
if session:
session["cancelled"] = True
@@ -654,7 +654,7 @@ async def _handle_index_file_batch(
from app.billing.tier_manager import tier_manager # noqa: PLC0415
from app.billing.quota import add_token_usage # noqa: PLC0415
session_id: str = frame.get("sessionId") or frame.get("session_id", "")
session_id: str = frame.get("sessionId") or frame.get("session_id") or ""
files: list[dict] = frame.get("files", [])
session = _index_sessions.get(session_id)
@@ -670,11 +670,12 @@ async def _handle_index_file_batch(
if session.get("cancelled"):
return
rel_path: str = file_info.get("relPath", "")
kind: str = file_info.get("kind", "text")
content: str = file_info.get("content", "")
ext: str = file_info.get("ext", "")
mime: str = file_info.get("mime", "application/octet-stream")
# Electron's toSnakeCase converts payload keys, so accept both forms.
rel_path: str = file_info.get("relPath") or file_info.get("rel_path") or ""
kind: str = file_info.get("kind") or "text"
content: str = file_info.get("content") or ""
ext: str = file_info.get("ext") or ""
mime: str = file_info.get("mime") or "application/octet-stream"
name: str = rel_path.split("/")[-1] or rel_path
try: