feat(dankvoice): /say options menu with output-device routing #25

Merged
dank merged 1 commits from feat/23-dankvoice-menu into main 2026-10-19 00:40:33 -07:00
Owner

Refs #23. Follow-on to #22 (dankvoice).

Adds the pi-peon-style options surface to the extension:

  • /say menu (bare /say now opens it; help keeps the text listing) via ctx.ui.select: auto-speak toggle, voice from the frank-tts roster, output device, player binary, spoken-char cap, and a Speak a test phrase utterance that proves the audio path audibly.
  • Output-device routing — sinks enumerated with wpctl list audio sinks; a saved sink becomes pw-play --target <sink> or paplay --device=<sink> (ffplay ignores). This is the fix for the 2026-10-18 silent-session incident: frank-tts synthesized the answers (200s in its journal) while PipeWire's remembered offline Bluetooth route swallowed the playback.
  • Persistence — choices written to ~/.omp/cache/dankvoice.json (DANKVOICE_CONFIG override); precedence env > file > defaults. detectPlayer is now availablePlayers + playerFor.

Tests: driver gains a fixture wpctl, a stub player that logs its full argv, and a scripted select; three new scenarios (menu listing, menu-set voice used by later + later process, menu-set device appears as --target). bats tests/dankvoice.bats 15/15, full suite 51/51. Live pty TUI smoke on the worktree file: /say menu toggled auto-speak, footer rendered 🔊 server default, settings file written, /exit clean.


cwd: /home/blank/.omp/wt/wt-20261018-204442-7c8a99d · session: 01a1525d-0a05-7615-ba60-58e9b20495d1

Refs #23. Follow-on to #22 (dankvoice). Adds the pi-peon-style options surface to the extension: - **`/say menu`** (bare `/say` now opens it; `help` keeps the text listing) via `ctx.ui.select`: auto-speak toggle, voice from the frank-tts roster, **output device**, player binary, spoken-char cap, and a **Speak a test phrase** utterance that proves the audio path audibly. - **Output-device routing** — sinks enumerated with `wpctl list audio sinks`; a saved sink becomes `pw-play --target <sink>` or `paplay --device=<sink>` (ffplay ignores). This is the fix for the 2026-10-18 silent-session incident: frank-tts synthesized the answers (200s in its journal) while PipeWire's remembered offline Bluetooth route swallowed the playback. - **Persistence** — choices written to `~/.omp/cache/dankvoice.json` (`DANKVOICE_CONFIG` override); precedence env > file > defaults. `detectPlayer` is now `availablePlayers` + `playerFor`. Tests: driver gains a fixture `wpctl`, a stub player that logs its full argv, and a scripted `select`; three new scenarios (menu listing, menu-set voice used by later + later process, menu-set device appears as `--target`). `bats tests/dankvoice.bats` 15/15, full suite 51/51. Live pty TUI smoke on the worktree file: `/say menu` toggled auto-speak, footer rendered `🔊 server default`, settings file written, `/exit` clean. --- cwd: /home/blank/.omp/wt/wt-20261018-204442-7c8a99d · session: 01a1525d-0a05-7615-ba60-58e9b20495d1
dank added 1 commit 2026-10-19 00:32:10 -07:00
Bare /say and /say menu open a ctx.ui.select settings surface: auto-speak
toggle, voice from the frank-tts roster, PipeWire output device
(pw-play --target / paplay --device=), player binary, spoken cap, and a
test phrase. Choices persist to ~/.omp/cache/dankvoice.json (env wins
over file); detectPlayer becomes availablePlayers + playerFor. Fixes
the silent-route failure mode where synthesized audio played into an
offline Bluetooth sink. 15/15 dankvoice bats, 51/51 suite, live pty
TUI smoke armed the footer and wrote the settings file.
dank merged commit 6fffd83957 into main 2026-10-19 00:40:33 -07:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dank/command-center#25