[PR #7939] fix: add error handling to RPC system to prevent crashes on session abort #12567

Open
opened 2026-02-16 18:17:28 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/anomalyco/opencode/pull/7939

State: open
Merged: No


What does this PR do?

Fixes a crash that occurs when aborting a session with double-escape. The app would crash with "Unexpected end of JSON input" error.

Fixes #7946

An example of error

error/crash [09:17:24] [LOG] 'bootstrapping'
[09:17:25] [LOG] 'resolveSystemTheme'
[09:17:25] [LOG] '{"type":"home"}'
[09:17:26] [LOG] [
      '#1d1f21', '#cc6666',
      '#b5bd68', '#f0c674',
      '#81a2be', '#b294bb',
      '#8abeb7', '#c5c8c6',
      '#666666', '#d54e53',
      '#b9ca4a', '#e7c547',
      '#7aa6da', '#c397d8',
      '#70c0b1', '#eaeaea'
    ]
[09:17:49] [LOG] 'navigate' { type: 'session', sessionID: 'ses_44eee8c1cffeyYbm3ENuvzhYkm' }
[09:17:49] [LOG] '{"type":"session","sessionID":"ses_44eee8c1cffeyYbm3ENuvzhYkm"}'
[09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/tree-sitter-markdown-411r6y9b.wasm'
[09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/highlights-r812a2qc.scm'
[09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/injections-73j83es3.scm'
[09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/tree-sitter-markdown_inline-j5349f42.wasm'
[09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/highlights-x6tmsnaa.scm'
[09:25:00] [ERROR] Error: Unexpected end of JSON input
    SyntaxError: Unexpected end of JSON input
        at <parse> (:0)
        at json (unknown)
        at <anonymous> (../sdk/js/src/v2/gen/client/client.gen.ts:167:33)
        at processTicksAndRejections (native:7:39) 

Changes:

  • Add try/catch in RPC listener to send error responses back to client instead of leaving promises hanging
  • Handle rpc.error messages in client to reject promises properly
  • Add .catch() to session.abort call to prevent unhandled rejections
  • Return JSON from /session/:sessionID/prompt instead of a streaming response to avoid empty bodies on abort
  • Fire-and-forget /session/:sessionID/prompt_async with a 204 no-content response and server-side error logging

How did you verify your code works?

  1. Started opencode TUI
  2. Started an agent task
  3. Pressed escape twice to abort mid-work
  4. Verified the app no longer crashes with JSON parse errors

Note: I have not rerun the flow after the latest server response adjustments in this environment.

**Original Pull Request:** https://github.com/anomalyco/opencode/pull/7939 **State:** open **Merged:** No --- ### What does this PR do? Fixes a crash that occurs when aborting a session with double-escape. The app would crash with "Unexpected end of JSON input" error. Fixes #7946 An example of error ``` error/crash [09:17:24] [LOG] 'bootstrapping' [09:17:25] [LOG] 'resolveSystemTheme' [09:17:25] [LOG] '{"type":"home"}' [09:17:26] [LOG] [ '#1d1f21', '#cc6666', '#b5bd68', '#f0c674', '#81a2be', '#b294bb', '#8abeb7', '#c5c8c6', '#666666', '#d54e53', '#b9ca4a', '#e7c547', '#7aa6da', '#c397d8', '#70c0b1', '#eaeaea' ] [09:17:49] [LOG] 'navigate' { type: 'session', sessionID: 'ses_44eee8c1cffeyYbm3ENuvzhYkm' } [09:17:49] [LOG] '{"type":"session","sessionID":"ses_44eee8c1cffeyYbm3ENuvzhYkm"}' [09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/tree-sitter-markdown-411r6y9b.wasm' [09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/highlights-r812a2qc.scm' [09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/injections-73j83es3.scm' [09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/tree-sitter-markdown_inline-j5349f42.wasm' [09:17:53] [LOG] 'TSWorker:' 'Loading from local path: /$bunfs/root/highlights-x6tmsnaa.scm' [09:25:00] [ERROR] Error: Unexpected end of JSON input SyntaxError: Unexpected end of JSON input at <parse> (:0) at json (unknown) at <anonymous> (../sdk/js/src/v2/gen/client/client.gen.ts:167:33) at processTicksAndRejections (native:7:39) ``` **Changes:** - Add try/catch in RPC listener to send error responses back to client instead of leaving promises hanging - Handle `rpc.error` messages in client to reject promises properly - Add `.catch()` to `session.abort` call to prevent unhandled rejections - Return JSON from `/session/:sessionID/prompt` instead of a streaming response to avoid empty bodies on abort - Fire-and-forget `/session/:sessionID/prompt_async` with a 204 no-content response and server-side error logging ### How did you verify your code works? 1. Started opencode TUI 2. Started an agent task 3. Pressed escape twice to abort mid-work 4. Verified the app no longer crashes with JSON parse errors Note: I have not rerun the flow after the latest server response adjustments in this environment.
yindo added the pull-request label 2026-02-16 18:17:28 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: anomalyco/opencode#12567