Skip to content

Release 0.2.1 - #10

Merged
katipally merged 22 commits into
mainfrom
rework/foundation
Jul 18, 2026
Merged

Release 0.2.1#10
katipally merged 22 commits into
mainfrom
rework/foundation

Conversation

@katipally

Copy link
Copy Markdown
Owner

OpenLive 0.2.1

Cuts the 0.2.1 release off rework/foundation. This is the foundation rework
landing on main: a current Electron with the renderer sandboxed, SQLite-backed
history, 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

  • Chats and messages persist in SQLite (node:sqlite), with a one-time migration
    from the old JSON history on first launch.

Changed

  • Electron 33 to 43 with the renderer sandbox enabled.
  • Security hardening: auth token on the agent WebSocket, agent file operations
    scoped to the selected workspace, and the pipeline pauses on system sleep.
  • Eight-step type scale on the bundled Geist font.
  • History panel is now Sessions, with an All/OpenLive filter and collapse-all.
  • Custom (non-native) dropdowns with arrow-key listbox navigation; window chrome
    is no longer text-selectable.
  • Launch and session-list motion; narrower store subscriptions and word-rate
    caption throttling to cut re-renders.

Fixed

  • Screen share on recent macOS: the system picker was cancelling the request, so
    OpenLive now shares the primary screen directly.
  • Mini mode launched from the tray was unresponsive.
  • Port cleanup and respawn on relaunch.
  • Agent elicitation and permission modal answers map to the right option.
  • Assorted ACP bridge bugs.

Release mechanics

  • Version bumped to 0.2.1 in the root and desktop package.json.
  • Release workflow download table no longer uses platform emoji, and the
    verify-on-launch note drops its em dash.
  • Updated the stale supervisor test to match the shipped crash-recovery contract
    (the recovery notice is an out-of-band error event, not a text_delta).

Full notes in CHANGELOG.md. Tagging v0.2.1 after merge drives the
signed macOS and Windows build.

katipally and others added 22 commits July 16, 2026 23:24
- 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.
@katipally
katipally merged commit 684a7e3 into main Jul 18, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant