Files
iris_x_hermes/docs
ARIAandClaude Opus 4.8 82c5a20848
CI / Gateway plugin tests (push) Successful in 4m48s
CI / Kotlin tests (android host + desktop) (push) Successful in 7m3s
Add interactive choice-picker menus for finite-choice slash commands
Slash commands with a finite set of options (/reasoning, /fast, ...) now
render a tappable card with buttons (2 per row, ✓ on the current value)
instead of a plain text status card. The mechanism is generic: any command
that calls the adapter's send_choice_picker() gets a picker automatically.

Wire protocol (docs/04, frames.schema.json):
- picker.choice (server→app): {picker_id, title, choices[]}
- picker.select (app→server): {picker_id, value}
- pickers capability flag now True in server_caps

gateway-plugin:
- protocol.py: picker.choice/picker.select frame types + picker_choice()
- dispatch.py: route picker.select → adapter.on_picker_select
- adapter.py: send_choice_picker() (fails cleanly with no live device so
  hermes falls back to text), on_picker_select(), in-memory pending pickers
  (gateway restart expires them; stale select is a no-op), pickers=True

app (KMP):
- Protocol.kt: PickerChoice/PickerChoicePayload + pickerSelectFrame()
- ChatStore.kt: PickerItem + onPickerChoice (idempotent) + resolvePicker
  (optimistic, one-shot)
- ChatDb.kt: persist PickerItem in the messages table (polymorphic decode)
- IrisController.kt: picker.choice routing + selectPicker() action
- ChatScreen.kt: PickerCard composable (locks after selection)

Tests:
- python: 3 picker tests (roundtrip, no-device fallback, stale-select noop)
- kotlin: ChatStorePickerTest (add/idempotent/resolve/one-shot/noop/serialize)
- fixture fix: clear leaked IRIS_HTTP_PORT/IRIS_WS_HOST env so the adapter
  binds the ephemeral port (a prior test's interactive_setup() polluted the
  process env, colliding with a live gateway on 8791)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-22 23:33:53 +02:00
..

Iris × Hermes — Implementation Reference Library

A coder-facing reference library for building a native Android + Desktop experience for hermes-agent, connected through a gateway platform plugin.

This folder is the single source of truth for what to build and why. Read it top-to-bottom once, then use the numbered docs as a lookup while implementing.

⚠️ READ FIRST — two hard rules

  1. hermes-agent/ (sibling of this folder) is a read-only research reference. It must NEVER be committed, pushed, or shipped. It is git-ignored at the repo root. We only install our plugin into a live hermes install (~/.hermes/plugins/); we never modify hermes core.
  2. ADB is installed and a device is connected (a5ca2a4b, Xiaomi MIX 2S, Android 10 / API 29). Use it to install/launch/debug the app on-device.

Reading order

# File When to read
0 00-overview.md Always first. Vision, scope, disclaimers, locked decisions.
1 01-architecture.md Before touching code. System shape + rationale.
2 02-monorepo.md When scaffolding the repo.
3 03-gateway-plugin.md When building the Python plugin.
4 04-wire-protocol.md When implementing either side of the WS.
5 05-streaming.md Streaming / reasoning / tools / intermediate.
6 06-channels-cron-search.md Channels, threads, cron delivery, search.
7 07-media.md Media upload/download + playback.
8 08-push.md Push (FCM + ntfy), outbox, sync.
9 09-pairing-security.md Pairing, auth, security model.
10 10-android-app.md When building the Android app.
11 11-desktop-app.md When building the Desktop app.
12 12-toolchain.md First time on a machine (JDK/SDK/uv/Firebase).
13 13-testing.md Writing tests + on-device ADB workflow.
14 14-milestones.md Planning work / tracking progress.
15 15-hermes-reference.md Cheat-sheet of hermes-agent source to read.
16 16-open-questions.md Decisions made + open items.
17 17-future-control-surface.md Backlog — what the app could control beyond chat (cron, kanban, models, …).
19 19-http-fallback-transport.md Design — HTTP fallback leg (POST + SSE/long-poll) so the app can send/receive when the WS is down.
20 20-qr-pairing.md Terminal QR at gateway setup + in-app QR scanner (Android) + iris://pair deep link.

Machine-readable / diagrams:


The three deliverables (one monorepo)

  1. gateway-plugin/ — a Python hermes platform plugin named iris. Runs inside the hermes gateway process. Opens a WebSocket server the apps connect to. Implements the full BasePlatformAdapter contract. Zero new Python dependencies, zero hermes-core changes.
  2. app/androidApp — native Kotlin + Jetpack Compose client.
  3. app/desktopApp — Kotlin + Compose Multiplatform client that shares the Android app's code and is "tweaked" for a big screen.

The Android and Desktop clients live in one Compose Multiplatform Gradle project (app/) with a shared KMP module (app/shared).


Status

  • Phase: M0–M6 complete; M7 (polish + E2E + docs) in progress.
  • Owner decisions locked: see 16-open-questions.md.
  • Last updated: 2026-08-19.