release(android): android-v1.2.2 - #122
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The repo is public and distributed; several files leaked real server identifiers. Replace them with generic placeholders across docs, scripts, source, and test fixtures: - real LAN IP 172.16.24.250 -> 192.168.1.100 (blessed example) - real Tailscale IP 100.71.8.56 -> 100.64.0.1 - real hostname docker-server / tail6f460 tailnet -> hermes-host(.tailnet.ts.net) - ssh user@host targets -> you@hermes-host - server home path /home/bailey/ -> $HOME/ - custom voice id -> <your-voice-id> Test fixtures changed on both input and assertion sides so suites stay green (plugin.tests.test_pairing_mint_schema + test_voice_routes pass; Kotlin URL-deriver/normalization fixtures consistent). No behavior change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the fragile screenHeightDp*0.34f cap on the clean-mode text flow with a weight split: the centered sphere keeps weight(1f) while the flow takes weight(1.1f), so the readable/scrollable text area grows from ~34% to ~52% of the vertical slack. Keeps the min=96.dp floor, internal scroll + top-fade + a11y mirror paths, and composer/exit spacing intact; drops the now-dead LocalConfiguration import. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tions UI Relabel the default connection path from "Vanilla Hermes" / "Standard Hermes" to simply "Hermes", and "Hermes-Relay plugin" to "Relay plugin", across the connections wizard, connection info/switcher sheets, voice settings, permissions, QR scanner, and power-feature gate (28 display strings, 10 files). Display text only — no enum names, sealed types, when-branches, or stored route/storage values were changed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the Diagnostics modal bottom sheet with a dedicated DiagnosticsScreen behind a new Screen.Diagnostics nav route. The screen leads with a vertical status-check timeline (Network, API server, server capabilities, chat transport, pairing/auth, relay, voice), each with a green/amber/red/gray dot on a connecting rail and an inline failure reason; checks backed by a logged error are tappable into the existing DiagnosticDetailDialog. Checks derive read-only from existing ConnectionViewModel flows plus the recent DiagnosticsLog (no new probing) via a pure, testable buildStatusChecks(); the recent-activity log panel stays below. Adds StatusCheck/CheckStatus models + a reusable StatusCheckTimeline composable, and tidies AnalyticsScreen + StatsForNerds visual hierarchy (no data/behavior change). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A non-default Hermes profile keeps its sessions in that profile's own
state.db, but the delete went through the unscoped api_server
DELETE /api/sessions/{id} — which hits the shared DB, leaves the row
intact, and lets the next profile-scoped list resurrect it. Route gateway
deletes through the dashboard profile-scoped surface (the write twin of
the existing list path): add DashboardApiClient.deleteSession(id, profile),
ConnectionViewModel.deleteProfileScopedSession(), a
ChatViewModel.profileSessionDeleter hook wired in RelayApp, and a
refreshSessions() after a successful delete so a still-present row can't
linger in the drawer. Off-gateway (one shared DB, no profiles) the plain
api_server delete is unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Check off the four resolved User-Added items (clean-chat viewport, connections reframe, diagnostics/analytics, session-delete fix), add the batch's deferred follow-ups (build+lint+device verify, diagnostics re-probe trigger, pass-check timing), a DEVLOG entry, and CHANGELOG [Unreleased] entries. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…profile resolves On cold start the session drawer (and the restored session context) could hydrate with the SERVER-DEFAULT profile's sessions and then visibly snap to the persisted profile a beat later. The chat client became ready — and the first refreshSessions() fired — before the per-connection agent-profile list arrived to resolve the persisted selection, so the first profile-scoped read ran with a null (server-default) profile; the list landed a tick later, re-resolved the profile, and re-fetched correctly. Add ProfileController.selectionSettled (true once the selection has resolved, OR no non-default profile is pending, OR the profile list has arrived so resolution was attempted) and gate the cold-start LaunchedEffect on it. While a non-default profile is still resolving the first load waits on a 2.5s backstop instead of fetching; the effect re-fires the instant the profile resolves, cancelling the wait so only the correct, profile-scoped load lands. The backstop keeps the drawer from ever stranding empty if the profile list never arrives. Also defers the per-profile session-context / transcript restore in the same effect. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Note the session-drawer cold-start race fix (889273a) in TODO (batch follow-ups + broader profile-isolation sweep), DEVLOG, and CHANGELOG [Unreleased] Fixed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bump appVersionName 1.2.1 -> 1.2.2, appVersionCode 15 -> 16. Headline: multi-profile reliability — deleting a session on a non-default profile now sticks, and a cold start opens the session drawer on the right profile instead of flashing the default one — plus a full-screen Diagnostics status timeline, simpler "Hermes"/"Relay" connection wording, and a roomier clean-chat text area. Build fix folded in: the 2026-06-22 Dependabot wave raised the compileSdk floor to 37 on two deps, breaking the dev build on our compileSdk 36. Pinned markdown-renderer 0.42.0 -> 0.41.0 and lifecycle 2.11.0 -> 2.10.0 (both the last versions that build on 36, and the 1.2.1-shipped values); guard comments added. Do not bump past these without a compileSdk bump. Docs: CHANGELOG [1.2.2] (Desktop-CLI entries stay under [Unreleased] for their own cli-v* cut), RELEASE_NOTES, whats_new.txt, Play default.txt, and changelog.json (also backfilled the missing 1.2.1 entry). Verified buildable: :app:assembleSideloadDebug green (versionCode 16 APK). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(relay): typed stream event passthrough
Iterate the clean text-flow mode (refines 1dca285) to its final shape: - Vertically-centered sphere + text group that rises toward the top third as the reply grows — no reserved empty "void", no gap above the composer (replaces the earlier fixed weight split). - Top fade-edge applies only when the flow is actually scrolled, so a reply that fits shows its first line crisply instead of looking cut off. - The flow now renders the recent CONVERSATION as one faded, scrollable transcript (user turns marked "›"), so scrolling up brings history into view; the line buffer accumulates across turns (keyed on a conversation-stable id) and the update loop keeps watching for new turns. - Clean mode consumes stray pointer events in its empty areas (mirrors the voice overlay scrim) so taps/swipes don't fall through to the chat and session drawer behind it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…m events) Catch up the local 1.2.2 work with origin/dev, which moved to compileSdk 37 (206d182) and added typed stream.event passthrough (PR #120). Dropped the local markdown-renderer 0.41.0 / lifecycle 2.10.0 pins (a compileSdk-36 workaround) for compileSdk 37 + the 0.42.0 / 2.11.0 deps origin adopted. Kept the 1.2.2 version bump (code 16) and all feature/fix work; both 2026-06-22 DEVLOG entries retained. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release: android-v1.2.2
Cuts Android 1.2.2 (appVersionName 1.2.2 / appVersionCode 16) from accumulated
devstate sinceandroid-v1.2.1.Headline — 1.2.2 "Multi-profile polish"
Also integrated on
dev(ships in this release)stream.eventrelay passthrough + native client mapping (PR feat(relay): typed stream event passthrough #120).CI — Android (build + tests on compileSdk 37) is green on
dev(65f22e2).🤖 Generated with Claude Code