Releases: lucidos-dev/lucidos
Release list
v0.16.0
⚠️ macOS notarization is still pending for this release.The
.dmgbelow is signed with our Developer ID, but Apple has not returned
its notarization ticket yet, so macOS blocks it on first launch. We publish the
release rather than hold it back.
This asset is replaced with the notarized one as soon as the ticket arrives
— usually within a few hours. Re-download it then and none of the steps below
apply.Two ways to install v0.16.0 with nothing extra to do:
- Already running Lucidos? Take the in-app update. It does not go through
Gatekeeper and is unaffected by notarization.- Prefer the terminal?
curl -fsSL https://lucidos.dev/install.sh | shIf you want the
.dmgright now, macOS needs you to approve the app once
by hand (Sequoia removed the old Control-click shortcut):
- Open the
.dmgand drag Lucidos to Applications.- Launch it. macOS says it "could not verify" the app — click Done.
- Open System Settings → Privacy & Security, scroll down to Security,
and click Open Anyway. Do this within an hour of step 2; it asks for
your administrator password.- Launch Lucidos again and click Open Anyway in the second dialog.
You only do this once. Subsequent launches are normal.
v0.16.0 — 2026-07-29
Added
-
Provider-native web search —
web_searchnow resolves over the configured provider set instead of a single hardcoded backend. Adds aWebSearchProvidertrait, a fallback chain, and three backends (Anthropic, OpenAI, Vertex/Gemini grounding), each pinned to a model its own provider actually serves. Prompt and result formatting are shared across backends, andmax_usesis decoupled from the chain. (ADR 0023) -
Per-model context windows — every builtin model now declares a verified context window, editable in Settings, and that value drives the context-trim budget instead of a guess derived from the model id. The reported token total counts tool schemas, and truncation is surfaced honestly as trimmed. Bare Claude rows stay on the prefix map since they send no 1M beta header.
-
GPT-5.6 (Sol / Terra / Luna) — added to the chat model picker and the Codex coding-agent
/modelpicker, with themaxreasoning tier enabled for the family. Max effort is validated server-side and filtered by the selected model in the picker. -
Claude Opus 5 — added to both the chat and Claude Code pickers and set as the default model (via
cc-settings.json). -
Built-in model-provider proxies —
vertex,openai,openrouter,anthropic, andlocalare available as proxy targets out of the box, so an app can call a model provider without hand-registering it inapis.json. Bearer credentials get the Anthropic OAuth beta header injected automatically. -
Packaged system-knowhow —
system-knowhow/ships as the 7th runtime resource and is resolved at runtime viaLUCIDOS_SYSTEM_KNOWHOW_DIR, so a packaged install has the same authoritative reference docs as a source checkout. -
Codex parity work — Codex sessions stream reasoning summaries, load
CLAUDE.md, validate the effort tier, surface plan-tool progress over the app-server protocol, and map slash commands to playbook files. -
Chat threads auto-resume after a version switch — a chat or trigger thread interrupted by Switch to new version now resumes on the next boot, matching what coding-agent threads already did, instead of leaving a device-attributed abort and a manual Continue button. A dedicated boot pass handles them (the switch teardown always lands a terminal event, so the orphan sweep structurally can't see them), and the shared cause gate now requires an engine-shutdown cause so a user Stop is never mistaken for a switch.
-
Stranded-Apply visibility — a frontend Apply that can't reach the served dist is now surfaced instead of failing silently, and the engine warns once when the dist it's serving is pinned to a coding-agent worktree.
-
Zero-file Apply refusal — Apply is refused server-side on a change whose branch diff has gone empty, and such a change is reconciled (without discarding its siblings) rather than left blocking the panel.
-
Compose-clear announcements — every clear of the compose box is announced to other devices, whether it came from an ordinary send or from answering a question card.
-
App Store Connect API key notarization — the release build prefers an ASC API key over an Apple ID app-specific password when one is configured, so notarization runs cleanly headless.
-
One source of truth for the release version, enforced —
RELEASEis the only place the version is written by hand; everything else derives from it (the build reads it, the release flow rewritesinstall.sh's baked constant, the site publisher pins the landing page's download links at publish time). A new offline suite scans the tree for a version literal nothing keeps in sync, pins both halves of theinstall.shmechanism so deleting the substitution fails immediately rather than at the next bump, and flags prose that announces which release line the project is on. Historical narration stays exempt — the changelog, plans, and ADRs are correct precisely because they don't move. Phase A runs the suite against the worktree after the bump, so a stale literal fails the release instead of reaching the mirror. -
Resumable notarization — the release build submits with
--no-waitand writes a resume handle (submission id, DMG path + sha256, source commit, submit time) to disk before it starts polling, so losing the waiting process costs a poll instead of a full rebuild. A build-grade run auto-resumes when a handle matches the DMG on disk,--adopt-submission <uuid>picks up a submission that's already in flight, stapling is idempotent, and the handle is cleared once staging succeeds. Backed by a pure, offline-testable state library (scripts/lib/release_notarize.sh) with atomic writes and a checksum gate that refuses to resume against a changed DMG. -
A re-fold on unchanged bytes no longer burns a notarization submission — one release spent 16 Apple submissions in two days, several of them on byte-identical compiled input, because any movement on
mainforced a rebuild + resign + resubmit. The build now fingerprints only what actually reaches the bundle — the seven compiled-input paths (crates,Cargo.lock,Cargo.toml,packages,package.json,package-lock.json,system-knowhow) — and Phase A consults that gate before rebuilding, reusing the already-notarized DMG when every hash matches. A docs-, plans-, orscripts/-only re-fold is now free. The fingerprint deliberately excludes the driver scripts themselves (a one-word comment edit inbuild-dmg.shwas enough to flip a coarser hash and re-break the very case this fixes); a separate recipe fingerprint tracks those, and both are recorded in the staging manifest. Also fixes a concurrent-poller miscount where a resume's own subshell was reported as a second poller. -
Shellcheck gate on every shell script —
scripts/lint-shell.sh+make lint-shell, wired intolintsomake checkcovers it. Discovery isgit ls-files '*.sh'rather than a hand-written path list, so a script added in any directory is gated the day it's committed. Fails closed on all three ways it could be disarmed (no shellcheck on PATH, empty discovery, a silently-skipped file). The sweep that brought the tree clean fixed the findings at the source rather than suppressing them — theSC2155masking bugs below were found by it. -
A release no longer waits on Apple — notarization verdicts have taken anywhere from ten minutes to fourteen-plus hours, and a wedged notary used to hold the whole release.
--defer-notarizationstages the DMG unstapled (recorded asnotarized: falsein the staging manifest) and publishes with a "notarization pending" banner on the release body, so the in-app update, the headless tarball andcurl … | sh— none of which touch Gatekeeper — ship immediately, while the download button deliberately stays on the previous notarized DMG. Against a submission already in flight it stages without polling at all, which rescues a Phase A stuck on a slow verdict with no rebuild.--attach-notarizedthen staples, swaps the published asset in place, removes the banner, and fires the clean-machine DMG gate against the published tag. (ADR 0027)
Changed
- The release candidate is the published artifact — the rc branch is now a pre-stripped, validated tree that gets promoted to
mainrather than rebuilt at publish time, so the commit CI gates is byte-identical to the commit that ships. Adoption requires a parentless candidate (a candidate carrying ancestry would push every reachable object while the private-data scan only inspects the tip tree), and the promote step re-asserts that at the irreversible push. The exclusion list, theWORKSPACES.mdstub, and the fail-closed private-data scan are now single-sourced. (ADR 0024) bash_output(wait_secs)actually blocks — the drain now waits the full requested window (server-side) rather than returning immediately, and reports a real elapsed clock. A user message cuts the block short so their follow-up isn't stuck behind it.- Background tasks report their true exit status — the completion summary no longer masks a failing pipeline stage;
pipefailsemantics are documented (rightmost failing stage wins),128+signumexit codes are decoded, and a trigger script killed by a signal is named as such. - Accent palette —
--accent-yellowretheming to a muted sand, with the "notable state" role split off into its own--accent-notabletoken. Dead--initiator-*tokens dropped. - Client build id — the frontend shows the client's own build id instead of the engine's frozen CalVer, and launch binaries are published per build variant rather than through cargo's shared uplift pa...
v0.15.0
v0.15.0 — 2026-07-03
Added
- New-version / Switch flow — Apply now auto-builds the engine in the background and splits build from switch: a unified "new version available" surface, an
ENGINE_BUILD_ID+/engine/version-statusendpoint, cause-gated resume that preserves pending questions, and switch-as-respawn with boundary events deferred to teardown. The Apply button reads Apply* when a restart is required; the brand badge shows a "!"/spinning build icon instead of a count; version toasts defer on dismiss with a persistent update badge; a hint toast explains when a frontend-only Apply is deferred to Switch. The engine also surfaces when its source is behind the running binary and self-heals a failed background rebuild; the pending-Rebuild toast only shows when no switchable binary already exists. - Keyboard navigation of thread content — arrow-key scrolling and turn-by-turn traversal (Cmd+Up/Down), Enter to collapse/expand the navigated turn, a unified deep-link "navigate to element" + chevron-scroll model with perceptible deceleration, and a persistent deep-link focus marker ("focus stick").
- Focused-pane cue — the focused pane's header segment gets a subtle lighter-blue wash (extended over the divider seams) so the active pane reads at a glance, mirrored on the mobile active-pane dot. (The earlier header focus pill was tried and dropped in favor of the wash.)
- Animated compose height — the prompt textarea animates its height (and position) on send and on draft↔draft / draft↔blank compose-view switches, with in-flight/rapid-switch frames cancelled cleanly.
- Thread drawer overhaul — the compose-draft tooltip becomes a ⋯ menu (Delete + Info), fully keyboard-drivable; a keyboard shortcut expands/collapses the focused thread's sub-threads; single-focus (aria-activedescendant) model.
- Remote access & Linux install —
install.shdownloads a prebuilt cross-platform headless tarball by default and registers the gateway as a user service; opt-in TLS (--tls-cert/--tls-key) and network bind (--bindvianetwork.toml); a user-facingscripts/run.shentry point;build-headless.sh+ CI matrix for the Linux tarball; post-extract execution smoke + runtime-dep preflights. - Self-skeletonizing loading system — skeleton primitives with a fill helper, tree-shaped skeletons for files/repos, self-skeletonized list rows, drawer search, and triggers; retires the generic
ListSkeleton. - Per-thread model memory — each thread remembers its last model + reasoning effort; coding-agent threads are pinned to their first account.
- Native dock badge & notification actions — a nudgeable dock-badge loop driven by notification SSE, an on-demand unread-total endpoint, and
[Open]/[OK]action buttons on in-app notification toasts (web links in toasts are now clickable). - Pane-anchored toasts — each toast is pinned to and centered over the pane it appeared on.
--font-size-*type scale — host + app-iframe type-scale tokens, with all font-size literals migrated onto them.- Per-draft compose state — compose-view dropdown selections and attachments persist per draft in the DB.
- macOS menu-bar mode — the desktop client goes menu-bar-only when its windows close.
- Durable native device id — the packaged desktop app persists its device id natively, so reinstalls keep a single device instead of spawning duplicates.
- Trigger last-run status — triggers surface last-run OK/failed status and a build-on-top pointer.
- Codex key auto-detect — the engine auto-detects an OpenAI key from the Codex CLI auth file; the chat agent is nudged to emit clickable
[Name](app:<id>)app links. - Graceful memory degradation — the engine boots with memory degraded (instead of failing) when the embedding model can't download, with an actionable error.
Changed
- Apply/Discard — the Diff button is permanently pulled out of the split button; frontend-only Applies propagate to peer dev workspaces and re-snapshot the served frontend without a respawn.
- App-name links — stopped auto-linking bare app-name mentions in chat/notifications in favor of the explicit
[Name](app:<id>)form. - Plugin setup threads — setup instructions moved to knowhow with a short seed message.
- Navigation focus marker unified across chat, settings, and plugins (drops the entrance flash, fades on any user action).
- Lockfile determinism — builds use
npm ciandcargo --locked; thelucidosCLI is bundled as a runtime resource in the packaged app. - Vertex —
eumulti-region added as a prefilled region option. - Spacing & type consistency — content-pane padding unified onto a
--space-*scale (Files tree + cards are deliberate carve-outs); prompt/confirm modal font sizes normalized with a codified no-magic-font-size rule.
Fixed
- Security — closes a CRITICAL CVE via wasmtime 25→36; blocks cross-origin browser-proxy requests; hardens
http_requestcredential redirects;git20.20.4 + safe Rust security bumps; scrubs credentials from the packaged env. - Vertex Gemini 3 reasoning — uses
thinkingLevel+includeThoughtsso reasoning stops leaking into the answer, and never sendsthinkingBudgetto Gemini 3 (clampsthinkingLevelper model). - Coding-agent reliability — stops a Fable false stale-resume from spawning duplicate CC processes / deleting live worktrees; an external watchdog kills a wedged coding-agent subprocess on recovery; preserves genuine CC API-drop failures instead of fabricating "Unknown error"; recovery reuses a worktree only when it's on the branch being recovered; a startup lease serializes restart recovery;
CLAUDE_CONFIG_DIRis pinned per session so a mid-flight provider toggle can't strand a resume; reads CCthinking_deltafrom the correct field. - Packaged runtime — packaged PATH floor + agent-binary detection (psql on the coding-agent PATH); resolves user-installed tools under the service-manager minimal PATH; boot preflights (git, PG client, embedding model, required resources) with actionable warnings; Docker entrypoint aligned to the PG18 binary path.
- Changes/Archive — reconciles an orphaned pending change that blocked Archive; gates apply-time reconcile on Applied and advances Apply-All on discard; the Apply-All merge-conflict toast no longer dangles.
- Streaming resilience — bounds the streaming send-header phase so a stalled LLM connection can't hang a turn; idempotent thread pin/unpin so a double-submit can't 409.
- iOS/mobile — repaint scroll-nudge no longer cancels momentum scroll; reliable scroll-to-top; boot-splash covers the iOS safe-area strip; mobile header titles centered without overlapping leading icons.
- Chat — repaired leaked inline tool-call XML in the agentic loop; the title model no longer executes instruction-style prompts; the agent is told its reasoning isn't shown to the user and is forbidden from claiming a repeated action without a fresh tool call; the coding agent must not ask post-work confirmations that block Apply (scoped to Apply-based prompts).
- Cancel — releases a stuck "Canceling" state when a running-turn cancel is superseded into waiting-for-answer, and clears the awaiting-bit on cancel rollback.
- Build lock — fails open (rather than reporting SkippedLocked) when the checkout is unresolvable; scoped to engine-triggered builds.
- Drawer / notifications — restored the normal drawer scrollbar and dropped the right-inset selection gap; channel/error tags keep their dark-mode hairline and red outline; notifications panel toolbar padding aligned with the plugins panel.
- Toast / focus — collapsed-pane toasts recenter over the surviving pane; toast focus/tab handling hardened for touch and overlays.
Removed
- Retired the generic
ListSkeletoncomponent (replaced by the self-skeletonizing system) and a stalecrates/lucidos-app/package-lock.json.
v0.14.0
v0.14.0 — 2026-06-29
Added
- Network access UI — configure the engine/gateway network bind from Settings and the workspace picker; durable scope-split bind (gateway machine-global, engine per-workspace), with click-to-fill of the detected Tailscale IP.
- Plugin Modified badge — the Plugins list now shows a per-plugin Modified state derived from the install commit, and warns before an update would overwrite local edits.
- App-icon unread badges — native dock-icon badge with the aggregate unread total, per-workspace PWA app-icon badges, and gateway-aggregated per-workspace counts.
- Cross-device native notification dismiss — dismissing a notification on one device removes the delivered native banner(s) on your other desktop devices.
- Documentation site — mkdocs-material docs site with anti-drift transclusion and deploy-on-release.
- Public-repo RC gate (CI) — clean-machine source install + signed-DMG verification on fresh macOS/Ubuntu runners before publish.
Changed
- Vertex AI region moved into the Settings → Providers section.
- OAuth account resolution — provider tokens now resolve to the newest connected account; the Accounts UI shows a created date per account.
- Sleeker Network access modal; skeletons fill the full content height; notification-detail title sized to match the list row.
Fixed
- Security hardening — engine API now defaults to a loopback bind (opt in to all-interfaces via
LUCIDOS_BIND_ALL); gateway control plane is authorized against app iframes; WASM signer execution budget + credential-leak scrubbing; scoped credential-URL matching. - Networking — retain loopback when binding a specific address; bounded gateway boot-splash escape; route us/eu Vertex multi-region locations to the
rep.googleapis.comhost. - Workspace storage — workspace-scope all browser storage (theme, device-id) with an idempotent namespacing override and a regression guard.
- Frontend recovery — recover gracefully from navigating into an unreachable workspace; gate the picker skeleton behind a 300ms delay to stop the fast-load flash.
- iOS PWA — fix the blank thread body (compositor paint loss) via a scroll-nudge + forced layout flush.
- Notifications — reliable native desktop banners with durable deeplink; the agent is now aware it's running in the Tauri desktop app.
- Cross-platform install — OS-aware sleep/clamshell prevention so Linux source installs run clean.
- Muted-gold light-mode warning toast.
v0.13.1
v0.13.1 — 2026-06-28
Fixed
- Toast in light mode — toasts read gray on a light background; now use a white fill so they render cleanly.
v0.13.0
v0.13.0 — 2026-06-28
Added
- Capability-parity manifest + grouped agent tools — a single capability manifest is the source of truth for the agent's tool surface, with Rust→TS codegen keeping the LLM tools, the
lucidosCLI, and the JS SDK in sync. Many narrow tools are consolidated into grouped tools —triggers,trigger_groups,preferences,events,changes,mcp,plugins,threads,thread_queue,memory,manage_models,manage_repositories,env_vars,notifications, and anappsdomain — each gaining matching CLI subcommands and SDK methods. - Agent-configurable settings — the agent reads and changes user preferences via
get_preferences/set_preference(theme, language, timezone, push, welcome message, chat model, reasoning effort, UI scale, font, …), validated against one catalog and routed through a single write chokepoint so per-device scope and live-apply are handled automatically. The narrowset_language/set_timezone/enable_push_notificationstools fold intoset_preference. Amanage_modelstool adds/enables/disables/removes chat models in the picker. Language + timezone also get human controls under Settings → System → Locale (with IANA timezone validation). The command guard stays human-only. - Dedicated Plugins panel — browse, install, and update plugins with an "Installed only" filter (default shows all), controlled-vocabulary categories, plugin updates appliable from the list, and provenance-tracked auto-registration of plugin triggers. Installed/uninstalled files are git-committed into the workspace repo.
- Coding-agent reasoning in the timeline — streamed model reasoning is captured as
CodingAgentThoughtStreamedand rendered as a live "Thinking" step with full persisted text. - Loading-state overhaul — a
ListSkeletonprimitive plus skeleton-by-default loaders, a 300/500 minimum-visible standard (retiringDelayedSpinner), and skeleton + fade-in + prefetch for the thread-open transition; loaders crossfade out viaLoadingFade. - Settings → System → Debugging panel with a default-off perf-instrumentation toggle; thread-open render/paint timing is instrumented and flushed via a batched
/internal/client-logstelemetry endpoint. - Thread overflow (⋯) menu with a separate pin icon — Archive and thread Info (moved out of the hover tooltip) live in the menu; Archive first, Info last.
- SDK
ui.toast+ui.prompthost-bridged components for apps. - Fira Code font option with programming ligatures.
get_backup_statustool + backups knowhow — timezone-aware backup scheduling, agent-readable/writable backup settings, and persisted run history.- Targetable memory entries — entry IDs surface in the
[Long-term Memory]block and the Memory settings view (copyable), pluscorrect_memory_by_idto delete/replace one memory by id.
Changed
- Welcome screen redesign — compact "Hi, there!" hero with a chevron suggestion carousel (one idea at a time), conversational clickable starter suggestions that prefill the prompt, and a top-right dismiss pill.
- Toast redesign — elevated surface with a thin per-type category-colored border on a plain theme background, clean amber warning in light mode, full-width centering, per-theme tint strength, and the "New version available" toast replaced by the refreshing spinner.
- Files panel: "Drop or click to import" pinned to the top-right of the source-switcher row; Expand/Collapse-all removed; empty repo Files toolbar no longer rendered.
- Settings: Animation speed moved from Appearance to System → Debugging; Environment Variables indexed in search; redundant subpanel titles dropped.
- Notifications: detail chevron navigation walks the whole inbox (not one page); detail panel uses larger body text and primary color; chevron layout refined for two-line titles and the iOS-PWA back-swipe gutter.
- Drawer/Archive: Archive pile is a single global created-at window (gap-free, chronological); long context-name chips wrap instead of truncating; tree-style ←/→ keyboard navigation.
- Mobile pane state persists in localStorage so a PWA close reopens where you left off.
- "App Store" wording retired in favor of the plugin Store; English recommended in the language setup prompt and under the Language setting.
- E2E suite runs against a release build by default.
Fixed
- Security hardening — guard path traversal in the intent loader and browser screenshot path; floor char boundaries on OpenAI streaming token slices; scrub private/internal data from public-shipping sources, docs, system-knowhow, and test fixtures, backed by a fail-closed private-data release guard.
- Drafts — a locally-edited draft is no longer blanked by a
MessageReceivedecho or a bulk SSE resync (drafts:65value=''). - Coding agent — worktree
node_modulesprovisioned from the hoisted root (npm workspaces); engine restart during a resumed session no longer read as a user rejection; idle-termination and question-answer-resume races closed; run-loop flags reset on resume. - Gateway never respawns an alive engine, only a dead one.
- Apply — an already-merged branch is marked applied (instead of stranded as failed) and pushes main on a no-op.
- Chat: no spurious "No changes" flash in Changes-mode; no open-jump on change-applied threads; pending messages survive a transient safety-refetch failure; iOS open-path repaint hardened.
- macOS app menu derived from the system default so arrow keys move the cursor; About item labeled "About Lucidos".
- Numerous UI fixes: dark-mode green confirm buttons, boot-splash label/sizing aligned to the gateway, header divider/tooltip behavior, and welcome carousel chevron/height stability.
Removed
- Retired flat/narrow agent tools now superseded by grouped tools; dead components (
DelayedSpinner,StoreTab,ExportThreadButton,CopyThreadRefButton).
v0.12.5
v0.12.5 — 2026-06-25
Added
- Welcome screen redesign — compact "Hi, there!" hero with a chevron suggestion carousel (one idea at a time), conversational de-quoted starter ideas, and a top-right dismiss pill. New starter suggestions: app store, mobile-access setup, daily scraper, weekday email summary.
- Targetable memory entries — memory entry IDs now surface in the
[Long-term Memory]block and the Memory settings view (copyable), plus a newcorrect_memory_by_idtool to delete/replace one specific memory by id. - Thread Queue moved into Settings → System.
- Files import hint relabeled to "Drop or click to import" in a dashed drop box.
Changed
- Gateway boot-splash phase renamed to "Downloading memory model".
- Settings: Environment Variables now indexed in search; redundant subpanel titles dropped.
- Notifications: a trayed/unfocused Tauri window now counts as not-in-use, so push is delivered when the window isn't actually visible (device-presence re-sync deduped on native focus change).
Fixed
- macOS app menu derived from the system default so arrow keys move the cursor; About item labeled "About Lucidos".
- Tauri: nav-history popover renders above the internal browser; app menu placed below the header strip; window drag and thread-toggle no longer steal the focused pane.
- Settings: API URL renders at normal row size (not page-base); system subpanel tabs render on the Environment Variables view.
- Threads: thread-link hover shows the real destination; cross-workspace thread links route through the gateway; stopped peers aren't lazy-started just to read a title.
- Update badge + toast unified on the build-id check; switcher reload icon badged.
- Welcome surface shows until dismissed and no longer clips the empty compose box.
v0.12.4
v0.12.4 — 2026-06-25
Fixed
- Desktop window state persists across launches — Tauri window size, position, and screen are restored on relaunch, and the window-state save is marshalled onto the main thread.
- Welcome message now shows until dismissed and no longer clips the empty compose box; added top padding and dropped the tagline.
- App menu "About" item is labelled "About Lucidos" instead of "Lucidos".
v0.12.3
v0.12.3 — 2026-06-25
Added
- "See all statuses" shortcut — empty status-filter views in the thread drawer now offer a one-click way to clear the filter and see every thread.
Changed
- macOS menu-bar tray icon rendered as a proper monochrome template glyph that fills the canvas (correct light/dark menu-bar appearance, no padding frame).
- Window dragging works from the whole header strip, with maximize-on-strip and a focused-pane accent line under the header.
- Focused-pane marker tuned to a full-width underline, muted in dark mode; navigating now activates the focused pane group.
- Quit menu item renamed, and the app confirms before stopping the background service.
- Chat agent now anchors on the currently open app/file for UI/copy requests.
- README tagline sentence-cased ("If you can describe it, it exists").
Fixed
- Packaged builds no longer register the workspace as a "Lucidos source" repository.
- Repo HTML shows as source (not a live render) in the file/diff preview.
v0.12.2
v0.12.2 — 2026-06-25
Added
- Menu-bar tray model (macOS) — the always-on service now survives closing the client window; the engine keeps running in the menu bar.
- In-app "Uninstall Lucidos" command (macOS) — clears WKWebView web storage and hides client windows on confirm, with a keep-vs-delete data choice, so a reinstall is clean.
- First run shows the workspace picker — no more silently auto-created default workspace; offers personal/work name suggestions.
view_imagechat tool — reprocess images posted earlier in a thread back into the agent's vision.- macOS title-bar tinting — the native title-bar strip is reclaimed as a blue drag-band matching the app header.
- Gateway boot-phase progress — the workspace boot splash now renders engine-reported boot phases instead of a blank wait.
- Keyboard pane navigation — focus the Conversation drawer (Cmd+Shift+1) and maximize the focused pane group (Cmd+Shift+Enter).
.gs(Google Apps Script) files highlighted as JavaScript in the file preview.- Unattended trigger-spawned coding agents — trigger-spawned sessions inherit the side-effect grant and auto-resolve permission prompts.
- Two-phase release pipeline —
release.sh --verify-build/--publish-verifiedand an--attach-stagedpath that builds once and verifies before publishing.
Changed
- Security: permissive CORS disabled by default, and the gateway default bind address secured (no longer binds broadly out of the box).
- Resolved npm-audit vulnerabilities — vite 6.4.2→6.4.3, @babel/core 7.29.0→7.29.7.
- Packaged update now restarts the whole service and surfaces inside the workspace; the dev-only gateway reload is hidden on packaged builds.
- JSON API responses are gzip/brotli-compressed via tower-http.
- Deterministic root-commit repository identity, with orphaned-thread backfill.
- Per-parent child-thread fan-out cap raised 3 to 10.
- Single-file changes open directly into their diff; added files render as the whole file.
- User-facing thread "Saved" renamed to "Pinned".
- Cron fires coalesce so a trigger holds at most one queue entry (idempotent recovery).
- "Lucidos source" coding target hidden on packaged builds; capture-context debug toggle defaults off.
- Unified focus ring across buttons/dropdowns via a
--focus-ringtoken (collapsed to a single soft band). - Perf: windowed thread render, faster exchange sort + incremental pending-message fold, memoized drawer categorization — fixes dev-workspace input lag.
Fixed
- Engine no longer culls alive-but-busy engines (gateway respawn-storm fix).
- Graceful coding-agent process-group teardown so Playwright reaps its browsers.
- Concurrent worktree spawns no longer collide on
.git/config.lock; backoff sleep skipped on the final retry. - Attached images stay visible to the agent for the whole turn; image message protected from context pass 2.
- Avoid a UTF-8 panic when truncating memory context.
- Coding agent treats relative
..targets as out-of-workspace; unwrapsshell -cbefore classifying Codex commands. - Globally disable browser autofill on host-app text inputs.
- Render binary images in the repo file viewer.
- Archive drawer ordered by created_at; inbox threads excluded from the archive pagination cursor.
- Hard-exit after uninstall so the window-state plugin can't re-create the deleted data dir.
- Various: picker boot-splash text, "Manage workspaces" link on a direct engine port, app-thread change-row Diff, legacy workspace switcher list, per-pane Tab trap, thread-row "Waiting" tooltip.
v0.12.1
v0.12.1 — 2026-06-23
Added
- Hot-swap LLM provider on credential change — adding or changing a provider key takes effect on the next chat, no restart required.
- Provider-aware first-run onboarding — a fresh workspace with no LLM provider configured guides you to Settings → Models → Providers instead of silently serving mock output; the engine reports
llm_configuredvia/health. - Vertex AI in packaged builds — Application Default Credentials (ADC) auto-read; the model list is filtered to only configured providers.
- Workspace-picker boot recovery — a wedged boot splash now reveals an escape link to the picker; health-gated auto-open and first-run workspace naming.
- Notification detail in the content panel instead of a modal.
- Action-toast keyboard support — focus, Tab cycling, and a visible focus ring.
Changed
- Prompt answer/follow-up SplitButton unified into one frosted, same-width frame.
- History-navigation arrow defaults swapped: Forward = Up, Back = Down.
- Setup copy corrected to Settings → Models → Providers; stale "restart" wording dropped.
Fixed
- Bundled engine is now self-contained — OpenSSL is statically vendored, so the packaged build no longer depends on Homebrew OpenSSL (the crash-loop that blocked packaged startup).
- Self-healing embedded Postgres lifecycle — stops on shutdown, adopts a healthy running instance, version-guarded.
- Never serve mock LLM output on a no-provider boot.
- Toast button focus ring no longer shows on mobile/touch.
- Laggy repeat-tap can no longer cancel a just-sent turn.
- Question/permission divider no longer mislabels system aborts as "Canceled".
- Diff view resets to hunks on each new diff.
- Stranded "Apply Now" toast is cleared on resume.
- Workspace selector renders above toasts.
- In-body notification app links open via openAppById, so disk-backed apps no longer falsely report as missing.
- Keyboard-shortcuts label font size normalized.