You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The app ships 45 .aac sound effects inherited from OpenCode (packages/ui/src/assets/audio/). They don't fit PawWork's tone, and the surrounding behavior is tangled:
Three separate sound toggles (agent / permissions / errors) plus three separate system-notification toggles.
Sounds are played in two places — context/notification.tsx (turn-complete + error) and pages/layout/layout-sdk-event-effects.ts (permission) — and are never gated by whether the session is currently on screen.
Every event can fire twice: the app plays its own sound and the OS notification fires with its own sound.
Goal (confirmed design)
When it sounds — "your turn" events (turn complete / question / permission) play one warm sound; a real error plays a second sound. Manual interrupts, reverts, and in-progress hiccups never sound.
What it sounds — exactly two bundled sounds (notify.aac, error.aac), warm and soft. No per-sound picker.
Relation to OS notifications — the app owns the sound; the OS notification is silenced (banner + click-to-focus only), so no double sound.
Settings — one three-state control governing all of the above uniformly: Never / Only when unfocused (default) / Always. Error follows the same control: only "Never" silences it, otherwise it ignores the focus state.
Audio is decided: a soft cooking-bell ding for "your turn", a low restrained tap for "error" (sources + licenses recorded in the Phase 1 PR).
Delivery (phased)
Phase 1 — ship the sounds (first PR): delete the 45 OpenCode .aac, add notify.aac + error.aac, point existing defaults at them, collapse the picker options, drop the 45 i18n option labels. Low risk; ships the new sounds without touching behavior.
Phase 2 — behavior refactor (follow-up PR): single three-state setting, silence OS notifications, unify "only when unfocused" gating across sounds + banners, settings migration, settings UI rewrite, i18n cleanup, DESIGN.md sound spec. Detailed file-by-file plan in the first comment.
Background
The app ships 45
.aacsound effects inherited from OpenCode (packages/ui/src/assets/audio/). They don't fit PawWork's tone, and the surrounding behavior is tangled:context/notification.tsx(turn-complete + error) andpages/layout/layout-sdk-event-effects.ts(permission) — and are never gated by whether the session is currently on screen.Goal (confirmed design)
notify.aac,error.aac), warm and soft. No per-sound picker.Audio is decided: a soft cooking-bell ding for "your turn", a low restrained tap for "error" (sources + licenses recorded in the Phase 1 PR).
Delivery (phased)
.aac, addnotify.aac+error.aac, point existing defaults at them, collapse the picker options, drop the 45 i18n option labels. Low risk; ships the new sounds without touching behavior.DESIGN.mdsound spec. Detailed file-by-file plan in the first comment.