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