This repository was archived by the owner on Oct 31, 2026. It is now read-only.
Repository navigation
feat(desktop): Live launcher in the composer like the web app - #45
Merged
omarzanji merged 1 commit intoOct 25, 2026
Merged
Conversation
Until the bundled ditto-app ships ditto-app#3432's own launcher, a build-time bridge puts a waveform Live launcher just left of Send (where Temporary chat was) and moves Temporary chat to the header, as pingdotgg#3432 does. The launcher calls window.ditto.liveToggle() and its pressed state follows ditto:live-active, so it agrees with the rail button and Cmd+Shift+L. Composer and header patches apply together or not at all, and are skipped once ditto-app renders its own live-mode-launcher. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ditto-app#3432 puts a waveform Live mode launcher in the composer just left of Send and moves Temporary chat to the header. pingdotgg#3432 isn't merged, and bumping the submodule to it breaks the desktop build right now, so Ditto Desktop still showed the temporary-chat clock beside Send and had no Live entry in the composer.
What changed
scripts/desktop-live-launcher-bridge.cjs, applied bybuild-web.cjson top of the chat and computer overlays, which edit the same two files. It does three things:SendMessage.tsx): removes the temporary-chat slot and rendersrenderer/DesktopLiveLauncher.tsxfirst in the send slot. It's hidden in the Code start view and while a separate Stop is showing, like [codex] Diagnose desktop client settings read failures pingdotgg/t3code#3432. It also removes the old PhoneCall "Live mode" entries that [codex] Diagnose desktop client settings read failures pingdotgg/t3code#3432 removes (they were in the + menu and the hidden media fallback).V2Shell.tsx): addsrenderer/DesktopHeaderTemporaryChat.tsxright after the search trigger, as [codex] Diagnose desktop client settings read failures pingdotgg/t3code#3432 does. It shows on chat, new-chat and temporary surfaces. It reads as pressed on Temporary Chats, and pressing it again goes back to Chats.LiveModeButton:data-testid="live-mode-launcher" data-placement="composer",AudioLinesicon, the "Talk to Ditto by voice" tooltip with a ⌘ ⇧ L key hint, andaria-keyshortcuts. While Live is off its label is "Start live mode". It'saria-disabledwith "Uploading files..." during an upload.window.ditto.liveToggle(). The pressed state followsliveStatus()plusonLiveActive. Main sendsditto:live-activeon every transition, so the launcher, the rail button, Cmd+Shift+L and the menu stay in sync. A late initialliveStatus()never overrides a newer push.renderer/desktopLiveLauncher.css): the launcher, kbd and header-toggle styles from [codex] Diagnose desktop client settings read failures pingdotgg/t3code#3432's liveDock.css and v2.css, plus [codex] Diagnose desktop client settings read failures pingdotgg/t3code#3432's 3-column composer grid at ≥1024px.live-mode-launcher/LiveModeButtonorheader-temporary-chat, the bridge is a no-op. feat(desktop): live mode drives Ditto through the web orchestrator #41'sstartLiveModepatch already sends ditto-app's own launcher to the aura.docs/ditto/live-mode.mdnow lists the composer entry point.Surfaces checked (dev build, isolated home)
Home/new chat, a chat thread, an agent chat (Main Ditto) and Temporary chat all show one launcher, at wide and narrow widths. The Code tab shows no launcher and no header toggle.
Tooltip with shortcut hint:
Active styling:
(Shown by setting
data-activefrom devtools. I didn't start a real Live session in the dev build, since that drives Computer Use. The state sync is covered by tests.)Temporary chat from the header (pressed), launcher still in the composer:
Agent chat:
Chat thread:
Code tab (no launcher): 
Tests
tests/live-launcher.node-test.cjscovers the patch result, idempotence, any missing anchor leaving both files untouched, the skip when ditto-app ships its own launcher or header toggle, active-state sync (a push beats a late status, unsubscribe on dispose), and the platform shortcut hint.node --experimental-strip-types --test tests/*.node-test.cjs: 236/237 passed. The one failure,computer-service"setup runs independently…", is a 15s readiness timeout under full-suite load. That file is untouched here and passes 7/7 on its own.vp run check:changed: format, lint, knip and typecheck all pass.node apps/desktop/scripts/build-web.cjsbuilds, and the submodule is left clean afterwards.Screenshots are on the
pr-assets/live-composer-launcherref, not in this branch.Model: Claude Opus 5.5, Claude Code.
🤖 Generated with Claude Code