rowboat/apps/x
Ramnique Singh c81d3cb27b surface silent runtime failures as error events
AgentRuntime.trigger() wrapped its body in try/finally with no outer
catch. An inner catch around the streamAgent for-await only handled
AbortError and rethrew everything else. Call sites fire-and-forget
trigger (runs.ts:26,60,72), so any thrown error became an unhandled
promise rejection. The finally still ran and published
run-processing-end, but nothing told the renderer why — the chat
showed the spinner, then an empty assistant bubble.

Provider misconfig, invalid API keys, unknown model ids, streamText
setup throws, runsRepo.fetch or loadAgent failing, and provider
auth/rate-limit rejections on the first chunk all hit this path on a
first message. All invisible.

Add a top-level catch that formats the error to a string and emits a
{type: "error"} RunEvent via the existing runsRepo/bus path. The
renderer already renders those as a chat bubble plus toast
(App.tsx:2069) — no UI work needed.

No changes to the abort path: user-initiated stops still flow through
the existing inner catch and the signal.aborted branch that emits
run-stopped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 14:36:00 +05:30
..
apps fix: duplicate navigation button 2026-04-21 13:02:44 +05:30
packages surface silent runtime failures as error events 2026-04-21 14:36:00 +05:30
.gitignore bootstrap new electron app 2026-01-16 12:05:33 +05:30
eslint.config.mts ignore renderer eslint 2026-01-16 12:05:33 +05:30
package.json integrate electron forge 2026-01-17 10:28:44 +05:30
pnpm-lock.yaml render tables in markdown 2026-04-20 10:43:27 +05:30
pnpm-workspace.yaml fix pnpm postinstall 2026-01-21 10:47:44 +05:30
TRACKS.md Add tracks — auto-updating note blocks with scheduled and event-driven triggers 2026-04-14 13:51:45 +05:30
tsconfig.base.json bootstrap new electron app 2026-01-16 12:05:33 +05:30