hermes-agent/apps/desktop/src
Teknium 4dd4708346
fix(wake): reconcile the listener back to config after a voice turn ends
Ending a voice conversation left the wake word silently off even with
wake_word.enabled: true — the desktop fired one wake.resume and hoped;
if the mic was still held by the just-released WebRTC capture (or the
resume raced teardown), the listener stayed dead until the user
re-toggled it. The wake word is a persistent setting: on is on until
the user explicitly turns it off.

- Desktop: resumeWakeAfterVoice() replaces the fire-and-forget resume —
  resume, then verify against wake.status (config 'enabled' is the
  authority) and re-arm via wake.start, with spaced retries to ride out
  mic-release latency. Passive path: never passes persist, never writes
  config; respects an explicit off and another surface's mic lease.
- Backend: wake.status now reports 'enabled' (config truth) so clients
  reconcile against the setting, not runtime listener state.
- Backend: _wake_resume_if_owner self-heals — a resume that throws
  (mic still busy) retries in a background thread for up to 15s. A
  False return (lease gone/moved) is final, never retried, so the
  retry can't steal another surface's mic. Covers the TUI/gateway
  voice.record path which had no recovery at all (CLI has its idle
  watchdog; the gateway had nothing).
- 6 new vitest cases: re-arm on enabled+down, no persist on the passive
  path, resume-alone success, disabled stays off, owned lease yields,
  older-backend no-op.
2026-07-27 17:17:04 -07:00
..
app fix(wake): reconcile the listener back to config after a voice turn ends 2026-07-27 17:17:04 -07:00
assets/tiers
…
components fmt(js): `npm run fix` on merge (#72902) 2026-07-27 21:15:26 +00:00
contrib
…
debug fmt(js): `npm run fix` on merge (#72532) 2026-07-27 07:16:27 +00:00
fonts
…
hooks
…
i18n Merge remote-tracking branch 'origin/main' into wake-toggle-config 2026-07-27 14:57:11 -07:00
lib Merge remote-tracking branch 'origin/main' into wake-toggle-config 2026-07-27 14:57:11 -07:00
plugins
…
sdk
…
store fix(wake): reconcile the listener back to config after a voice turn ends 2026-07-27 17:17:04 -07:00
themes
…
types
…
global.d.ts
…
hermes-cron-scope.test.ts
…
hermes-parity.test.ts
…
hermes-profile-scope.test.ts
…
hermes.test.ts
…
hermes.ts
…
main.tsx
…
styles.css
…
vite-env.d.ts
…
webhooks-rest.test.ts
…