Release 0.2.1 - #10
Merged
Merged
Conversation
- electron ^43.1.1 (Node 24.18, node:sqlite available for the chat-store migration), electron-builder ^26, electron-updater ^6.8 - sandbox: true on main/panel/splash windows — preload only uses contextBridge/ipcRenderer, verified the bridge (version/platform) and WebGPU fast path still work in the running app - LSMinimumSystemVersion 11.0 → 12.0 (Electron 43 / Chromium requirement) - dev-only --remote-debugging-port=9333 on start:dev for CDP-driven testing - fix pnpm-workspace allowBuilds placeholder that broke install - correct stale mini-mode comment (separate panel window, not a shrink) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ile ops - packaged desktop generates a per-launch token, flows it to both spawned servers as OPENLIVE_AGENT_SECRET and to the renderer via argv; agent's /live upgrade now also accepts ?token= (timing-safe) since a browser WebSocket can't set headers. Verified: no/bad token → 401, query+header → accepted. Dev and web/container paths unchanged. - powerMonitor suspend/lock ends an active call cleanly (mic/VAD released) with a 'paused while your machine slept' banner instead of a zombie pipeline - reveal_path/open_path validate against the bound workspace via realpath (verified live: /etc/hosts and ../ traversal refused, workspace file ok) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- LiveDock/InCall/MiniBar/TranscriptPanel subscribed to the ENTIRE live store — every caption chunk, tool tick, todo or usage update re-rendered the whole call UI. All four now use useShallow field selectors; LiveDock no longer subscribes to any hot per-chunk field. - caption word-reveal wrote chatStore.liveText every rAF frame (~60fps) while the agent spoke; now writes only when a new word is revealed (~3-6/s). Barge-in truncation and the hidden-window whole-chunk path are unchanged. - verified live: full call starts and ends cleanly on the running app, console clean. (Word-by-word reveal pacing needs a real mic turn.) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ration - packages/db: new sqlite.ts (lazy DatabaseSync singleton, WAL, busy_timeout 5000, FK cascade) + migrate-conversations.ts (lockfile- guarded, transactional, idempotent import; source renamed to .migrated.bak as the recovery hatch) - queries.ts chat/message functions rewritten on prepared statements with IDENTICAL signatures; providers/settings/voice-profiles stay JSON - kills the two scaling bugs: whole-file rewrite per message and whole-file parse per read; messages are now append-only + indexed - node:sqlite is built into Node 22.13+/Electron 43 — zero native deps, universal mac build unaffected - verified on real data live: 58 chats / 295 messages migrated with identical order+content, History renders, web-process rename round-trips - 4 new vitest cases: fidelity (incl. same-timestamp order + orphan rows), idempotency, CRUD+cascade, createChat dedupe Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- remove dev-only window.__olLive/__olUi exposures (were marked 'removed before merge'), stray [live:perf] console.debug lines - delete permanently-empty LIVE_TOOL_DENY scaffolding; dedupe safeParseArgs into turn.ts (both turn-runner and worker already import it) - new tests: /live upgrade gate (5 cases incl. length-mismatch), anthropic wire adapter SSE→ProviderEvent contract, liveStore slice stability (guards the useShallow selector fix) - suite: 66 tests green Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- all 261 ad-hoc text-[Npx] sizes (16 distinct values) swept onto tokens: micro/caption/label/body/callout/title-sm/title/title-lg/display, defined in @theme with paired line-heights; tnum utility for counters - Geist stays, BUNDLED via next/font (build-time embedded, identical on mac + windows). A system-font-stack experiment was reverted — SF renders wider than the layout's design metrics and diverged per platform. - teach tailwind-merge the custom font-size group in cn() — unknown text-* classes were classified as color and silently DROPPED by later color classes (chips/labels rendered 16px; verified fixed live at 10px) - desktop build scripts now always run pack:web+pack:agent: 'prebuild' never fired for build:mac/build:win, so local builds silently packaged a stale dist (matches what CI already does explicitly) - electron-builder kept at ^25.1.8 (26 bump reverted — no benefit, and the known-shipped version packages the pnpm symlink farm correctly) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- app-launch hero timeline (page.tsx): mark settles → headline and tagline rise → CTA row staggers → talk-to fades in. expo.out, transforms/opacity only, once per hero mount, gated by prefersReduced(). - HistorySidebar: workspace groups cascade in keyed on the data arriving (not just open), so rows never pop in unanimated after the query lands - shared presets (enterUp/staggerIn) + EASE.emphasized added to lib/gsap.ts with the motion rules documented (no loops during calls, useGSAP scope, reduced-motion short-circuit) - verified live: mid-animation frames captured for both moments, console clean. Lobby↔call transitions, settings enter/exit, orb morphs already existed and were left alone. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- .ol-select: appearance:none + custom SVG chevron on every native <select> (device pickers, pipeline/vision settings, elicitation forms) — keeps OS keyboard/a11y/popup semantics, drops the platform chrome that clashed with the design. Gotcha: raw single quotes in the CSS data-URI made Tailwind/Lightning silently drop the whole rule — fully URL-encoded now. - custom Select (SetupControls): ArrowUp/Down/Home/End walk the options with wraparound, focus lands on the current selection on open; Escape and outside-click unchanged. Verified live by driving it with key events. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- .desktop scope: user-select none on the app chrome (native apps don't drag-select their UI); explicitly re-enabled for inputs, textareas, contenteditable, transcript markdown (.ol-md), code, and .ol-selectable (user chat bubbles). Verified live: chrome=none, input/content=text. Web build untouched (.desktop class only exists under Electron). - audit confirmed the rest was already right: drag regions cover the chrome with no-drag on controls, buttons use cursor:default, and the hero reveal serves as the launch fade-in Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The tray's 'Mini mode' hid the main window without telling the renderer, so PanelBridge (the component that publishes call state to the pill and executes its commands) never mounted: end/expand/camera/screen all did nothing and the confirm never ended the call. - main now echoes openlive:minimized to the renderer — but ONLY for tray-originated transitions. Echoing renderer-initiated ones closed a feedback loop with StrictMode's mount/unmount cycle (panel recreated in a tight loop until the app died — caught live via the GET /mini flood). - panel commands route through a module-level router with a fallback: expand/end restore the window even when no call is running (tray mini with no session used to strand a dead pill) - verified live end-to-end: renderer mini → panel shows real call state, camera toggles with preview relay, End→confirm ends the call and restores the window; no-call expand restores via fallback; exactly one GET /mini per entry (no loop) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- sidebar is now 'Sessions' everywhere (header, tooltips, delete confirms) - segmented All ↔ OpenLive filter (persisted): OpenLive shows only sessions started from this app across all agents, and drops workspaces left with none — the agents' own CLI sessions stop crowding the list. Tooltips on both options explain exactly what each shows; empty states adapt. Verified live: 28 workspace groups → 3 with the filter on. - collapse-all button folds every folder at once (they persist open otherwise). Verified live: expanded folder → 0 open after click. - counts, search, and collapse-all all operate on the FILTERED list, so the numbers always agree with what's visible Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Menus animated IN but vanished on close — reading as broken. Added useMenuPresence: enter via useGSAP, exit via plain gsap + a timer-driven unmount (useGSAP's context revert was killing the exit tween before it finished, hanging the menu at opacity 0). Applied to every precall/in-call popover: provider/model/agent Pickers, the hero 'Talk to', device menus. Verified live: open → animate → close animates back → unmounts clean. Precall panel clarity (the aside read as flat grey text): - section eyebrows get an accent tick + muted-foreground (was faint, nearly invisible); field hints lifted faint → muted-foreground - fact chips (vision / reasoning / ctx) cascade in when the model changes, so the row visibly reacts to the pick above it Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Bump app and desktop to 0.2.1, add the 0.2.1 changelog entry - Screen share: share the primary screen directly (the macOS system picker was cancelling getDisplayMedia and killing the share) - Release notes: drop the platform emoji from the download table and the em dash in the verify-on-launch line - Fix stale supervisor test to match the shipped crash-recovery contract (recovery is an out-of-band error event, not a text_delta)
Under shell:true on Windows (needed for .cmd shims), cmd.exe mangles an inline `node -e` script's quotes and parens, so the exit code, output cap, and kill tests failed there. Run each script from a temp file, which exercises the same capture, cap, and kill behavior on every OS.
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 join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
OpenLive 0.2.1
Cuts the 0.2.1 release off
rework/foundation. This is the foundation reworklanding on
main: a current Electron with the renderer sandboxed, SQLite-backedhistory, agent security hardening, and a typography and controls pass, plus the
screen-share fix and release-notes cleanup that motivated tagging it now.
Highlights
Added
node:sqlite), with a one-time migrationfrom the old JSON history on first launch.
Changed
scoped to the selected workspace, and the pipeline pauses on system sleep.
is no longer text-selectable.
caption throttling to cut re-renders.
Fixed
OpenLive now shares the primary screen directly.
Release mechanics
package.json.verify-on-launch note drops its em dash.
(the recovery notice is an out-of-band error event, not a
text_delta).Full notes in CHANGELOG.md. Tagging
v0.2.1after merge drives thesigned macOS and Windows build.