M57 c5d1ef1c42 fix(network): scope management REST calls with ?profile= (fixes #528) (#540)
* fix(network): scope management REST calls with ?profile= (fixes #528)

Mobile fired all management REST calls with NO profile scope, so every
profile read/wrote the backend's implicit default profile — multi-profile
setups silently corrupted config/skills/toolsets/mcp/model/env.

Add ProfileScopeInterceptor (OkHttp) that appends ?profile=<activeProfile>
to the same endpoint families the desktop/web dashboard scopes
(web/src/lib/api.ts PROFILE_SCOPED_PREFIXES), respecting:
- no active profile -> pass through (legacy default behavior)
- explicit ?profile= on the URL wins over the global scope
- only scoped families rewritten; ops/pairing/cron/profiles stay global

Wired into ApiClient.buildService(). 5 MockWebServer tests cover scoped
append, explicit-param precedence, no-profile passthrough, non-scoped skip,
and skills scoping.

Mirrors desktop/web contract derived from audit of /opt/hermes-agent.

* fix(ci): stub getSelectedProfileId in ApiClientTest + harden prefix match (fixes PR #540)

- ApiClientTest: stub AuthManager.getSelectedProfileId() to null. The new
  ProfileScopeInterceptor (registered in ApiClient.buildService) calls it, and
  the unstubbed real method threw IllegalStateException at AuthManager.kt:56,
  breaking all 4 auth-interceptor tests.
- ProfileScopeInterceptor: replace startsWith(prefix) with whole-segment match
  (path == prefix || path.startsWith(prefix/)) so lookalike paths like
  /api/statusXYZ are NOT wrongly scoped (Sourcery review, PR #540).
- ProfileScopeInterceptorTest: add lookalikePath_notScoped + scopedSubPath_isScoped
  to lock the segment-boundary fix.
2026-07-10 14:02:45 +03:00
2026-07-02 23:14:34 +03:00
2026-06-22 21:35:40 +03:00
2026-06-30 20:55:56 +03:00


Android Jetpack Compose Kotlin Material You

Hermes Mobile

Native Android companion app for your Hermes AI agent.

Latest Release CI minSdk 26 targetSdk 36


Overview

Hermes Mobile is the native Android client for Hermes Agent. It connects securely to your local Hermes gateway (REST API and WebSocket TUI Gateway) over LAN, giving you pocket control over your AI assistant.


Features

  • Real-Time Chat: Message your agent with Room-backed local database history.
  • System Config: Manage active profiles, installed skills, plugins, and LLM model selections.
  • Operations: Stream and filter live logs, manage cron jobs, edit environment keys, and test webhooks.
  • Gateway Status: Monitor WebSocket connection, MCP servers, and messaging channel status.
  • Productivity: View and manage tasks via integrated Kanban boards and track agent milestones.
  • Modern UX: Native Material You design supporting dynamic color theming, scroll-aware TopBar, and pull-to-refresh.

Quick Start

Prerequisites

  • JDK 21+ (required for Kotlin compilation and the Gradle toolchain)
  • Android Studio (Ladybug+) or a Nix development environment

Build & Deploy

  1. Clone the repository:
    git clone https://github.com/Hy4ri/hermes-mobile.git
    cd hermes-mobile
    
  2. Build the debug APK:
    ./gradlew assembleDebug
    
  3. Install on your emulator/device:
    adb install app/build/outputs/apk/debug/app-debug.apk
    

Note: For release builds, ensure keystore environment variables (KEYSTORE_PATH, KEYSTORE_PASSWORD, KEY_ALIAS, KEY_PASSWORD) are configured, or let the GitHub Actions release workflow handle it on tag push (v*).


Authentication

Once the app is installed, you need to point it at your Hermes gateway. The app auto-detects which auth mode the dashboard is using — just fill in the fields it shows.

1. Start the dashboard

On your host machine, start the dashboard:

hermes dashboard                          # loopback (127.0.0.1:9119) — no auth needed
hermes dashboard --host 0.0.0.0           # LAN — requires auth

For LAN access, configure credentials in ~/.hermes/config.yaml:

dashboard:
  basic_auth:
    username: admin       # pick your own
    password: hermes      # pick your own

2. Connect the app

Tap Sign in on the landing screen and enter the dashboard host and port. The app probes the dashboard and reveals the fields you need:

Auth mode When What you fill
Token only Dashboard on same machine (loopback) Token — grab from ~/.hermes/dashboard-token.txt or ~/.hermes/.env (HERMES_DASHBOARD_SESSION_TOKEN). The app can also auto-extract it from the dashboard page
Basic auth Dashboard on LAN with password gate Username + Password (default admin / hermes). The app logs in, gets a session cookie, and mints a WebSocket ticket automatically

The app communicates over plain HTTP — it's designed for trusted local networks only. Do not expose your Hermes gateway to untrusted networks.

Connection profiles

Have multiple gateways? Switch between them in Settings → Connection profiles. Each profile stores its own host, port, and token — just tap to swap.

Pairing (admin)

The Pairing screen lets you approve or revoke agents and services that are trying to connect to your gateway, such as Telegram or Discord sessions.


Project Structure

app/src/main/java/com/m57/hermescontrol/
├── data/          # Local (Room, EncryptedSharedPreferences) & Remote (Retrofit, OkHttp WS)
├── notification/  # Foreground service for message notifications
├── theme/         # Material You design system, status colors, spacing, and typography
└── ui/            # Compose screens (Chat, Settings, Profiles, Kanban, etc.) + Navigation

Tech Stack

  • Language: Kotlin 2.4.0 with KSP compiler plugin
  • UI & Layout: Jetpack Compose (BOM 2026.03.01) & Material 3 / Material You
  • Navigation: Navigation3 (Compose-first Routing)
  • Networking: Retrofit 3.0.0, OkHttp 5.4.0, Gson 2.14.0
  • Database: Room 2.7.1 with SQLCipher encryption
  • Security: EncryptedSharedPreferences (AES256-GCM)
  • Formatting: ktlint style rules (checked automatically in CI)

Contributing

Contributions are welcome! Please read CONTRIBUTING.md for our branch workflow, code style guidelines, and PR checklist.

For developer-specific details, code conventions, and project architecture notes, refer to AGENTS.md.


License

Copyright © 2026 M57 (Hy4ri).

This project is licensed under the Apache License, Version 2.0. See the LICENSE file for details.

S
Description
AITURK Mobil — Android companion for AITURK IDE (fork of Hy4ri/hermes-mobile, Apache-2.0)
Readme Apache-2.0
10 MiB
0 Stars 1 Watchers 0 Forks
Languages
Kotlin 99.9%