Lumiverse

Lumiverse 0.8.5 on Staging — Slimmed Down, Amped Up!

March 31, 2026
lumiverselumiverse updateschat app

This one's small, but big in its own right. Let's go over what changed in 0.8.5 together, shall we?

Generation Recovery

Generations now survive navigation. The backend pools all streamed tokens in memory with a monotonic sequence counter. When you navigate back to a chat mid-stream, the frontend fetches the pooled state and resumes rendering from where it left off. Reasoning timer state is recovered too — no phantom "Thought for 0s" on reconnect.

Three new endpoints back this: GET /generate/status/:chatId for single-chat recovery, GET /generate/active for all in-flight generations, and POST /generate/acknowledge to mark a generation as seen.

Chat Heads

Floating indicators that track background generations. Start a generation, navigate away, and a draggable avatar bubble appears showing status — assembling, council, reasoning, streaming, completed, error. Click it to jump back. Plays an audio ping when a backgrounded chat finishes (unlocked on first send to satisfy autoplay policy).

Configurable in Display settings: toggle, size (32–64px), layout direction, opacity.

Assembly Prefetch

prompt-assembly-prefetch.ts batch-loads everything the assembly pipeline needs upfront: chat, messages, character, persona, connection, preset, all relevant settings, world book entries, group members, embedding config, cortex config. ~7 queries instead of ~35-40 scattered calls. New PrefetchedData type on AssemblyContext.

Supporting batch queries: getCharactersByIds() on the characters service, listEntriesForBooks() on world books, getSettingsByKeys() on settings.

Council Error Recovery

Partial council failures no longer silently drop results. When some tools succeed and others fail, the generation pauses and emits COUNCIL_TOOLS_FAILED. The frontend shows a modal: "Retry Failed" or "Continue Anyway." Retry re-executes only the broken tools (dice rolls skipped, enrichment reused), merges results back, and rebuilds the deliberation block. Auto-continues after 60s if the user doesn't respond.

Council Result Caching

New retainResultsForRegens toggle in council tools settings. When on, regenerations and swipes reuse the last successful council results from chat.metadata.last_council_results instead of re-running all tools. Fresh sends, continues, and impersonations still execute normally.

UI Scale Rework

Moved CSS zoom from body to body > *. This means React portals (modals, toasts, context menus rendered outside #root) now scale correctly instead of rendering at 1x inside a zoomed app.

Viewport height compensation updated accordingly — syncViewportVars and the theme applicator both account for the zoom factor when computing --app-shell-height.

Font scale and UI scale sliders now commit on pointer release instead of every drag step. Prevents layout thrashing during adjustment, and you getting confused.

Range Input Normalization

All <input type="range"> styling consolidated into reset.css. 44px minimum touch target (transparent hit area, visual track stays thin), consistent thumb/track appearance across components. Removed the per-component slider styling that was copy-pasted across SettingsModal, AccentPicker, DepthControls, and WorldBookPanel.

Smaller Changes

  • App shell layout switched from height: var(--app-shell-height) to position: fixed; inset: 0.
  • Home button stays visible in the input area during streaming so you can actually leave a generating chat.
  • ModalContainer now fires onCancel callback on dismiss (previously only called closeModal).
  • GENERATION_IN_PROGRESS event type registered for future proactive WS push on reconnect.
  • formatDeliberation exported from council execution service for reuse in retry merging.
  • start.sh / start.ps1: new --kill-pkgs (-k) mode — nukes lockfiles and node_modules, reinstalls backend deps.
  • bunfig.toml: [install] peer = false to suppress peer dependency noise.
  • lumiverse-spindle-types 0.3.9 -> 0.4.0.