# Project: HermesControl Jetpack Compose Android App ## Architecture The HermesControl Jetpack Compose Android application communicates with the local Hermes agent instance via two communication channels: 1. **REST API (Port 9119)**: For status queries, listing sessions, and system configuration. 2. **WebSocket Gateway (`/api/ws?token=`)**: For real-time JSON-RPC messaging (chat, prompt submission, stream events, tool execution updates, etc.). ### Package Boundaries - `com.m57.hermescontrol.data.model` — REST API data classes. - `com.m57.hermescontrol.data.remote` — Retrofit ApiClient and HermesApiService. - `com.m57.hermescontrol.data.ws` — JSON-RPC models, HermesWsClient, and EventParser. - `com.m57.hermescontrol.data.local` — AuthManager (EncryptedSharedPreferences). - `com.m57.hermescontrol.ui.connect` — ConnectScreen and ConnectViewModel. - `com.m57.hermescontrol.ui.chat` — ChatScreen, ChatViewModel, and ChatBubble. - `com.m57.hermescontrol.ui.settings` — SettingsScreen and SettingsViewModel. - `com.m57.hermescontrol.theme` — Color, Theme, and Type. --- ## Milestones | # | Name | Scope | Dependencies | Status | |---|---|---|---|---| | M1 | Exploration & Setup | Explore codebase, identify dependencies and structure | None | DONE | | M2 | Networking & Data Layer | Implement/Fix AuthManager, api clients, WS clients, EventParser | M1 | DONE | | M3 | UI Screen Implementation | Implement ConnectScreen, ChatScreen, SettingsScreen, and Nav integration | M2 | DONE | | M4 | Unit Testing | Implement unit tests for AuthManager, EventParser, Connect/Chat ViewModels | M2, M3 | DONE | | M5 | Styling & Audit Validation | Perform ktlint formatting fixes, compiler error fixes, and run Forensic Audit | M4 | DONE | | M6 | E2E Testing Track | Design and build comprehensive opaque-box integration tests (Tiers 1-4) | M5 | PLANNED | | M7 | API Integration & Models | Add Retrofit endpoints and JSON serialization models for Skills & Cron Jobs | M5 | PLANNED | | M8 | Skills Management UI | Implement Viewmodel and UI Screen for skills management | M7 | PLANNED | | M9 | Cron Jobs Management UI | Implement Viewmodel and UI Screen for cron jobs control | M7 | PLANNED | | M10 | Navigation Drawer | Integrate Material3 navigation drawer using Navigation3 keys | M8, M9 | PLANNED | | M11 | E2E & Hardening Phase | Verify all E2E tests, perform adversarial coverage hardening (Tier 5) | M6, M10 | PLANNED | --- ## Interface Contracts ### REST API Service - `getStatus()`: Returns `StatusResponse` (version, gateway status, active sessions) - `getSessions()`: Returns `SessionListResponse` (all sessions and metadata) - `getSessionMessages(sessionId: String)`: Returns `SessionMessagesResponse` (message history) - `getSystemStats()`: Returns `SystemStatsResponse` (CPU, memory, etc.) - `getSkills()`: Returns list of skills (`GET api/skills`) - `toggleSkill(payload)`: Toggles a skill's state (`PUT api/skills/toggle`) - `getCronJobs()`: Returns list of cron jobs (`GET api/cron/jobs`) - `pauseCronJob(id)`: Pauses a job (`POST api/cron/jobs/{id}/pause`) - `resumeCronJob(id)`: Resumes a job (`POST api/cron/jobs/{id}/resume`) - `triggerCronJob(id)`: Triggers a job immediately (`POST api/cron/jobs/{id}/trigger`) - `deleteCronJob(id)`: Deletes a job (`DELETE api/cron/jobs/{id}`) ### WebSocket Client (`HermesWsClient`) - `connect()`: Establish connection to `/api/ws?token=` - `disconnect()`: Terminate connection - `sendMessage(text: String)`: Submit prompt (`prompt.submit` JSON-RPC method) - `resumeSession(sessionId: String)`: Resume a session (`session.resume` JSON-RPC method) - Callbacks: `onConnected()`, `onDisconnected(reason: String)`, `onMessage(JsonRpcResponse)` ### Event Parser (`EventParser`) - Parses incoming JSON messages from WebSocket and extracts event fields (`event`, `data`, `id`, `result`, `error`). - Categorizes events: `message.complete`, `message.token`, `tool.start`, `tool.complete`, `clarify.request`, etc. ## Code Layout - `app/src/main/java/com/m57/hermescontrol/` (Main Source) - `app/src/test/java/com/m57/hermescontrol/` (Unit Tests)