913ee91024e6407b721f8dc43931d649c47412fe
Gateway plugin: - media.upload (chunked binary) -> size/sha256 verify + MIME re-sniff -> cache_*_from_bytes -> media.upload.ack - media.offer / media.pull (chunked) for agent-sent media, delivery-path security re-checked at pull time - send_* overrides mint media_id and emit media.offer - message.send media_refs resolve to cached inbound media - per-send + per-chunk timeouts so a stalled peer can't starve the rest App (Kotlin CMP): - Protocol: media frame types/payloads/builders - GatewayClient: binary session, uploadMedia (chunked + streaming sha256), pullMedia serialized via Mutex so concurrent offers don't interleave - ChatStore/IrisController: MediaItem, attachments, auto-pull on offer - Platform media: SAF picker, ExoPlayer (audio mini-player + video), image loader, FileProvider document open (Android); AWT-free desktop actuals - ChatScreen: attach button + chips, media rendering, keyboard dismiss on send UI polish: - preserve image aspect ratio (no stretching), cap dominant dimension - adjustResize so only chat content squeezes for the keyboard - clear focus (hide keyboard) on send Docs: media.upload.ack in 04-wire-protocol.md + frames.schema.json + 07-media.md; M4 marked complete in 14-milestones.md. Tests: 17-test tests/gateway/test_android.py suite passes.
Iris × Hermes
A native Android + Desktop experience for hermes-agent, connected through a gateway platform plugin.
⚠️ HARD RULES
hermes-agent/is a read-only research reference. It is git-ignored and must NEVER be committed, pushed, or shipped. We only install our plugin into a live hermes home (~/.hermes/plugins/android); we never modify hermes core.- 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.
Start here
📚 The full implementation reference library is in docs/.
Read docs/00-overview.md first, then follow the numbered docs.
The three deliverables (this monorepo)
| Path | What |
|---|---|
gateway-plugin/ |
Python hermes platform plugin (android). Runs in the hermes gateway process; opens a WebSocket server the apps connect to. Zero new Python deps, zero hermes-core changes. |
app/androidApp |
Native Kotlin + Jetpack Compose client. |
app/desktopApp |
Kotlin + Compose Multiplatform client — the Android app, tweaked for a big screen (shares app/shared). |
The Android and Desktop clients live in one Compose Multiplatform Gradle
project (app/) with a shared KMP module (app/shared).
Status
- Phase: Planning complete → ready to implement (Milestone M0).
- Milestones: see
docs/14-milestones.md. - Locked decisions: see
docs/16-open-questions.md.
Quick orientation
- Architecture + rationale →
docs/01-architecture.md - Wire protocol →
docs/04-wire-protocol.md(+docs/protocol/frames.schema.json) - Gateway plugin design →
docs/03-gateway-plugin.md - hermes source cheat-sheet →
docs/15-hermes-reference.md - Toolchain setup →
docs/12-toolchain.md
Description
Iris × Hermes — native Android + Desktop client for hermes-agent via a gateway platform plugin. Compose Multiplatform app (Kotlin) + Python WebSocket gateway adapter. See docs/ for the full reference library.
7.8 MiB
0 Stars
1 Watchers
0 Forks