Problem
SshPromptDialog treats every resolved ssh.prompt.respond call as success.
src/browser/components/SshPromptDialog/SshPromptDialog.tsx:101-103 awaits api.ssh.prompt.respond(...), then removes the prompt from the queue.
respond returns Result<void, string> (src/common/orpc/schemas/api.ts ~3546). A { success: false, error } reply still dismisses the prompt. No error is shown and no retry is offered. Only a thrown error keeps the prompt (the catch at ~:104).
The old test double returned void, which hid this. It surfaced while typing the double in the createTestApiClient migration (#4625 stack).
Repro
In SshPromptDialog.test.tsx, make respond resolve { success: false, error: "expired" }, then click Reject. The dialog closes. Expected: it stays open with the error, so the user can retry.
Generated with xum • Model: anthropic:claude-opus-5-5 • Thinking: high • Cost: $86.18
Problem
SshPromptDialogtreats every resolvedssh.prompt.respondcall as success.src/browser/components/SshPromptDialog/SshPromptDialog.tsx:101-103awaitsapi.ssh.prompt.respond(...), then removes the prompt from the queue.respondreturnsResult<void, string>(src/common/orpc/schemas/api.ts~3546). A{ success: false, error }reply still dismisses the prompt. No error is shown and no retry is offered. Only a thrown error keeps the prompt (thecatchat ~:104).The old test double returned
void, which hid this. It surfaced while typing the double in thecreateTestApiClientmigration (#4625 stack).Repro
In
SshPromptDialog.test.tsx, makerespondresolve{ success: false, error: "expired" }, then click Reject. The dialog closes. Expected: it stays open with the error, so the user can retry.Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:high• Cost:$86.18