249 Commits
Author SHA1 Message Date
Bailey Dixon 607c26660c merge: integrate current dev into media consumer fixes 2026-09-23 17:48:41 -04:00
Bailey Dixon 3882b857e3 fix(relay): retire owned media and redact activity logs 2026-09-23 17:48:33 -04:00
Bailey Dixon 81c186c6ba fix(plugin): attach desktop screenshots as host images 2026-09-23 17:48:26 -04:00
Bailey Dixon f8c31f8b59 fix(plugin): distinguish SuperGrok credential failures and on-demand state 2026-09-23 17:16:12 -04:00
Bailey Dixon abb4bc0ced Merge PR #615 SuperGrok provider usage into current dev 2026-09-23 17:14:32 -04:00
Bailey Dixon 759ac490c9 fix(plugin): resolve Android screenshot media tokens for host tools 2026-09-23 16:37:50 -04:00
Bailey Dixon a128e910f1 feat: guide Secure Link setup across Relay surfaces 2026-09-23 13:10:25 -04:00
ophirhan a7cbf377a0 test(plugin): resolve temp paths in profile-home usage test
On macOS tempfile lives under /var which Path.resolve() maps to
/private/var; compare resolved paths so the assertion is stable.
2026-09-23 19:36:16 +03:00
ophirhan 52170f76ea fix(plugin): keep the Grok window when a period reports no usage yet
For a billing period that has recorded no usage, xAI omits `creditUsagePercent` and `productUsage` from the credits snapshot instead of reporting zero. The adapter treated the resulting empty window list as an upstream failure, so a freshly rolled-over period surfaced as 'usage is temporarily unavailable' on the device.

Emit the period window with no percentage and an explicit detail line whenever the period bounds are known: the window, its label, and its reset time are real, only the figure is absent. A payload carrying neither a figure nor period bounds still reports unavailable, so a genuinely broken upstream contract is not masked.

Verified against a rolled-over weekly period that previously produced the error state; the surface now reports the window with its reset time.
2026-09-23 19:36:15 +03:00
ophirhan 9871b0cb7c feat(plugin): report Grok subscription usage in the provider surface
Hosts signed in with `xai-oauth` have a Grok subscription whose windows are
only served by xAI's CLI proxy, not the public API, so the provider-neutral
usage surface could not see them.

Add a `supergrok` adapter that reads the account identity and then the credits
billing snapshot over the pinned `cli-chat-proxy.grok.com` contract with the
host-side OAuth bearer: the current billing period, per-product usage, and
on-demand credit state map onto the existing window/detail shape. Hosts with
no `xai-oauth` credential report `not_configured`, upstream failures degrade to
`unavailable`, and the bearer never enters the response.
2026-09-23 19:36:15 +03:00
Bailey Dixon 43357a387d fix: enforce the combined Secure Link transport contract 2026-09-23 09:48:56 -04:00
ophirhan dcc8d54916 fix(plugin): make Secure Link proxy usable for Gateway chat and login
Preserve WebSocket query strings (auth tickets) when proxying dashboard
and Gateway sockets, disable nested permessage-deflate on the upstream
leg, scope dashboard login HTML/JSON and redirects under /dashboard
without double-prefixing, register bare /api and /dashboard routes, and
include version on /relay/health for route probes.
2026-09-22 14:40:45 +03:00
Bailey DixonandJack Hunzicker 179080d6d9 fix(plugin): share relay availability checks
Co-authored-by: Jack Hunzicker <JackHunzicker@users.noreply.github.com>
2026-09-09 20:57:22 -04:00
Bailey Dixon 7c5894213d fix(plugin): harden bridge credential recovery 2026-09-03 20:53:19 -04:00
nicolasestrem 82c088aa89 test(plugin): remove trailing blank line 2026-09-03 22:40:30 +02:00
nicolasestrem ed599995d6 fix(plugin): resolve bridge token from disk and make android_setup callable
Every android_* tool returned `401 Client Error: Unauthorized` on a phone
that was paired, connected and healthy (`/bridge/status` reported
phone_connected: true, accessibility_granted: true).

Cause: `_bridge_token()` read ANDROID_BRIDGE_TOKEN from the process
environment only. The env is snapshotted when the host starts, so a token
written afterwards — by `android_setup`, by `hermes-pair`, or by hand —
stayed invisible and `_require_bearer_session` rejected every bridge
dispatch until a full restart.

Resolution order is now env -> ~/.hermes/.env -> most-recently-seen paired
session in ~/.hermes/hermes-relay-sessions.json, with the disk fallbacks
cached for 30s so we don't stat two files on every bridge call. The process
environment still wins when set, and HERMES_HOME is honoured.

The documented recovery path was itself broken: android_setup's schema
required `pairing_code` while the signature had been renamed to
`bridge_session_token`, and the dispatcher calls func(**call_args) — so the
schema-conformant call raised TypeError and the canonical one was rejected
by the validator. The tool could not be invoked at all. Both spellings are
now accepted (canonical wins), neither is schema-required, a missing token
returns a structured error, and the description no longer mislabels the
value as a "6-character pairing code" or claims the tool performs pairing.

Also pin TestSetup to a temporary home. It exercises the real
android_setup, which persists ANDROID_BRIDGE_* to ~/.hermes/.env — running
the suite on a real host overwrote the machine's live paired session token
with a fixture value.

Verified: 43 passed (test_android_tool.py + test_android_tool_device_selector.py),
and against the physical device with ANDROID_BRIDGE_TOKEN unset from the
environment — /ping and /current_app both 200 via the new disk fallback.
2026-09-03 22:40:30 +02:00
Bailey Dixon 367e5d271c Merge origin/dev into feature/upstream-first-media
# Conflicts:
#	CHANGELOG.md
#	README.md
#	docs/localization-status.json
#	docs/upstream-surface-matrix.md
#	user-docs/features/connections.md
#	user-docs/features/index.md
#	user-docs/guide/index.md
#	user-docs/guide/remote-access.md
#	user-docs/reference/configuration.md
2026-08-31 21:39:05 -04:00
Bailey Dixon e7cbed3c8f feat(android): prefer upstream standard surfaces 2026-08-31 21:36:18 -04:00
Bailey Dixon 201e204290 fix(plugin): restore native installer compatibility 2026-08-31 19:45:38 -04:00
Bailey Dixon bb2f1e6c0c fix(plugin): harden Git workspace path containment 2026-08-30 23:28:51 -04:00
Bailey Dixon faf4281486 fix(pairing): omit inactive Tailscale API routes 2026-08-30 20:15:42 -04:00
Bailey Dixon 8ee772f5fb fix(pairing): prefer dedicated Tailscale listener 2026-08-30 19:56:05 -04:00
Bailey Dixon 6c27bc9cda fix(plugin): dedicate Tailscale dashboard port 2026-08-30 19:55:09 -04:00
Bailey Dixon 460d6cd198 fix(installer): dedicate Tailscale listener port 2026-08-30 19:54:51 -04:00
Bailey Dixon ce63030bcf fix(pairing): reject ambiguous dashboard ingress 2026-08-30 18:15:36 -04:00
Bailey Dixon 92f99a4120 fix(pairing): bind relay to selected dashboard origin 2026-08-30 18:02:53 -04:00
Bailey Dixon 85ba13bd04 fix(pairing): prefer recommended Tailscale listener 2026-08-30 15:44:56 -04:00
Bailey Dixon ea982c60d4 fix(plugin): separate Tailscale listener from dashboard 2026-08-30 15:37:43 -04:00
Bailey Dixon 8f394e8b18 fix(installer): serve dashboard through Tailscale 443 2026-08-30 15:36:10 -04:00
Bailey Dixon 841e237905 fix(pairing): reject public plaintext routes 2026-08-30 15:11:56 -04:00
Bailey Dixon 01533337eb fix(pairing): route new invites through dashboard ingress 2026-08-30 15:02:55 -04:00
Bailey Dixon a2ed48ab20 fix(installer): default Tailscale to dashboard ingress 2026-08-30 14:59:07 -04:00
Bailey Dixon ef280979e9 fix(plugin): prefer dashboard Tailscale ingress 2026-08-30 14:58:58 -04:00
Bailey Dixon 0bb0a1e3e2 fix(pairing): make direct relay compatibility explicit 2026-08-30 14:53:11 -04:00
Bailey Dixon ea7c7cd3e2 Merge dashboard route preview head
# Conflicts:
#	CHANGELOG.md
#	app/src/main/kotlin/com/hermesandroid/relay/ui/screens/ChatScreen.kt
#	app/src/main/kotlin/com/hermesandroid/relay/viewmodel/ChatViewModel.kt
#	app/src/main/kotlin/com/hermesandroid/relay/viewmodel/ConnectionViewModel.kt
#	app/src/main/kotlin/com/hermesandroid/relay/viewmodel/connection/ProfileController.kt
#	app/src/main/res/values-b+pt+BR/strings.xml
#	app/src/main/res/values-b+zh+Hans/strings.xml
#	app/src/main/res/values-de/strings.xml
#	app/src/main/res/values-es/strings.xml
#	app/src/main/res/values-ja/strings.xml
#	app/src/main/res/values-ru/strings.xml
#	app/src/test/kotlin/com/hermesandroid/relay/network/upstream/GatewayChatClientTest.kt
#	docs/decisions.md
#	docs/localization-status.json
2026-08-30 13:02:58 -04:00
Bailey Dixon 318a02db49 fix(pairing): preserve relay routes from QR 2026-08-29 13:58:29 -04:00
Bailey Dixon 76ead50c60 fix(android): remove provisional threads safely 2026-08-28 22:08:47 -04:00
Bailey Dixon 47b471acb4 feat(relay): add dashboard same-origin ingress 2026-08-26 21:54:56 -04:00
Bailey Dixon 1bdcab8fc0 feat(android): add native git workspace surfaces 2026-08-26 19:03:21 -04:00
Bailey Dixon 00288a2b3b test(git-state): cover links across platforms 2026-08-25 13:54:45 -04:00
Bailey Dixon 8f52feffba fix(git-state): harden repository operations 2026-08-25 13:51:10 -04:00
Bailey Dixon 1f5e50ccd7 chore: merge dev into git-state 2026-08-25 11:51:44 -04:00
Bailey Dixon 2ebdf55501 Merge branch 'dev' into feature/android-supervised-mode 2026-08-25 11:32:54 -04:00
mrvigneshvt ad107ea205 feat(git-state): add AI commit messages, stash-checkout, and push-after-commit
Commit-message generation reuses the upstream async LLM helper via the plugin's deferred-import pattern; empty staged diffs never call the model and failures degrade to an empty message plus notice. stash_checkout auto-stashes a dirty tree before switching (recoverable; stash surfaced as a notice). Push-after-commit toggle auto-starts the push confirmation flow without bypassing the confirmation token. Truncation caps consistent across all bounded endpoints. New UI strings localized across the 12-catalog parity gate.
2026-08-25 13:25:21 +00:00
mrvigneshvt f5aeb27e5a feat(git-state): add git write operations and Android write UI
POST endpoints for stage, unstage, discard, commit (selected paths supported), fetch, pull (--ff-only), push, and checkout with new-branch/track. Destructive ops enforce fixed per-use confirmation tokens (403 on missing or mismatched confirmation); the plugin.api.write grant gates writes client-side per the documented plugin contract; git failures classify into a structured taxonomy mapped to HTTP (409 dirty/conflict, 502 auth/network, 400 invalid). Android: commit dialog, branch picker with track, confirmation dialogs (standard AlertDialog pattern), grant-refusal notice, mutation progress/error rendering, 16 view-model tests. Dashboard: identically gated write controls. 56 endpoint/helper-level tests; deterministic fixtures.
2026-08-25 13:25:21 +00:00
mrvigneshvt fdaeb121d5 feat(git-state): add read-only git workspace browser (scan, status, branches, diff, file read)
Plugin endpoints under /api/plugins/hermes-relay/git/* backed by a scanned-repo allowlist with configurable base path; bounded responses with truncation flags; traversal-rejected file reads returning working-tree content with clear binary/non-UTF-8 errors; remote URLs scrubbed of userinfo; zero shell interpolation. Registers the Git mobile plugin page and a read-only dashboard tab; Android renders the surface via a dedicated Compose screen with view model and unit tests; all locale catalogs refreshed.
2026-08-25 13:25:21 +00:00
Bailey Dixon 8c8c3975f2 fix(server): bound provider usage profile errors 2026-08-24 23:21:24 -04:00
Bailey Dixon 1074ecc24f Merge remote-tracking branch 'origin/dev' into feature/android-supervised-mode
# Conflicts:
#	app/src/main/kotlin/com/hermesandroid/relay/ui/RelayApp.kt
#	app/src/main/kotlin/com/hermesandroid/relay/ui/screens/SettingsScreen.kt
#	docs/localization-status.json
2026-08-24 21:41:12 -04:00
Bailey Dixon c223dc690d Merge remote-tracking branch 'origin/dev' into codex/pr-393-integration
# Conflicts:
#	CHANGELOG.md
#	app/src/main/res/values-b+pt+BR/strings.xml
#	app/src/main/res/values-b+zh+Hans/strings.xml
#	app/src/main/res/values-de/strings.xml
#	app/src/main/res/values-es/strings.xml
#	app/src/main/res/values-ja/strings.xml
#	app/src/main/res/values-ru/strings.xml
#	docs/decisions.md
#	docs/localization-status.json
2026-08-24 20:51:41 -04:00
Bailey Dixon 4d90eef3d8 Merge remote-tracking branch 'origin/dev' into feature/android-supervised-mode 2026-08-24 20:15:18 -04:00