Title: feat(voice): desktop 🎙 composer button + Tauri voice commands (slice 3) by oratis · Pull Request #175 · oratis/deepcode · GitHub
Open Graph Title: feat(voice): desktop 🎙 composer button + Tauri voice commands (slice 3) by oratis · Pull Request #175 · oratis/deepcode
X Title: feat(voice): desktop 🎙 composer button + Tauri voice commands (slice 3) by oratis · Pull Request #175 · oratis/deepcode
Description: Summary Slice 3 of /voice: voice dictation in the Mac desktop client, mirroring the CLI. Click the 🎙 button in the composer to record, click again to stop → it transcribes locally with whisper.cpp and splices the text into the input. Fully on-device. Stacked on #174 (slice 2), which is stacked on #173 (slice 1). Base is feat/voice-cli-capture. Merge the chain bottom-up. Changes Rust (src-tauri) voice.rs: voice_status — detect whisper binary + model (settings or defaults) + ffmpeg; returns readiness + problems. voice_start / voice_stop / voice_cancel — the in-flight recording Child lives in tauri-managed VoiceState between start and stop. Desktop uses ffmpeg and stops it gracefully by writing q to stdin (flushes a valid WAV trailer), then runs whisper, parses the transcript, and deletes the temp clip. parse_whisper_output ported from core (timestamps + log lines stripped). Registered in lib.rs (+ .manage(VoiceState)). Entitlements.plist: com.apple.security.device.audio-input. Info.plist: NSMicrophoneUsageDescription (Tauri merges it into the bundle) → the OS mic-permission prompt on first use. Renderer lib/voice.ts — typed voice_* wrappers + a pure insertTranscript() helper (splices at the caret with smart spacing). lib/use-voice.ts — idle → recording → transcribing state machine; probes voice_status on mount to disable the button (with a tooltip) when voice isn't set up. Repl.tsx — 🎙 button in the composer toolbar; the transcript is spliced at the cursor. index.css — button styling incl. a recording pulse. preview-app.tsx — mock voice_* so the dev harness can exercise the button. Docs: VOICE_INPUT.md desktop usage; BEHAVIOR_PARITY.md /voice row now covers CLI + desktop. Testing Rust: cargo test — 4 voice cases (parse / expand-home / ffmpeg-args / status-with-missing-paths); cargo build clean (no warnings). Renderer: 6 voice.ts cases (IPC command names + insertTranscript); full desktop suite 60 pass; pnpm typecheck, vite build, pnpm lint (0 errors), pnpm format:check all clean. Preview harness: verified the full idle → record (red ⏹) → stop → transcript spliced into the composer flow with the mock-Tauri preview (screenshots below). ⚠️ The real-microphone round-trip is not verified — there's no audio hardware in CI, CI doesn't compile Rust, and the avfoundation capture + macOS TCC permission flow only exercise on a packaged .app with a mic + a whisper model. The control flow, command wiring, arg-building, and transcript parsing are unit-tested; the actual record→audio→whisper round-trip needs a manual on-device pass. 🤖 Generated with Claude Code
Open Graph Description: Summary Slice 3 of /voice: voice dictation in the Mac desktop client, mirroring the CLI. Click the 🎙 button in the composer to record, click again to stop → it transcribes locally with whisper.cpp ...
X Description: Summary Slice 3 of /voice: voice dictation in the Mac desktop client, mirroring the CLI. Click the 🎙 button in the composer to record, click again to stop → it transcribes locally with whisper.cpp ...
Opengraph URL: https://github.com/oratis/deepcode/pull/175
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/files(.:format) |
| route-controller | pull_requests |
| route-action | files |
| fetch-nonce | v2:ee5f33cb-777d-6755-af97-9f43d316c2f5 |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | D6E2:299DE6:E7CE4A:13D5D6C:6A4D60D5 |
| html-safe-nonce | 6b3059a7282134546cd78e51c9f60ee17475af2a88f37350184b0664d1d6585b |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJENkUyOjI5OURFNjpFN0NFNEE6MTNENUQ2Qzo2QTRENjBENSIsInZpc2l0b3JfaWQiOiIyNTA2NzAwMTMzMDA2OTI2MDM3IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 269acf7473264b9dfde5a07307768e2e2ebac98d9b55fc4ddb912689f86ea552 |
| hovercard-subject-tag | pull_request:3821384556 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/oratis/deepcode/pull/175/files |
| twitter:image | https://avatars.githubusercontent.com/u/1140143?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/1140143?s=400&v=4 |
| og:image:alt | Summary Slice 3 of /voice: voice dictation in the Mac desktop client, mirroring the CLI. Click the 🎙 button in the composer to record, click again to stop → it transcribes locally with whisper.cpp ... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | e6658d7c7808aeed776f841e0839b885fce343c9b96244be612c779298e7661e |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/oratis/deepcode git https://github.com/oratis/deepcode.git |
| octolytics-dimension-user_id | 1140143 |
| octolytics-dimension-user_login | oratis |
| octolytics-dimension-repository_id | 1251330559 |
| octolytics-dimension-repository_nwo | oratis/deepcode |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1251330559 |
| octolytics-dimension-repository_network_root_nwo | oratis/deepcode |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | true |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | a438513d3a22ffcd713795ed948c3e5525007665 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width