What's New
Releases the work merged in #14 and #15.
Added
- Upload your own notification sounds — each of the three events (agent asks you something / sends a notification / finishes working) can be overridden with your own audio file from Settings → General → Sounds per event. Uploads are stored server-side (mp3, wav, ogg, m4a, aac, webm — 5 MB cap), so the same sounds apply on every device connected to that commander, not just the browser that uploaded them. Per event, not all-or-nothing: anything you don't override keeps its built-in cue, and a file that fails to play (bad codec, missing file, autoplay blocked) falls back to the synthesized cue instead of going silent.
- Slash-command autocomplete in chat — typing
/suggests the commands the commander can actually deliver (/compact,/clear,/context,/cost), gated per provider. Interactive-only commands like/modeland/loginare deliberately absent: agents run headless, where those silently do nothing.
Changed
- Warmer built-in cues — the synthesized sounds were pure oscillators with exact-octave overtones, which is precisely what reads as "electronic beep". They're now synthesized as struck bars: inharmonic partials (2.005×, 3.01×, 5.43×) like a real marimba, a short filtered-noise mallet transient, per-partial decay, a gentle lowpass, and a ~10 ms attack instead of a clicky onset. Same melodies and pitch-bend, so every cue stays recognizable — only the timbre changed.
Fixed
- Context counter drifting out of sync — a turn can bill several models (the conversation model plus short auxiliary Haiku calls), and
modelUsagekey order follows first use, so the first key was frequently Haiku and its 200k window got reported as the agent's: replaying 1578 real result events, 290 of 402 multi-model turns were mis-attributed. The meter now picks the model the main loop actually streamed. A prompt larger than the tracked window is no longer discarded (which collapsed the meter to0.0kmid-conversation) but widens the stale window instead, and the terminal footer, mobile bar and flat view now share one precedence helper instead of three. /compactleaving a stale context number on screen until the next message.- Slash commands looking like a no-op — hidden in four places, they now render as a chip in both live and reloaded-history paths, server-intercepted commands (
/context,/cost,/clear) are echoed so they reach the chat, and Echo Prompt no longer mangles/compactinto something the CLI won't treat as a command. - CSS leaking into highlighted code — a global
.class-namerule collided with Prism'sbuiltin class-nametoken and capitalizedcd/echoin every command shown in chat; a global.tagrule hit Prism's markup token, giving HTML/JSX blocksdisplay: inline-flexand a red hover. Both scoped to their owners. - Commands mislabelled as GREP — the classifier matched
grepanywhere in the string, so a multi-step build gate got labelled by one late pipe stage.
Technical Details
- New
/api/custom-soundsroutes (list / upload / serve / delete), storing under the app data dir alongside the existing custom-class-icons pattern - New
slashCommands.tscatalog with per-provider gating;getDisplayContextInfois now the single source of truth for context display - Quality gates: ESLint 0 warnings, TypeScript 0 errors, 1210 tests across 101 files
- Android: versionName 1.174.0 / versionCode 1174000