Files
kandev/apps
João Salavisa c534aac355 refactor(backend): split terminal_handler.go into pumps/sessions/messages (#1056)
* refactor(backend): split terminal_handler.go into pumps/sessions/messages

terminal_handler.go was 1,380 lines (1.7x the 800-line cap). Split it into
four sibling files in the same package, by responsibility:

- terminal_handler.go (525 lines): HTTP upgrade, route dispatch, top-level
  handler entries, shell-label resolution.
- terminal_pumps.go (725 lines): wsWriter, bridgeBinaryWebSockets,
  runTerminalBridge / runUserShellBridge and all input/resize/PTY-setup
  helpers. Extracts replayBufferedOutput from setupPtyAccessCommon to keep
  nestif under threshold.
- terminal_sessions.go (133 lines): execution-readiness helpers
  (ensurePassthroughExecutionReady, waitForRemoteExecutionReadyWithTimeout,
  remoteExecutionWithClientReady, shouldUseWorkspaceShell) and related
  timeout constants.
- terminal_messages.go (53 lines): protocol primitives (ResizePayload,
  isResizeCommand, resizeCommandByte, stripTerminalResponses), with a
  top-of-file doc comment describing the binary wire protocol.

Backed off the "typed TerminalMessage envelope" half of the task: the
current protocol is binary, not JSON-enveloped (terminal I/O is raw PTY
bytes; the only JSON is ResizePayload, sent as a binary frame prefixed by
0x01). Wrapping PTY bytes in a JSON envelope would require base64 and
break xterm.js AttachAddon for every client — the task brief explicitly
authorizes shipping just the file split when the format would change.

Adds terminal_messages_test.go pinning the wire format: exact JSON output
of ResizePayload, the 0x01-prefix detection, and a full resize-frame
round-trip. These fail loudly on any accidental change to the struct tags
or prefix byte.

Pure relocation otherwise: no signature changes, no behavior changes, no
frontend impact.

* refactor(backend): simplify detectInputSubmission with bytes.ContainsAny

Addresses Claude bot's PR review on #1056: replace the manual loop +
flag pattern with bytes.ContainsAny(data, "\n\r"). Behavior identical
(detect CR or LF anywhere in the input). Also drops the now-redundant
"Check for Enter key (CR or LF)" comment.

* ci: retrigger CI to re-test known-flaky session-resume spec

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
2026-05-29 00:31:27 +01:00
..