Repository navigation
OPE-276 Show structured session errors - #354
Conversation
OPE-276 Errors: decode and show structured OpenCode errors (session, message, tool, HTTP)
When a run fails, both apps show at most a one-line message, usually in a snackbar. They drop the server's error type, HTTP status and provider body. Read-only check on Oct 9 of upstream Follows OPE-272, which had "Show the provider body in session errors" as one item. Upstream error model (v2)
Where the error appears:
HTTP errors (
v1 (
How upstream clients show errors:
App todayDTOs:
History projection (Android
Live events (Android
HTTP errors:
To do
Open questions
|
|
@cursor review |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 3 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 56e5b06. Configure here.
Evidence from the unit fixturesNo device or Paparazzi capture. Failure stays beside the reply. Assistant text
Caption actions.
Retry card.
HTTP tags.
Tool. iOS locks the same cases in |
|
Paparazzi renders of the production failure composables on the OpenCode theme: The "Provider response" heading is test chrome. The sheet itself is the existing bottom sheet; the snapshot is the body that sheet shows. Light: Dark: Fixture mapping is in the earlier comment: #354 (comment) Recorded with |
|
Composer status frames of the failure composables. Each failed reply is a quiet mark: a dot and the caption. Permission rejected stays neutral. The provider body keeps Copy. The row at the bottom is the composer status: "Slow down", "attempt 2, retrying in 12s", and Upgrade. In the app that row sits on the composer. Compact, Pick a model, and Copy open from the sheet when the mark is tapped. Earlier frames showed caption buttons. These replace them. Light Dark |
Show reconnect, pick-a-model, compact, and copy on the failure caption. Rate-limit and quota use a countdown card with the retry action link. A busy session queues one follow-up send.
Point screenshot component symlinks at chrome and input, and compile layout plus the failure composables. A screenshot-only diagnostic stub keeps the theme off the real logger.
A provider auth failure keeps its caption. The app has no in-app reconnect, so that button is gone.
A partial live info no longer drops a REST-seeded failure caption. A compaction error with no row still toasts, and a later ended update clears the old caption.
5a864ed to
c0a9668
Compare







Summary
statusandresponse.body) and keep the failure visible beside assistant text on Android and iOS.permission.rejectedstays neutral. The provider body stays in the detail sheet titled "Provider response". Abort and interrupt stay silent.outcome: failed) so they survive reload. A live failure that already has a timeline row does not also raise the snackbar.atanderror.message. The home-list label staysRetrying · N. The reason appears on the in-chat working label.provider.authfailure keeps the mark and has no button, because there is no in-app reconnect.SessionStatus.retry.actionlabel. A link opens in the browser. Tapping the status opens the provider response when a body exists. While that countdown is showing, the transcript mark stays hidden. Content-filter hides the status. Compaction failures sit on the compaction card.SessionBusyError("Session is busy") queues one follow-up resend. Active session status keeps retry attempt, next time, message, error type, and action label/link.Checks
:app:testDebugUnitTestforSessionFailureTest,MessageDomainAdapterTest,SessionDomainAdapterTest,EventDomainAdapterTest, andV2LiveTurnTimelineTest(181 tests, succeeded).SessionFailureTests,MessageDomainAdapterTests,EventDomainAdapterTests,V2LiveTurnTimelineTests,SessionStatusLiveStoreTests, andDefaultSessionCacheTests(197 tests, succeeded).SessionFailureTestandMessageDomainAdapterTestsucceeded, and iOSSessionFailureTestsplusMessageDomainAdapterTests(68 tests) succeeded.SessionFailureTest,SessionFailureDetailTargetTest, andMessageDomainAdapterTestsucceeded. iOSSessionFailureTests,SessionFailureDetailTargetTests,MessageDomainAdapterTests, andV2LiveTurnTimelineTests(95 tests) succeeded.Linear
Risks / Follow-ups
Retrying · N.nextand the action again. The session cache stores the attempt only.session.next.*aliases stay in the event adapter.