From 59acf66c898c09cdeef5b0426f473507fe5c91b5 Mon Sep 17 00:00:00 2001 From: ARIA Date: Wed, 19 Aug 2026 11:27:02 +0200 Subject: [PATCH] M0: toolchain, monorepo scaffold, gateway plugin skeleton, CMP app - gateway-plugin/: android platform plugin (plugin.yaml + adapter.py register(ctx) + no-op AndroidAdapter) + stub modules for M1-M5 - app/: Compose Multiplatform project (shared KMP + androidApp + desktopApp) with Gradle wrapper; builds :androidApp:assembleDebug and :desktopApp:compileKotlin - scripts/guard_hermes_agent.sh + pre-commit hook: fail if hermes-agent/ is staged (read-only reference, never committed) - .gitignore excludes hermes-agent/; docs/ reference library --- .gitignore | 34 ++ README.md | 42 ++ Screenshot_20260819_083446~2.jpg | Bin 0 -> 384770 bytes app/androidApp/build.gradle.kts | 42 ++ app/androidApp/src/main/AndroidManifest.xml | 22 + .../main/kotlin/dev/iris/app/MainActivity.kt | 15 + app/build.gradle.kts | 13 + app/desktopApp/build.gradle.kts | 27 + .../src/main/kotlin/iris/desktop/Main.kt | 11 + app/gradle.properties | 11 + app/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes app/gradle/wrapper/gradle-wrapper.properties | 7 + app/gradlew | 252 ++++++++++ app/gradlew.bat | 94 ++++ app/settings.gradle.kts | 20 + app/shared/build.gradle.kts | 34 ++ .../src/commonMain/kotlin/iris/IrisApp.kt | 53 ++ docs/00-overview.md | 93 ++++ docs/01-architecture.md | 106 ++++ docs/02-monorepo.md | 130 +++++ docs/03-gateway-plugin.md | 263 ++++++++++ docs/04-wire-protocol.md | 327 ++++++++++++ docs/05-streaming.md | 143 ++++++ docs/06-channels-cron-search.md | 107 ++++ docs/07-media.md | 96 ++++ docs/08-push.md | 105 ++++ docs/09-pairing-security.md | 95 ++++ docs/10-android-app.md | 197 ++++++++ docs/11-desktop-app.md | 75 +++ docs/12-toolchain.md | 138 +++++ docs/13-testing.md | 131 +++++ docs/14-milestones.md | 138 +++++ docs/15-hermes-reference.md | 136 +++++ docs/16-open-questions.md | 75 +++ docs/README.md | 67 +++ docs/diagrams/architecture.mmd | 54 ++ docs/protocol/frames.schema.json | 107 ++++ gateway-plugin/__init__.py | 3 + gateway-plugin/adapter.py | 471 ++++++++++++++++++ gateway-plugin/media.py | 16 + gateway-plugin/outbox.py | 10 + gateway-plugin/pairing.py | 10 + gateway-plugin/plugin.yaml | 67 +++ gateway-plugin/protocol.py | 22 + gateway-plugin/push.py | 15 + gateway-plugin/search.py | 8 + gateway-plugin/tests/README.md | 7 + gateway-plugin/ws_server.py | 24 + scripts/guard_hermes_agent.sh | 37 ++ 49 files changed, 3950 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 Screenshot_20260819_083446~2.jpg create mode 100644 app/androidApp/build.gradle.kts create mode 100644 app/androidApp/src/main/AndroidManifest.xml create mode 100644 app/androidApp/src/main/kotlin/dev/iris/app/MainActivity.kt create mode 100644 app/build.gradle.kts create mode 100644 app/desktopApp/build.gradle.kts create mode 100644 app/desktopApp/src/main/kotlin/iris/desktop/Main.kt create mode 100644 app/gradle.properties create mode 100644 app/gradle/wrapper/gradle-wrapper.jar create mode 100644 app/gradle/wrapper/gradle-wrapper.properties create mode 100755 app/gradlew create mode 100644 app/gradlew.bat create mode 100644 app/settings.gradle.kts create mode 100644 app/shared/build.gradle.kts create mode 100644 app/shared/src/commonMain/kotlin/iris/IrisApp.kt create mode 100644 docs/00-overview.md create mode 100644 docs/01-architecture.md create mode 100644 docs/02-monorepo.md create mode 100644 docs/03-gateway-plugin.md create mode 100644 docs/04-wire-protocol.md create mode 100644 docs/05-streaming.md create mode 100644 docs/06-channels-cron-search.md create mode 100644 docs/07-media.md create mode 100644 docs/08-push.md create mode 100644 docs/09-pairing-security.md create mode 100644 docs/10-android-app.md create mode 100644 docs/11-desktop-app.md create mode 100644 docs/12-toolchain.md create mode 100644 docs/13-testing.md create mode 100644 docs/14-milestones.md create mode 100644 docs/15-hermes-reference.md create mode 100644 docs/16-open-questions.md create mode 100644 docs/README.md create mode 100644 docs/diagrams/architecture.mmd create mode 100644 docs/protocol/frames.schema.json create mode 100644 gateway-plugin/__init__.py create mode 100644 gateway-plugin/adapter.py create mode 100644 gateway-plugin/media.py create mode 100644 gateway-plugin/outbox.py create mode 100644 gateway-plugin/pairing.py create mode 100644 gateway-plugin/plugin.yaml create mode 100644 gateway-plugin/protocol.py create mode 100644 gateway-plugin/push.py create mode 100644 gateway-plugin/search.py create mode 100644 gateway-plugin/tests/README.md create mode 100644 gateway-plugin/ws_server.py create mode 100755 scripts/guard_hermes_agent.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d179f3c --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# ── HARD RULE: hermes-agent is a read-only research reference ───────────── +# It must NEVER be committed, pushed, or shipped. +/hermes-agent/ + +# ── Python (gateway-plugin) ─────────────────────────────────────────────── +__pycache__/ +*.py[cod] +*.egg-info/ +.venv/ +venv/ +.pytest_cache/ +.ruff_cache/ + +# ── Kotlin / Gradle (app) ───────────────────────────────────────────────── +.gradle/ +build/ +local.properties +*.iml +.idea/ +captures/ +.cxx/ + +# ── Android / secrets ───────────────────────────────────────────────────── +app/androidApp/src/main/res/values/secrets.xml +google-services.json +*.jks +keystore.jks +*.keystore + +# ── OS / misc ───────────────────────────────────────────────────────────── +.DS_Store +Thumbs.db +*.log +*.tmp \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ee1c553 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# Iris × Hermes + +A **native Android + Desktop** experience for [hermes-agent](https://github.com/NousResearch/hermes-agent), connected through a **gateway platform plugin**. + +> ## ⚠️ HARD RULES +> 1. **`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. +> 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. + +## Start here + +📚 **The full implementation reference library is in [`docs/`](docs/README.md).** +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`](docs/14-milestones.md). +- **Locked decisions:** see [`docs/16-open-questions.md`](docs/16-open-questions.md). + +## Quick orientation + +- Architecture + rationale → [`docs/01-architecture.md`](docs/01-architecture.md) +- Wire protocol → [`docs/04-wire-protocol.md`](docs/04-wire-protocol.md) (+ [`docs/protocol/frames.schema.json`](docs/protocol/frames.schema.json)) +- Gateway plugin design → [`docs/03-gateway-plugin.md`](docs/03-gateway-plugin.md) +- hermes source cheat-sheet → [`docs/15-hermes-reference.md`](docs/15-hermes-reference.md) +- Toolchain setup → [`docs/12-toolchain.md`](docs/12-toolchain.md) + \ No newline at end of file diff --git a/Screenshot_20260819_083446~2.jpg b/Screenshot_20260819_083446~2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad3bf733effac7b40f98b4d631aef94c096b1be5 GIT binary patch literal 384770 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

h%I9~FaUZ0H$8@N+ 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 literal 0 HcmV?d00001 diff --git a/app/androidApp/build.gradle.kts b/app/androidApp/build.gradle.kts new file mode 100644 index 0000000..89cc72b --- /dev/null +++ b/app/androidApp/build.gradle.kts @@ -0,0 +1,42 @@ +plugins { + id("com.android.application") + kotlin("android") + id("org.jetbrains.kotlin.plugin.compose") +} + +android { + namespace = "dev.iris.app" + compileSdk = 34 + + defaultConfig { + applicationId = "dev.iris.app" + minSdk = 29 + targetSdk = 34 + versionCode = 1 + versionName = "0.1.0" + } + + buildTypes { + release { + isMinifyEnabled = false + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } +} + +dependencies { + implementation(project(":shared")) + implementation(platform("androidx.compose:compose-bom:2024.09.02")) + implementation("androidx.compose.material3:material3") + implementation("androidx.compose.ui:ui") + implementation("androidx.activity:activity-compose:1.9.2") + implementation("androidx.core:core-splashscreen:1.0.1") +} \ No newline at end of file diff --git a/app/androidApp/src/main/AndroidManifest.xml b/app/androidApp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..fda8506 --- /dev/null +++ b/app/androidApp/src/main/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/androidApp/src/main/kotlin/dev/iris/app/MainActivity.kt b/app/androidApp/src/main/kotlin/dev/iris/app/MainActivity.kt new file mode 100644 index 0000000..071c5ea --- /dev/null +++ b/app/androidApp/src/main/kotlin/dev/iris/app/MainActivity.kt @@ -0,0 +1,15 @@ +package dev.iris.app + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import iris.IrisApp + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + IrisApp() + } + } +} \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..3cccc37 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + kotlin("multiplatform") version "2.1.0" apply false + kotlin("android") version "2.1.0" apply false + kotlin("jvm") version "2.1.0" apply false + id("com.android.application") version "8.7.3" apply false + id("com.android.library") version "8.7.3" apply false + id("org.jetbrains.compose") version "1.7.3" apply false + id("org.jetbrains.kotlin.plugin.compose") version "2.1.0" apply false +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} \ No newline at end of file diff --git a/app/desktopApp/build.gradle.kts b/app/desktopApp/build.gradle.kts new file mode 100644 index 0000000..c2af2c2 --- /dev/null +++ b/app/desktopApp/build.gradle.kts @@ -0,0 +1,27 @@ +import org.gradle.internal.os.OperatingSystem + +plugins { + kotlin("jvm") + id("org.jetbrains.compose") + id("org.jetbrains.kotlin.plugin.compose") +} + +val composeVersion = "1.7.3" +val os = OperatingSystem.current() +val arch = System.getProperty("os.arch") ?: "amd64" +val desktopTarget = when { + os.isMacOsX -> if (arch == "aarch64") "macos-arm64" else "macos-x64" + os.isWindows -> "windows-x64" + else -> if (arch == "aarch64") "linux-arm64" else "linux-x64" +} + +dependencies { + implementation(project(":shared")) + implementation("org.jetbrains.compose.desktop:desktop-jvm-$desktopTarget:$composeVersion") +} + +compose.desktop { + application { + mainClass = "iris.desktop.MainKt" + } +} \ No newline at end of file diff --git a/app/desktopApp/src/main/kotlin/iris/desktop/Main.kt b/app/desktopApp/src/main/kotlin/iris/desktop/Main.kt new file mode 100644 index 0000000..c67e057 --- /dev/null +++ b/app/desktopApp/src/main/kotlin/iris/desktop/Main.kt @@ -0,0 +1,11 @@ +package iris.desktop + +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application +import iris.IrisApp + +fun main() = application { + Window(onCloseRequest = ::exitApplication, title = "Iris") { + IrisApp() + } +} \ No newline at end of file diff --git a/app/gradle.properties b/app/gradle.properties new file mode 100644 index 0000000..52115af --- /dev/null +++ b/app/gradle.properties @@ -0,0 +1,11 @@ +org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 +org.gradle.caching=true +org.gradle.configuration-cache=true + +android.useAndroidX=true +android.nonTransitiveRClass=true + +kotlin.code.style=official + +# Compose Multiplatform +org.jetbrains.compose.experimental.jscanvas.enabled=false \ No newline at end of file diff --git a/app/gradle/wrapper/gradle-wrapper.jar b/app/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 zcma&N1CXTcmMvW9vTb(Rwr$&4wr$(C?dmSu>@vG-+vuvg^_??!{yS%8zW-#zn-LkA z5&1^$^{lnmUON?}LBF8_K|(?T0Ra(xUH{($5eN!MR#ZihR#HxkUPe+_R8Cn`RRs(P z_^*#_XlXmGv7!4;*Y%p4nw?{bNp@UZHv1?Um8r6)Fei3p@ClJn0ECfg1hkeuUU@Or zDaPa;U3fE=3L}DooL;8f;P0ipPt0Z~9P0)lbStMS)ag54=uL9ia-Lm3nh|@(Y?B`; zx_#arJIpXH!U{fbCbI^17}6Ri*H<>OLR%c|^mh8+)*h~K8Z!9)DPf zR2h?lbDZQ`p9P;&DQ4F0sur@TMa!Y}S8irn(%d-gi0*WxxCSk*A?3lGh=gcYN?FGl z7D=Js!i~0=u3rox^eO3i@$0=n{K1lPNU zwmfjRVmLOCRfe=seV&P*1Iq=^i`502keY8Uy-WNPwVNNtJFx?IwAyRPZo2Wo1+S(xF37LJZ~%i)kpFQ3Fw=mXfd@>%+)RpYQLnr}B~~zoof(JVm^^&f zxKV^+3D3$A1G;qh4gPVjhrC8e(VYUHv#dy^)(RoUFM?o%W-EHxufuWf(l*@-l+7vt z=l`qmR56K~F|v<^Pd*p~1_y^P0P^aPC##d8+HqX4IR1gu+7w#~TBFphJxF)T$2WEa zxa?H&6=Qe7d(#tha?_1uQys2KtHQ{)Qco)qwGjrdNL7thd^G5i8Os)CHqc>iOidS} z%nFEDdm=GXBw=yXe1W-ShHHFb?Cc70+$W~z_+}nAoHFYI1MV1wZegw*0y^tC*s%3h zhD3tN8b=Gv&rj}!SUM6|ajSPp*58KR7MPpI{oAJCtY~JECm)*m_x>AZEu>DFgUcby z1Qaw8lU4jZpQ_$;*7RME+gq1KySGG#Wql>aL~k9tLrSO()LWn*q&YxHEuzmwd1?aAtI zBJ>P=&$=l1efe1CDU;`Fd+_;&wI07?V0aAIgc(!{a z0Jg6Y=inXc3^n!U0Atk`iCFIQooHqcWhO(qrieUOW8X(x?(RD}iYDLMjSwffH2~tB z)oDgNBLB^AJBM1M^c5HdRx6fBfka`(LD-qrlh5jqH~);#nw|iyp)()xVYak3;Ybik z0j`(+69aK*B>)e_p%=wu8XC&9e{AO4c~O1U`5X9}?0mrd*m$_EUek{R?DNSh(=br# z#Q61gBzEpmy`$pA*6!87 zSDD+=@fTY7<4A?GLqpA?Pb2z$pbCc4B4zL{BeZ?F-8`s$?>*lXXtn*NC61>|*w7J* z$?!iB{6R-0=KFmyp1nnEmLsA-H0a6l+1uaH^g%c(p{iT&YFrbQ$&PRb8Up#X3@Zsk zD^^&LK~111%cqlP%!_gFNa^dTYT?rhkGl}5=fL{a`UViaXWI$k-UcHJwmaH1s=S$4 z%4)PdWJX;hh5UoK?6aWoyLxX&NhNRqKam7tcOkLh{%j3K^4Mgx1@i|Pi&}<^5>hs5 zm8?uOS>%)NzT(%PjVPGa?X%`N2TQCKbeH2l;cTnHiHppPSJ<7y-yEIiC!P*ikl&!B z%+?>VttCOQM@ShFguHVjxX^?mHX^hSaO_;pnyh^v9EumqSZTi+#f&_Vaija0Q-e*| z7ulQj6Fs*bbmsWp{`auM04gGwsYYdNNZcg|ph0OgD>7O}Asn7^Z=eI>`$2*v78;sj-}oMoEj&@)9+ycEOo92xSyY344^ z11Hb8^kdOvbf^GNAK++bYioknrpdN>+u8R?JxG=!2Kd9r=YWCOJYXYuM0cOq^FhEd zBg2puKy__7VT3-r*dG4c62Wgxi52EMCQ`bKgf*#*ou(D4-ZN$+mg&7$u!! z-^+Z%;-3IDwqZ|K=ah85OLwkO zKxNBh+4QHh)u9D?MFtpbl)us}9+V!D%w9jfAMYEb>%$A;u)rrI zuBudh;5PN}_6J_}l55P3l_)&RMlH{m!)ai-i$g)&*M`eN$XQMw{v^r@-125^RRCF0 z^2>|DxhQw(mtNEI2Kj(;KblC7x=JlK$@78`O~>V!`|1Lm-^JR$-5pUANAnb(5}B}JGjBsliK4& zk6y(;$e&h)lh2)L=bvZKbvh@>vLlreBdH8No2>$#%_Wp1U0N7Ank!6$dFSi#xzh|( zRi{Uw%-4W!{IXZ)fWx@XX6;&(m_F%c6~X8hx=BN1&q}*( zoaNjWabE{oUPb!Bt$eyd#$5j9rItB-h*5JiNi(v^e|XKAj*8(k<5-2$&ZBR5fF|JA z9&m4fbzNQnAU}r8ab>fFV%J0z5awe#UZ|bz?Ur)U9bCIKWEzi2%A+5CLqh?}K4JHi z4vtM;+uPsVz{Lfr;78W78gC;z*yTch~4YkLr&m-7%-xc ztw6Mh2d>_iO*$Rd8(-Cr1_V8EO1f*^@wRoSozS) zy1UoC@pruAaC8Z_7~_w4Q6n*&B0AjOmMWa;sIav&gu z|J5&|{=a@vR!~k-OjKEgPFCzcJ>#A1uL&7xTDn;{XBdeM}V=l3B8fE1--DHjSaxoSjNKEM9|U9#m2<3>n{Iuo`r3UZp;>GkT2YBNAh|b z^jTq-hJp(ebZh#Lk8hVBP%qXwv-@vbvoREX$TqRGTgEi$%_F9tZES@z8Bx}$#5eeG zk^UsLBH{bc2VBW)*EdS({yw=?qmevwi?BL6*=12k9zM5gJv1>y#ML4!)iiPzVaH9% zgSImetD@dam~e>{LvVh!phhzpW+iFvWpGT#CVE5TQ40n%F|p(sP5mXxna+Ev7PDwA zamaV4m*^~*xV+&p;W749xhb_X=$|LD;FHuB&JL5?*Y2-oIT(wYY2;73<^#46S~Gx| z^cez%V7x$81}UWqS13Gz80379Rj;6~WdiXWOSsdmzY39L;Hg3MH43o*y8ibNBBH`(av4|u;YPq%{R;IuYow<+GEsf@R?=@tT@!}?#>zIIn0CoyV!hq3mw zHj>OOjfJM3F{RG#6ujzo?y32m^tgSXf@v=J$ELdJ+=5j|=F-~hP$G&}tDZsZE?5rX ztGj`!S>)CFmdkccxM9eGIcGnS2AfK#gXwj%esuIBNJQP1WV~b~+D7PJTmWGTSDrR` zEAu4B8l>NPuhsk5a`rReSya2nfV1EK01+G!x8aBdTs3Io$u5!6n6KX%uv@DxAp3F@{4UYg4SWJtQ-W~0MDb|j-$lwVn znAm*Pl!?Ps&3wO=R115RWKb*JKoexo*)uhhHBncEDMSVa_PyA>k{Zm2(wMQ(5NM3# z)jkza|GoWEQo4^s*wE(gHz?Xsg4`}HUAcs42cM1-qq_=+=!Gk^y710j=66(cSWqUe zklbm8+zB_syQv5A2rj!Vbw8;|$@C!vfNmNV!yJIWDQ>{+2x zKjuFX`~~HKG~^6h5FntRpnnHt=D&rq0>IJ9#F0eM)Y-)GpRjiN7gkA8wvnG#K=q{q z9dBn8_~wm4J<3J_vl|9H{7q6u2A!cW{bp#r*-f{gOV^e=8S{nc1DxMHFwuM$;aVI^ zz6A*}m8N-&x8;aunp1w7_vtB*pa+OYBw=TMc6QK=mbA-|Cf* zvyh8D4LRJImooUaSb7t*fVfih<97Gf@VE0|z>NcBwBQze);Rh!k3K_sfunToZY;f2 z^HmC4KjHRVg+eKYj;PRN^|E0>Gj_zagfRbrki68I^#~6-HaHg3BUW%+clM1xQEdPYt_g<2K+z!$>*$9nQ>; zf9Bei{?zY^-e{q_*|W#2rJG`2fy@{%6u0i_VEWTq$*(ZN37|8lFFFt)nCG({r!q#9 z5VK_kkSJ3?zOH)OezMT{!YkCuSSn!K#-Rhl$uUM(bq*jY? zi1xbMVthJ`E>d>(f3)~fozjg^@eheMF6<)I`oeJYx4*+M&%c9VArn(OM-wp%M<-`x z7sLP1&3^%Nld9Dhm@$3f2}87!quhI@nwd@3~fZl_3LYW-B?Ia>ui`ELg z&Qfe!7m6ze=mZ`Ia9$z|ARSw|IdMpooY4YiPN8K z4B(ts3p%2i(Td=tgEHX z0UQ_>URBtG+-?0E;E7Ld^dyZ;jjw0}XZ(}-QzC6+NN=40oDb2^v!L1g9xRvE#@IBR zO!b-2N7wVfLV;mhEaXQ9XAU+>=XVA6f&T4Z-@AX!leJ8obP^P^wP0aICND?~w&NykJ#54x3_@r7IDMdRNy4Hh;h*!u(Ol(#0bJdwEo$5437-UBjQ+j=Ic>Q2z` zJNDf0yO6@mr6y1#n3)s(W|$iE_i8r@Gd@!DWDqZ7J&~gAm1#~maIGJ1sls^gxL9LLG_NhU!pTGty!TbhzQnu)I*S^54U6Yu%ZeCg`R>Q zhBv$n5j0v%O_j{QYWG!R9W?5_b&67KB$t}&e2LdMvd(PxN6Ir!H4>PNlerpBL>Zvyy!yw z-SOo8caEpDt(}|gKPBd$qND5#a5nju^O>V&;f890?yEOfkSG^HQVmEbM3Ugzu+UtH zC(INPDdraBN?P%kE;*Ae%Wto&sgw(crfZ#Qy(<4nk;S|hD3j{IQRI6Yq|f^basLY; z-HB&Je%Gg}Jt@={_C{L$!RM;$$|iD6vu#3w?v?*;&()uB|I-XqEKqZPS!reW9JkLewLb!70T7n`i!gNtb1%vN- zySZj{8-1>6E%H&=V}LM#xmt`J3XQoaD|@XygXjdZ1+P77-=;=eYpoEQ01B@L*a(uW zrZeZz?HJsw_4g0vhUgkg@VF8<-X$B8pOqCuWAl28uB|@r`19DTUQQsb^pfqB6QtiT z*`_UZ`fT}vtUY#%sq2{rchyfu*pCg;uec2$-$N_xgjZcoumE5vSI{+s@iLWoz^Mf; zuI8kDP{!XY6OP~q5}%1&L}CtfH^N<3o4L@J@zg1-mt{9L`s^z$Vgb|mr{@WiwAqKg zp#t-lhrU>F8o0s1q_9y`gQNf~Vb!F%70f}$>i7o4ho$`uciNf=xgJ>&!gSt0g;M>*x4-`U)ysFW&Vs^Vk6m%?iuWU+o&m(2Jm26Y(3%TL; zA7T)BP{WS!&xmxNw%J=$MPfn(9*^*TV;$JwRy8Zl*yUZi8jWYF>==j~&S|Xinsb%c z2?B+kpet*muEW7@AzjBA^wAJBY8i|#C{WtO_or&Nj2{=6JTTX05}|H>N2B|Wf!*3_ z7hW*j6p3TvpghEc6-wufFiY!%-GvOx*bZrhZu+7?iSrZL5q9}igiF^*R3%DE4aCHZ zqu>xS8LkW+Auv%z-<1Xs92u23R$nk@Pk}MU5!gT|c7vGlEA%G^2th&Q*zfg%-D^=f z&J_}jskj|Q;73NP4<4k*Y%pXPU2Thoqr+5uH1yEYM|VtBPW6lXaetokD0u z9qVek6Q&wk)tFbQ8(^HGf3Wp16gKmr>G;#G(HRBx?F`9AIRboK+;OfHaLJ(P>IP0w zyTbTkx_THEOs%Q&aPrxbZrJlio+hCC_HK<4%f3ZoSAyG7Dn`=X=&h@m*|UYO-4Hq0 z-Bq&+Ie!S##4A6OGoC~>ZW`Y5J)*ouaFl_e9GA*VSL!O_@xGiBw!AF}1{tB)z(w%c zS1Hmrb9OC8>0a_$BzeiN?rkPLc9%&;1CZW*4}CDDNr2gcl_3z+WC15&H1Zc2{o~i) z)LLW=WQ{?ricmC`G1GfJ0Yp4Dy~Ba;j6ZV4r{8xRs`13{dD!xXmr^Aga|C=iSmor% z8hi|pTXH)5Yf&v~exp3o+sY4B^^b*eYkkCYl*T{*=-0HniSA_1F53eCb{x~1k3*`W zr~};p1A`k{1DV9=UPnLDgz{aJH=-LQo<5%+Em!DNN252xwIf*wF_zS^!(XSm(9eoj z=*dXG&n0>)_)N5oc6v!>-bd(2ragD8O=M|wGW z!xJQS<)u70m&6OmrF0WSsr@I%T*c#Qo#Ha4d3COcX+9}hM5!7JIGF>7<~C(Ear^Sn zm^ZFkV6~Ula6+8S?oOROOA6$C&q&dp`>oR-2Ym3(HT@O7Sd5c~+kjrmM)YmgPH*tL zX+znN>`tv;5eOfX?h{AuX^LK~V#gPCu=)Tigtq9&?7Xh$qN|%A$?V*v=&-2F$zTUv z`C#WyIrChS5|Kgm_GeudCFf;)!WH7FI60j^0o#65o6`w*S7R@)88n$1nrgU(oU0M9 zx+EuMkC>(4j1;m6NoGqEkpJYJ?vc|B zOlwT3t&UgL!pX_P*6g36`ZXQ; z9~Cv}ANFnJGp(;ZhS(@FT;3e)0)Kp;h^x;$*xZn*k0U6-&FwI=uOGaODdrsp-!K$Ac32^c{+FhI-HkYd5v=`PGsg%6I`4d9Jy)uW0y%) zm&j^9WBAp*P8#kGJUhB!L?a%h$hJgQrx!6KCB_TRo%9{t0J7KW8!o1B!NC)VGLM5! zpZy5Jc{`r{1e(jd%jsG7k%I+m#CGS*BPA65ZVW~fLYw0dA-H_}O zrkGFL&P1PG9p2(%QiEWm6x;U-U&I#;Em$nx-_I^wtgw3xUPVVu zqSuKnx&dIT-XT+T10p;yjo1Y)z(x1fb8Dzfn8e yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/app/gradle/wrapper/gradle-wrapper.properties b/app/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..df97d72 --- /dev/null +++ b/app/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/app/gradlew b/app/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/app/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/app/gradlew.bat b/app/gradlew.bat new file mode 100644 index 0000000..9b42019 --- /dev/null +++ b/app/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/app/settings.gradle.kts b/app/settings.gradle.kts new file mode 100644 index 0000000..ed24893 --- /dev/null +++ b/app/settings.gradle.kts @@ -0,0 +1,20 @@ +pluginManagement { + repositories { + mavenCentral() + gradlePluginPortal() + google() + } +} + +dependencyResolutionManagement { + repositories { + mavenCentral() + google() + } +} + +rootProject.name = "iris" + +include(":shared") +include(":androidApp") +include(":desktopApp") \ No newline at end of file diff --git a/app/shared/build.gradle.kts b/app/shared/build.gradle.kts new file mode 100644 index 0000000..37cc195 --- /dev/null +++ b/app/shared/build.gradle.kts @@ -0,0 +1,34 @@ +plugins { + kotlin("multiplatform") + id("com.android.library") + id("org.jetbrains.compose") + id("org.jetbrains.kotlin.plugin.compose") +} + +val composeVersion = "1.7.3" + +kotlin { + androidTarget() + jvm("desktop") + + sourceSets { + commonMain.dependencies { + implementation("org.jetbrains.compose.runtime:runtime:$composeVersion") + implementation("org.jetbrains.compose.foundation:foundation:$composeVersion") + implementation("org.jetbrains.compose.material3:material3:$composeVersion") + implementation("org.jetbrains.compose.ui:ui:$composeVersion") + } + } +} + +android { + namespace = "iris.shared" + compileSdk = 34 + defaultConfig { + minSdk = 29 + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } +} \ No newline at end of file diff --git a/app/shared/src/commonMain/kotlin/iris/IrisApp.kt b/app/shared/src/commonMain/kotlin/iris/IrisApp.kt new file mode 100644 index 0000000..8a6ef87 --- /dev/null +++ b/app/shared/src/commonMain/kotlin/iris/IrisApp.kt @@ -0,0 +1,53 @@ +package iris + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +/** + * Root composable shared by the Android and Desktop shells. + * + * M0: a visible placeholder to confirm the Compose stack renders. M1+ + * replaces this with the Connect screen, chat UI, and the rest of the app + * (see docs/10-android-app.md). + */ +@Composable +fun IrisApp() { + MaterialTheme { + Surface(modifier = Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFF1B1E28)), + contentAlignment = Alignment.Center, + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box( + modifier = Modifier + .size(72.dp) + .background(Color(0xFF4F7CFF), CircleShape), + contentAlignment = Alignment.Center, + ) { + Text(text = "I", color = Color.White, fontSize = 40.sp) + } + Spacer(modifier = Modifier.height(16.dp)) + Text(text = "Iris × Hermes", color = Color.White, fontSize = 22.sp) + } + } + } + } +} \ No newline at end of file diff --git a/docs/00-overview.md b/docs/00-overview.md new file mode 100644 index 0000000..1fe862e --- /dev/null +++ b/docs/00-overview.md @@ -0,0 +1,93 @@ +# 00 — Overview + +## Vision + +A **native, Telegram-quality chat experience** for a personal hermes-agent: +install an app on your phone (and a desktop app on your PC), pair it to your +running `hermes gateway`, and talk to your agent with streaming replies, +visible reasoning, structured tool activity, channels/threads, media, search, +and push notifications — with cron jobs able to post into any channel you +create. + +## Goals + +- **Native feel.** Real Android app (Kotlin/Compose), not a WebView. Desktop + app that is the same app, resized for a big screen. +- **First-class gateway citizen.** The app is a hermes *messaging platform*, so + everything the gateway already does "just works": slash commands, cron + delivery, `send_message` routing, coexistence with Telegram/Discord/etc. +- **Full agent transparency.** Streaming text, reasoning shown *before* the + answer, structured tool events (the app chooses how much to show), and + intermediate assistant beats. +- **Organized by default.** A default chat with optional threads, plus + user-created channels that cron jobs can target. +- **Reachable anywhere.** Live over a WebSocket; background push via FCM + (primary) or ntfy (fallback). + +## In scope (v1) + +Everything in the feature checklist below. + +## Out of scope / stretch (v1) + +- **Standalone-cron delivery while the gateway process is fully down** — + best-effort FCM/ntfy only (the outbox is served by the running gateway). +- **Multi-user / group chat** — this is a *personal* 1-user agent. +- **End-to-end encryption** — transport security (WSS) only. +- **iOS** — Android + Desktop only (the protocol is transport-agnostic, so an + iOS client is a future port, not a v1 goal). + +## Feature checklist → where it's handled + +| Requirement | Gateway plugin | App | +|---|---|---| +| Input box, auto-grow (max height) | — | Compose `TextField` + bounded `heightIn` | +| Menu button → all slash commands | Dispatches `/…`; serves command catalog | Bottom-sheet menu + `/` autocomplete | +| Tool output (app decides how much) | Emits **structured** tool events | App setting: everything / truncated / nothing | +| Reasoning shown before message | Captures + splits reasoning | Collapsible "Reasoning" block above message | +| Intermediate messages | Forwards `Commentary` events | Distinct dimmed bubble | +| Threading + channels; default chat; user channels for cron | `chat_id`/`thread_id` model; cron `deliver=android:[:]` | Channel list, thread toggle, "new channel" | +| Search ("everywhere" / "this chat/channel") | FTS5 session search bridge | Search UI + scope toggle | +| Attach media (music/video/images/docs) | Inbound cache; outbound `send_*` | Pickers + chunked upload + preview | +| Push notifications | FCM (primary) / ntfy (fallback) | FCM token / ntfy topic + notification service | +| Live playback of AI-sent music/video | Serves media bytes over WS | ExoPlayer inline player | + +## Locked decisions (from planning) + +| Decision | Choice | +|---|---| +| Desktop app tech | **Compose Multiplatform** (shares Android code; "tweaked" for big screen) | +| Push backend | **Both** — FCM primary, ntfy fallback (`ANDROID_PUSH_BACKEND`) | +| Media transport | **Over the WebSocket** (chunked binary frames; no extra Python deps) | +| Phone default layout | **User-toggleable, single-pane default** (auto two-pane on large screens) | + +## Disclaimers (hard rules) + +1. **`hermes-agent/` is a read-only research reference.** It lives next to this + folder for study only. It is **git-ignored** and must **never** be committed, + pushed, or included in any artifact. Our plugin is *installed* into a live + hermes home (`~/.hermes/plugins/android`); we never edit hermes core files. +2. **ADB is available and a device is connected** (`a5ca2a4b`, Xiaomi MIX 2S, + Android 10 / API 29). Use `adb install` / `adb logcat` / `adb shell am start` + to install, launch, and debug the app on-device throughout the build. + +## Verified environment state (2026-08-19) + +| Item | State | +|---|---| +| OS | CachyOS (Arch-based), `pacman` present | +| JDK | **Not installed** → Milestone M0 (`pacman -S jdk17-openjdk`) | +| Android SDK | **Not installed** → M0 (cmdline-tools + sdkmanager) | +| Gradle | Via project wrapper (`gradlew`), no system install | +| ADB | Installed; device `a5ca2a4b` (MIX 2S, API 29) connected | +| Python | 3.14.7; `uv` 0.12.3 present | +| hermes venv | **Not created** → M0 (`cd hermes-agent && uv sync`) | +| hermes core deps | `websockets==15.0.1` and `httpx` are **core** deps → plugin needs **zero new Python deps** | +| Disk / RAM | 522 GB free / 62 GB RAM — ample | + +## Naming + +- Product/effort name: **Iris × Hermes** (folder `iris_x_hermes`). +- hermes platform name: **`android`** (the plugin registers `Platform("android")`). +- WS default port: **8790** (configurable). +- Default chat id: **`android:default`** (the home channel). \ No newline at end of file diff --git a/docs/01-architecture.md b/docs/01-architecture.md new file mode 100644 index 0000000..49d32a3 --- /dev/null +++ b/docs/01-architecture.md @@ -0,0 +1,106 @@ +# 01 — Architecture + +## System diagram + +``` +┌────────────────────────────── User's machine (home server / PC) ─────────────────────────────┐ +│ │ +│ hermes gateway (ONE process) │ +│ ┌──────────────────────────────────────────────────────────────────────────────────┐ │ +│ │ Agent core (run_agent.py) ── sessions (SQLite + FTS5) ── cron scheduler │ │ +│ │ │ │ │ +│ │ ▼ legacy stream callbacks (delta / tool-progress / commentary) │ │ +│ │ ┌──────────────────────────────┐ ┌────────────────────────────────┐ │ │ +│ │ │ android PLATFORM PLUGIN │◄───────►│ WebSocket SERVER (websockets) │ │ │ +│ │ │ AndroidAdapter │ JSON │ ws://host:8790/ws │ │ │ +│ │ │ (BasePlatformAdapter) │ frames │ + media + FCM-token + pairing │ │ │ +│ │ │ • send / edit / stream │ └───────────────┬────────────────┘ │ │ +│ │ │ • media cache │ │ WSS │ │ +│ │ │ • outbox (SQLite) │ │ │ │ +│ │ │ • push (FCM / ntfy) │─────────────────────────┼──────────┐ │ │ +│ │ └──────────────────────────────┘ │ │ │ │ +│ └───────────────────────────────────────────────────────────┼──────────┼───────────┘ │ +└───────────────────────────────────────────────────────────────┼──────────┼───────────────────────┘ + │ │ push (FCM HTTP v1 / ntfy) + ┌──────────────────┼──────────▼─────────┐ + │ │ Google FCM cloud │ + ▼ │ │ │ + ┌────────────────────────┐ │ ▼ │ + │ ANDROID APP │◄──┴── (wake) ┌──────────┐ + │ (Kotlin / Compose) │ WSS │ PHONE │ + │ • WS client (OkHttp) │◄───────────►│ MIX 2S │ + │ • ExoPlayer │ │ (API 29) │ + │ • FCM service │ └──────────┘ + └────────────────────────┘ + DESKTOP APP (Compose Multiplatform) + • same shared code, WSS to same server + • tray + OS notifications (no FCM), big-screen two-pane +``` + +## Process model + +- **One `hermes gateway` process** hosts the agent core, the session store, the + cron scheduler, *and* our `android` platform plugin. The plugin's WebSocket + server runs on the gateway's asyncio loop (started in `AndroidAdapter.connect()`). +- **The app is a client.** It *initiates* the WS connection to the gateway + (outbound), so no inbound port is needed on the phone. For LAN/remote access + the user points the app at the gateway's LAN IP / Tailscale name / a WSS + tunnel (see `09-pairing-security.md`). +- **Push is the only inbound path to a sleeping phone**, and it goes through a + cloud relay (FCM or ntfy), not a direct connection. + +## Why the *messaging gateway* is the connection point (not `tui_gateway`) + +hermes has two "gateways": the **messaging gateway** (`hermes gateway`, which +serves Telegram/Discord/… and cron) and the **`tui_gateway`** JSON-RPC backend +(used by the TUI and the existing Electron desktop app). We deliberately use the +**messaging gateway** because: + +1. **Cron delivery is native.** Cron jobs resolve `deliver=android:[:]` + through the platform registry and call our adapter's `send()`. No bridging. +2. **`send_message` tool routing** works out of the box (plugin + `parse_target_ref_fn`). +3. **Slash commands** are dispatched by the gateway's command pipeline — the app + just sends `/cmd args` as a message. +4. **Coexistence.** The same agent is reachable via Telegram *and* the app at + once; sessions/channels are shared. + +The `tui_gateway` WS protocol is *not* reused; we define a clean, purpose-built +protocol (`04-wire-protocol.md`) that borrows familiar names (`message.*`, +`tool.*`, `reasoning`) but is owned by our plugin. + +## Key architectural decisions + rationale + +| Decision | Rationale | +|---|---| +| **Community-style platform plugin** (`register(ctx)` → `ctx.register_platform`) | Zero hermes-core changes; survives hermes updates; follows `ADDING_A_PLATFORM.md` "Plugin Path". | +| **Single WS transport** for chat, streaming, tools, media, pairing, FCM-token | One connection, one auth, one dependency (`websockets`, already core). Media as chunked binary frames avoids adding an HTTP server. | +| **`websockets` + `httpx` only** | Both are hermes *core* deps → the plugin adds **zero** new Python dependencies (respects hermes supply-chain pinning policy). | +| **Structured tool events, app-side verbosity** | Per the requirement: the gateway sends full tool data; the *app* decides everything/truncated/nothing. | +| **Reasoning split in the adapter** | The gateway prepends reasoning to the final text when `show_reasoning` is on; the adapter splits the stable prefix into a `reasoning` field so the app renders a clean collapsible block. | +| **Channels/threads = `chat_id`/`thread_id`** | The gateway's `SessionSource` already models this; cron delivery already targets `platform:chat_id:thread_id`. We map app concepts onto existing primitives. | +| **SQLite outbox + sync cursor** | Offline delivery + reconnect catch-up without re-reading full history. | +| **Compose Multiplatform** | Desktop is "the Android app, tweaked" → share protocol/state/UI; only platform services + layout differ. | + +## Data flow (one turn) + +1. App sends `message.send {text}` (or `/cmd`). +2. Plugin builds a `MessageEvent` (+ `media_urls` if attachments) → + `AndroidAdapter.handle_message(event)`. +3. Gateway resolves the session (`chat_id`/`thread_id`), runs the agent. +4. Agent streams: `stream_delta_callback` → `GatewayStreamConsumer` → + `adapter.send()` (first) / `adapter.edit_message()` (updates) → + `message.start` / `message.update` frames. +5. Tool calls: `tool_progress_callback` → progress queue → `adapter.send()` → + `tool.*` frames (structured). +6. Intermediate beats: `interim_assistant_callback` → consumer → `commentary` frames. +7. Final answer: consumer finalizes → `adapter.send()` → `message` frame + (reasoning split into its own field). +8. If the app is disconnected at any point: frame is dropped to the **outbox** + and a **push** is fired; on reconnect the app `sync`s the delta. + +> Implementation note: the main gateway uses the **legacy callback path** +> (not the ACP-only event-native `render_message_event` path). We therefore map +> the legacy `send`/`edit_message`/progress calls to our frames. The exact +> tool-progress vs commentary classification is verified empirically in M2 by +> running the real gateway with a test WS client (see `13-testing.md`). \ No newline at end of file diff --git a/docs/02-monorepo.md b/docs/02-monorepo.md new file mode 100644 index 0000000..252e525 --- /dev/null +++ b/docs/02-monorepo.md @@ -0,0 +1,130 @@ +# 02 — Monorepo Structure + +One repository, three artifacts. `hermes-agent/` is **not** part of the repo +(git-ignored reference). + +## Top-level tree + +``` +iris_x_hermes/ +├── .gitignore # MUST exclude hermes-agent/ (see below) +├── README.md # Repo root readme (short; points to docs/) +├── docs/ # ← THIS reference library +│ +├── hermes-agent/ # ⚠️ READ-ONLY REFERENCE — NEVER PUSHED (git-ignored) +│ +├── gateway-plugin/ # ① Python plugin → installed to ~/.hermes/plugins/android +│ ├── plugin.yaml # manifest (kind: platform, env vars, home channel) +│ ├── __init__.py +│ ├── adapter.py # AndroidAdapter(BasePlatformAdapter) + register(ctx) +│ ├── ws_server.py # websockets server, connection registry, framing +│ ├── protocol.py # frame schemas (source of truth, mirrored in Kotlin) +│ ├── media.py # inbound cache + outbound chunked streaming +│ ├── outbox.py # SQLite offline outbox + sync cursor +│ ├── push.py # PushBackend: FcmBackend + NtfyBackend +│ ├── pairing.py # token gen/verify, device registry +│ ├── search.py # FTS5 session search bridge +│ └── tests/ # pytest (run via hermes scripts/run_tests.sh) +│ +├── app/ # ② + ③ Compose Multiplatform project (Kotlin) +│ ├── settings.gradle.kts +│ ├── build.gradle.kts +│ ├── gradle.properties +│ ├── gradle/ gradlew gradlew.bat +│ ├── shared/ # KMP module — the bulk of the code +│ │ ├── build.gradle.kts +│ │ └── src/ +│ │ ├── commonMain/kotlin/iris/… # protocol, WS client, repo, state, Compose UI +│ │ ├── androidMain/kotlin/… # FCM, ExoPlayer, SAF picker, notifications +│ │ └── desktopMain/kotlin/… # tray, file dialog, player, window +│ ├── androidApp/ # thin Android shell (Application, MainActivity) +│ │ ├── build.gradle.kts +│ │ └── src/main/… # AndroidManifest, res, Firebase options +│ └── desktopApp/ # thin Desktop shell (main(), window) +│ ├── build.gradle.kts +│ └── src/main/kotlin/… +│ +└── (no other top-level code) +``` + +## Module responsibilities + +### `gateway-plugin/` (Python) +- **`plugin.yaml`** — manifest: `name: android-platform`, `kind: platform`, + `requires_env` / `optional_env` (surfaced in `hermes config`/setup). +- **`adapter.py`** — `AndroidAdapter(BasePlatformAdapter)` + `register(ctx)`. + The heart of the plugin. See `03-gateway-plugin.md`. +- **`ws_server.py`** — `websockets` server, per-device connection registry, + frame encode/decode, heartbeat, broadcast routing to all connected devices. +- **`protocol.py`** — dataclasses/constants for every frame (single source of + truth; `docs/protocol/frames.schema.json` is generated/mirrored from it). +- **`media.py`** — inbound chunked upload → `cache_*_from_bytes`; outbound + `media.offer`/`media.pull` chunked streaming. +- **`outbox.py`** — SQLite outbox per `chat_id` + monotonic sync cursor. +- **`push.py`** — `PushBackend` interface; `FcmBackend` (httpx, FCM HTTP v1) and + `NtfyBackend` (reuses hermes ntfy publish). Selected by `ANDROID_PUSH_BACKEND`. +- **`pairing.py`** — token generation/verification (constant-time), device + registry (SQLite), QR payload. +- **`search.py`** — FTS5 query bridge over the hermes session store. + +### `app/shared` (Kotlin KMP) +- **`commonMain`** — protocol models (kotlinx-serialization), `GatewayClient` + (OkHttp WS), repositories (Room), ViewModels (StateFlow), and the Compose UI + (design system, screens). ~80% of app code. +- **`androidMain`** — FCM service, ExoPlayer, SAF media picker, system + notifications, `MediaPlayer` actual. +- **`desktopMain`** — tray + OS notifications, desktop player, file dialog, + window management, `MediaPlayer` actual. + +### `app/androidApp` / `app/desktopApp` +Thin shells: `Application`/`MainActivity` (Android) and `main()`/window +(Desktop). They compose the `shared` UI and inject platform services. + +## Build systems + +- **Python plugin:** no build step (pure Python, stdlib + hermes core deps). + Installed by copying/symlinking into `~/.hermes/plugins/android`. Tested with + hermes's `scripts/run_tests.sh`. +- **Kotlin/CMP:** Gradle (Kotlin DSL) with the Compose Multiplatform plugin. + `./gradlew :androidApp:installDebug`, `./gradlew :desktopApp:run`, + `./gradlew :shared:testDebugUnitTest`. + +## `.gitignore` (root) — critical + +```gitignore +# hermes-agent is a read-only research reference — NEVER commit/push it +/hermes-agent/ + +# Python +__pycache__/ +*.pyc +.venv/ +venv/ + +# Kotlin / Gradle +.gradle/ +build/ +local.properties +*.iml +.idea/ + +# Android / Firebase +app/androidApp/src/main/res/values/secrets.xml +google-services.json +*.jks +keystore.jks + +# OS / misc +.DS_Store +*.log +``` + +> The `/hermes-agent/` line is non-negotiable. Add a pre-commit guard (or CI +> check) that fails if any path under `hermes-agent/` is staged. + +## Install layout (runtime) + +- **Plugin:** `~/.hermes/plugins/android/` ← copy of `gateway-plugin/` + (or a symlink for dev). Discovered by hermes's `PluginManager`. +- **App (dev):** installed on-device via `./gradlew :androidApp:installDebug`. +- **App (desktop, dev):** `./gradlew :desktopApp:run`. \ No newline at end of file diff --git a/docs/03-gateway-plugin.md b/docs/03-gateway-plugin.md new file mode 100644 index 0000000..8920397 --- /dev/null +++ b/docs/03-gateway-plugin.md @@ -0,0 +1,263 @@ +# 03 — Gateway Plugin (Python) + +The plugin is a **community-style hermes platform plugin** named `android`. +It follows the "Plugin Path" in `hermes-agent/gateway/platforms/ADDING_A_PLATFORM.md` +and the canonical example `hermes-agent/plugins/platforms/irc/adapter.py`. +**Zero hermes-core changes. Zero new Python dependencies** (`websockets` and +`httpx` are already core deps). + +> Source map for every hermes integration point: see `15-hermes-reference.md`. + +## 3.1 `plugin.yaml` (manifest) + +```yaml +name: android-platform +label: Android +kind: platform +version: 0.1.0 +description: > + Native Android / Desktop client gateway adapter for Hermes Agent. + Runs a WebSocket server inside the gateway; the app connects with a + pairing token. Supports streaming, reasoning, structured tool events, + channels/threads, media, FTS5 search, and FCM/ntfy push. +author: +requires_env: + - name: ANDROID_TOKEN + description: "Shared pairing token the app presents on connect" + prompt: "Android pairing token" + password: true +optional_env: + - name: ANDROID_WS_HOST + description: "WS bind host (default 127.0.0.1; use 0.0.0.0 for LAN)" + prompt: "WS host" + password: false + - name: ANDROID_WS_PORT + description: "WS port (default 8790)" + prompt: "WS port" + password: false + - name: ANDROID_HOME_CHANNEL + description: "Default chat id for cron/notification delivery (default android:default)" + prompt: "Home channel" + password: false + - name: ANDROID_ALLOWED_USERS + description: "Comma-separated allowed device_ids (empty = token-only auth)" + prompt: "Allowed device ids" + password: false + - name: ANDROID_ALLOW_ALL_USERS + description: "Allow any paired device (dev only)" + prompt: "Allow all devices? (true/false)" + password: false + - name: ANDROID_PUSH_BACKEND + description: "Push backend: fcm (default) or ntfy" + prompt: "Push backend" + password: false + - name: ANDROID_FCM_SERVICE_ACCOUNT + description: "Path to Firebase service-account JSON (FCM HTTP v1)" + prompt: "FCM service account path" + password: true + - name: ANDROID_FCM_SERVER_KEY + description: "Legacy FCM server key (fallback if no service account)" + prompt: "FCM server key" + password: true + - name: NTFY_TOPIC + description: "ntfy topic for push (when ANDROID_PUSH_BACKEND=ntfy)" + prompt: "ntfy topic" + password: false + - name: NTFY_SERVER_URL + description: "ntfy server URL (default https://ntfy.sh)" + prompt: "ntfy server URL" + password: false + - name: ANDROID_WS_CERT + description: "TLS cert path for WSS (optional)" + prompt: "WSS cert" + password: false + - name: ANDROID_WS_KEY + description: "TLS key path for WSS (optional)" + prompt: "WSS key" + password: false +``` + +Behavioral (non-secret) settings live in `config.yaml` under +`gateway.platforms.android.extra` (host, port, home_channel, outbox retention, +max upload bytes, tls). Secrets live in `.env`. (hermes policy: `.env` = secrets +only.) + +## 3.2 `register(ctx)` entry point + +```python +def register(ctx): + ctx.register_platform( + name="android", + label="Android", + adapter_factory=lambda cfg: AndroidAdapter(cfg), + check_fn=check_requirements, # passive: websockets importable + token set + validate_config=validate_config, # host/port/token present + is_connected=is_connected, + required_env=["ANDROID_TOKEN"], + install_hint="No extra packages needed (websockets + httpx are core deps)", + setup_fn=interactive_setup, # hermes gateway setup flow + env_enablement_fn=_env_enablement, # seed extra + home_channel from env + cron_deliver_env_var="ANDROID_HOME_CHANNEL", + standalone_sender_fn=_standalone_send, # best-effort out-of-proc cron (stretch) + parse_target_ref_fn=_parse_target_ref, # "android:[:]" + allowed_users_env="ANDROID_ALLOWED_USERS", + allow_all_env="ANDROID_ALLOW_ALL_USERS", + max_message_length=0, # 0 = no limit (WS has none) + emoji="📱", + pii_safe=False, + platform_hint=( + "You are chatting with the user through their native Iris app " + "(Android/Desktop). It renders Markdown, inline code, images, " + "audio and video, and shows your reasoning and tool activity. " + "Conversations are organized into channels and optional threads. " + "Keep formatting rich but readable." + ), + ) +``` + +Field reference (all from `PlatformEntry`, `gateway/platform_registry.py:63`): +`adapter_factory`, `check_fn`, `validate_config`, `is_connected`, `required_env`, +`install_hint`, `setup_fn`, `env_enablement_fn`, `apply_yaml_config_fn`, +`cron_deliver_env_var`, `parse_target_ref_fn`, `allowed_users_env`, +`allow_all_env`, `max_message_length`, `pii_safe`, `platform_hint`, `emoji`, +`ensure_deps_fn`. + +- **`check_requirements()`** — passive probe: `import websockets` succeeds and + `ANDROID_TOKEN` is set. Never installs. +- **`_env_enablement()`** — returns a dict seeding `PlatformConfig.extra` + (host/port/home_channel/push_backend) + a `home_channel` key + `{"chat_id": "android:default", "name": "Default"}` so `hermes gateway status` + and cron home-channel resolution work without instantiating the adapter. +- **`_parse_target_ref(ref)`** — if `ref` starts with `android:`, return + `(chat_id, thread_id)` parsed from `android:[:]`; else `None`. +- **`interactive_setup()`** — prompts for token (or generates one), host/port, + push backend + credentials, prints a QR code (pairing) and the app URL. + +## 3.3 `AndroidAdapter(BasePlatformAdapter)` + +Constructor: `super().__init__(config=config, platform=Platform("android"))`. +Reads `config.extra` (env overrides win). Initializes: WS server (not started +until `connect()`), connection registry, outbox (SQLite under +`get_hermes_home()/"android"`), push backend, pairing store, channel directory. + +### Lifecycle +- **`connect(*, is_reconnect=False) -> bool`** + - Acquire scoped lock (`gateway.status.acquire_scoped_lock("android", key)`) + so two profiles can't bind the same port/identity. + - Start the `websockets` server on `host:port` (TLS if cert/key set). + - `_mark_connected()`; return True. +- **`disconnect()`** + - Stop server, close all device sockets, release lock, `_mark_disconnected()`. + +### Inbound (app → agent) +- WS `message.send {text, reply_to?, media_refs?}` → build `SessionSource` via + `self.build_source(chat_id, chat_name, chat_type, user_id, user_name, + thread_id)` → build `MessageEvent(text=…, message_type=TEXT, source=…, + media_urls=[cached paths], media_types=[…], reply_to_message_id=…)` → + `await self.handle_message(event)`. +- Slash commands arrive as plain text starting with `/`; the gateway's command + pipeline resolves + dispatches them (no special handling needed). +- `picker.select {picker_id, value}` → route to the gateway-side resolvers + (model picker / choice picker / clarify / approval / slash-confirm) using the + shared callback-id conventions (`cl::`, `appr::`, + `sc::`). +- `channel.create` / `channel.rename` / `channel.set_default` → mutate the + channel directory (SQLite) + emit `channel.*` frames to all devices. +- `search {query, scope, chat_id?, thread_id?}` → `search.py` → `search.results`. +- `media.upload` (chunked) → `media.py` → `cache_*_from_bytes` → `media_ref`. +- `media.pull {media_id}` → stream cached bytes as binary frames. +- `fcm.register {token}` / `hello` → update device registry. +- `read.receipt {message_id}` → mark delivered/read (drives ✓✓), ack. +- `sync {cursor}` → `outbox.py` → replay frames since cursor. + +### Outbound (agent → app) +- **`send(chat_id, content, reply_to=None, metadata=None) -> SendResult`** + - Split reasoning prefix (see `05-streaming.md`) → `reasoning` field. + - If **any** device is connected: broadcast `message` frame to all. + - Else (no live devices): append to **outbox** + fire **push** (FCM/ntfy). + - Return `SendResult(success=True, message_id=)`. +- **`edit_message(chat_id, message_id, content)`** → `message.update` frame + (drives streaming). If no device, no-op (outbox holds the final `send`). +- **`send_typing(chat_id, metadata=None)`** → `typing` frame. +- **`get_chat_info(chat_id) -> dict`** → `{"name": , "type": "dm"|"channel"}` + from the channel directory. +- **Media send** — `send_image / send_video / send_document / send_voice / + send_image_file / send_multiple_images`: stage the file in the media cache, + mint a `media_id`, emit `media.offer {media_id, mime, size, filename, kind}`, + serve bytes on `media.pull`. (Base-class `extract_media`/`extract_images` + already pull `MEDIA:`/image tags out of agent text and call these.) +- **Interactive pickers** — `send_model_picker(...)`, `send_choice_picker(...)`, + `send_clarify(...)`, `send_exec_approval(...)`, `send_slash_confirm(...)`: + emit `picker.model` / `picker.choice` / `picker.clarify` / `picker.approval` / + `picker.confirm` frames with options; store pending state keyed by + `picker_id`; resolve on `picker.select`. +- **`create_handoff_thread(chat_id, name)`** → create a thread id, register in + channel directory, return it (used by cron "continuable" threads). + +### Streaming hooks +The main gateway drives delivery through the **legacy callback path**: +- `stream_delta_callback` → `GatewayStreamConsumer` → `send()` (first) + + `edit_message()` (updates) → `message.start` / `message.update`. +- `tool_progress_callback` → progress queue → `send_progress_messages` → + `send()` → `tool.*` frames (structured; classified in the adapter). +- `interim_assistant_callback` → consumer `on_commentary` → `send()` → + `commentary` frames. + +The adapter tracks per-chat **turn state** (in-turn, current streaming +`message_id`, last tool index) to classify outbound `send()` calls into +`message` vs `tool.*` vs `commentary`. The exact classification markers are +verified empirically in M2 (see `13-testing.md`). + +## 3.4 WebSocket server (`ws_server.py`) + +- Library: **`websockets`** (core dep, v15). `websockets.serve(handler, host, + port, ssl=ctx)`. +- **Handler** per connection: + 1. Await first frame; must be `hello {token, device_id, device_name, caps, + fcm_token?}`. Verify token (constant-time) + allowlist. On failure: send + `error {code:"auth"}` and close. + 2. On success: register in connection registry + (`device_id → {ws, caps, fcm_token}`), send + `hello.ack {server_caps, sync_cursor, channels[]}`. + 3. Loop: decode frames, dispatch to adapter inbound handlers. + 4. On close: deregister; if no devices remain, ensure pending outbox + frames have push fired. +- **Routing:** `emit(chat_id, frame)` → broadcast to **all** connected + devices (no per-chat subscribe; single-user model). Global frames + (`channel.*`, `status`) also broadcast to all. +- **Heartbeat:** WS ping/pong + app-level `ping`/`pong`; dead peers reaped. +- **Backpressure:** per-connection send queue with a bounded buffer; drop + `message.update` (coalesce to latest) under pressure, never drop + `message`/`tool.end`/`notification`. + +## 3.5 State & storage (all under `get_hermes_home()/"android"`) + +> Use `get_hermes_home()` from `hermes_constants` for **all** paths (profile-safe). +> Never hardcode `~/.hermes`. + +- `devices.db` — device registry (device_id, name, caps, fcm_token, ntfy_topic, + last_seen, created). +- `channels.db` — channel directory (chat_id, name, kind: default|channel|thread, + parent_chat_id, created, is_default). +- `outbox.db` — undelivered frames per chat_id + monotonic cursor. +- `media/` — inbound + outbound media cache (reuse hermes `cache_*_from_bytes` + dirs where possible). + +## 3.6 Config resolution + +- **Secrets (`.env`):** `ANDROID_TOKEN`, `ANDROID_FCM_SERVICE_ACCOUNT`, + `ANDROID_FCM_SERVER_KEY`, `ANDROID_WS_CERT/KEY`, `NTFY_TOPIC` (if secret). +- **Behavioral (`config.yaml` → `gateway.platforms.android.extra`):** `host`, + `port`, `home_channel`, `allowed_users`, `push_backend`, `outbox_retention_hours`, + `max_upload_bytes`, `tls`. +- Env vars override `config.yaml` (hermes convention). Read secrets with the + scope-aware `_get_scoped_secret` pattern (see `plugins/platforms/irc/adapter.py:42`) + so multiplexed profiles don't leak each other's tokens. + +## 3.7 Failure & lifecycle safety + +- WS server bind failure → `_set_fatal_error("bind_failed", …, retryable=True)`. +- All outbound sends are best-effort; a dead socket latches and the frame falls + to the outbox. +- `disconnect()` cancels the server task and closes sockets cleanly. +- Token/PII redaction in all logs (hermes PII policy). \ No newline at end of file diff --git a/docs/04-wire-protocol.md b/docs/04-wire-protocol.md new file mode 100644 index 0000000..7d37614 --- /dev/null +++ b/docs/04-wire-protocol.md @@ -0,0 +1,327 @@ +# 04 — Wire Protocol + +JSON frames over a single WebSocket. One connection per device. Text frames are +JSON; media travels as **binary frames** (chunked) referenced by a header frame. + +## Envelope + +Every frame: + +```json +{ + "v": 1, + "id": 42, // optional; present on requests + their responses + "type": "message", // frame type (below) + "chat_id": "android:default", // optional; scope for chat-scoped frames + "thread_id": "t_123", // optional + "payload": { } // type-specific object +} +``` + +- `v` — protocol version (currently `1`). Server rejects unknown major versions. +- `id` — request id (client-chosen). Responses/acks echo it. Events have no `id`. +- `chat_id` / `thread_id` — top-level for convenience; may also be in `payload`. +- Unknown `type`s are ignored (forward-compat); unknown `payload` fields ignored. + +**Binary media frames** are not JSON. A media transfer is: one JSON header frame +(`media.upload.start` / `media.pull` ack) followed by raw binary frames, then a +JSON `media.upload.end` / final ack. See `07-media.md`. + +## Server → App (events / responses) + +### `hello.ack` +Pairing succeeded. +```json +{"type":"hello.ack","payload":{ + "server_caps":{"streaming":true,"reasoning":true,"tools":true,"media":true, + "search":true,"push":"fcm","pickers":true}, + "sync_cursor":1042, + "channels":[{"chat_id":"android:default","name":"Default","kind":"default","is_default":true}] +}} +``` + +### `message` +A final / standalone message. +```json +{"type":"message","chat_id":"android:default","thread_id":null, + "payload":{ + "message_id":"m_9001","role":"assistant", + "text":"Here is the answer…", + "reasoning":"The user asked… so I will…", // optional; render ABOVE text + "media":[{"media_id":"md_5","kind":"video","mime":"video/mp4","size":123456, + "filename":"clip.mp4"}], // optional + "reply_to":"m_8999", // optional + "model":"qwen3-27b","tokens":11,"ts":1724000000000 + }} +``` +`role` ∈ `user | assistant | system | cron`. `reasoning` present only when the +agent produced reasoning and `show_reasoning` is on. + +### `message.start` / `message.update` / `message.stop` +Streaming a bubble. `update` carries the **full** current text (app replaces). +```json +{"type":"message.start","chat_id":"…","payload":{"message_id":"m_9002","role":"assistant"}} +{"type":"message.update","chat_id":"…","payload":{"message_id":"m_9002","text":"partial…"}} +{"type":"message.stop","chat_id":"…","payload":{"message_id":"m_9002","final_text":"full…", + "reasoning":"…","model":"…","tokens":11}} +``` + +### `commentary` +Intermediate assistant beat (between tool iterations). +```json +{"type":"commentary","chat_id":"…","payload":{"message_id":"m_9003","text":"Let me inspect the repo first."}} +``` + +### `tool.start` / `tool.progress` / `tool.end` +**Structured** tool events. The app decides how much to show (everything / +truncated / nothing). +```json +{"type":"tool.start","chat_id":"…","payload":{ + "index":3,"name":"terminal","preview":"pytest -q","args":{"command":"pytest -q"}}} +{"type":"tool.progress","chat_id":"…","payload":{"index":3,"name":"terminal","note":"running…"}} +{"type":"tool.end","chat_id":"…","payload":{"index":3,"name":"terminal","ok":true,"duration":12.4, + "output_preview":"12 passed"}} +``` +`args` may be large; the app truncates per its setting. `output_preview` is a +short tail (full output is not streamed — it lives in agent history). + +### `typing` / `typing.stop` +```json +{"type":"typing","chat_id":"…","payload":{"on":true}} +``` + +### `notification` +In-app banner (foreground) and/or push mirror (background). +```json +{"type":"notification","chat_id":"…","payload":{ + "kind":"channel_renamed","title":"ARIA","body":"Renamed topic to …","ts":1724000000000}} +``` +`kind` ∈ `channel_renamed | channel_created | cron | approval | clarify | generic`. + +### `picker.model` / `picker.choice` / `picker.clarify` / `picker.approval` / `picker.confirm` +Interactive prompts. App renders a native picker; answers via `picker.select`. +```json +{"type":"picker.model","chat_id":"…","payload":{ + "picker_id":"pm_1","current_model":"qwen3-27b","current_provider":"local", + "providers":[{"id":"local","label":"Local","models":[{"id":"qwen3-27b","label":"Qwen3 27B"}]}]}} +{"type":"picker.choice","chat_id":"…","payload":{ + "picker_id":"pc_1","title":"Reasoning effort","choices":[ + {"value":"low","label":"Low"},{"value":"high","label":"High","is_current":true}]}} +``` + +### `channel.list` / `channel.created` / `channel.renamed` / `channel.deleted` +Channel directory updates. **Broadcast to all connected devices** (no explicit +subscribe; the server pushes to every open WS). +```json +{"type":"channel.created","payload":{"chat_id":"android:chan_7","name":"Cron Reports", + "kind":"channel","parent_chat_id":null}} +``` + +### `history` +Response to a `history` request. Returns a page of messages for a chat/thread. +```json +{"type":"history","id":20,"chat_id":"android:default","thread_id":null, + "payload":{ + "messages":[ + {"message_id":"m_8990","role":"user","text":"Hi","ts":1723990000000}, + {"message_id":"m_8991","role":"assistant","text":"Hello!","reasoning":"…", + "model":"qwen3-27b","tokens":8,"ts":1723990001000} + ], + "has_more":true, + "oldest_message_id":"m_8990" + }} +``` +`messages` are ordered oldest → newest. Paginate with `before_message_id` in the +request. The app uses this to **populate the initial view** when a channel is +opened (complements `sync`, which only replays undelivered outbox frames). + +### `commands.catalog` +Response to a `commands.catalog` request. Full slash-command list. +```json +{"type":"commands.catalog","id":21,"payload":{ + "commands":[ + {"name":"/new","description":"Start a new session","args_hint":"","category":"session"}, + {"name":"/model","description":"Switch model","args_hint":"","category":"config"}, + {"name":"/reasoning","description":"Toggle reasoning effort","args_hint":"[low|medium|high]","category":"config"}, + {"name":"/status","description":"Show session status","args_hint":"","category":"info"}, + {"name":"/cron","description":"Manage cron jobs","args_hint":"","category":"automation"}, + {"name":"/tools","description":"List available tools","args_hint":"","category":"info"} + ]}} +``` + +### `commands.complete` +Response to a `commands.complete` request. Autocomplete matches for a typed prefix. +```json +{"type":"commands.complete","id":22,"payload":{ + "prefix":"/mod", + "matches":[ + {"name":"/model","description":"Switch model","args_hint":""} + ]}} +``` + +### `agent.busy` / `agent.idle` +Agent lifecycle for a chat/thread. App shows a "thinking…" indicator on `busy`. +```json +{"type":"agent.busy","chat_id":"android:default","thread_id":null, + "payload":{"reason":"processing"}} +{"type":"agent.idle","chat_id":"android:default","thread_id":null,"payload":{}} +``` +`reason` ∈ `processing | tool | waiting_input | cron`. + +### `search.results` +```json +{"type":"search.results","id":7,"payload":{ + "query":"deploy","scope":"all","hits":[ + {"message_id":"m_123","chat_id":"android:chan_7","thread_id":null, + "role":"assistant","snippet":"…deploy the service…","ts":1723900000000}]}} +``` + +### `media.offer` +Agent-sent media is available; app pulls bytes. +```json +{"type":"media.offer","chat_id":"…","payload":{ + "media_id":"md_5","kind":"video","mime":"video/mp4","size":123456,"filename":"clip.mp4"}} +``` + +### `status` +Gateway lifecycle / session info. +```json +{"type":"status","payload":{"state":"online","session":{"chat_id":"…","model":"…","tokens":11}}} +``` +`state` ∈ `online | restarting | degraded`. + +### `error` +```json +{"type":"error","id":7,"payload":{"code":"not_found","message":"chat_id unknown"}} +``` +`code` ∈ `auth | not_found | rate_limited | media_too_large | unsupported | internal`. + +### `pong` +Keepalive reply to `ping`. + +## App → Server (requests / actions) + +### `hello` +First frame; auth + caps. +```json +{"type":"hello","payload":{ + "token":"","device_id":"dev_a1b2","device_name":"MIX 2S", + "caps":{"min_protocol":1,"media":true,"push":"fcm"}, + "fcm_token":"","ntfy_topic":""}} +``` + +### `message.send` +Send text (or a `/slash-command`). +```json +{"type":"message.send","id":10,"chat_id":"android:default","thread_id":null, + "payload":{"text":"/model qwen3-27b","reply_to":"m_9001","media_refs":["mu_1"]}} +``` +`media_refs` reference completed `media.upload`s to attach. + +### `media.upload.start` / (binary) / `media.upload.end` +See `07-media.md`. +```json +{"type":"media.upload.start","id":11,"payload":{ + "media_ref":"mu_1","kind":"image","mime":"image/jpeg","size":204800,"filename":"a.jpg"}} +// … binary frames … +{"type":"media.upload.end","id":11,"payload":{"media_ref":"mu_1","sha256":"…"}} +``` + +### `media.pull` +Request agent-sent media bytes. +```json +{"type":"media.pull","id":12,"payload":{"media_id":"md_5"}} +// server replies: binary frames, then {"type":"media.pull.end","id":12,"payload":{"ok":true}} +``` + +### `picker.select` +Answer an interactive picker. +```json +{"type":"picker.select","id":13,"payload":{"picker_id":"pm_1","value":"local/qwen3-27b"}} +``` + +### `channel.create` / `channel.rename` / `channel.set_default` / `channel.delete` +```json +{"type":"channel.create","id":14,"payload":{"name":"Cron Reports","kind":"channel"}} +{"type":"channel.rename","id":15,"chat_id":"android:chan_7","payload":{"name":"Reports"}} +{"type":"channel.set_default","id":16,"chat_id":"android:chan_7","payload":{}} +``` + +### `search` +```json +{"type":"search","id":17,"payload":{"query":"deploy","scope":"all"}} +{"type":"search","id":18,"payload":{"query":"deploy","scope":"chat","chat_id":"android:chan_7","thread_id":null}} +``` +`scope` ∈ `all | chat`. + +### `read.receipt` +App → server: "user has viewed this message." Server stores the read state and +broadcasts to other devices (for multi-device ✓✓ sync). The app uses it to +mark messages as read locally (✓✓ on user bubbles). +```json +{"type":"read.receipt","payload":{"chat_id":"android:default","message_id":"m_9001"}} +``` + +### `history` +Load a page of messages for a chat/thread (initial open, scroll-up pagination). +```json +{"type":"history","id":20,"chat_id":"android:default","thread_id":null, + "payload":{"before_message_id":"m_8990","limit":50}} +``` +`before_message_id` — return messages older than this (omit for newest page). +`limit` — max messages (default 50, max 200). + +### `commands.catalog` +Fetch the full slash-command catalog (for the `Menü` bottom sheet). +```json +{"type":"commands.catalog","id":21,"payload":{}} +``` + +### `commands.complete` +Autocomplete for a typed `/prefix`. +```json +{"type":"commands.complete","id":22,"payload":{"prefix":"/mod"}} +``` + +### `agent.stop` +Stop the current agent turn (abort generation / tool execution). +```json +{"type":"agent.stop","id":23,"chat_id":"android:default","thread_id":null,"payload":{}} +``` + +### `agent.steer` +Inject a steering message mid-turn (redirects the agent without a new turn). +```json +{"type":"agent.steer","id":24,"chat_id":"android:default","thread_id":null, + "payload":{"text":"Actually, focus on the error case."}} +``` + +### `sync` +Reconnect catch-up. Replays **undelivered outbox frames** (frames sent while +this device was offline). Does NOT load full history — use `history` for that. +```json +{"type":"sync","id":19,"payload":{"cursor":1042}} +// server replays outbox frames with cursor > 1042, then {"type":"sync.done","id":19,"payload":{"cursor":1099}} +``` + +### `fcm.register` +Update push token. +```json +{"type":"fcm.register","payload":{"fcm_token":"","ntfy_topic":""}} +``` + +### `ping` +Keepalive. `{"type":"ping","payload":{"ts":1724000000000}}` → `pong`. + +## Ordering & reliability + +- Frames are ordered per connection (TCP/WS). Streaming `message.update` frames + for a `message_id` are monotonic; the app may coalesce to the latest. +- Terminal frames (`message`, `message.stop`, `tool.end`, `notification`, + `picker.*`, `channel.*`, `agent.busy`, `agent.idle`, `history`, + `commands.catalog`, `commands.complete`) are **never dropped** under + backpressure; only intermediate `message.update`/`tool.progress` are coalesced. +- Anything not delivered live goes to the **outbox** and is replayed by `sync`. +- **Broadcast:** channel directory events (`channel.*`) and read-receipts are + pushed to **all** connected devices for that gateway (no subscribe step). +- Requests get exactly one response or `error` (matched by `id`). \ No newline at end of file diff --git a/docs/05-streaming.md b/docs/05-streaming.md new file mode 100644 index 0000000..5d85a64 --- /dev/null +++ b/docs/05-streaming.md @@ -0,0 +1,143 @@ +# 05 — Streaming, Reasoning, Tools, Intermediate Messages + +This doc covers the four "agent transparency" features and exactly how each is +produced by the gateway and rendered by the app. + +> The main hermes gateway delivers via the **legacy callback path** (not the +> ACP-only event-native `render_message_event` path). We map the legacy +> `send`/`edit_message`/progress calls to our WS frames. + +## 5.1 Text streaming + +**Gateway side.** The agent's `stream_delta_callback` feeds a +`GatewayStreamConsumer` (`gateway/stream_consumer.py:156`). The consumer +accumulates text and, at intervals / thresholds, calls: +- `adapter.send(chat_id, text)` — first time a bubble is created. +- `adapter.edit_message(chat_id, message_id, text)` — subsequent updates + (each carries the **full** accumulated text). + +**Adapter → frames.** +- First `send()` of a turn segment → `message.start {message_id, role}`. +- Each `edit_message()` → `message.update {message_id, text}` (full text). +- Segment/turn finalization → `message.stop {message_id, final_text, reasoning?, + model?, tokens?}` (or a final `message` frame when not streaming). + +**App side.** Maintain a live bubble per `message_id`. On `message.update`, +replace the bubble text (cheap: it's a full snapshot). On `message.stop`, +finalize (attach reasoning/model/tokens footer, stop the cursor). Auto-scroll +while the user is at the bottom. + +**Streaming on/off.** Controlled by hermes `display.platforms.android.streaming` +(default follows global). When off, the app just gets one final `message` frame. + +## 5.2 Reasoning (shown *before* the message) + +**Requirement:** reasoning appears as a block **above** the answer (like the +reference screenshot's "Reasoning:" panel with a copy button). + +**Gateway side.** hermes prepends reasoning to the final response when +`show_reasoning` is enabled (`gateway/run.py:20089`). The format is stable and +chosen by `reasoning_style` (`gateway/display_config.py:37`): +- `code` (default): `💭 **Reasoning:**\n```\n\n```\n\n` +- `blockquote`: `> 💭 **Reasoning:**\n> …\n\n` +- `subtext`: `-# 💭 Reasoning\n-# …\n\n` (Discord-style) + +**Plugin config.** Set for the `android` platform: +```yaml +display: + platforms: + android: + show_reasoning: true + reasoning_style: code # we split on the code-fence form +``` + +**Adapter split.** In `send()`, detect the `code`-style prefix and split: +``` +prefix = "💭 **Reasoning:**\n```\n" +# find the closing "\n```\n\n" after the prefix +reasoning = text[len(prefix):close_idx] +body = text[close_idx + len("\n```\n\n"):] +``` +Emit `message {reasoning: , text: , …}`. If no prefix is found +(reasoning off / no reasoning), emit `message {text: …}` with no `reasoning`. + +> Robustness: the split is a best-effort parse of a *stable, gateway-owned* +> format. If the format ever changes, the fallback is "no reasoning field, full +> text" — the app still shows the answer. Verified in M2 against the live +> gateway. + +**App side.** `ReasoningBlock` composable: collapsible, header "💭 Reasoning", +monospace body, a **copy** button (matches reference). Rendered **above** the +message body. Collapsed by default if long; expanded tap. + +## 5.3 Tool output (app controls verbosity) + +**Requirement:** hermes supports several tool-display modes; the **gateway sends +full structured data**, and the **app** chooses how much to show +(everything / truncated / nothing). + +**Gateway side.** Tool activity flows through `tool_progress_callback` → the +gateway progress queue → `send_progress_messages` (`gateway/run.py:4603`) → +`adapter.send()`. The adapter receives tool lines during a turn. + +**Adapter → frames.** The adapter classifies tool activity (via turn-state + +line format) and emits **structured** frames — not pre-formatted strings: +- `tool.start {index, name, preview, args}` — a tool call began. +- `tool.progress {index, name, note}` — in-progress update (optional). +- `tool.end {index, name, ok, duration, output_preview}` — completed. + +`index` is a monotonic per-turn counter so the app correlates start→end. +`args` is the full argument dict (the app truncates). `output_preview` is a +short tail; full tool output is **not** streamed (it lives in agent history and +is reachable via search). + +**App side — the verbosity setting** (Settings → "Tool detail"): +- **Everything** — show tool name, full args (collapsible), and output preview. +- **Truncated** (default) — show `emoji name: "short preview"` one-liner, + collapsible to expand. +- **Nothing** — suppress `tool.*` frames entirely (clean chat). + +Rendering: a `ToolCard` per tool, grouped under the message it belongs to, with +a spinner while `tool.end` hasn't arrived, a ✓/✗ on completion, and duration. + +> Classification detail: the exact way to distinguish a tool-progress `send()` +> from a regular `send()`/commentary is confirmed empirically in M2 by running +> the real gateway with a test WS client and observing the calls. The adapter +> keeps a per-chat turn state machine (turn active, current streaming id, last +> tool index) to make the classification deterministic. + +## 5.4 Intermediate messages (commentary) + +**Requirement:** show the agent's interim beats (e.g. "I'll inspect the repo +first.") as distinct messages. + +**Gateway side.** `interim_assistant_callback` → consumer `on_commentary` +(`gateway/stream_consumer.py:518`) → delivered as its own message. + +**Adapter → frames.** `commentary {message_id, text}`. + +**App side.** Render as a **dimmed / smaller** bubble, visually distinct from +final answers (e.g. reduced opacity, no model footer). It reads as a "beat" in +the conversation, not a full reply. + +## 5.5 Typing indicator + +`send_typing` → `typing {on:true}`; the app shows an animated indicator in the +chat header / above the composer until `typing.stop` or the first +`message.start`. + +## 5.6 Frame sequence for a typical turn + +``` +app → message.send {text:"summarize the repo"} +srv → typing {on:true} +srv → message.start {message_id:m1} +srv → message.update {m1, "Let me look…"} (streaming) +srv → tool.start {index:1, name:terminal, args:{command:"ls -la"}} +srv → tool.end {index:1, name:terminal, ok:true, duration:0.4} +srv → commentary {m2, "Found 12 files."} +srv → message.start {message_id:m3} +srv → message.update {m3, "The repo has…"} +srv → message.stop {m3, final_text:"…", reasoning:"…", model:"…", tokens:42} +srv → typing {on:false} +``` \ No newline at end of file diff --git a/docs/06-channels-cron-search.md b/docs/06-channels-cron-search.md new file mode 100644 index 0000000..05e74de --- /dev/null +++ b/docs/06-channels-cron-search.md @@ -0,0 +1,107 @@ +# 06 — Channels, Threads, Cron Delivery, Search + +## 6.1 Concept model + +The hermes gateway already models conversations as `SessionSource` with +`chat_id` + `thread_id` + `chat_topic` (`gateway/platforms/base.py:7047` +`build_source`). We map app concepts onto these existing primitives — **no new +gateway identity concepts**. + +| App concept | hermes primitive | Example | +|---|---|---| +| Default chat | home channel `chat_id` | `android:default` | +| A thread (inside default chat) | `thread_id` under the default `chat_id` | `chat_id=android:default, thread_id=t_12` | +| A user-created channel | a new `chat_id` | `android:chan_7` | +| A thread inside a channel | `thread_id` under that `chat_id` | `chat_id=android:chan_7, thread_id=t_31` | + +- **`chat_id`** = the conversation lane (a channel or the default chat). +- **`thread_id`** = an optional sub-lane within a `chat_id` (topic-like). +- The **channel directory** (plugin SQLite, `channels.db`) stores + `{chat_id, name, kind: default|channel|thread, parent_chat_id, is_default, + created}` and is the source of truth for the app's channel list. + +## 6.2 Default chat + +- On first connect, the plugin ensures a **default channel** exists: + `chat_id = ANDROID_HOME_CHANNEL` (default `android:default`), `kind=default`, + `is_default=true`, name "Default". +- It is also the **cron home channel** (`cron_deliver_env_var= + ANDROID_HOME_CHANNEL`), so `deliver=android` (bare) routes here. +- The app opens the default chat on launch. + +## 6.3 Threads (toggle for overview) + +- **Requirement:** a default chat where the user can **activate threads** for a + better overview, or not. +- **Thread toggle** (per default chat, in the chat header menu): + - **Threads OFF** — flat conversation; all messages use `thread_id=null`. + - **Threads ON** — the app groups the conversation into topic-like lanes. + Each new "topic" mints a `thread_id` (via `channel.create {kind:thread, + parent_chat_id:android:default}` or an implicit thread). The UI shows a + topic switcher (like Telegram topics) above the message list. +- Threads are **app-organized** but **gateway-real**: each `thread_id` is a + distinct hermes session lane, so context is isolated per thread and cron can + target a specific thread. +- The gateway's `create_handoff_thread` is used where hermes wants to open a + named thread (e.g. continuable cron). + +## 6.4 User-created channels (for cron delegation) + +- **Requirement:** the user creates new channels so **cron job outputs can be + delegated to them** instead of the default chat. +- **`channel.create {name, kind:"channel"}`** → plugin mints + `chat_id = android:chan_`, stores in directory, broadcasts + `channel.created` to all devices. The new channel appears in the channel list. +- **`channel.rename` / `channel.set_default` / `channel.delete`** manage the + directory (rename broadcasts `channel.renamed`; delete is soft — marks + archived, keeps history for search). +- **Cron targeting** (the key payoff): because the plugin registers + `parse_target_ref_fn` and `cron_deliver_env_var`, cron jobs and the + `send_message` tool can target any channel/thread: + - `deliver="android"` → home (default) channel. + - `deliver="android:android:chan_7"` → that channel. + - `deliver="android:android:chan_7:t_31"` → that channel's thread. + - In-chat: the agent's `cronjob` tool can be told "deliver to the *Cron + Reports* channel"; the gateway resolves the name via the channel directory. +- **In-app affordance:** each channel's menu has "Set as cron target" / shows a + badge when a cron job points at it, and the channel name is offered in the + `/cron` creation flow. + +## 6.5 Cron delivery mechanics (how it works under the hood) + +- Cron resolves delivery targets in `cron/scheduler.py:2148` + (`_resolve_single_delivery_target`). For `platform:chat_id[:thread_id]` it + calls `tools.send_message_tool.resolve_send_target`, which uses our + `parse_target_ref_fn` to parse `android:[:]`. +- Delivery then calls the **live adapter's `send(chat_id, text, …)`** (gateway + running) → our WS `message` frame (or outbox+push if the app is offline). +- Cron deliveries are framed with a `[Cron delivery: ]` header by hermes; + the app can style cron messages distinctly (e.g. a small "⏰ " + chip) using the `role:"cron"` / header. +- **Mirror option:** hermes `cron.mirror_delivery` (default off) can also mirror + a cron delivery into the origin session; we leave it off to keep channels + clean. + +## 6.6 Search + +- **Requirement:** search with settings "search everywhere" / "search in this + chat/channel". +- **Backend:** hermes's session store is **SQLite + FTS5** + (`hermes_state.py`, `hermes_state_search.py`). The plugin's `search.py` opens + the session DB read-only and runs FTS5 queries. +- **`search` frame** → `search.results`: + - `scope:"all"` — search **everywhere** (all channels/threads/sessions). + - `scope:"chat"` — restrict to the given `chat_id` (and optional `thread_id`). +- **Result hit:** `{message_id, chat_id, thread_id, role, snippet, ts}`. The app + renders a results list; tapping a hit navigates to that channel/thread and + scrolls to + highlights the message. +- **Query syntax:** plain text (FTS5). Optional `role:` / `channel:` qualifiers + are a nice-to-have; v1 is plain-text + scope. +- **Privacy:** search is local to the user's own hermes home; no data leaves the + machine. + +## 6.7 Channel list frame + +`hello.ack` and `channel.*` frames carry the directory. App keeps a local copy +(Room) and reconciles on `channel.*` events (merge, don't clobber — see +`10-android-app.md` state rules). \ No newline at end of file diff --git a/docs/07-media.md b/docs/07-media.md new file mode 100644 index 0000000..6a220de --- /dev/null +++ b/docs/07-media.md @@ -0,0 +1,96 @@ +# 07 — Media (upload, download, playback) + +Media travels **over the WebSocket** as chunked binary frames (decision: no +separate HTTP server; keeps the plugin to `websockets` only). Both directions +use the same chunking. + +## 7.1 Kinds & MIME + +`kind` ∈ `image | audio | video | document | voice`. +- `image` — `image/*` (jpg/png/webp/gif/heic). +- `audio` — `audio/*` (mp3/m4a/ogg/…) — music. +- `video` — `video/*` (mp4/webm/mov). +- `document` — anything else (pdf, docx, zip, txt, …). +- `voice` — short voice note (`audio/ogg; codecs=opus` typical). + +The app sniffs `kind` from the picked file's MIME; the plugin re-sniffs on +receipt (don't trust the client) using hermes helpers +(`gateway/platforms/base.py` `_sniff_audio_ext`, `_looks_like_image`). + +## 7.2 Inbound (app → agent) — `media.upload` + +**Flow:** +1. App picks a file (SAF) → reads size + MIME. +2. App sends `media.upload.start {media_ref, kind, mime, size, filename}`. +3. App streams the file as **binary WS frames** (e.g. 256 KiB chunks). +4. App sends `media.upload.end {media_ref, sha256}`. +5. Plugin verifies size ≤ `max_upload_bytes` and sha256, writes to the media + cache via hermes `cache_*_from_bytes`: + - image → `cache_image_from_bytes` + - audio/voice → `cache_audio_from_bytes` + - video → `cache_video_from_bytes` + - document → `cache_document_from_bytes` + → returns a local path. +6. The path is attached to the next `message.send` via `media_refs`, becoming + `MessageEvent.media_urls` + `media_types` + (`gateway/platforms/base.py:2337`). The agent's vision/audio tools can then + read the file. + +**Limits:** `get_inbound_media_max_bytes()` / `validate_inbound_media_size` +(`base.py:758/779`) enforce the cap; over-limit → `error {code:"media_too_large"}`. + +**Backpressure:** large uploads use the WS flow control; the plugin reads +binary frames into a temp file (not memory) to bound RAM. + +## 7.3 Outbound (agent → app) — `media.offer` / `media.pull` + +**Flow:** +1. Agent produces/references media (e.g. generates an image, or replies with a + `MEDIA:` tag / image URL). hermes base `extract_media` / `extract_images` + (`base.py:4439/4884`) pull these out and call the adapter's + `send_image / send_video / send_document / send_voice / send_image_file / + send_multiple_images`. +2. Adapter stages the file in the media cache, mints a `media_id`, and emits + `media.offer {media_id, kind, mime, size, filename}` (inside/with the + `message` frame's `media[]`). +3. App sends `media.pull {media_id}`. +4. Plugin streams the file as **binary WS frames**; ends with + `media.pull.end {ok:true}`. +5. App writes to its cache dir and hands the path to the player/viewer. + +**Security:** `validate_media_delivery_path` (`base.py:1684`) + the media +delivery root/recency/denied-path checks (`base.py:1312-1480`) ensure the plugin +only serves files hermes is allowed to deliver (no arbitrary file read). + +## 7.4 Live playback (AI-sent music/video) + +**Requirement:** play AI-sent music and video **in the app**. + +- **Audio (music/voice):** `ExoPlayer` (Media3). Inline player in the bubble + (play/pause, seek, duration); a persistent **mini-player** for music that + survives navigation. Voice notes play inline with a waveform. +- **Video:** `ExoPlayer` inline player (play/pause, seek, fullscreen, PiP on + Android). Streams from the local cache file after `media.pull`. +- **Documents/images:** image viewer (zoom) / open-with for documents (Android + `Intent.ACTION_VIEW` with a `FileProvider` URI; Desktop opens with the system + handler). +- **Desktop:** ExoPlayer is Android-only → the `MediaPlayer` expect/actual uses + a desktop backend (see `11-desktop-app.md`): a `libmpv`/`mpv`-backed surface + or a WebView fallback for video, and a desktop audio player for music. + +## 7.5 Chunking parameters + +- Chunk size: **256 KiB** (tunable). +- Binary frames carry raw bytes only; framing/metadata is in the JSON header + + end frames. +- Reassembly is ordered (WS preserves order); a gap/corruption → abort + + `error {code:"internal"}` + retry the whole transfer. +- `sha256` in `media.upload.end` / a size check on pull verify integrity. + +## 7.6 App-side storage + +- Cache dir: app-specific external cache (`getExternalCacheDir()/media`). +- LRU eviction by size (configurable, default 500 MB) so old media doesn't fill + the device. +- A `MediaRepository` tracks `{media_id, local_path, kind, size, ts}` in Room so + bubbles can re-render players after process death. \ No newline at end of file diff --git a/docs/08-push.md b/docs/08-push.md new file mode 100644 index 0000000..4f356a1 --- /dev/null +++ b/docs/08-push.md @@ -0,0 +1,105 @@ +# 08 — Push Notifications, Outbox & Sync + +The gateway can't reach a sleeping phone directly. Push goes through a cloud +relay. **Decision: FCM primary, ntfy fallback** (`ANDROID_PUSH_BACKEND`). + +## 8.1 When push fires + +- A frame targets a `chat_id` whose device is **disconnected** (WS closed) → + drop to **outbox** + fire **push**. +- Also fire push for high-priority foreground events the user should see even if + the app is backgrounded (approvals, clarifies, cron completions) — the app + decides whether to also show an in-app banner. +- If the device is **connected**, no push (the live frame is enough). + +## 8.2 `PushBackend` interface (`push.py`) + +```python +class PushBackend(Protocol): + name: str + async def send(self, *, device_id: str, chat_id: str, + title: str, body: str, + data: dict) -> bool: ... + def configured(self) -> bool: ... +``` + +Selected at adapter init by `ANDROID_PUSH_BACKEND` (`fcm` default, `ntfy`). + +### 8.2.1 `FcmBackend` (primary) +- **FCM HTTP v1 API** via `httpx` (core dep). Auth = Firebase **service + account** (`ANDROID_FCM_SERVICE_ACCOUNT` JSON path) → mint a short-lived + OAuth2 access token (cached, refreshed before expiry). +- Fallback: legacy **server key** (`ANDROID_FCM_SERVER_KEY`) if no service + account (simpler, but legacy). +- Target = the device's **FCM token** (registered via `hello` / + `fcm.register`, stored in `devices.db`). +- Payload: + - `notification {title, body}` → system notification (tap → open app). + - `data {chat_id, thread_id, kind, message_id, cursor}` → app uses to `sync`. +- **Data-only option:** for background catch-up, send a data message (silent) so + the app's `FirebaseMessagingService` wakes a foreground service and syncs + without a visible notification (used for non-urgent updates). +- Batch: FCM allows up to 500 tokens/message; we send per-device (1 user, few + devices). + +### 8.2.2 `NtfyBackend` (fallback, self-host friendly) +- Reuses hermes's existing ntfy publish path (hermes ships an ntfy adapter). +- Publish to `NTFY_TOPIC` on `NTFY_SERVER_URL` (default `https://ntfy.sh`) via + `httpx` POST, with an `X-Title` / `X-Message` / `X-Tag` / `X-Priority` and a + JSON `data` attachment (`{chat_id, thread_id, kind, cursor}`). +- The app subscribes to the topic (via an ntfy client lib or a lightweight + listener) to receive pushes without Firebase. +- Best for users who self-host ntfy and want zero Firebase. + +## 8.3 Outbox (`outbox.py`) + +- SQLite `outbox.db`: rows `{cursor (monotonic), chat_id, thread_id, frame_json, + ts, delivered}`. +- **Write** on every outbound frame that has no live subscriber (or always, then + mark delivered on live send — simpler + crash-safe). +- **Retention:** `outbox_retention_hours` (default 72h); prune on write. +- **Cursor:** global monotonic int; `hello.ack` returns the current cursor; + `sync {cursor}` replays rows with `cursor > given`. +- Bounded: if the outbox grows past a cap (e.g. 5k rows), oldest are pruned and + a `notification {kind:"generic", body:"Older messages pruned"}` is sent. + +## 8.4 Sync (reconnect catch-up) + +1. App reconnects → `hello` → `hello.ack {sync_cursor}`. +2. App sends `sync {cursor: }`. +3. Server replays outbox frames (in cursor order) → app applies them (messages, + tools, channels, media offers). +4. Server sends `sync.done {cursor: }`. +5. App updates its local cursor (Room) — idempotent (dedupe by `message_id`). + +This makes the app **eventually consistent** across disconnects, restarts, and +gateway restarts. + +## 8.5 App-side push handling (Android) + +- **`FirebaseMessagingService.onMessageReceived`** (foreground): show in-app + banner + optionally sync. +- **`onNewToken`** → `fcm.register` the new token. +- **Background data message** → start a **foreground service** (low-priority, + notification channel "Sync") → open WS → `sync` → stop. +- **Notification channels** (Android 8+): one per chat so cron channels can have + their own style/priority (e.g. "Cron Reports" = high, "Default" = default). + Tapping a notification deep-links to the chat/thread. +- **ntfy mode:** a foreground service maintains the ntfy subscription; incoming + events trigger the same sync path. + +## 8.6 In-app banners (foreground) + +`notification` frames (e.g. `channel_renamed`, `approval`, `clarify`, `cron`) +render as a transient banner above the composer (like the reference screenshot's +"ARIA hat Thema … umbenannt"). Dismissible; high-priority ones (approval/clarify) +persist until acted on. + +## 8.7 Security + +- FCM tokens are per-device, revocable; stored only in `devices.db`. +- Push payloads carry **no secrets** and no full message bodies larger than a + short preview (privacy on lock screen). Full content is fetched via `sync` + over the authenticated WS. +- ntfy: use a **private topic + auth token** for any real trust boundary (hermes + ntfy adapter guidance). \ No newline at end of file diff --git a/docs/09-pairing-security.md b/docs/09-pairing-security.md new file mode 100644 index 0000000..3a2322c --- /dev/null +++ b/docs/09-pairing-security.md @@ -0,0 +1,95 @@ +# 09 — Pairing, Auth & Security + +## 9.1 Threat model + +- **Trusted domain:** a personal agent on the user's own machine; one owner, a + few of their own devices (phone + desktop). +- **Primary risks:** (a) an unauthorized device connecting to the WS and + reading/driving the agent; (b) eavesdropping on the WS in transit; (c) token + leakage in logs; (d) arbitrary file read via media pull. +- **Not addressing (v1):** multi-tenant isolation, adversarial multi-user abuse, + E2E encryption. + +## 9.2 Pairing flow + +1. **Generate a token.** `hermes gateway setup` (our `interactive_setup`) either + uses an existing `ANDROID_TOKEN` or generates a fresh high-entropy token + (e.g. 32 bytes → 64 hex chars) and stores it in `.env`. +2. **Present to the app.** Two options: + - **QR code:** the setup prints a QR encoding + `iris://pair?host=&port=8790&token=` (or a WSS URL). The + phone scans it with the app's camera (or a system scanner) → pre-fills + settings. + - **Manual:** user types the server URL + token in the app's Connect screen. +3. **App connects.** First WS frame is `hello {token, device_id, device_name, + caps, fcm_token?}`. +4. **Server verifies.** Constant-time compare of `token` vs `ANDROID_TOKEN` + (`hmac.compare_digest`). Optionally check `device_id` against + `ANDROID_ALLOWED_USERS` (if set) or `ANDROID_ALLOW_ALL_USERS`. +5. **On success:** register the device in `devices.db`, send `hello.ack`. + **On failure:** send `error {code:"auth"}` and close. + +`device_id` is a stable, app-generated UUID (persisted in the app's +secure storage). It identifies the device for routing + push, **not** as a +security principal (the token is). + +## 9.3 Auth model + +- **Token = the security principal.** Any connection presenting the valid + `ANDROID_TOKEN` is authorized (it's the user's own token). +- **Allowlist (optional):** `ANDROID_ALLOWED_USERS` (comma-separated + `device_id`s) restricts which *devices* may connect even with the token — + useful if the token is shared. `ANDROID_ALLOW_ALL_USERS=true` disables the + allowlist (dev only). +- **Per-device tokens (stretch):** mint a unique token per device at pairing + (revocable) instead of one shared token. v1 uses the shared token + optional + device allowlist. +- **Re-pairing:** rotating `ANDROID_TOKEN` invalidates all devices; they must + re-pair. `hermes android pair` (stretch CLI) re-issues + prints a new QR. + +## 9.4 Transport security + +- **Default (LAN/dev):** plain `ws://` on the trusted LAN. Fine for a home + network. +- **WSS (recommended for remote):** set `ANDROID_WS_CERT` / `ANDROID_WS_KEY` + (self-signed or CA-signed). The app pins/accepts the cert (self-signed → user + confirms fingerprint on first pair, like a SSH host key). +- **Remote reachability options** (documented, user's choice): + - **Tailscale / WireGuard** (recommended): gateway gets a stable tailnet IP; + app connects over the private mesh. No public exposure. + - **Reverse proxy / tunnel** (Caddy, Cloudflare Tunnel, ngrok): terminate TLS + at the edge, forward WS to `127.0.0.1:8790`. + - **Public bind** (`0.0.0.0`) + WSS + strong token — last resort. +- The app stores the server URL + (for self-signed) the pinned cert fingerprint + in secure storage. + +## 9.5 Secret & PII handling + +- **Tokens/keys never logged.** Redact `ANDROID_TOKEN`, FCM tokens/keys, ntfy + tokens in all log output (hermes PII policy; `agent/redact.py` patterns). +- **`device_id`** is a random UUID (not PII). `device_name` is user-chosen. +- **Media pull** is gated by hermes `validate_media_delivery_path` + delivery + root/recency/denied-path checks (`gateway/platforms/base.py:1684`) — the + plugin can only serve files hermes is allowed to deliver (no arbitrary file + read). +- **Search** is local-only (user's own hermes home); no data leaves the machine. + +## 9.6 Profile safety + +- All plugin state lives under `get_hermes_home()/"android"` (profile-aware). +- Secrets are read with the scope-aware `_get_scoped_secret` pattern (see + `plugins/platforms/irc/adapter.py:42`) so multiplexed profiles don't leak + each other's tokens (fail-closed under `gateway.multiplex_profiles`). +- The WS bind uses a scoped lock (`gateway.status.acquire_scoped_lock`) so two + profiles can't bind the same port/identity. + +## 9.7 Hardening checklist + +- [ ] Constant-time token compare. +- [ ] Bounded per-connection send buffer + rate limit on inbound frames. +- [ ] Reject oversized frames / uploads (`max_upload_bytes`). +- [ ] Verify media sha256 + re-sniff MIME (don't trust client). +- [ ] Redact all secrets in logs. +- [ ] WSS + cert pinning for remote. +- [ ] Outbox retention cap + prune. +- [ ] Fail-closed secret reads under multiplexing. \ No newline at end of file diff --git a/docs/10-android-app.md b/docs/10-android-app.md new file mode 100644 index 0000000..b0c4c97 --- /dev/null +++ b/docs/10-android-app.md @@ -0,0 +1,197 @@ +# 10 — Android App (Kotlin + Jetpack Compose) + +Native client. Lives in the Compose Multiplatform project at `app/`; the bulk of +the code is in `app/shared` (commonMain) so the Desktop app reuses it. + +## 10.1 Tech stack + +| Concern | Choice | +|---|---| +| Language | Kotlin | +| UI | Jetpack Compose (Material 3), Compose Navigation | +| Async | Kotlinx Coroutines + Flow | +| WS client | OkHttp (`WebSocketListener`) | +| JSON | kotlinx-serialization | +| Local DB | **SQLDelight** (KMP; channels, messages cache, media index, sync cursor, settings) | +| Media playback | Media3 **ExoPlayer** (audio + video) | +| Push | Firebase Messaging (FCM) [primary] / ntfy listener [fallback] | +| DI | Hilt | +| Images | Coil | +| minSdk / target | **26** / 34 (test device: MIX 2S, API 29) | + +## 10.2 Module layout + +``` +app/shared/src/ +├── commonMain/kotlin/iris/ +│ ├── protocol/ # frame data classes (mirror of gateway protocol.py) +│ ├── net/ # GatewayClient (OkHttp WS), reconnect, heartbeat, dispatch +│ ├── data/ # ChannelRepository, MessageRepository, MediaRepository, +│ │ # SearchRepository, SettingsRepository (SQLDelight + WS) +│ ├── state/ # ViewModels: ChatListVM, ChatVM, ComposerVM, SettingsVM +│ ├── ui/ +│ │ ├── theme/ # Material 3 theme (dark default), type, color +│ │ ├── components/ # MessageBubble, ReasoningBlock, ToolCard, MediaPlayer, +│ │ │ # ChannelRow, Composer, PickerSheet, SearchBar, Banner +│ │ └── screens/ # ConnectScreen, ChatListScreen, ChatScreen, +│ │ # SearchScreen, SettingsScreen, ChannelMenu +│ └── util/ # time formatting, markdown, id gen +├── androidMain/kotlin/iris/ +│ ├── platform/ # MediaPlayer actual (ExoPlayer), MediaPicker (SAF), +│ │ # Notifications, SecureStore (EncryptedSharedPreferences) +│ ├── fcm/ # FirebaseMessagingService, foreground sync service +│ └── IrisApp.kt # Application (Hilt), notification channels +└── androidApp/ # MainActivity, AndroidManifest, res, google-services +``` + +## 10.3 `GatewayClient` (net) + +- OkHttp `WebSocket` to `ws(s)://host:port/ws`. +- **Reconnect:** exponential backoff + jitter; on reconnect send `hello` then + `sync {cursor}` (replays undelivered outbox only). +- **Initial channel open:** on first open of a chat/thread, send `history` + (newest page) to populate the view. `sync` does NOT load history. +- **Heartbeat:** send `ping` every 20s; reap on missed `pong` (3×) → reconnect. +- **Request/response:** map of `id → CompletableDeferred`; events → a + `SharedFlow` consumed by repositories. +- **Backpressure:** collect frames on a bounded channel; coalesce + `message.update` per `message_id` (keep latest) to avoid flooding the UI. +- **Thread:** all frame emission on a single dispatcher; UI observes via Flow. + +## 10.4 State rules (from hermes desktop AGENTS.md — apply here) + +- **Server is authoritative** for channels/messages/cursor; the app's Room copy + is a **cache**. Reconcile (merge, don't clobber) on `channel.*`/`sync`. +- **Optimistic then honest:** send a message → show it immediately (pending), + roll back visibly on `error`, authoritative `sync` gets the last word. +- **Guard against the past:** generation counters / request tokens so a stale + response never overwrites newer intent. +- **Isolate the foreground:** only the visible chat publishes into the shared + view; background chats update their own cache quietly. +- **Coalesce noise, flush signal:** batch cosmetic updates; let terminal + transitions (turn done, needs input, failed) reach the user immediately. + +## 10.5 Feature implementation (your checklist) + +### Input box, auto-grow (max height) +- Compose `BasicTextField` inside a `Box` with + `Modifier.heightIn(min = 1.line, max = 160.dp)`. Grows with lines, caps at + 160dp, then scrolls internally. +- Bottom bar (matches reference): `Menü` button (left), emoji button, the + auto-grow field, attach (paperclip), mic/send (right). Send on Enter + (configurable: Enter=send vs Enter=newline). + +### Menu button → all slash commands +- `Menü` opens a **bottom sheet** listing the command catalog. The catalog is + served by the gateway via `commands.catalog` request → response with + `{name, description, args_hint, category}` per command, so it always matches + hermes (`/new`, `/model`, `/reasoning`, `/status`, `/cron`, `/tools`, …). +- Typing `/` in the field shows **autocomplete** via `commands.complete` + request (gateway matches the typed prefix). Selecting inserts `/cmd `. +- Selecting a command sends `message.send {text:"/cmd args"}`. +- **Interactive commands** (`/model`, `/reasoning`, `/fast`, approvals, + clarifies) render as **native pickers** from `picker.*` frames (a dialog / + sheet with the options; answer via `picker.select`). + +### Tool output (app-controlled verbosity) +- `ToolCard` renders `tool.start/progress/end` frames. +- **Settings → "Tool detail": Everything / Truncated / Nothing.** + - Everything: name + full args (collapsible) + output preview. + - Truncated (default): `emoji name: "short preview"` one-liner, expandable. + - Nothing: suppress tool frames. +- Spinner while running; ✓/✗ + duration on `tool.end`. + +### Reasoning before message +- `ReasoningBlock` (collapsible, "💭 Reasoning" header, monospace body, **copy** + button) rendered **above** the message body from the `reasoning` field. + Matches the reference screenshot. + +### Intermediate messages +- `commentary` frames → dimmed/smaller bubble, distinct from final answers. + +### Agent busy / stop / steer +- `agent.busy` → show "thinking…" indicator in chat header (animated dots). +- `agent.idle` → clear indicator. +- **Stop button** (appears in header while busy): sends `agent.stop`. +- **Steer:** while busy, the composer accepts input; sending it calls + `agent.steer` (injects mid-turn) rather than queuing a new `message.send`. + +### Threading + channels +- **Channel list** (drawer on single-pane; left rail on two-pane) = default chat + + user channels (avatar, name, last-message preview, unread badge, active + highlight bar) — matches the reference left sidebar. +- **Thread toggle** in the default chat header: "Threads on/off". On → topic + switcher above the message list (each topic = a `thread_id`). +- **New channel** (FAB / channel-list menu) → `channel.create` → appears in list; + menu offers "Set as cron target". + +### Search +- Search bar (chat header or top) with a **scope toggle**: "Search everywhere" / + "Search in this chat/channel". → `search` frame → results list → tap jumps to + the message (navigate + highlight). + +### Attach media +- Paperclip → system pickers (Photos / Files / Audio / Video / Docs) via SAF. +- Selected files show as **preview chips** in the composer (thumbnail + name + + remove). On send: `media.upload` (chunked) for each, then `message.send` with + `media_refs`. + +### Voice input (mic button) +- Mic button (right of composer, toggles to send when text is present). +- Tap → request `RECORD_AUDIO` permission → start recording (MediaRecorder, + OGG/Opus, 44.1 kHz mono). +- While recording: timer + waveform; tap again to stop. +- On stop: file becomes a **preview chip** (audio, kind=`voice`) in the + composer, same as attached media. Send → `media.upload` (chunked) → + `message.send` with `media_refs`. +- Hermes receives it as an audio attachment; the agent's STT (if configured) + transcribes it. No client-side STT. + +### Push notifications +- FCM service (see `08-push.md`): foreground banner + background foreground + service → `sync`. Notification channel per chat. Tap → deep-link to chat. +- ntfy fallback: foreground service maintains the subscription. + +### Live playback +- AI-sent audio/video → `media.pull` → cache file → **ExoPlayer** inline player + (audio: mini-player; video: inline + fullscreen + PiP). Documents/images → + viewer / open-with. + +## 10.6 Layout (Telegram-style, per reference image) + +**Two layout modes** (decision: user-toggleable, **single-pane default**): +- **Single-pane (default on phones):** chat full-screen; channel list in a + swipeable drawer (hamburger / edge swipe). +- **Two-pane (Telegram-style, like the reference):** persistent left channel + rail + chat. Auto-enabled on tablets / large screens; toggleable in Settings. + +**Chat screen anatomy (matches reference):** +- **Header:** back (single-pane), avatar, name + "Bot" subtitle, edit + overflow + (⋮) menu (thread toggle, channel menu, set cron target, clear). +- **Message list:** date separators ("7. August"); user bubbles **right** + (accent color, ✓✓ read receipts); agent bubbles **left** (surface color) with + optional ReasoningBlock + ToolCards + media + model/token footer + ("Qwen3-… · 11% · ~") + timestamp. +- **In-app banner** above the composer (e.g. "renamed topic"). +- **Composer:** `Menü` / emoji / auto-grow input / attach / mic-send. + +**Theme:** dark by default (reference is dark); Material 3; optional dynamic +color. Accent = user's chosen brand color (default indigo, like the reference). + +## 10.7 SQLDelight schema (cache) + +- `channels(chat_id PK, name, kind, parent_chat_id, is_default, last_preview, + last_ts, unread)`. +- `messages(id PK, chat_id, thread_id, role, text, reasoning, model, tokens, + ts, status[pending|sent|read], media_json)`. +- `media(media_id PK, local_path, kind, mime, size, ts)`. +- `meta(key PK, value)` — sync cursor, settings, device_id, server url, pinned + cert fingerprint. + +## 10.8 Onboarding / Connect screen + +- First launch → **Connect**: server URL + token (or scan QR). "Test connection" + does a real `hello` (not just a TCP probe — per hermes desktop guidance, the + auth leg must be exercised). On success → save (secure storage) → main. +- States: connecting / connected / reconnecting / degraded / auth-failed — each + with honest copy and a way out. \ No newline at end of file diff --git a/docs/11-desktop-app.md b/docs/11-desktop-app.md new file mode 100644 index 0000000..f74a64b --- /dev/null +++ b/docs/11-desktop-app.md @@ -0,0 +1,75 @@ +# 11 — Desktop App (Kotlin + Compose Multiplatform) + +The desktop app is **the Android app, tweaked for a big screen**. It reuses the +entire `app/shared` module (protocol, network, repositories, state, most UI) and +only adds desktop platform services + a wider default layout. + +## 11.1 What's shared vs desktop-specific + +| Layer | Shared (commonMain) | Desktop-specific (desktopMain) | +|---|---|---| +| Protocol / WS client | ✅ | — | +| Repositories / state | ✅ | — | +| Most Compose UI | ✅ | layout tweaks, keyboard shortcuts | +| Push | — | **tray icon + OS notifications** (no FCM) | +| Media playback | `MediaPlayer` interface | **desktop player** actual | +| File picker | `MediaPicker` interface | **desktop file dialog** actual | +| Window | — | resizable window, always-on-top, global hotkey | +| Secure store | `SecureStore` interface | keyring / encrypted file actual | + +## 11.2 `desktopMain` platform services + +- **Push → tray + OS notifications.** Desktop is assumed reachable (persistent + WS), so no FCM. A **system tray icon** shows connection state + unread count; + OS notifications (Java Desktop / `SystemTray` + a cross-platform notifier) + fire for background chats / approvals / cron. Clicking focuses the window and + deep-links to the chat. +- **Media playback → `MediaPlayer` actual.** ExoPlayer is Android-only. Desktop + uses a `libmpv`/`mpv`-backed Compose surface for video (and audio), with a + WebView-based fallback if `mpv` isn't available. Same `MediaPlayer` interface + the Android `ExoPlayer` actual implements, so UI code is identical. +- **File picker → `MediaPicker` actual.** A native file dialog (Compose + Desktop `FileChooser` / AWT `JFileChooser`) returning local file paths, then + the same `media.upload` chunked path. +- **Window.** Resizable, remembers size/position, optional always-on-top, a + global hotkey to focus/show. Minimize-to-tray option. +- **Secure store → `SecureStore` actual.** OS keychain (macOS Keychain, Linux + Secret Service / encrypted file, Windows Credential Manager) or an encrypted + file for the token + pinned cert. + +## 11.3 Layout (big-screen tweaks) + +- **Two-pane is the default** (persistent left channel rail + chat), since there + is width. Single-pane still available via the same toggle. +- **Wider chat column** with comfortable max line length; optional **third + pane** (inspector: session info, model, tokens, tool detail, channel settings). +- **Larger type scale** and spacing for desktop; hover states; mouse + keyboard + first. +- **Keyboard shortcuts:** + - `/` focus the composer and open the command menu. + - `Ctrl/Cmd+K` command palette (all slash commands + actions). + - `Ctrl/Cmd+N` new channel; `Ctrl/Cmd+T` new thread. + - `Ctrl/Cmd+F` search (with the all/this-chat scope toggle). + - `↑/↓` navigate channel list; `Enter` open. + - `Esc` close sheet/dialog (one cancel gesture does exactly one thing). +- **Multi-window (stretch):** open a channel in a separate window / pop-out. + +## 11.4 Distribution + +- **Compose Desktop** → native binaries via **jpackage** (or a plain app image): + Linux (.deb/.AppImage), macOS (.dmg), Windows (.msi/.exe). +- Bundles the JRE. Auto-update is a stretch goal (v1: manual download). +- The desktop app connects to the **same** gateway WS server as the phone (the + user's home server / Tailscale). It does **not** spawn its own backend (unlike + hermes's existing Electron desktop, which spawns `hermes serve`) — our + desktop is a pure client of the messaging gateway, matching the Android app. + +## 11.5 Parity checklist (same functionality as Android) + +- [ ] Streaming, reasoning block, tool cards (3-level verbosity), commentary. +- [ ] Channels + threads + new channel + cron target. +- [ ] Search (all / this-chat). +- [ ] Media attach + live playback (via desktop player). +- [ ] Slash command menu + autocomplete + interactive pickers. +- [ ] Push (tray + OS notifications) + outbox/sync. +- [ ] Pairing/Connect screen (URL + token, WSS cert pin). \ No newline at end of file diff --git a/docs/12-toolchain.md b/docs/12-toolchain.md new file mode 100644 index 0000000..d2712ca --- /dev/null +++ b/docs/12-toolchain.md @@ -0,0 +1,138 @@ +# 12 — Toolchain Setup + +First-time setup on a machine (verified baseline: CachyOS/Arch, `pacman`, +`uv` present, ADB present, no JDK/SDK/Gradle). + +## 12.1 JDK 17 + +```bash +pacman -S jdk17-openjdk +java -version # expect 17.x +``` +(Compose Multiplatform + current AGP are happy on JDK 17. Use 17 to match the +Android toolchain; 21 also works but 17 is the safe floor.) + +## 12.2 Android SDK + +```bash +# cmdline-tools +mkdir -p ~/android-sdk/cmdline-tools +cd ~/android-sdk/cmdline-tools +curl -O https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip +unzip commandlinetools-linux-*.zip && mv cmdline-tools latest +rm commandlinetools-linux-*.zip + +export ANDROID_HOME=$HOME/android-sdk +export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools + +sdkmanager --licenses +sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" +``` +Persist `ANDROID_HOME`/`PATH` in `~/.bashrc`. ADB is already installed system-wide; +`platform-tools` from the SDK is fine too (whichever is first on `PATH`). + +Create `app/local.properties`: +``` +sdk.dir=/home//android-sdk +``` + +## 12.3 Gradle + +No system install — use the project wrapper: +```bash +cd app +./gradlew tasks # first run downloads the wrapper distribution +``` +(The wrapper version is pinned in `app/gradle/wrapper/gradle-wrapper.properties`.) + +## 12.4 hermes environment (for the plugin + running the gateway) + +```bash +cd hermes-agent +uv sync # creates .venv with all core deps (websockets, httpx, …) +source .venv/bin/activate +hermes --version # sanity +``` +- Run the gateway with the plugin: + ```bash + # install the plugin (dev: symlink) + mkdir -p ~/.hermes/plugins + ln -s "$PWD/../gateway-plugin" ~/.hermes/plugins/android + hermes gateway status # should list "android" + hermes gateway # run + ``` +- Tests use hermes's hermetic runner (never bare `pytest`): + ```bash + scripts/run_tests.sh tests/gateway/test_android.py + ``` + +## 12.5 Firebase (FCM) — primary push + +1. Create a Firebase project (console.firebase.google.com). +2. Add an **Android app** (package = `androidApp` applicationId, e.g. + `dev.iris.app`). Download `google-services.json` → `app/androidApp/`. +3. Create a **service account** (Project settings → Service accounts → Generate + new private key) → download the JSON. Store its path in + `ANDROID_FCM_SERVICE_ACCOUNT` (in `~/.hermes/.env`). +4. The app's `FirebaseMessagingService` obtains the FCM token at runtime and + registers it via `hello` / `fcm.register`. + +> Skip Firebase → set `ANDROID_PUSH_BACKEND=ntfy` and configure `NTFY_TOPIC` / +> `NTFY_SERVER_URL` (self-host ntfy or use ntfy.sh). See `08-push.md`. + +## 12.6 Environment variables (summary) + +**Secrets (`~/.hermes/.env`):** +``` +ANDROID_TOKEN=<64-hex> +ANDROID_PUSH_BACKEND=fcm # or ntfy +ANDROID_FCM_SERVICE_ACCOUNT=/path/to/service-account.json +# ANDROID_FCM_SERVER_KEY= # fallback if no service account +# NTFY_TOPIC=iris-push # when ntfy +# NTFY_SERVER_URL=https://ntfy.sh +# ANDROID_WS_CERT=/path/cert.pem # WSS +# ANDROID_WS_KEY=/path/key.pem +``` + +**Behavioral (`~/.hermes/config.yaml`):** +```yaml +gateway: + platforms: + android: + enabled: true + extra: + host: 127.0.0.1 # 0.0.0.0 for LAN + port: 8790 + home_channel: android:default + push_backend: fcm + outbox_retention_hours: 72 + max_upload_bytes: 104857600 # 100 MB +display: + platforms: + android: + show_reasoning: true + reasoning_style: code + streaming: true + tool_progress: all # gateway sends full data; app controls display +``` + +## 12.7 Verify the stack (smoke test) + +```bash +# 1. gateway up with plugin +hermes gateway status | grep -i android + +# 2. a raw WS client can pair + echo +python - <<'PY' +import asyncio, json, websockets +async def main(): + async with websockets.connect("ws://127.0.0.1:8790/ws") as ws: + await ws.send(json.dumps({"v":1,"type":"hello","payload":{ + "token":"","device_id":"test","device_name":"probe", + "caps":{"min_protocol":1}}})) + print("recv:", await ws.recv()) +asyncio.run(main()) +PY +``` +Expect a `hello.ack`. If you get `error {code:"auth"}`, the token/host/port is +wrong. \ No newline at end of file diff --git a/docs/13-testing.md b/docs/13-testing.md new file mode 100644 index 0000000..fd85be4 --- /dev/null +++ b/docs/13-testing.md @@ -0,0 +1,131 @@ +# 13 — Testing & Debugging (incl. ADB on-device) + +Three layers: **Python plugin tests**, **Kotlin unit/UI tests**, and **on-device +E2E via ADB**. Plus a **WS test-client harness** to drive the real gateway +without the app (critical for verifying frame shapes early). + +## 13.1 Python plugin tests + +- Location: `gateway-plugin/tests/` (and, for hermes-integration tests, mirror + into the hermes `tests/gateway/test_android.py` pattern when running under + hermes's suite). +- **Run with hermes's hermetic runner** (never bare `pytest`): + ```bash + cd hermes-agent + scripts/run_tests.sh tests/gateway/test_android.py + scripts/run_tests.sh # full suite (CI parity) + ``` +- Coverage to write (behavioral, not change-detector — per hermes test policy): + - `register(ctx)` produces a valid `PlatformEntry` (name, cron env var, + parse_target_ref). + - `check_requirements` / `validate_config` / `is_connected` truth table. + - `_parse_target_ref`: `android:`, `android::`, non-android + → None. + - **Reasoning split:** given a `show_reasoning`-style final text, `send()` + emits `message {reasoning, text}` correctly; no-prefix → no reasoning field. + - **Outbox:** frame with no subscriber → written with a cursor; `sync` replays + the right range; retention prunes. + - **Pairing:** valid token → `hello.ack`; wrong token → `error auth` + close. + Constant-time compare used. + - **Media:** upload start→binary→end reassembles + sha256 verified; over-limit + → `media_too_large`; pull serves only allowed paths. + - **Push backend selection:** fcm vs ntfy chosen by config; `configured()` + reflects missing creds. + - **Channel directory:** create/rename/set_default; cron target resolution. +- **No `~/.hermes` writes in tests** — use the `_isolate_hermes_home` fixture + pattern (temp `HERMES_HOME`). Profile tests also mock `Path.home()`. + +## 13.2 WS test-client harness (do this FIRST, in M1/M2) + +A small Python script (`gateway-plugin/tests/ws_probe.py`) that connects to the +**real running gateway** and drives a turn, printing every frame. This is how we +**empirically confirm** the exact frame shapes (especially tool-progress vs +commentary classification and the reasoning prefix) before/while building the +Kotlin client. + +```bash +hermes gateway & # with the android plugin +python gateway-plugin/tests/ws_probe.py --token \ + --send "list the files and summarize" +# prints: hello.ack, typing, message.start, message.update…, tool.start, tool.end, +# commentary, message.stop {reasoning,…}, … +``` +Use it to lock `04-wire-protocol.md` against reality and to debug the adapter +without waiting for the app. + +## 13.3 Kotlin unit / UI tests + +- **Protocol codec:** round-trip every frame type (serialize → deserialize → + equal); unknown `type`/fields ignored (forward-compat). +- **Repositories:** merge-don't-clobber on `channel.*`; optimistic send + rollback + on `error`; sync dedupe by `message_id`; cursor monotonic. +- **`GatewayClient`:** reconnect/backoff; `message.update` coalescing (latest + wins); request/response correlation by `id`. +- **ViewModels:** state transitions (connecting→connected→reconnecting); tool + verbosity filtering (everything/truncated/nothing); reasoning present/absent. +- **Compose UI tests:** ReasoningBlock collapse/expand + copy; ToolCard + spinner→done; composer auto-grow cap; channel list active highlight. +- Run: `./gradlew :shared:testDebugUnitTest` (and `:shared:testDesktopTest`). + +## 13.4 On-device E2E via ADB (the MIX 2S, API 29) + +Device: `a5ca2a4b` (Xiaomi MIX 2S). Workflow: + +```bash +# install + launch +cd app +./gradlew :androidApp:installDebug +adb shell am start -n dev.iris.app/.MainActivity + +# logs (filter our tags + WS + FCM + ExoPlayer) +adb logcat -c +adb logcat | grep -Ei "iris|GatewayClient|Firebase|ExoPlayer|MediaCodec" + +# screenshots for visual checks +adb exec-out screencap -p > /tmp/shot.png + +# clear app data between pairing attempts +adb shell pm clear dev.iris.app + +# push a file to the app's cache (for media tests) / pull logs +adb shell run-as dev.iris.app ls files +adb logcat -d > /tmp/logcat.txt +``` + +**E2E scenarios (script where possible):** +1. **Pair:** connect screen → enter URL+token → `hello.ack` → main. (Verify auth + leg, not just TCP.) +2. **Text round-trip:** send "hello" → streamed reply appears (message.start → + updates → stop). +3. **Reasoning:** ask a reasoning-model question → ReasoningBlock shows above the + answer; copy button works. +4. **Tools:** trigger a tool (e.g. "list files") → ToolCard shows; toggle + verbosity in Settings → rendering changes. +5. **Intermediate:** a multi-step prompt → commentary bubble appears dimmed. +6. **Channels:** create "Cron Reports" → appears in list; set as cron target. +7. **Cron delivery:** create a cron job `deliver=android:android:chan_` → it + fires → lands in that channel (not default). +8. **Search:** "search everywhere" vs "this chat" → correct scoping; tap → jump. +9. **Media (in):** attach a photo + a video → agent receives (vision) → reply. +10. **Media (out):** ask the agent to send an image/video → `media.offer` → + inline player plays it live. +11. **Push:** background the app (`adb shell am start` another app / lock) → + trigger a message → FCM notification appears → tap → syncs + deep-links. +12. **Reconnect/sync:** kill the WS (stop gateway briefly) → restart → app + reconnects → `sync` catches up (no lost/dup messages). + +## 13.5 Debugging tips + +- **Gateway side:** `~/.hermes/logs/gateway.log` (and `hermes logs --follow`). + Our plugin logs under the `android` adapter name; secrets redacted. +- **WS framing bugs:** use the `ws_probe.py` harness — it isolates the protocol + from the app. +- **Streaming jitter:** the consumer edits at intervals; if updates look chunky, + check `display.platforms.android.streaming` and the consumer's edit interval. +- **Media pull stalls:** check chunk size + backpressure; confirm the file is + within hermes delivery roots (`validate_media_delivery_path`). +- **FCM not arriving:** confirm the token registered (`devices.db`), the service + account can mint a token, and the app's `onNewToken` re-registered after + `pm clear`. +- **Profile leaks:** if tokens look wrong under multiple profiles, verify the + scope-aware secret read (`_get_scoped_secret`) is used. \ No newline at end of file diff --git a/docs/14-milestones.md b/docs/14-milestones.md new file mode 100644 index 0000000..58a67ad --- /dev/null +++ b/docs/14-milestones.md @@ -0,0 +1,138 @@ +# 14 — Milestones (M0–M7) + +Phased delivery. Each milestone ends with a **demo** (on-device where noted) and +has explicit **acceptance criteria**. Work top-to-bottom; don't skip M0/M1. + +--- + +## M0 — Toolchain & scaffolding +**Goal:** everything builds; the plugin is discoverable; the repo is safe. +- [ ] Install JDK 17, Android SDK, set `ANDROID_HOME` (`12-toolchain.md`). +- [ ] `cd hermes-agent && uv sync` (hermes venv works). +- [ ] Create monorepo scaffold (`02-monorepo.md`): `gateway-plugin/`, `app/` + (CMP: `shared`, `androidApp`, `desktopApp`), root `.gitignore` + (**excludes `hermes-agent/`**), root `README.md`. +- [ ] `git init` + a pre-commit/CI guard that fails if `hermes-agent/` is staged. +- [ ] CMP project builds empty: `./gradlew :androidApp:assembleDebug`, + `./gradlew :desktopApp:run` (blank window). +- [ ] Plugin skeleton: `plugin.yaml` + `adapter.py` with `register(ctx)` + a + no-op `AndroidAdapter` → `hermes gateway status` lists **android**. +- **Demo:** `hermes gateway status` shows `android`; `./gradlew + :androidApp:installDebug` installs a blank app on the MIX 2S. +- **Accept:** blank app installs + launches on-device; plugin visible in + `hermes gateway status`; `hermes-agent/` is git-ignored (verify with + `git status --ignored`). + +## M1 — Gateway core loop (text round-trip) +**Goal:** pair + send a text message + get a (non-streaming) reply. +- [ ] WS server (`ws_server.py`): bind, `hello` auth (constant-time), + `hello.ack`, heartbeat, connection registry. +- [ ] `AndroidAdapter.send()` → `message` frame; inbound `message.send` → + `MessageEvent` → `handle_message`. +- [ ] Pairing store + `ANDROID_TOKEN`; QR payload in `interactive_setup`. +- [ ] App: Connect screen (URL+token, real `hello` test), `GatewayClient` + (connect + reconnect), ChatScreen sends + renders `message`. +- [ ] `ws_probe.py` harness drives a real turn. +- **Demo (on-device):** pair the phone, send "hello", see the agent's reply. +- **Accept:** text round-trip works on-device; wrong token is rejected; + reconnect after gateway restart re-pairs. + +## M2 — Streaming + reasoning + tools + commentary +**Goal:** the "agent transparency" features. +- [ ] Map consumer `send`/`edit_message` → `message.start/update/stop`. +- [ ] Reasoning: set `show_reasoning` for android; adapter splits prefix → + `reasoning` field. **Verify format with `ws_probe.py`.** +- [ ] Tool events: classify tool-progress `send()`s → structured + `tool.start/progress/end` (turn-state machine). **Verify with probe.** +- [ ] Commentary → `commentary` frames. Typing → `typing`. +- [ ] App: live bubble (coalesced updates), `ReasoningBlock` (collapse + copy), + `ToolCard` with **Everything/Truncated/Nothing** setting, dimmed + `commentary` bubble. +- **Demo (on-device):** a multi-step prompt streams, shows reasoning above the + answer, tool cards (toggle verbosity), and an intermediate beat. +- **Accept:** all four render correctly; tool verbosity setting changes + rendering; reasoning copy button works; frame shapes match `04-wire-protocol`. + +## M3 — Channels/threads + cron + search +**Goal:** organization + cron delegation + search. +- [ ] Channel directory (SQLite): default channel ensured; `channel.create/ + rename/set_default/delete` + `channel.*` frames. +- [ ] Threads: toggle in default chat; `thread_id` lanes; `create_handoff_thread`. +- [ ] `parse_target_ref_fn` + `cron_deliver_env_var` → cron + `deliver=android:[:]` works. +- [ ] `search.py` FTS5 bridge; `search` frame (all / this-chat) → results. +- [ ] App: channel list (drawer/rail), thread toggle + topic switcher, "new + channel" + "set as cron target", SearchScreen with scope toggle + jump. +- **Demo (on-device):** create "Cron Reports"; create a cron job delivering to + it; it fires into that channel; search finds a message (both scopes). +- **Accept:** cron output lands in the chosen channel (not default); threads + isolate context; search scoping correct; channel list reconciles on events. + +## M4 — Media +**Goal:** attach + receive + play media. +- [ ] Inbound: `media.upload` chunked → `cache_*_from_bytes` → `media_urls`; + size limit + sha256 + MIME re-sniff. +- [ ] Outbound: `send_*` → `media.offer`; `media.pull` chunked; delivery-path + security. +- [ ] App: SAF pickers + preview chips + upload; `media.pull` → cache; + **ExoPlayer** inline (audio mini-player, video fullscreen/PiP); image/doc + viewers. +- **Demo (on-device):** attach a photo + video (agent sees them); ask agent to + send an image/video → plays live in-app. +- **Accept:** both directions work; over-limit rejected; playback is live; + only allowed files are servable. + +## M5 — Push + offline (FCM + ntfy) +**Goal:** reach the phone when backgrounded; catch up on reconnect. +- [ ] Outbox (SQLite) + sync cursor; `sync`/`sync.done`; retention prune. +- [ ] `push.py`: `FcmBackend` (HTTP v1 + service account, httpx) + + `NtfyBackend`; selected by `ANDROID_PUSH_BACKEND`. +- [ ] Fire push on no-live-subscriber; data payload for silent sync. +- [ ] App: FCM service (foreground banner + background foreground-service sync), + `onNewToken` → `fcm.register`; per-chat notification channels; deep-link. + ntfy listener fallback. +- [ ] In-app `notification` banners (channel_renamed, approval, cron, …). +- **Demo (on-device):** background the app → trigger a message → notification + appears → tap → syncs + opens the chat. Repeat with ntfy backend. +- **Accept:** push arrives when backgrounded (both backends); reconnect syncs + with no loss/dup; banners show for foreground events. + +## M6 — Desktop app +**Goal:** the same app on a big screen. +- [ ] `desktopMain`: tray + OS notifications; `MediaPlayer` actual (mpv/WebView); + `MediaPicker` actual (file dialog); `SecureStore` actual; window mgmt. +- [ ] Two-pane default layout; keyboard shortcuts; optional inspector pane. +- [ ] Parity pass vs Android feature checklist (`11-desktop-app.md`). +- [ ] jpackage builds (Linux first; macOS/Windows as available). +- **Demo:** desktop app pairs to the same gateway; full feature parity; tray + notifications; media plays. +- **Accept:** all Android features work on desktop; tray + shortcuts work; + native binary launches. + +## M7 — Polish + E2E + docs +**Goal:** ship-quality. +- [ ] Telegram-style layout pass (per reference image): header, bubbles, date + separators, ✓✓, model/token footer, banner, bottom bar. +- [ ] Theming (dark default, accent), onboarding/pairing UX, empty/loading/ + reconnecting/degraded states with honest copy. +- [ ] Full E2E suite (`13-testing.md` scenarios 1–12) automated where possible. +- [ ] Docs: `docs/protocol/frames.schema.json` finalized; `docs/setup.md` + (user-facing pairing + FCM/ntfy + remote access); root README. +- [ ] Security hardening checklist (`09-pairing-security.md`) verified. +- **Demo:** end-to-end on phone + desktop simultaneously; cron into a channel; + push; media; search. +- **Accept:** all feature-checklist items pass on-device; E2E green; docs + complete; `hermes-agent/` still never committed. + +--- + +## Sequencing notes +- **M1/M2 depend on the `ws_probe.py` harness** to lock frame shapes early — + build it in M1. +- **M3 (cron) and M5 (push) both touch the outbox** — build the outbox in M3, + extend for push in M5. +- **M6 (desktop) reuses M1–M5 shared code** — do it after the Android features + are stable so the shared module is settled. +- Parallelizable: plugin (Python) and app (Kotlin) can be worked on + concurrently once the protocol (`04-wire-protocol.md`) is agreed; the probe + harness is the integration seam. \ No newline at end of file diff --git a/docs/15-hermes-reference.md b/docs/15-hermes-reference.md new file mode 100644 index 0000000..554f5f6 --- /dev/null +++ b/docs/15-hermes-reference.md @@ -0,0 +1,136 @@ +# 15 — hermes-agent Source Reference Map + +A cheat-sheet of the **exact hermes-agent files/lines** to read for each +integration point. Paths are relative to `hermes-agent/` (the read-only +reference). This lets a coder jump straight to the right code instead of +re-deriving the architecture. + +> ⚠️ Read-only. We **install** our plugin into `~/.hermes/plugins/android`; we +> never edit these files. + +## Plugin / platform registration +| What | Where | +|---|---| +| How to add a platform (Plugin Path) | `gateway/platforms/ADDING_A_PLATFORM.md` | +| Canonical plugin-platform example | `plugins/platforms/irc/adapter.py` (esp. `register(ctx)` at :953, `_env_enablement` :677, `_standalone_send` :743, `_get_scoped_secret` :42) | +| ntfy plugin example (push-ish) | `plugins/platforms/ntfy/adapter.py`, `plugin.yaml` | +| `register_platform()` (PluginContext) | `hermes_cli/plugins.py:2774` | +| `PlatformEntry` dataclass (all fields) | `gateway/platform_registry.py:63` | +| `Platform` enum | `gateway/config.py` | +| Plugin discovery (`PluginManager`) | `hermes_cli/plugins.py` | + +## Base adapter contract +| What | Where | +|---|---| +| `BasePlatformAdapter` (ABC) | `gateway/platforms/base.py:2890` | +| `MessageEvent` (inbound) | `gateway/platforms/base.py:2300` | +| `MessageType` | `gateway/platforms/base.py:2278` | +| `SendResult` | `gateway/platforms/base.py:2466` | +| `build_source(...)` (SessionSource) | `gateway/platforms/base.py:7047` | +| `handle_message(event)` | `gateway/platforms/base.py:5981` | +| `send()` / `edit_message()` / `delete_message()` | `base.py:3920 / 3976 / 4005` | +| `send_typing` / `stop_typing` | `base.py:4298 / 4307` | +| Media send: `send_image/video/document/voice/animation/image_file/multiple_images` | `base.py:4396 / 4632 / 4659 / 4486 / 4415 / 4339 / 7834(tg)` | +| `extract_images` / `extract_media` / `extract_local_files` | `base.py:4439 / 4884 / 5020` | +| Media cache helpers: `cache_image/audio/video/document_from_bytes` | `base.py:854 / 1005 / 1122 / 2126` | +| Inbound media size: `get_inbound_media_max_bytes` / `validate_inbound_media_size` | `base.py:758 / 779` | +| Media delivery security: `validate_media_delivery_path` + roots/recency/denied | `base.py:1684 / 1312-1480` | +| Interactive: `send_slash_confirm` / `send_clarify` / `send_private_notice` | `base.py:4169 / 4204 / 4278` | +| `create_handoff_thread` | `base.py:3949` | +| Streaming hooks: `supports_draft_streaming` / `send_draft` / `render_message_event` / `format_tool_event` | `base.py:3215 / 3274 / 3316 / 3337` | +| Scoped secret read pattern (profile-safe) | `plugins/platforms/irc/adapter.py:42` | +| Scoped lock (profile-safe bind) | `gateway/status.py` (`acquire_scoped_lock`) | + +## Streaming (legacy callback path — what the main gateway uses) +| What | Where | +|---|---| +| `GatewayStreamConsumer` (the sink) | `gateway/stream_consumer.py:156` | +| `on_delta` / `on_commentary` / `on_segment_break` / `finish` | `stream_consumer.py:611 / 518 / 514 / 623` | +| Consumer `run()` loop (edit cadence) | `stream_consumer.py:781` | +| Structured events (ACP-only, NOT main gateway) | `gateway/stream_events.py`, `gateway/stream_dispatch.py:40` | +| Callback wiring (agent → consumer) | `gateway/run.py:5642-5704` (`tool_progress_callback`, `stream_delta_callback`, `interim_assistant_callback`, `status_callback`, `event_callback`) | +| `send_progress_messages` (tool progress → `send`) | `gateway/run.py:4603` | +| Progress metadata | `gateway/run.py:28089` | + +## Reasoning display +| What | Where | +|---|---| +| Reasoning prepended to final response | `gateway/run.py:20089-20127` | +| `show_reasoning` / `reasoning_style` defaults + per-platform | `gateway/display_config.py:33-181` | +| `resolve_display_setting()` | `gateway/display_config.py:187` | +| `last_reasoning` in agent result | `gateway/run.py:6471` | +| Think-tag filtering in consumer | `stream_consumer.py:175-185, 627+` | + +## Display settings (tool progress, interim, streaming, etc.) +| What | Where | +|---|---| +| All overrideable display keys + defaults | `gateway/display_config.py:33` (`tool_progress`, `show_reasoning`, `reasoning_style`, `tool_preview_length`, `streaming`, `interim_assistant_messages`, `long_running_notifications`, `cleanup_progress`, `live_status`) | +| Per-platform tiers | `gateway/display_config.py:81-181` | + +## Slash commands +| What | Where | +|---|---| +| `COMMAND_REGISTRY` / `CommandDef` (all commands) | `hermes_cli/commands.py:144+` | +| `GATEWAY_KNOWN_COMMANDS` / `is_gateway_known_command` / `resolve_command` | `hermes_cli/commands.py` | +| Gateway command dispatch (alias, access, hooks) | `gateway/run.py:16974-17099` | +| `send_model_picker` / `send_choice_picker` (Telegram ref) | `plugins/platforms/telegram/adapter.py:6350 / 6424` | +| Picker invocation from gateway | `gateway/slash_commands.py:1859, 2157, 3622-3657` | +| Button-callback id conventions (`cl:`, `appr:`, `sc:`) | `gateway/platforms/ADDING_A_PLATFORM.md` (Interactive UX) | + +## Cron delivery +| What | Where | +|---|---| +| Resolve a delivery target (`platform:chat_id[:thread_id]`) | `cron/scheduler.py:2148` (`_resolve_single_delivery_target`) | +| `_resolve_delivery_targets` / routing tokens (`all`) | `cron/scheduler.py:2296 / 2278` | +| `cron_deliver_env_var` handling (home channel) | `cron/scheduler.py:1903+` | +| `deliver` param normalization | `cron/scheduler.py:2251` | +| `send_message` tool target resolution (`resolve_send_target`, `prepare_send_message_platforms`) | `tools/send_message_tool.py` | +| `parse_target_ref_fn` usage | `tools/send_message_tool.py` (`_parse_target_ref`) | +| Cron mirror delivery (default off) | `cron/scheduler.py:1520` | +| `cronjob` tool schema (`deliver` description) | `tools/cronjob_tools.py` | + +## Search (FTS5) +| What | Where | +|---|---| +| Session store (SQLite + FTS5) | `hermes_state.py` | +| Search implementation | `hermes_state_search.py` | +| Schema | `hermes_state_schema.py` | + +## Config / env / profiles +| What | Where | +|---|---| +| `get_hermes_home()` / `display_hermes_home()` (profile-safe paths) | `hermes_constants.py` | +| `DEFAULT_CONFIG` / `OPTIONAL_ENV_VARS` | `hermes_cli/config.py` | +| Gateway config load (`load_gateway_config`, `_apply_env_overrides`) | `gateway/config.py` | +| Profile override (`_apply_profile_override`) | `hermes_cli/main.py` | +| Secret scope (multiplex fail-closed) | `agent/secret_scope.py` | +| PII redaction | `agent/redact.py` | + +## Dependencies (confirm zero new deps) +| What | Where | +|---|---| +| `websockets==15.0.1` (core) | `pyproject.toml:111` | +| `httpx[socks]==0.28.1` (core) | `pyproject.toml:44` | +| `aiohttp` (messaging extra, NOT core) | `pyproject.toml:185` | +| Dependency pinning policy | `pyproject.toml:19-39`, root `AGENTS.md` | + +## Testing +| What | Where | +|---|---| +| Hermetic test runner (use this, not bare pytest) | `scripts/run_tests.sh` | +| `_isolate_hermes_home` fixture | `tests/conftest.py` | +| Example platform tests | `tests/gateway/test_*.py` (e.g. `test_google_chat.py`, `test_line_plugin.py`) | +| Stream-event tests (dispatcher) | `tests/gateway/test_stream_events.py` | + +## Existing desktop app (for reference only — we do NOT reuse its backend) +| What | Where | +|---|---| +| Electron desktop app | `apps/desktop/` (its own `AGENTS.md`, `DESIGN.md`) | +| Shared JSON-RPC WS client (tui_gateway protocol) | `apps/shared/src/json-rpc-gateway.ts` | +| tui_gateway WS transport (mobile-client-ready) | `tui_gateway/ws.py` | +| tui_gateway method catalog | `tui_gateway/server.py` | + +> Note: the existing desktop app talks to the **`tui_gateway`** backend +> (`hermes serve`), a *different* process from the messaging gateway. Our apps +> talk to the **messaging gateway** via our own plugin + protocol. We borrow +> naming conventions only. \ No newline at end of file diff --git a/docs/16-open-questions.md b/docs/16-open-questions.md new file mode 100644 index 0000000..2ec93e4 --- /dev/null +++ b/docs/16-open-questions.md @@ -0,0 +1,75 @@ +# 16 — Decisions & Open Questions + +## Locked decisions (from planning, 2026-08-19) + +| # | Decision | Choice | Rationale | +|---|---|---|---| +| 1 | Desktop app tech | **Compose Multiplatform** | Desktop = "the Android app, tweaked"; share protocol/state/UI. | +| 2 | Push backend | **Both — FCM primary, ntfy fallback** | FCM is standard/reliable; ntfy for self-hosters with no Firebase. `ANDROID_PUSH_BACKEND`. | +| 3 | Media transport | **Over the WebSocket** | One transport, zero new Python deps; chunked binary frames. | +| 4 | Phone default layout | **User-toggleable, single-pane default** | App-like on phones; auto two-pane on large screens; desktop defaults two-pane. | + +## Additional decisions made during planning + +| Decision | Choice | Note | +|---|---|---| +| Connection point | **Messaging gateway** (platform plugin `android`), not `tui_gateway` | Makes cron/`send_message`/slash/coexistence native. | +| Plugin style | **Community plugin** (`register(ctx)`) | Zero hermes-core changes. | +| Python deps | **None new** (`websockets` + `httpx` are core) | Respects hermes pinning policy. | +| Tool events | **Structured frames; app controls verbosity** | Gateway sends full data; app = everything/truncated/nothing. | +| Reasoning | **Adapter splits the `show_reasoning` prefix** | Clean `reasoning` field → collapsible block above message. | +| Channels/threads | **Map onto `chat_id`/`thread_id`** | Existing gateway primitives; cron targets them. | +| Offline | **SQLite outbox + sync cursor** | Catch-up on reconnect; push on disconnect. | +| Default chat id | `android:default` | Home channel + cron default. | +| WS port | `8790` (default) | Configurable. | +| minSdk | 26 (test device API 29) | Broad coverage. | +| Frame routing | **Broadcast to all connected devices** (no per-chat subscribe) | Single-user model; simpler. | +| Initial channel load | **`history` frame** (paginated) | `sync` only replays outbox; `history` loads full messages. | +| Slash menu | **`commands.catalog` + `commands.complete`** frames | Gateway serves catalog; app renders bottom sheet + autocomplete. | +| Agent lifecycle | **`agent.busy`/`agent.idle`** events + **`agent.stop`/`agent.steer`** requests | App shows thinking indicator; user can abort or steer mid-turn. | +| Local DB (KMP) | **SQLDelight** (not Room) | Room is Android-only; SQLDelight works in commonMain for both platforms. | +| Voice input | **Record → upload as audio media** (no client-side STT) | Agent's STT (if configured) handles transcription. | + +## Open questions (resolve during implementation) + +These are **implementation-time** details, not blockers. Each has a default we +will proceed with unless you say otherwise. + +1. **Tool-progress vs commentary classification (M2).** The exact signal that + distinguishes a tool-progress `send()` from a regular `send()`/commentary in + the legacy path. *Default:* per-chat turn-state machine + line-format + heuristic, **verified empirically** with the `ws_probe.py` harness against the + live gateway. If a clean metadata marker exists, prefer it. +2. **Reasoning prefix format stability (M2).** We split on the `code`-style + `💭 **Reasoning:**\n```\n…\n```\n\n` prefix. *Default:* set + `reasoning_style: code` for android and split on that; fallback = no + reasoning field (full text) if the prefix isn't found. Verify in M2. +3. **Per-device tokens vs shared token (M1/M5).** *Default (v1):* shared + `ANDROID_TOKEN` + optional `ANDROID_ALLOWED_USERS` device allowlist. + Per-device revocable tokens are a stretch. +4. **Desktop video backend (M6).** *Default:* `libmpv`/`mpv`-backed Compose + surface, WebView fallback. Confirm `mpv` availability on target OSes during + M6. +5. **Remote access default (M1).** *Default:* document Tailscale as the + recommended remote path; WSS + reverse proxy as alternatives. No public bind + by default. +6. **Streaming cadence (M2).** If live updates look chunky, tune + `display.platforms.android.streaming` / consumer edit interval. *Default:* + follow global streaming config. +7. **App package name / branding.** *Default:* applicationId `dev.iris.app`, + app name "Iris". Confirm final product name + package + icon. +8. **ntfy in-app listener (M5).** *Default:* a foreground service maintaining the + ntfy subscription (no extra native lib) — or a lightweight ntfy client lib if + one is acceptable. Decide in M5. +9. **Auto-update for desktop (M7).** *Default:* out of scope (manual download). + Revisit post-v1. +10. **iOS port.** Out of scope for v1 (protocol is transport-agnostic, so it's a + future port). No action now. + +## Explicit non-goals (v1) + +- Multi-user / group chat (personal 1-user agent). +- End-to-end encryption (transport WSS only). +- Standalone-cron delivery while the gateway process is fully down (best-effort + push only). +- iOS. \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..f90ac1e --- /dev/null +++ b/docs/README.md @@ -0,0 +1,67 @@ +# Iris × Hermes — Implementation Reference Library + +A coder-facing reference library for building a **native Android + Desktop +experience** for [hermes-agent](https://github.com/NousResearch/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`](00-overview.md) | Always first. Vision, scope, disclaimers, locked decisions. | +| 1 | [`01-architecture.md`](01-architecture.md) | Before touching code. System shape + rationale. | +| 2 | [`02-monorepo.md`](02-monorepo.md) | When scaffolding the repo. | +| 3 | [`03-gateway-plugin.md`](03-gateway-plugin.md) | When building the Python plugin. | +| 4 | [`04-wire-protocol.md`](04-wire-protocol.md) | When implementing either side of the WS. | +| 5 | [`05-streaming.md`](05-streaming.md) | Streaming / reasoning / tools / intermediate. | +| 6 | [`06-channels-cron-search.md`](06-channels-cron-search.md) | Channels, threads, cron delivery, search. | +| 7 | [`07-media.md`](07-media.md) | Media upload/download + playback. | +| 8 | [`08-push.md`](08-push.md) | Push (FCM + ntfy), outbox, sync. | +| 9 | [`09-pairing-security.md`](09-pairing-security.md) | Pairing, auth, security model. | +| 10 | [`10-android-app.md`](10-android-app.md) | When building the Android app. | +| 11 | [`11-desktop-app.md`](11-desktop-app.md) | When building the Desktop app. | +| 12 | [`12-toolchain.md`](12-toolchain.md) | First time on a machine (JDK/SDK/uv/Firebase). | +| 13 | [`13-testing.md`](13-testing.md) | Writing tests + on-device ADB workflow. | +| 14 | [`14-milestones.md`](14-milestones.md) | Planning work / tracking progress. | +| 15 | [`15-hermes-reference.md`](15-hermes-reference.md) | **Cheat-sheet** of hermes-agent source to read. | +| 16 | [`16-open-questions.md`](16-open-questions.md) | Decisions made + open items. | + +Machine-readable / diagrams: +- [`protocol/frames.schema.json`](protocol/frames.schema.json) — wire-frame schema. +- [`diagrams/architecture.mmd`](diagrams/architecture.mmd) — mermaid architecture. + +--- + +## The three deliverables (one monorepo) + +1. **`gateway-plugin/`** — a Python hermes **platform plugin** named `android`. + 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:** Planning complete → ready to implement (Milestone M0). +- **Owner decisions locked:** see [`16-open-questions.md`](16-open-questions.md). +- **Last updated:** 2026-08-19. \ No newline at end of file diff --git a/docs/diagrams/architecture.mmd b/docs/diagrams/architecture.mmd new file mode 100644 index 0000000..92ca9c1 --- /dev/null +++ b/docs/diagrams/architecture.mmd @@ -0,0 +1,54 @@ +%% Iris x Hermes — architecture (mermaid) +%% Render with any mermaid viewer (e.g. https://mermaid.live or `mmdc`). +flowchart TB + subgraph HOST["User's machine (home server / PC)"] + subgraph GW["hermes gateway (ONE process)"] + AGENT["Agent core
(run_agent.py)"] + SESS["Sessions
(SQLite + FTS5)"] + CRON["Cron scheduler"] + subgraph PLUGIN["android PLATFORM PLUGIN"] + ADAPTER["AndroidAdapter
(BasePlatformAdapter)"] + OUTBOX["Outbox (SQLite)
+ sync cursor"] + PUSH["push.py
FcmBackend / NtfyBackend"] + MEDIA["media.py
cache + chunk stream"] + PAIR["pairing.py
token + device registry"] + SEARCH["search.py
FTS5 bridge"] + end + WSS["WebSocket SERVER
(websockets) ws://host:8790/ws"] + end + AGENT -->|legacy stream callbacks| ADAPTER + CRON -->|deliver=android:chat:thread| ADAPTER + ADAPTER <--> WSS + ADAPTER <--> OUTBOX + ADAPTER <--> PUSH + ADAPTER <--> MEDIA + ADAPTER <--> PAIR + ADAPTER <--> SEARCH + ADAPTER <--> SESS + end + + subgraph CLOUD["Cloud relays"] + FCM["Google FCM"] + NTFY["ntfy (self-host / ntfy.sh)"] + end + + subgraph DEVICES["Clients"] + PHONE["ANDROID APP
(Kotlin / Compose)
WS client + ExoPlayer + FCM"] + DESKTOP["DESKTOP APP
(Compose Multiplatform)
WS client + tray + desktop player"] + end + + WSS <-->|WSS JSON + binary media| PHONE + WSS <-->|WSS JSON + binary media| DESKTOP + PUSH -->|FCM HTTP v1| FCM + PUSH -->|ntfy publish| NTFY + FCM -->|wake (data msg)| PHONE + NTFY -->|subscribe| PHONE + + classDef host fill:#eef,stroke:#333; + classDef plugin fill:#efe,stroke:#333; + classDef device fill:#fee,stroke:#333; + classDef cloud fill:#ffe,stroke:#333; + class GW,AGENT,SESS,CRON,OUTBOX,PUSH,MEDIA,PAIR,SEARCH,WSS host; + class ADAPTER plugin; + class PHONE,DESKTOP device; + class FCM,NTFY cloud; \ No newline at end of file diff --git a/docs/protocol/frames.schema.json b/docs/protocol/frames.schema.json new file mode 100644 index 0000000..5583475 --- /dev/null +++ b/docs/protocol/frames.schema.json @@ -0,0 +1,107 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Iris x Hermes wire protocol", + "description": "Machine-readable description of the JSON frames exchanged over the gateway WebSocket. Mirrors gateway-plugin/protocol.py and docs/04-wire-protocol.md. Media travels as binary WS frames referenced by header/end frames.", + "protocol_version": 1, + "envelope": { + "type": "object", + "required": ["v", "type"], + "properties": { + "v": { "type": "integer", "const": 1, "description": "Protocol version." }, + "id": { "type": "integer", "description": "Request id; present on requests and their responses/acks. Absent on pure events." }, + "type": { "type": "string", "description": "Frame type (see frame_types)." }, + "chat_id": { "type": "string", "description": "Optional chat scope (e.g. android:default, android:chan_7)." }, + "thread_id": { "type": "string", "description": "Optional thread scope within a chat_id." }, + "payload": { "type": "object", "description": "Type-specific payload." } + } + }, + "frame_types": { + "server_to_app": { + "hello.ack": { + "description": "Pairing succeeded.", + "payload": { + "server_caps": { "type": "object", "properties": { "streaming": {"type":"boolean"}, "reasoning": {"type":"boolean"}, "tools": {"type":"boolean"}, "media": {"type":"boolean"}, "search": {"type":"boolean"}, "push": {"type":"string","enum":["fcm","ntfy","none"]}, "pickers": {"type":"boolean"} } }, + "sync_cursor": { "type": "integer" }, + "channels": { "type": "array", "items": { "$ref": "#/definitions/channel" } } + } + }, + "message": { + "description": "A final / standalone message.", + "payload": { + "message_id": { "type": "string" }, + "role": { "type": "string", "enum": ["user", "assistant", "system", "cron"] }, + "text": { "type": "string" }, + "reasoning": { "type": "string", "description": "Optional; render ABOVE text." }, + "media": { "type": "array", "items": { "$ref": "#/definitions/media_ref" } }, + "reply_to": { "type": "string" }, + "model": { "type": "string" }, + "tokens": { "type": "integer" }, + "ts": { "type": "integer", "description": "epoch millis" } + } + }, + "message.start": { "payload": { "message_id": { "type": "string" }, "role": { "type": "string" } } }, + "message.update": { "payload": { "message_id": { "type": "string" }, "text": { "type": "string", "description": "Full current text (app replaces)." } } }, + "message.stop": { "payload": { "message_id": { "type": "string" }, "final_text": { "type": "string" }, "reasoning": { "type": "string" }, "model": { "type": "string" }, "tokens": { "type": "integer" } } }, + "commentary": { "description": "Intermediate assistant beat.", "payload": { "message_id": { "type": "string" }, "text": { "type": "string" } } }, + "tool.start": { "payload": { "index": { "type": "integer" }, "name": { "type": "string" }, "preview": { "type": "string" }, "args": { "type": "object" } } }, + "tool.progress": { "payload": { "index": { "type": "integer" }, "name": { "type": "string" }, "note": { "type": "string" } } }, + "tool.end": { "payload": { "index": { "type": "integer" }, "name": { "type": "string" }, "ok": { "type": "boolean" }, "duration": { "type": "number" }, "output_preview": { "type": "string" } } }, + "typing": { "payload": { "on": { "type": "boolean" } } }, + "notification": { "payload": { "kind": { "type": "string", "enum": ["channel_renamed", "channel_created", "cron", "approval", "clarify", "generic"] }, "title": { "type": "string" }, "body": { "type": "string" }, "ts": { "type": "integer" } } }, + "picker.model": { "payload": { "picker_id": { "type": "string" }, "current_model": { "type": "string" }, "current_provider": { "type": "string" }, "providers": { "type": "array", "items": { "type": "object", "properties": { "id": {"type":"string"}, "label": {"type":"string"}, "models": { "type": "array", "items": { "type": "object", "properties": { "id": {"type":"string"}, "label": {"type":"string"} } } } } } } } }, + "picker.choice": { "payload": { "picker_id": { "type": "string" }, "title": { "type": "string" }, "choices": { "type": "array", "items": { "type": "object", "properties": { "value": {"type":"string"}, "label": {"type":"string"}, "is_current": {"type":"boolean"} } } } } }, + "picker.clarify": { "payload": { "picker_id": { "type": "string" }, "question": { "type": "string" }, "choices": { "type": "array", "items": { "type": "object" } } } }, + "picker.approval": { "payload": { "picker_id": { "type": "string" }, "command": { "type": "string" }, "description": { "type": "string" } } }, + "picker.confirm": { "payload": { "picker_id": { "type": "string" }, "title": { "type": "string" }, "message": { "type": "string" } } }, + "channel.list": { "payload": { "channels": { "type": "array", "items": { "$ref": "#/definitions/channel" } } } }, + "channel.created": { "payload": { "$ref": "#/definitions/channel" } }, + "channel.renamed": { "payload": { "chat_id": { "type": "string" }, "name": { "type": "string" } } }, + "channel.deleted": { "payload": { "chat_id": { "type": "string" } } }, + "history": { "description": "Response to history request; page of messages oldest→newest.", "payload": { "messages": { "type": "array", "items": { "type": "object", "properties": { "message_id": {"type":"string"}, "role": {"type":"string"}, "text": {"type":"string"}, "reasoning": {"type":"string"}, "model": {"type":"string"}, "tokens": {"type":"integer"}, "ts": {"type":"integer"} } } }, "has_more": { "type": "boolean" }, "oldest_message_id": { "type": "string" } } }, + "commands.catalog": { "description": "Full slash-command catalog.", "payload": { "commands": { "type": "array", "items": { "type": "object", "properties": { "name": {"type":"string"}, "description": {"type":"string"}, "args_hint": {"type":"string"}, "category": {"type":"string"} } } } } }, + "commands.complete": { "description": "Autocomplete matches for a typed prefix.", "payload": { "prefix": { "type": "string" }, "matches": { "type": "array", "items": { "type": "object", "properties": { "name": {"type":"string"}, "description": {"type":"string"}, "args_hint": {"type":"string"} } } } } }, + "agent.busy": { "description": "Agent is processing; app shows thinking indicator.", "payload": { "reason": { "type": "string", "enum": ["processing", "tool", "waiting_input", "cron"] } } }, + "agent.idle": { "description": "Agent turn complete; clear thinking indicator.", "payload": {} }, + "search.results": { "payload": { "query": { "type": "string" }, "scope": { "type": "string", "enum": ["all", "chat"] }, "hits": { "type": "array", "items": { "type": "object", "properties": { "message_id": {"type":"string"}, "chat_id": {"type":"string"}, "thread_id": {"type":["string","null"]}, "role": {"type":"string"}, "snippet": {"type":"string"}, "ts": {"type":"integer"} } } } } }, + "media.offer": { "description": "Agent-sent media available; app pulls bytes.", "payload": { "$ref": "#/definitions/media_ref" } }, + "status": { "payload": { "state": { "type": "string", "enum": ["online", "restarting", "degraded"] }, "session": { "type": "object" } } }, + "error": { "payload": { "code": { "type": "string", "enum": ["auth", "not_found", "rate_limited", "media_too_large", "unsupported", "internal"] }, "message": { "type": "string" } } }, + "pong": { "payload": { "ts": { "type": "integer" } } }, + "sync.done": { "payload": { "cursor": { "type": "integer" } } }, + "media.pull.end": { "payload": { "ok": { "type": "boolean" } } } + }, + "app_to_server": { + "hello": { "description": "First frame; auth + caps.", "payload": { "token": { "type": "string" }, "device_id": { "type": "string" }, "device_name": { "type": "string" }, "caps": { "type": "object", "properties": { "min_protocol": {"type":"integer"}, "media": {"type":"boolean"}, "push": {"type":"string"} } }, "fcm_token": { "type": "string" }, "ntfy_topic": { "type": "string" } } }, + "message.send": { "payload": { "text": { "type": "string" }, "reply_to": { "type": "string" }, "media_refs": { "type": "array", "items": { "type": "string" } } } }, + "media.upload.start": { "payload": { "media_ref": { "type": "string" }, "kind": { "$ref": "#/definitions/kind" }, "mime": { "type": "string" }, "size": { "type": "integer" }, "filename": { "type": "string" } } }, + "media.upload.end": { "payload": { "media_ref": { "type": "string" }, "sha256": { "type": "string" } } }, + "media.pull": { "payload": { "media_id": { "type": "string" } } }, + "picker.select": { "payload": { "picker_id": { "type": "string" }, "value": { "type": "string" } } }, + "channel.create": { "payload": { "name": { "type": "string" }, "kind": { "type": "string", "enum": ["channel", "thread"] }, "parent_chat_id": { "type": ["string", "null"] } } }, + "channel.rename": { "payload": { "name": { "type": "string" } } }, + "channel.set_default": { "payload": {} }, + "channel.delete": { "payload": {} }, + "search": { "payload": { "query": { "type": "string" }, "scope": { "type": "string", "enum": ["all", "chat"] }, "chat_id": { "type": "string" }, "thread_id": { "type": "string" } } }, + "history": { "description": "Load a page of messages (initial open / scroll-up).", "payload": { "before_message_id": { "type": "string" }, "limit": { "type": "integer", "minimum": 1, "maximum": 200 } } }, + "commands.catalog": { "description": "Fetch full slash-command catalog.", "payload": {} }, + "commands.complete": { "description": "Autocomplete for typed /prefix.", "payload": { "prefix": { "type": "string" } } }, + "agent.stop": { "description": "Abort current agent turn.", "payload": {} }, + "agent.steer": { "description": "Inject steering message mid-turn.", "payload": { "text": { "type": "string" } } }, + "read.receipt": { "description": "User viewed message; server stores + broadcasts to other devices.", "payload": { "chat_id": { "type": "string" }, "message_id": { "type": "string" } } }, + "sync": { "description": "Reconnect catch-up; replays undelivered outbox frames only (not full history).", "payload": { "cursor": { "type": "integer" } } }, + "fcm.register": { "payload": { "fcm_token": { "type": "string" }, "ntfy_topic": { "type": "string" } } }, + "ping": { "payload": { "ts": { "type": "integer" } } } + } + }, + "definitions": { + "kind": { "type": "string", "enum": ["image", "audio", "video", "document", "voice"] }, + "channel": { "type": "object", "properties": { "chat_id": {"type":"string"}, "name": {"type":"string"}, "kind": {"type":"string","enum":["default","channel","thread"]}, "parent_chat_id": {"type":["string","null"]}, "is_default": {"type":"boolean"} } }, + "media_ref": { "type": "object", "properties": { "media_id": {"type":"string"}, "kind": { "$ref": "#/definitions/kind" }, "mime": {"type":"string"}, "size": {"type":"integer"}, "filename": {"type":"string"} } } + }, + "reliability": { + "ordering": "Per-connection (TCP/WS). message.update for a message_id is monotonic; app may coalesce to latest.", + "never_dropped": ["message", "message.stop", "tool.end", "notification", "picker.*", "channel.*", "agent.busy", "agent.idle", "history", "commands.catalog", "commands.complete", "search.results", "error"], + "coalescable_under_backpressure": ["message.update", "tool.progress"], + "offline": "Undelivered frames go to the outbox; replayed by sync. Terminal frames always outboxed." + } +} diff --git a/gateway-plugin/__init__.py b/gateway-plugin/__init__.py new file mode 100644 index 0000000..9094c78 --- /dev/null +++ b/gateway-plugin/__init__.py @@ -0,0 +1,3 @@ +from .adapter import register + +__all__ = ["register"] \ No newline at end of file diff --git a/gateway-plugin/adapter.py b/gateway-plugin/adapter.py new file mode 100644 index 0000000..2535f48 --- /dev/null +++ b/gateway-plugin/adapter.py @@ -0,0 +1,471 @@ +""" +Android Platform Adapter for Hermes Agent (Iris x Hermes). + +A plugin-based gateway adapter that runs a WebSocket server *inside* the +``hermes gateway`` process. The native Android / Desktop app connects to it +with a pairing token and talks to the agent over a single WS transport +(chat, streaming, tools, media, pairing, push-token). + +Zero new Python dependencies: ``websockets`` and ``httpx`` are hermes core +deps. Zero hermes-core changes. + +Milestone M0: this is a *skeleton* adapter. It registers the ``android`` +platform, resolves its configuration, and implements the abstract adapter +contract as no-ops so that ``hermes gateway status`` lists ``android``. The +WebSocket server, pairing, streaming, media, outbox, push, and search are +wired in later milestones (see ``docs/14-milestones.md``). + +Configuration in config.yaml:: + + gateway: + platforms: + android: + enabled: true + extra: + host: 127.0.0.1 + port: 8790 + home_channel: android:default + push_backend: fcm + outbox_retention_hours: 72 + max_upload_bytes: 104857600 + +Or via environment variables (overrides config.yaml; secrets live in .env): + ANDROID_TOKEN, ANDROID_WS_HOST, ANDROID_WS_PORT, ANDROID_HOME_CHANNEL, + ANDROID_PUSH_BACKEND, ANDROID_FCM_SERVICE_ACCOUNT, NTFY_TOPIC, ... +""" + +import logging +import os +import time +import uuid +from typing import Any, Dict, List, Optional + +from agent.secret_scope import UnscopedSecretError as _UnscopedSecretError +from agent.secret_scope import get_secret as _scoped_get_secret + + +def _get_scoped_secret(name, default=None): + """Scope-aware credential read with the default-profile startup fallback. + + Secondary profiles construct their adapters under a profile secret scope + -- the scope is authoritative and a scoped miss returns ``default`` (no + cross-profile borrow from ``os.environ``, which may hold another + profile's value). The DEFAULT profile's adapter constructs and sends + *unscoped* under multiplexing, where a bare ``get_secret`` would raise + ``UnscopedSecretError`` and crash this path; there ``os.environ`` is that + profile's own value, so fall back to it. Same pattern as the IRC + ``IRC_SERVER_PASSWORD`` read (``plugins/platforms/irc/adapter.py``). + """ + try: + val = _scoped_get_secret(name, default) + except _UnscopedSecretError: + val = os.getenv(name) + return val if val is not None else default + + +logger = logging.getLogger(__name__) + +# --------------------------------------------------------------------------- +# Lazy import: BasePlatformAdapter and friends live in the main repo. +# We import at module level (as the bundled plugins do) but guard the heavy +# gateway imports so the plugin can be discovered before the gateway is fully +# initialised. +# --------------------------------------------------------------------------- + +from gateway.platforms.base import ( # noqa: E402 + BasePlatformAdapter, + SendResult, + MessageEvent, + MessageType, +) +from gateway.config import Platform # noqa: E402 + + +# --------------------------------------------------------------------------- +# Defaults +# --------------------------------------------------------------------------- + +DEFAULT_HOST = "127.0.0.1" +DEFAULT_PORT = 8790 +DEFAULT_HOME_CHANNEL = "android:default" +DEFAULT_PUSH_BACKEND = "fcm" +DEFAULT_OUTBOX_RETENTION_HOURS = 72 +DEFAULT_MAX_UPLOAD_BYTES = 100 * 1024 * 1024 # 100 MB + + +def _truthy(value: Optional[str]) -> bool: + return (value or "").strip().lower() in {"1", "true", "yes", "on"} + + +# --------------------------------------------------------------------------- +# Passive / config probes (called from status displays -- no side effects) +# --------------------------------------------------------------------------- + +def check_requirements() -> bool: + """PASSIVE dependency probe: ``websockets`` importable + token set. + + Must be side-effect free (called from ``hermes setup`` / ``status`` / + dashboard readiness). Never installs. + """ + try: + import websockets # noqa: F401 (core dep) + except Exception: + return False + return bool(_get_scoped_secret("ANDROID_TOKEN")) + + +def validate_config(config) -> bool: + """Given a PlatformConfig, is the platform properly configured?""" + extra = getattr(config, "extra", {}) or {} + token = _get_scoped_secret("ANDROID_TOKEN") or extra.get("token", "") + return bool(token) + + +def is_connected(config) -> bool: + """Is the platform configured (env or config.yaml)?""" + return validate_config(config) + + +# --------------------------------------------------------------------------- +# Env-driven auto-configuration (seeds PlatformConfig.extra pre-adapter) +# --------------------------------------------------------------------------- + +def _env_enablement() -> Optional[dict]: + """Seed ``PlatformConfig.extra`` from env vars during gateway config load. + + Called by the platform registry's env-enablement hook BEFORE adapter + construction, so ``gateway status`` and ``get_connected_platforms()`` + reflect env-only configuration without instantiating the adapter. + Returns ``None`` when the platform isn't minimally configured (no token); + the caller then skips auto-enabling. + + The special ``home_channel`` key in the returned dict is handled by the + core hook -- it becomes a proper ``HomeChannel`` dataclass on the + ``PlatformConfig`` rather than being merged into ``extra``. + """ + token = _get_scoped_secret("ANDROID_TOKEN", "") + if not token: + return None + + seed: Dict[str, Any] = { + "host": os.getenv("ANDROID_WS_HOST", "").strip() or DEFAULT_HOST, + "port": _parse_port(os.getenv("ANDROID_WS_PORT", "")), + "push_backend": ( + os.getenv("ANDROID_PUSH_BACKEND", "").strip().lower() + or DEFAULT_PUSH_BACKEND + ), + } + home = os.getenv("ANDROID_HOME_CHANNEL", "").strip() or DEFAULT_HOME_CHANNEL + seed["home_channel"] = { + "chat_id": home, + "name": os.getenv("ANDROID_HOME_CHANNEL_NAME", "").strip() or "Default", + } + return seed + + +def _parse_port(raw: str) -> int: + try: + return int((raw or "").strip()) + except (ValueError, TypeError): + return DEFAULT_PORT + + +# --------------------------------------------------------------------------- +# Target parsing: "android:[:]" +# --------------------------------------------------------------------------- + +def _parse_target_ref(target_ref: str) -> Optional[tuple]: + """Parse a raw target string into ``(chat_id, thread_id)`` or ``None``. + + Recognises the native syntax ``android:[:]``. Returns + ``None`` for anything else so the target proceeds to channel-directory + resolution. + """ + if not target_ref or not target_ref.startswith("android:"): + return None + body = target_ref[len("android:"):] + if not body: + return None + if ":" in body: + chat_id, thread_id = body.split(":", 1) + thread_id = thread_id or None + else: + chat_id, thread_id = body, None + chat_id = chat_id.strip() + if not chat_id: + return None + return (chat_id, thread_id) + + +# --------------------------------------------------------------------------- +# Standalone (out-of-process) send -- best-effort, stretch for v1 +# --------------------------------------------------------------------------- + +async def _standalone_send( + pconfig, + chat_id: str, + message: str, + *, + thread_id: Optional[str] = None, + media_files: Optional[List[str]] = None, + force_document: bool = False, +) -> Dict[str, Any]: + """Out-of-process delivery for cron jobs that run separately from the + gateway. + + The outbox is served by the *running* gateway, so standalone delivery + while the gateway process is fully down is best-effort only (see + ``docs/00-overview.md`` "Out of scope"). For M0 this is a stub that + reports the gateway is required; the real implementation lands with the + outbox (M3/M5). + """ + return { + "error": ( + "android standalone send: the running gateway is required to serve " + "the outbox (standalone delivery is best-effort only)" + ) + } + + +# --------------------------------------------------------------------------- +# Interactive setup (hermes gateway setup flow) -- full version in M1 +# --------------------------------------------------------------------------- + +def interactive_setup() -> None: + """Prompt for the pairing token / host / port / push backend. + + M0: minimal. M1 adds token generation, QR payload, and a live ``hello`` + connectivity test. + """ + try: + from hermes_cli.config import ( + get_env_value, + save_env_value, + prompt, + print_info, + print_success, + print_warning, + ) + except Exception: + print("android: setup helpers unavailable; set ANDROID_TOKEN in ~/.hermes/.env") + return + + print_info("📱 Android / Desktop (Iris x Hermes)") + token = get_env_value("ANDROID_TOKEN") or "" + if not token: + generated = uuid.uuid4().hex + uuid.uuid4().hex # 64 hex chars + save_env_value("ANDROID_TOKEN", generated) + print_success(f"Generated pairing token: {generated}") + print_warning("Keep this secret -- the app presents it on connect.") + else: + print_info("Existing ANDROID_TOKEN found (not shown).") + + host = prompt("WS bind host", default=get_env_value("ANDROID_WS_HOST") or DEFAULT_HOST) + save_env_value("ANDROID_WS_HOST", host or DEFAULT_HOST) + port = prompt("WS port", default=str(_parse_port(get_env_value("ANDROID_WS_PORT") or ""))) + save_env_value("ANDROID_WS_PORT", str(_parse_port(port))) + backend = prompt("Push backend (fcm/ntfy)", default=get_env_value("ANDROID_PUSH_BACKEND") or DEFAULT_PUSH_BACKEND) + save_env_value("ANDROID_PUSH_BACKEND", (backend or DEFAULT_PUSH_BACKEND).strip().lower()) + + print_success("Android configuration saved to ~/.hermes/.env") + print_info("Restart the gateway for changes to take effect: hermes gateway restart") + + +# --------------------------------------------------------------------------- +# Android Adapter +# --------------------------------------------------------------------------- + +class AndroidAdapter(BasePlatformAdapter): + """WebSocket-backed adapter for the native Iris Android / Desktop app. + + M0: skeleton. Implements the abstract adapter contract as no-ops and + resolves configuration. The WebSocket server, connection registry, + pairing, streaming, media, outbox, push, and search are added in later + milestones. + """ + + def __init__(self, config, **kwargs): + platform = Platform("android") + super().__init__(config=config, platform=platform) + + extra = getattr(config, "extra", {}) or {} + + # Connection settings (env vars override config.yaml) + self.host = os.getenv("ANDROID_WS_HOST", "").strip() or extra.get("host", DEFAULT_HOST) + self.port = _parse_port(os.getenv("ANDROID_WS_PORT", "") or str(extra.get("port", DEFAULT_PORT))) + self.token = _get_scoped_secret("ANDROID_TOKEN") or extra.get("token", "") + self.home_channel = extra.get("home_channel", DEFAULT_HOME_CHANNEL) + self.push_backend = ( + os.getenv("ANDROID_PUSH_BACKEND", "").strip().lower() + or extra.get("push_backend", DEFAULT_PUSH_BACKEND) + ) + self.outbox_retention_hours = int( + extra.get("outbox_retention_hours", DEFAULT_OUTBOX_RETENTION_HOURS) + ) + self.max_upload_bytes = int( + extra.get("max_upload_bytes", DEFAULT_MAX_UPLOAD_BYTES) + ) + + # TLS (optional) + self.ws_cert = _get_scoped_secret("ANDROID_WS_CERT") or extra.get("ws_cert", "") + self.ws_key = _get_scoped_secret("ANDROID_WS_KEY") or extra.get("ws_key", "") + + # Auth + allowed = os.getenv("ANDROID_ALLOWED_USERS", "").strip() + self.allowed_users: List[str] = ( + [u.strip() for u in allowed.split(",") if u.strip()] if allowed else [] + ) + self.allow_all = _truthy(os.getenv("ANDROID_ALLOW_ALL_USERS")) + + # Runtime state (populated by the WS server in M1) + self._ws_server = None + self._connections: Dict[str, Any] = {} + self._connected = False + + @property + def name(self) -> str: + return "Android" + + # ── Connection lifecycle ────────────────────────────────────────────── + + async def connect(self, *, is_reconnect: bool = False) -> bool: + """Bring the platform up. + + M0: no WebSocket server yet -- just validate config and mark + connected so ``hermes gateway status`` reflects the platform. M1 + starts the ``websockets`` server here. + """ + if not self.token: + logger.error("android: ANDROID_TOKEN must be set") + self._set_fatal_error( + "config_missing", + "ANDROID_TOKEN must be set", + retryable=False, + ) + return False + + # Prevent two profiles from binding the same port/identity. + try: + from gateway.status import acquire_scoped_lock + lock_key = f"{self.host}:{self.port}" + if not acquire_scoped_lock("android", lock_key): + logger.error("android: %s:%s already in use by another profile", self.host, self.port) + self._set_fatal_error( + "lock_conflict", + "WS port in use by another profile", + retryable=False, + ) + return False + self._lock_key = lock_key + except ImportError: + self._lock_key = None # status module not available (e.g. tests) + + # M1: start the websockets server on host:port (TLS if cert/key set). + self._connected = True + self._mark_connected() + logger.info("android: connected (skeleton; WS server starts in M1) on %s:%s", self.host, self.port) + return True + + async def disconnect(self) -> None: + """Tear down the platform.""" + try: + from gateway.status import release_scoped_lock + if getattr(self, "_lock_key", None): + release_scoped_lock("android", self._lock_key) + except ImportError: + pass + # M1: stop the server and close all device sockets. + self._connected = False + self._mark_disconnected() + logger.info("android: disconnected") + + # ── Outbound (agent -> app) ─────────────────────────────────────────── + + async def send( + self, + chat_id: str, + content: str, + reply_to: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + ) -> SendResult: + """Send a message to a chat. + + M0: no live devices yet -- log and report success with a minted id. + M1: broadcast a ``message`` frame to connected devices, else fall to + the outbox + fire push. + """ + message_id = f"msg_{uuid.uuid4().hex}" + logger.debug("android: send to %s (%d chars) [skeleton no-op]", chat_id, len(content or "")) + return SendResult(success=True, message_id=message_id) + + async def send_typing(self, chat_id: str, metadata: Optional[Dict[str, Any]] = None) -> None: + """Send a typing indicator. M0: no-op (M1 emits a ``typing`` frame).""" + return None + + async def send_image( + self, + chat_id: str, + image_url: str, + caption: Optional[str] = None, + reply_to: Optional[str] = None, + metadata: Optional[Dict[str, Any]] = None, + ) -> SendResult: + """Send an image. M0: not implemented (M4).""" + return SendResult(success=False, error="android: media not implemented yet (M4)") + + # ── Chat info ───────────────────────────────────────────────────────── + + async def get_chat_info(self, chat_id: str) -> Dict[str, Any]: + """Return ``{name, type, chat_id}`` for a chat. + + M0: the channel directory is not persisted yet, so report the home + channel name for the default chat and a generic name otherwise. + """ + name = "Default" if chat_id in (self.home_channel, DEFAULT_HOME_CHANNEL) else (chat_id or "chat") + return {"name": name, "type": "channel", "chat_id": chat_id} + + +# --------------------------------------------------------------------------- +# Plugin entry point +# --------------------------------------------------------------------------- + +def register(ctx): + """Plugin entry point: called by the Hermes plugin system.""" + ctx.register_platform( + name="android", + label="Android", + adapter_factory=lambda cfg: AndroidAdapter(cfg), + check_fn=check_requirements, + validate_config=validate_config, + is_connected=is_connected, + required_env=["ANDROID_TOKEN"], + install_hint="No extra packages needed (websockets + httpx are core deps)", + setup_fn=interactive_setup, + # Env-driven auto-configuration: seeds PlatformConfig.extra with + # host/port/push_backend + home_channel so env-only setups show up in + # gateway status without instantiating the adapter. + env_enablement_fn=_env_enablement, + # Cron home-channel delivery support (deliver=android:[:]). + cron_deliver_env_var="ANDROID_HOME_CHANNEL", + # Out-of-process cron delivery (best-effort; outbox is gateway-served). + standalone_sender_fn=_standalone_send, + # Native target syntax: "android:[:]". + parse_target_ref_fn=_parse_target_ref, + # Auth env vars for _is_user_authorized() integration. + allowed_users_env="ANDROID_ALLOWED_USERS", + allow_all_env="ANDROID_ALLOW_ALL_USERS", + # WS has no message-size limit. + max_message_length=0, + # Display. + emoji="📱", + pii_safe=False, + allow_update_command=True, + # LLM guidance. + platform_hint=( + "You are chatting with the user through their native Iris app " + "(Android/Desktop). It renders Markdown, inline code, images, " + "audio and video, and shows your reasoning and tool activity. " + "Conversations are organized into channels and optional threads. " + "Keep formatting rich but readable." + ), + ) \ No newline at end of file diff --git a/gateway-plugin/media.py b/gateway-plugin/media.py new file mode 100644 index 0000000..4f82ffa --- /dev/null +++ b/gateway-plugin/media.py @@ -0,0 +1,16 @@ +"""Inbound media cache + outbound chunked streaming. + +Inbound: ``media.upload`` (chunked binary frames) -> ``cache_*_from_bytes`` +-> a ``media_ref`` the adapter attaches to the ``MessageEvent``. Enforces +size limit + sha256 + MIME re-sniff. + +Outbound: ``send_*`` -> stage the file in the media cache, mint a +``media_id``, emit ``media.offer {media_id, mime, size, filename, kind}``; +serve bytes on ``media.pull`` as chunked binary frames. Delivery-path +security via ``validate_media_delivery_path``. + +Reuses hermes ``cache_image/audio/video/document_from_bytes`` where possible. +All paths under ``get_hermes_home()/"android"/media``. + +Milestone M4. +""" \ No newline at end of file diff --git a/gateway-plugin/outbox.py b/gateway-plugin/outbox.py new file mode 100644 index 0000000..2101dc0 --- /dev/null +++ b/gateway-plugin/outbox.py @@ -0,0 +1,10 @@ +"""SQLite offline outbox + monotonic sync cursor. + +Undelivered frames are appended per ``chat_id`` with a monotonic cursor so a +reconnecting app can ``sync {cursor}`` the delta without re-reading full +history. Retention prunes old entries (``outbox_retention_hours``). + +Storage: ``get_hermes_home()/"android"/outbox.db``. + +Milestone M3 (built), extended in M5 (push integration). +""" \ No newline at end of file diff --git a/gateway-plugin/pairing.py b/gateway-plugin/pairing.py new file mode 100644 index 0000000..3d36337 --- /dev/null +++ b/gateway-plugin/pairing.py @@ -0,0 +1,10 @@ +"""Pairing: token generation/verification + device registry. + +Token generation (64-hex) and constant-time verification. Device registry +(SQLite) tracks ``device_id``, name, caps, fcm_token, ntfy_topic, last_seen, +created. QR payload for the pairing flow (``interactive_setup``). + +Storage: ``get_hermes_home()/"android"/devices.db``. + +Milestone M1. +""" \ No newline at end of file diff --git a/gateway-plugin/plugin.yaml b/gateway-plugin/plugin.yaml new file mode 100644 index 0000000..f7c1cfa --- /dev/null +++ b/gateway-plugin/plugin.yaml @@ -0,0 +1,67 @@ +name: android-platform +label: Android +kind: platform +version: 0.1.0 +description: > + Native Android / Desktop client gateway adapter for Hermes Agent. + Runs a WebSocket server inside the gateway; the app connects with a + pairing token. Supports streaming, reasoning, structured tool events, + channels/threads, media, FTS5 search, and FCM/ntfy push. +author: Iris x Hermes +# ``requires_env`` / ``optional_env`` entries are surfaced in the +# ``hermes config`` / ``hermes gateway setup`` UI via the platform-plugin +# env var injector in ``hermes_cli/config.py``. +requires_env: + - name: ANDROID_TOKEN + description: "Shared pairing token the app presents on connect" + prompt: "Android pairing token" + password: true +optional_env: + - name: ANDROID_WS_HOST + description: "WS bind host (default 127.0.0.1; use 0.0.0.0 for LAN)" + prompt: "WS host" + password: false + - name: ANDROID_WS_PORT + description: "WS port (default 8790)" + prompt: "WS port" + password: false + - name: ANDROID_HOME_CHANNEL + description: "Default chat id for cron/notification delivery (default android:default)" + prompt: "Home channel" + password: false + - name: ANDROID_ALLOWED_USERS + description: "Comma-separated allowed device_ids (empty = token-only auth)" + prompt: "Allowed device ids" + password: false + - name: ANDROID_ALLOW_ALL_USERS + description: "Allow any paired device (dev only)" + prompt: "Allow all devices? (true/false)" + password: false + - name: ANDROID_PUSH_BACKEND + description: "Push backend: fcm (default) or ntfy" + prompt: "Push backend" + password: false + - name: ANDROID_FCM_SERVICE_ACCOUNT + description: "Path to Firebase service-account JSON (FCM HTTP v1)" + prompt: "FCM service account path" + password: true + - name: ANDROID_FCM_SERVER_KEY + description: "Legacy FCM server key (fallback if no service account)" + prompt: "FCM server key" + password: true + - name: NTFY_TOPIC + description: "ntfy topic for push (when ANDROID_PUSH_BACKEND=ntfy)" + prompt: "ntfy topic" + password: false + - name: NTFY_SERVER_URL + description: "ntfy server URL (default https://ntfy.sh)" + prompt: "ntfy server URL" + password: false + - name: ANDROID_WS_CERT + description: "TLS cert path for WSS (optional)" + prompt: "WSS cert" + password: false + - name: ANDROID_WS_KEY + description: "TLS key path for WSS (optional)" + prompt: "WSS key" + password: false \ No newline at end of file diff --git a/gateway-plugin/protocol.py b/gateway-plugin/protocol.py new file mode 100644 index 0000000..9be6b4e --- /dev/null +++ b/gateway-plugin/protocol.py @@ -0,0 +1,22 @@ +"""Frame schemas -- the single source of truth for the wire protocol. + +Every frame the plugin sends/receives is modelled here as a dataclass + +constants. ``docs/protocol/frames.schema.json`` is generated/mirrored from +this module, and the Kotlin side mirrors these shapes (see +``docs/04-wire-protocol.md``). + +Milestone M1: hello/hello.ack, message, error, ping/pong. +Milestone M2: message.start/update/stop, reasoning, tool.*, commentary, typing. +Milestone M3: channel.*, search, sync. +Milestone M4: media.*. +Milestone M5: notification, fcm.register, read.receipt. +""" + +PROTOCOL_VERSION = 1 + +# Frame type constants (the ``type`` field of every frame). +TYPE_HELLO = "hello" +TYPE_HELLO_ACK = "hello.ack" +TYPE_ERROR = "error" +TYPE_PING = "ping" +TYPE_PONG = "pong" \ No newline at end of file diff --git a/gateway-plugin/push.py b/gateway-plugin/push.py new file mode 100644 index 0000000..7ae9cce --- /dev/null +++ b/gateway-plugin/push.py @@ -0,0 +1,15 @@ +"""Push backends: FCM (primary) + ntfy (fallback). + +``PushBackend`` interface with two implementations: + - ``FcmBackend``: FCM HTTP v1 via ``httpx`` + a Firebase service account + (``ANDROID_FCM_SERVICE_ACCOUNT``), or a legacy server key + (``ANDROID_FCM_SERVER_KEY``). + - ``NtfyBackend``: reuses hermes ntfy publish (``NTFY_TOPIC`` / + ``NTFY_SERVER_URL``). + +Selected by ``ANDROID_PUSH_BACKEND`` (``fcm`` default, ``ntfy`` fallback). +Fired when a frame has no live subscriber; data payload drives a silent sync +on the device. + +Milestone M5. +""" \ No newline at end of file diff --git a/gateway-plugin/search.py b/gateway-plugin/search.py new file mode 100644 index 0000000..a1ff3ed --- /dev/null +++ b/gateway-plugin/search.py @@ -0,0 +1,8 @@ +"""FTS5 session search bridge. + +Bridges the ``search {query, scope, chat_id?, thread_id?}`` frame to the +hermes session store (SQLite + FTS5, ``hermes_state_search.py``) and returns +``search.results``. Scope: "all" (everywhere) or "chat" (this chat/channel). + +Milestone M3. +""" \ No newline at end of file diff --git a/gateway-plugin/tests/README.md b/gateway-plugin/tests/README.md new file mode 100644 index 0000000..6a26aed --- /dev/null +++ b/gateway-plugin/tests/README.md @@ -0,0 +1,7 @@ +# Tests for the android gateway plugin. + +Run via hermes's hermetic runner (never bare pytest):: + + scripts/run_tests.sh tests/gateway/test_android.py + +See ``docs/13-testing.md`` for the scenario list. \ No newline at end of file diff --git a/gateway-plugin/ws_server.py b/gateway-plugin/ws_server.py new file mode 100644 index 0000000..94b21c3 --- /dev/null +++ b/gateway-plugin/ws_server.py @@ -0,0 +1,24 @@ +"""WebSocket server, connection registry, and frame routing. + +Runs on the gateway's asyncio loop (started in ``AndroidAdapter.connect()``). +Uses the ``websockets`` core dep (v15): ``websockets.serve(handler, host, +port, ssl=ctx)``. + +Per-connection handler: + 1. Await first frame; must be ``hello {token, device_id, device_name, + caps, fcm_token?}``. Verify token (constant-time) + allowlist. On + failure: send ``error {code:"auth"}`` and close. + 2. On success: register in the connection registry (``device_id -> + {ws, caps, fcm_token}``), send ``hello.ack {server_caps, sync_cursor, + channels[]}``. + 3. Loop: decode frames, dispatch to adapter inbound handlers. + 4. On close: deregister; if no devices remain, ensure pending outbox + frames have push fired. + +Routing: ``emit(chat_id, frame)`` broadcasts to ALL connected devices +(single-user model). Heartbeat via WS ping/pong + app-level ping/pong. +Backpressure: bounded per-connection send queue; coalesce ``message.update`` +under pressure, never drop ``message``/``tool.end``/``notification``. + +Milestone M1. +""" \ No newline at end of file diff --git a/scripts/guard_hermes_agent.sh b/scripts/guard_hermes_agent.sh new file mode 100755 index 0000000..7a2b703 --- /dev/null +++ b/scripts/guard_hermes_agent.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Guard: hermes-agent/ is a read-only research reference and must NEVER be +# committed, pushed, or shipped. This fails the commit/CI if any path under +# hermes-agent/ is staged. +# +# Usage: +# - pre-commit hook: scripts/guard_hermes_agent.sh --staged +# - CI / manual: scripts/guard_hermes_agent.sh --staged +# +# Exit 0 = clean, exit 1 = hermes-agent/ paths detected. + +set -euo pipefail + +MODE="${1:---staged}" + +if [[ "$MODE" == "--staged" ]]; then + # Every path currently in the index. Using `git ls-files --cached` (rather + # than `git diff --cached`) makes this robust on the very first commit, + # where no HEAD exists yet and `git diff --cached` is unreliable. We never + # want hermes-agent/ in the index at all, so blocking on its presence is + # both correct and safe. + mapfile -t BAD < <(git ls-files --cached | grep -E '^hermes-agent/' || true) +else + # Fallback: any tracked file under hermes-agent/. + mapfile -t BAD < <(git ls-files | grep -E '^hermes-agent/' || true) +fi + +if [[ ${#BAD[@]} -gt 0 ]]; then + echo "ERROR: the following hermes-agent/ paths are staged. This directory is a" >&2 + echo "read-only research reference and must NEVER be committed (see .gitignore" >&2 + echo "and docs/00-overview.md 'Disclaimers'). Unstage them with:" >&2 + echo " git restore --staged " >&2 + printf ' %s\n' "${BAD[@]}" >&2 + exit 1 +fi + +exit 0 \ No newline at end of file