Call-first UI: instant listen, Bloub, neural-or-silence TTS - #1
Conversation
The lockfile requires rustc 1.85+ (edition 2024). Pin 1.98.0, compile the workspace, and start the mock gateway on :8787 so Cloud Agents boot ready to work. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (5)
📒 Files selected for processing (73)
📝 WalkthroughWalkthroughThe change introduces a call-first OpenLive interface. It adds a local desktop splash flow, Bloub SVG animation, animated call controls, automatic call joining, neural-or-silence TTS behavior, vendored UI assets, and development startup scripts. It also includes lint-oriented Rust refactors and updated documentation. ChangesOpenLive call surface
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant Browser
participant CallEntry
participant AudioSession
participant Gateway
participant BloubOrb
Browser->>CallEntry: evaluate shouldAutoJoinCall
CallEntry->>AudioSession: beginConversation after gesture
AudioSession->>Gateway: establish voice session
Gateway-->>Browser: voice state and media events
Browser->>BloubOrb: setMode and setSignals
BloubOrb-->>Browser: render SVG animation frame
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
CI uses stable rustc 1.98 with -D warnings while the workspace denies clippy::all and clippy::pedantic, so map_unwrap_or, unnecessary_sort_by, result_large_err, and related lints now fail the rust job. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Default chrome is the listening orb plus Mute / End / Settings. Vendors Bloub (MIT) and Morphicons + Lucide. Auto TTS is Piper or silence — no formant pad. Desktop shows the orb while the gateway spawns. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
The bundled lucide re-export listed Phone instead of PhoneOff, which blocked ESM load of call-controls and left the UI on the boot splash. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Exclude the orb SVG from the global icon stroke reset, use a light face with dark eyes on black, and hide idle chrome rings/backchannel. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Boot fade-in left a translateY transform on the signal shell, which made the fixed dock clip under overflow:hidden. Clear those for minimal UI. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Skip the branded splash delay, auto-join the session, and treat Mute as mute. Lab chrome stays in Settings. Desktop CI lint no longer requires a prebuilt gateway binary. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
The call chrome no longer lives inside overflow-hidden stage layout. The OpenLive wordmark opens Settings instead of diagnostics. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Keep the stage from eating topbar clicks, and let End cancel an in-flight auto-join. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
Move splash and media-generation state above first use so auto-join, brand Settings, and End all wire up on load. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
tauri_build still requires bundle.resources during clippy, so the skip path writes a placeholder gateway binary. Add PNG/ICO/ICNS placeholders and drop the empty macOS entitlements string. The web UI no longer mounts a branded boot splash, keeps lab tools inside a collapsed Advanced block, and uses call-native copy. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
The settings body is a CSS grid. Forcing min-height:0 on the Advanced details crushed the closed summary to the border width, so lab tools were unreachable. Use min-content so the disclosure stays tappable. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
The Feel fieldset used to append after Settings → Advanced once Runtime was no longer a top-level fieldset, which overlapped the lab disclosure. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
macOS desktop-build failed when the cache already had cargo-tauri: cargo install exits 101 without --force. Skip install when 2.11.4 is present, otherwise force-install. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
The bash if/then skip broke PowerShell on windows-latest. A single cargo install --force works on macOS and Windows and tolerates a cached cargo-tauri binary. Co-authored-by: Byte271 <byte271@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: be49d490d6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| addTimeline("microphone", `Capture started at ${sampleRate} Hz`); | ||
| } | ||
|
|
||
| if (epoch !== joinEpoch) return; |
There was a problem hiding this comment.
Clean up resources when cancelling an in-flight join
If the user presses End while the new auto-join is awaiting provider/transport setup, joinEpoch changes but the function can still resume, open a socket and start the microphone before reaching this check. Returning here performs no cleanup because endConversation() already ran, leaving the microphone and connection active behind an idle UI; cancellation must be checked before each resource acquisition or explicitly tear down resources on an epoch mismatch.
Useful? React with 👍 / 👎.
| const advance = this.reducedMotion ? 0 : dt * this.motionScale; | ||
| this.clock += advance; | ||
| this.paint(this.engine.sample(this.clock)); |
There was a problem hiding this comment.
Preserve state changes when motion is disabled
When prefers-reduced-motion is enabled, or the motion slider is set to 0, advance remains zero forever. BotEngine.setState() represents state changes as time-based morphs, so every subsequent sample(this.clock) stays at morph progress zero and the face remains in its previous state instead of reflecting thinking, speaking, yielding, or interruption; suppress ambient animation without freezing state-transition time, or snap transitions to their terminal pose.
Useful? React with 👍 / 👎.
OpenLive’s default path is now a call, not a lab console.
Feel (GPT-Live)
Desktop CI
OPENLIVE_SKIP_GATEWAY_BUILD=1writes a placeholderopenlive-gateway-bundled.exeso clippy’stauri_buildresource check passes without a real gateway binary.entitlementsstring removed.cargo install … --forceso cached runners on macOS and Windows do not fail whencargo-taurialready exists.How to try
Not affiliated with xAI or OpenAI. Face: Bloub (MIT). Controls: Morphicons + Lucide.