[feature] Ambient AI — top-right widget + wake word + conversation mode + OS-wide voice routing #16
Labels
No labels
prio_critical
prio_low
type_bug
type_contact
type_issue
type_lead
type_question
type_story
type_task
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lhumina_code/hero_agent#16
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Vision
The AI Assistant is not an island — it's a layer. A small widget pinned top-right of every Hero OS page. Wake-word triggers. Conversation flows. The whole OS becomes voice-addressable.
You're scrolling photos and you say:
You're in a meeting and you say:
That's the target. The OS is reachable by voice from any island, any time.
Why this is achievable
The pieces are mostly built — what's needed is wiring + UX + reliability:
hero_route)What this issue covers
Three components, ship in order:
1. OS-wide AI Widget
A small floating widget pinned top-right of the OS shell, on every page, every island.
Implementation:
hero_os_app/src/shell/as a top-level component, mounted alongside the dock.2. Wake-word activation
Default wake word:
hey hero. User-customisable in Settings → Voice.Implementation:
hey hero,hey ai,hello hero,hi hero, custom.Existing partial work: kokoro-micro / hero_voice has wake-word detection built. This issue integrates it with the widget.
3. Conversation mode
After the agent answers, the widget stays listening for 5 seconds (configurable). User can speak again without re-triggering the wake word.
Voice-to-OS-action: the routing layer
When the agent receives a voice prompt with intent to operate the OS, it calls one of the
os.*MCP tools (defined in the curated tool issue):os.open_island(island_id)os.switch_context(context_name)os.set_theme(mode)These tools issue
hero_routepostMessage commands to the OS shell, which already knows how to route URLs, change contexts, etc. So:→ STT → agent →
os.open_island('biz')+ (implicit)biz.list_contacts()→ island opens, contacts populate, agent says "Here are your 29 contacts."The intent layer is just the LLM picking the right
os.*tool, no new routing infra needed. hero_route already supports all the navigation we need.UX details that matter
Acceptance
Phase 1 — Widget (visual only, no audio yet)
Phase 2 — Wake word
Phase 3 — Conversation mode
Phase 4 — OS-wide voice routing
os.*MCP tool, agent picks correctly.What this issue is NOT
Cross-references
os.*tools live there): filed alongside (hero_agent)Signed-off-by: mik-tf
Update from source-grounded read (session 52)
After reading hero_voice + kokoro-micro, the wake-word path is more fragmented than the issue body assumes.
Wake-word state today:
hero_voice/.../wakeword.rsdue to acandle-core 0.2.2dependency conflict.Listenmode that VAD-segments microphone input and substring-matches"hey hero"on Whisper STT output (ws.rs:389). Coarse, false-positive-prone, not exposed via OpenRPC/MCP.STT/TTS state today:
whisper_localvia whisper.cpp (HERO_VOICE_STT_LOCAL=true), falling back to Groqwhisper-large-v3-turboviaherolib-ai.kokoro-micro(POST /ttsonui.sock; models auto-downloaded to~/.cache/k/). There is no Groq TTS path in code despite earlier "Groq fallback" framing — Groq fallback applies to STT only.OS-wide widget / conversation mode:
Not present in
hero_voicerepo.hero_voice_appships only the per-island Dioxus voice editor. The widget + conversation mode this issue describes don't exist yet.Suggested split:
Reconciliation memo for session 52:
memory/investigation_roadmap_reconciliation.md(private workspace).