5fe8f228c1
Add a read-only /ecosystem page that consumes the sibling services' JSON APIs (Nexus entities, Praxis attention, Hexis capabilities), fetched concurrently with honest per-panel error states. Siblings stay headless — mavweb is their human surface (arch §16). Wired via mavweb -nexus/-praxis/-hexis flags; mavweb joins the ecosystem compose network. Fix mobile horizontal overflow across all pages: .content is a flex child with default min-width:auto, so it refused to shrink below the tables' intrinsic width. min-width:0 lets wide tables pan inside .scroll instead of dragging the page sideways. Verified via CDP geometry check (scrollWidth === clientWidth at 430px). Also includes in-progress Ethos UI redesign, ecosystem deploy compose, and planning docs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
Plan: Hearing — Audio Stream Monitoring & Meeting Summarization
Goal: Maven can "hear" ambient audio from workpc — microphone input during meetings, system audio — and on demand (or on trigger) produce transcripts, summaries, or extract action items. A typical use case: "Maven, запиши встречу" starts capture, "хватит" stops it, and Maven writes a summary note.
Done when:
internal/audio/capture.go— remote microphone capture client (receives PCM stream from workpc over WebSocket or the existing voice TCP protocol)internal/stt/— streaming transcription (uses existingstt.Transcriberinterface, extended with streaming support)- Meeting capture triggered by voice command (IntentCapture) or configurable keyword ("maven record")
- Raw audio is either streamed to STT in real-time or saved to a WAV file and transcribed after capture ends
- Transcription + LLM summary is written as a note (
source:capture:meeting) throughipc.CoreAPI - New
mavhearymodule (cmd/mavheard/) — the workpc-side agent that captures mic/speaker audio and streams it to mavend
Scope:
- New
cmd/mavheard/— workpc-side agent: captures microphone (PortAudio or ALSAarecord), streams over WebSocket to mavend internal/audio/extended with capture types:MicCapture,SystemCapture,FileCaptureinternal/stt/stt.goextended withStreamingTranscriberinterface (or reuse existing with chunked input)- Router: new
IntentCaptureintent for start/stop commands - Reuses
internal/llm.Clientfor summarization - Reuses
internal/voice/server.goTCP protocol for streaming audio
Steps:
- Create
cmd/mavheard/main.go— workpc-side daemon: captures microphone viaarecordpipe or PortAudio, opens WebSocket or TCP connection to mavend, streams PCM frames - Create
internal/audio/capture.go—Captureinterface:Start(),Stop(),AudioCh <-chan Audio; implementMicCapture(reads frommavheardstream) andFileCapture(reads WAV) - Extend
internal/stt/stt.go— addTranscribeStream(ctx, audio <-chan Audio) (string, error)toTranscriberinterface;Stubreturns empty;Remoteforwards chunks to worker socket - Add
IntentCapturetointernal/router/intent.go— slots:Action("start"/"stop"/"status"),Duration - Wire capture handler in
cmd/mavend/voice.go:reactiveHandler— start = spawn goroutine receiving audio, stream to STT; stop = finalize, send to LLM for summarization, write note viaWriteNote - Add capture config to
voiceblock inconfig.Config—{capture_enabled, capture_timeout} - Test with a recorded WAV file — simulate a meeting, verify transcription + summary note is created