Repository navigation
Conversation
|
🤖 Hermes-Relay automated PR intake Thanks for opening this focused Android interrupt-reason display fix! Intake evidence looks solid: the PR targets Nothing else is missing for intake. The outstanding device proof is already stated, so no extra checklist item is needed before review. A maintainer will review the mapping change and decide whether the stated missing on-device proof should be collected before merge. |
Device proof (on-device)
This is not a bare |
0145d2c to
8ab6831
Compare
8ab6831 to
4b38854
Compare
…rrupted Map server content/error/turn_exit_reason into the chat error path so Hermes Relay never replaces a cancelled turn with a reasonless label.
4b38854 to
70f8d47
Compare
|
Rebased onto current Interrupt-reason display (no bare Response/Run interrupted) is still independent of the quiet-turn ownership work. Android + contract checks re-running. Ready for review when CI is green. |
Empty interrupted turns (hard stop, timeout, client-gone) no longer settle as silence or bare "Operation interrupted." Host fills a reasoned final line; gateway/API/TUI complete payloads carry error+text; Desktop paints a non-retryable stop notice instead of a blank chat. System lifecycle stops pass distinct tool_reason so they are not mislabeled as user Stop. Related: NousResearch#84207, Codename-11/hermes-relay#634

Summary
When a Gateway/API turn is cancelled, Android Chat often showed a bare Response interrupted or Run interrupted label even if the host already sent a reason (
content,error,interrupt_reason, orturn_exit_reason). This PR prefers any non-placeholder server text for the user-visible error path.Related (hermes-agent — server delivery of interrupt reasons):
Full end-to-end “always an explanation” still depends on the host emitting a reason (agent fix above or equivalent). This client change is defensive: when a reason is present it is shown; when absent, existing bare fallbacks remain.
Changes
SessionEventPayload.resolveInterruptMessage()(and bare-placeholder detection) prioritizinginterrupt_reason/error/ content fields, then a humanizedturn_exit_reason.GatewayEventMapper,ChatHandler) and API run streams (HermesApiClient).InterruptReasonResolveTest.Verification
./gradlew :app:testSideloadDebugUnitTest --tests com.hermesandroid.relay.network.upstream.models.InterruptReasonResolveTest— BUILD SUCCESSFUL (focused class green; full sideload unit test task also completed successfully on this branch).Screenshots
Device proof (OnePlus CPH2653 / Hermes Relay sideload). Cancelled turn shows:
Plus the standard recovery banner (“Hermes couldn’t complete this response” with Details / Retry / Dismiss). No layout redesign — copy only.
(Image attached in the following PR comment.)
Compatibility / risk
Lineage / contributor credit
Checklist
dev, unless this is adev→mainrelease PR or a focused production-tag hotfix PR tomainCHANGELOG.mdis updated for user-visible changes, or N/A is listed above