v1.8.0
What's Changed
- feat(conversation-ui): deepen the element interface (pre-1.0.0 additions)
- ci: gate release on CI passing
- feat: one turn-persistence pipeline + thread persistence for
hosts - chore: release conversation-ui-v1.0.0
- docs: renderer migration spec (Vue 3 → SolidJS)
- feat(prefs): rewrite the preferences window in SolidJS (renderer migration PR 1)
- fix: fall back to the in-memory XLSX reader when the stream reader crashes
- feat(search): rewrite the search window in SolidJS (renderer migration PR 2)
- feat(playground): rewrite the tabular playground in SolidJS (renderer migration PR 2a)
- chore: drop Vue from the toolchain (renderer migration PR 3)
- feat(preview): every stream renders in the conversation surface (ADR 0002)
- docs(research): asset delivery for the web runtime on a third-party site
- docs(specs): sequenced PR plan for the web runtime + tabular agent packages
- ci: per-PR checks + generic topological packages step (web packages PR 1)
- feat(conversation-ui): public acceptDrop(dataTransfer) (web packages PR 2)
- feat: extract @leopsidom/agent-core (web packages PR 3)
- feat: extract @leopsidom/provider-agents (web packages PR 4)
- fix: bundle @leopsidom/agent-core + provider-agents into the main process
- feat: extract @leopsidom/tabular-agent (web packages PR 5)
- fix(conversation-ui): auto-open workspace panel + fix CSV grid preview
- docs(specs): amend web-packages plan — PR 6 blocked on shared contract layer
- feat: extract @leopsidom/host-protocol (web packages PR 5.5)
- fix: bundle ESM-only @leopsidom packages into the preload (fixes blank desktop UI)
- feat: extract @leopsidom/agent-runtime-web (web packages PR 6)
- feat: extract @leopsidom/conversation-host (web packages PR 7)
- ci: generic @leopsidom publish pipeline (web packages PR 8)
- refactor(host-protocol): make host-link generic over the contract (#280 PR 1)
- fix: keep tabular chart source inspectable for plotly/altair
- fix: restore tabular conversation from carousel over an open preview
- refactor(host-protocol): split Runtime vs Desktop contract (#280 PR 2)
- docs: refresh CLAUDE.md agent paths + fix stale conversation-ui dep range
- fix: keep the preview WCV hidden while the recents carousel is open
- ci: gate per-package typecheck+test to affected packages on PRs
- refactor(conversation): extract bootConversation from the resident page
- feat(conversation): open a live conversation in a stand-alone window
- fix(tabular-agent): declare marked dependency (1.0.1)
- feat(conversation-ui): make the workspace files panel resizable (1.2.0)
- build: one-command dev — auto-build workspace package dist/ before run
- fix(conversation): align composer to transcript, pin usage bar flush
- fix(conversation): stop carousel restore from re-running the seeded query
- fix(status-line): describe the navigated history surface, not the opener
- fix(search): stop Recents/History churn during preview; pin preview to the chosen row
- fix(carousel): keep the restored surface when a web/file card seeds its query
- feat(ranking): auto-primary agent leads default-mode ranking
- refactor(search): extract createAgentSearch, the third search-dispatch service
- refactor(oauth): unify providers behind one OAuthProvider seam
- refactor(sync): concentrate last-write-wins into one ConflictResolution seam
- feat(tabular): local on-disk trace of LLM calls + query failures
- feat(tabular): register each source as a named DuckDB view
- refactor(data): split index.ts into per-entity query modules behind a barrel
- fix(tabular): emit spec-valid JSON for Altair charts (no bare NaN)
- feat(conversation): syntax-highlight code blocks (sql/python/js) with DuckDB dialect
- docs(research): SQL AST validator choice for the agent access layer
- fix(tabular): validate read-only SQL via DuckDB's own parser (AST), not regex
- fix(tabular): recover from planner SQL syntax errors + reduce them at the source
- docs(research): PGlite + drizzle multi-schema mechanics spike
- docs(specs): prototype the agent access layer broker + ctx API surface (#317)
- docs: agent access layer spec + ADRs 0003-0006 (#322)
- feat(data): move the five entity tables to agent schemas
- feat(data): ownership code catalog + provisioning registry tables
- feat(lint): catalog-driven ESLint boundary rule for built-in agents
- feat(main): allowlist SQL validator on libpg-query
- feat(agents): channel broker + 23-channel re-homing
- feat(agents): installed-agent DB lifecycle — db block, ctx.db, install/upgrade/uninstall
- feat(agents): access-layer sync integration + preferences UI
- docs(research): src/web consumer survey (map #345, ticket #346)
- docs(specs): built-in vertical ownership spec + ADRs 0007/0008 (map #345)
- feat(data): squash cutover — per-owner migration baselines on the registry rails (#355)
- feat(agents): go vertical — colocation reference + EntityManager + SyncAdapter harvesting (#356)
- feat(agents): snip vertical — colocation, second SyncAdapter, declared entities (#357)
- Surface Open in New Window on the conversation action bar
- Stop autofocusing the conversation composer when a stream turn settles.
- feat(agents): tasks vertical — colocation + channel handlers (#358)
- feat(agents): dashboard vertical — colocation + rows-kind entities, last bespoke manager deleted (#359)
- feat(agents): history vertical + events capability — host writes inverted into subscribers (#360)
- refactor(data): boundary closeout — one flipped rule, legacy arm retired (#361)
- feat(agents): native @github search agent — repos, issues, PRs, code
- docs(research): entity-channel transport serialization audit (#377)
- docs(specs): type-machinery spike — typed agent-core channels + derived proxy surface (#378)
- docs(research): agent-core consumer + publish impact audit (#379)
- docs(specs): agent-owned typed contracts — locked design + sequenced plan (#381)
- feat(agent-core): typed channel declarations — ch<Args,Res> contracts + NoInfer handlers (#386)
- feat(agents): verticals declare contracts + generic channel binding — wire names retired behind shims (#387)
- feat(agent-core): rows-entity protocol — defineEntity tier-2 conformance (#388)
- feat(agents): preview:navigated host-owned + announcement channel — recordHistoryVisit retired (#389)
- feat(host): native feature protocols — carousel-source + history-adjacency via protocolClient (#390)
- feat(agents): SDK board vocabulary + command conversions — DashboardItem and action-menu methods retired (#391)
- refactor(ipc): contracts closeout — HostChannelContract, entity aliases, shims deleted (#392)
- fix(agents): export sync PushedRef types + clear spike lint warnings
- refactor: remove dead code left by recent architectural cutovers
- fix(history): collapse script-initiated same-origin URL rewrites in preview
- feat(agents): @def typeahead via a first-class suggest() endpoint
- refactor(conversation-ui): move chart harnesses into the package
- fix(preview): render local video through a media viewer, fixing .mov download
- refactor(auth): lift the OAuthProvider seam contract into agent-core
- refactor(action-menu): extract the ⌘K overlay into its own ActionMenuOverlay store
- feat(agent-core): unified manifest surface + net:{fromConfig} resolver → 1.3.0
- refactor(preview): extract the PreviewTarget route resolver from previewSurface
- refactor(agent-core): extract the shared agent sandbox (B1)
- feat(agent-sdk): pin agent-core ^1.3.0 + surface new manifest types (A1)
- feat(agent-sdk): astros build/pack CLI + programmatic exports (B2)
- feat(agent-sdk): offline runAgent harness + astros verify (B3)
- feat(app): net:{fromConfig} host resolution + enforcement (A3)
- refactor(agent-config): lift the set-agent-config write router into a deep module
- fix(ui): accessibility + token-consistency pass across launcher and preferences
- feat(app): net:{fromConfig} inline consent + consent-copy rendering (A4)
- feat(app): testConnection hook + "Test connection" button (C2)
- docs(specs): DisplayOption frame prototype .d.ts (wayfinder #421)
- docs(context): glossary entries for Channel, Command, Action
- chore: de-stale the IPC structured-clone note (post Vue→Solid)
- docs(specs): the DisplayOption frame — locked design + M1 train (wayfinder #427)
- DisplayOption frame M1 · PR 1 — Gate: frame + interpreter + @clip (recents reshaping-only) (#432)
- DisplayOption frame M1 · PR 2 — @snip conforms (#433)
- DisplayOption frame M1 · PR 3 — @dashboard conforms (#434)
- DisplayOption frame M1 · PR 4 — @tasks conforms, the invoke-channel showcase (#435)
- DisplayOption frame M1 · PR 5 — Closeout (docs) (#436)
- docs(specs): DisplayOption frame M2 prototype .d.ts (wayfinder #443)
- docs(specs): DisplayOption frame M2 spec — the full collapse (wayfinder #449)
- docs(context): Hint row glossary entry (wayfinder #445)
- DisplayOption frame M2 · PR 1 — gate: SDK 2.1.0 + canonicalizer spine + the web fold
- DisplayOption frame M2 · PR 2 — file + app fold; legacy-Recents removal completes
- DisplayOption frame M2 · PR 3 — surfaces re-home; conversation absorbs stream
- DisplayOption frame M2 · PR 4 — routing + inert fold; the manual-search fix
- DisplayOption frame M2 · PR 5 — the text fold;
kinddies - DisplayOption frame M2 · PR 6 — closeout + the in-app harness pass
- test(e2e): repair the six specs
mainhad broken (#467) - refactor(calc): fold complete() into evaluate() behind params.aiCompile
- refactor(frame): kill
run-callback— the host verb tier goes closure-free (#451) - docs(claude): ask about switching models before implementing
- refactor(recents): extract RecentsCodec — one module owns the wire round-trip
- AgentOAuthConnect — the OAuth twin of AgentConfigWrites
- Make the #474 pins falsifiable + code-review fixes
- refactor(renderer): PreviewPin — deliberate focus intent gets one owner
- Close the three OAuth connect edges (#474)
- One prefs-window prompt, not two hand-rolled correlations
- refactor(renderer): PreviewOwner — the authority the preview surface follows gets one machine
- feat(hotkeys): default the preview swap to Control+Tab
- fix(preview): pick-anchor carousel web/file visit recording (#489)
- fix(preview): suspend audio when navigating away from a playing media file (#488)
- fix(preview): suspend media on same-surface navigation too (#488 sibling)
- fix(preview): media/doc/sheet previews record as the file, not the viewer page (#487)
- feat(tabular): prototype lazy-download seam for duckdb/pyodide runtimes
- refactor(preview): gesture-site dispatch for carousel card / dashboard tile (#479)
- refactor(installer): one origin-bound download + loader sanitize, pinned by 43 security tests (#496)
- feat(preview): add a General preference to disable media autoplay
- fix(preview): serialize back/forward walk so a burst steps through (#498)
- refactor(preview): delete the dead benign-media loadURL carve-out
- docs(claude): split implementation into core-coding + testing tasks, ask model per task
- docs(claude): testing task covers unit + e2e and waits for core coding
- refactor(search): extract SearchDispatch — what-to-search decision + Search-dispatch service ownership (#504)
- refactor(installer): AgentInstaller — the choreography behind an InstallerHost seam (#496)
- build(mac): drop unused duckdb-wasm dead weight from the asar (~30 MB)
- fix(custom-agents): migrate asana + linear-agent off the removed subPath contract
- Worktree tabular lazy runtime
- refactor(main): LivePageView — one boot behind every live-page WCV
- refactor(provider-agents): defineModelProvider — one factory behind the five assembly shells (#515)
- refactor(renderer): CarouselPhysics — the recents deck's motion decisions get one pure module
- fix(carousel): center card letterbox evenly and fill it opaque per-theme
- docs(specs): agent-subnamespace — locked design + sequenced train
- Sub-namespace train 1/6 — core dynamic-segment tier: a registered agent claims the dotted tail (#529)
- feat(files): the dotted tail re-scopes the search to a folder (#531)
- Sub-namespace train 2/6 — provider roots claim the dotted tail: day-0 models by path (#530)
- Sub-namespace train 4/6 — renderer resolution parity + the scope commit gate (#532)
- Sub-namespace train 5/6 — path completion rides suggest() (#533)
- fix(prefs): restore the child-row indent in the agents table
- Sub-namespace train 6/6 — Save as custom model + closeout (#534)
- fix(action-menu): a re-summoned launcher never inherits an open ⌘K menu
- docs(claude-md): PRs go up active, not draft
- fix(preview): a self-rewritten URL is not a visit — anchor in-page history on user activation (#486)
- docs(claude-md): fold the test-split rule into the model check
- fix(recents): Tab on a recent row peeks in place instead of re-scoping the bar
- fix(commands): Tab on a command row completes the typing instead of previewing
- docs(research): how a result list re-queries after a mutation (wayfinder #553)
- docs(research): inventory every producer-action → hidden-window path (#551)
- docs(prototypes): the @tasks post-action end state, played out (#556)
- docs(specs): post-action navigation — the locked design (#557)
- feat(agent-core): invalidatesSearch — the declared fact + its AgentInfo mirror (#565)
- fix(renderer): observe every producer invocation + preserve the broker code (#566)
- feat(renderer): the fourth disposition — enterDisposition gains requery (#567)
- feat(renderer): the success branch — re-query, scope, and post-action focus (#568)
- feat(renderer): the failure branch — the app's first mutation error surface (#569)
- Fix app launch failures
- fix(agents): @tasks.done becomes a claimed tail, not a registered agent (#561)
- feat(tasks): opt in to post-action navigation — the wired consumer (#570)
- docs: post-action navigation closeout — the amendments, the glossary, the landed spec (#571)
- docs(specs): search-input commit semantics — Tab commits, the scope survives (#540)
- docs(marketing): social platform strategy for tech-explainer content
- feat(renderer): the scope survives + the round-trip — reset becomes the pair, Tab-close restores (#540)
- feat(renderer): Tab commits — the four-value table replaces the peek (#540)
- feat(renderer): the scope rule — an open pick claims Enter, verbless scope rows chip (#540)
- feat(renderer): no-focus for pure-hint lists — the restored suggest() lock (#540)
- feat(renderer): the ghost chip — default mode's honest preview (#540)
- docs: search-input commit closeout — the amendments, the glossary, the landed spec (#540)
- feat(renderer): the ghost chip names the owning agent — provenance on result rows, fixed slot
- feat(renderer): strict completions — exhaustive-set hints take initial focus again (#540)
- Paint resolved @mentions in the accent ink; flatten references to inline links
- feat(agents): open-urls verb — dashboard Enter opens all items in one browser window
- feat(renderer): dashboard grid pagination — 6 live tiles per page, keyboard + pager
- fix(main): detach dashboard tiles on dispose — no more ghosts over the dropdown
- refactor(main): assert the one-visible-surface invariant in applyVisibility
- feat(dashboard): read a dashboard as a list beside a live preview
- feat(renderer): the grid flip — Ctrl+Shift+G tiles the list you are looking at
- docs(research): frame-stream tile substrate verdict (#598)
- prototype(dashboard-grid): wcv scroll bench — can live tiles move at 60fps? (#597)
- prototype(dashboard-grid): mixed live/captured arm — what the phase latch costs (#611)
- docs(research): occluded tiles stop streaming on Aura (#612)
- docs(research): addendum to the Aura occlusion answer — a third escape, its price, and input forwarding (#612)
- fix(files): honour never-index markers so a VM data root can't starve the walk
- feat(files): fuzzy folder jump in @files path completion
- feat(files): breadth-first walk fairness + surface index truncation (#622)
- docs(research): a covered tile stays fully interactive (#616)
- docs(research): run the Aura probe suite on real Windows (#620)
- research(dashboard): measure the warm tier — screencast survives setVisible(false), resume is one frame
- docs(specs): dashboard grid scroll — the consolidated design (#596)
- feat(dashboard-grid): grid mode owns its window geometry — 384×400 tiles, variable columns
- feat(dashboard-grid): park tiles under the DOM and stream frames into the grid
- feat(dashboard-grid): pure scroll — delete the pager; native strip, settle contract, keyboard model (#643)
- feat(dashboard-grid): the pool — streaming/warm rings, settle-gated spawns, warm-ceiling preference (#644)
- feat(dashboard-grid): captures, staleness, and the ⌥-wheel into the tile (#645)
- feat(dashboard-grid): click, wake, expand-promote, restore-before-reveal (#646)
- feat(dashboard-grid): bounds at scale + the Live dashboard tiles preference — train closeout (#647)
- fix(dashboard-grid): live tiles never painted — blob: was missing from the renderer CSP
- fix(preview): stop the preview surface losing focus and advertising a non-Chrome build
- fix(history): key URL uniqueness on a generated md5 so a long URL can't overflow the btree
- chore(release): 1.8.0 + repair the first-ever core e2e run