Skip to content

release(android): android-v1.2.2 - #122

Merged
Codename-11 merged 17 commits into
mainfrom
dev
Jun 23, 2026
Merged

Codename-11 merged 17 commits into
mainfrom
dev

Conversation

@Codename-11

Copy link
Copy Markdown
Owner

Release: android-v1.2.2

Cuts Android 1.2.2 (appVersionName 1.2.2 / appVersionCode 16) from accumulated dev state since android-v1.2.1.

Headline — 1.2.2 "Multi-profile polish"

  • Session delete on a non-default profile now sticks — no more resurrection after the list refreshes (scoped to the active profile's dashboard surface).
  • Cold start opens on the right profile — the session drawer + restored context no longer flash the server-default profile before resolving the persisted one.
  • Full-screen Diagnostics — a vertical status-check timeline (network, API, chat transport, pairing, relay, voice) with inline failure reasons; tappable detail.
  • Connections wording simplified — "Hermes" / "Relay" across setup, switcher, voice, permissions.
  • Clean-chat refinements — taller, scrollable text with conversation history; centered sphere that rises with the reply; no click-through to the chat behind.

Also integrated on dev (ships in this release)

CI — Android (build + tests on compileSdk 37) is green on dev (65f22e2).

🤖 Generated with Claude Code

Codename-11 and others added 17 commits June 22, 2026 18:52
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>
@Codename-11
Codename-11 merged commit 984d9a2 into main Jun 23, 2026
27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant