Everything between main (0.7.6) and staging (0.9). 150 commits, rolled into one document because the in-between releases were already covered at lucid.cards/posts/lumiverse-0-8-0 and lumiverse-0-8-5. This is the consolidated view.
embeddingConfig, every other user inherits it (config + API key) and can no longer set their own. Toggling the gate or changing the owner's fingerprint nukes vectors for every user — by design, so the shared table can be rebuilt at the new dimension.Ctrl+Enter / Ctrl+LClick. Plain Enter was being intercepted by the newline combo and the "press enter to send" setting. Hold-modifier semantics fix it.id, pack_id, and preset_id columns. Regex scripts imported as part of a preset or pack are now linked to that owner; deleting the parent cascades. If you were relying on regex scripts surviving preset deletion, they don't anymore.The headline of 0.7.7. Entity graph, salience scoring, relationship extraction, and contextual retrieval per chat. Migrations 038–048, plus 050 (vaults) and 052 (perf indexes).
src/services/memory-cortex/. Tests included for font attribution and NP chunking.bidirectional flag creates two link rows.simple, standard, advanced. Tunes thresholds without exposing the full surface.Character creation studio. Migration 048 (dream_weaver_sessions).
src/services/dream-weaver/prompts.ts. Saved prompts API (/saved-prompts) lets users keep templates between sessions.src/services/dream-weaver/visual-studio/.Document knowledge banks with chunking and vector retrieval. Migration 055.
global, character-bound, chat-bound. Cross-references via character.extensions.databank_ids, chat.metadata.chat_databank_ids, and the globalDatabanks setting. Mirrors the world-books attachment pattern..txt, .md, .csv, .json, .xml, .html, .yaml, .log, .rst, .rtf, max 10MB.safeFetch.#mention autocomplete and resolution. Tags get stripped from all user messages in context, content appended to the last user message as # Additional Context.{{databank}}, {{databankRaw}}, {{databankActive}}, {{databankCount}}.Connect to external MCP tool servers. Migration 053.
streamable_http (modern), sse (legacy HTTP+SSE), stdio (subprocess).ALLOW_MCP_PRIVATE_NETWORKS=true.mcp:{serverIdPrefix8}:{toolName}), lowest priority below extension/DLC/built-in.is_enabled=1 AND auto_connect=1. Graceful shutdown disconnects all clients.GET /mcp-servers/:id/status and GET /mcp-servers/status (all servers for user).Migration 051 for TTS connections.
openai_tts, elevenlabs, kokoro. Same CRUD shape as image-gen connections — list providers, list models, list voices, test, manage API key, duplicate./tts/synthesize (binary), /tts/synthesize/stream (chunked), /tts/detect-segments (classifies roleplay text by delimiter — *asterisks* → narration, "quotes" → speech).Owner-only server management UI. Routes under /operator/.
Bun.spawn({ ipc }). Server detects LUMIVERSE_RUNNER_IPC=1 and routes git/restart operations through the parent process. UUID-correlated request/response with mutex-protected critical sections.POST /operator/logs/subscribe + WebSocket.cache_size and mmap_size sized against host RAM, configurable via the databaseTuning setting (cacheMemoryPercent, mmapSizeBytes). Windows keeps mmap disabled.databaseMaintenance setting). Vacuum only runs when the interval, hidden/idle timer, reclaim thresholds, and active-generation/visibility gates are all satisfied.src/services/generation-pool.service.ts) caches token state for 5 minutes. GET /generate/status/:chatId returns pooled content for mid-stream recovery on WS reconnect. Token events carry seq for dedup.Used by the SillyTavern migrator to pull data from remote storage.
local, sftp, smb, google-drive, dropbox. Each implements the same interface in src/file-connections/providers/.remote-fetch-cap.ts)./google-drive and /dropbox route files.comfyui (with discovery, import, workflow parser), swarmui, pollinations. pollinations-text provider also added on the LLM side. BYOP support for Pollinations.Routes under /openrouter/. Service in src/services/openrouter.service.ts.
code_verifier in-memory (5min TTL). Frontend pops a window, OpenRouter redirects to /api/v1/openrouter/oauth-landing (unauthenticated), popup writes the code to sessionStorage, parent exchanges via POST /openrouter/auth/callback. Key lands in encrypted secrets as the connection's API key.order, allow_fallbacks, require_parameters, data_collection, ignore, only, quantizations, sort) injected as provider on the request body.web, response-healing, context-compression) injected as plugins[].HTTP-Referer, X-Title, X-OpenRouter-Categories) on every request.Three rounds of fixes before this stuck. JWT signing, region mapping, endpoint URL — all corrected. Vertex now handles the same cases the standard google provider does, including embeddings (separate google_vertex embeddings provider added).
Default safety settings inject BLOCK_NONE for all five harm categories on google and google_vertex unless the user provides custom safetySettings. The frontend has stopped silently filtering responses.
COUNCIL_TOOLS_FAILED and pauses for up to 60s. Frontend modal: "Retry Failed" or "Continue Anyway". Retry re-runs only the failed tools (executeCouncil with retryToolNames filter, dice rolls skipped) and re-formats deliberation from the full merged set.toolsSettings.retainResultsForRegens skips tool execution on regenerate/swipe and reuses the last successful results from chat.metadata.last_council_results.thinking), Google (thinkingConfig), OpenRouter (reasoning: { effort }), and toggle-only for Moonshot/Z.AI.summarization.systemPromptOverride and summarization.userPromptOverride accept user-edited templates with full token substitution. Defaults exposed via GET /generate/summarize/prompt-defaults.openai, anthropic, google, google_vertex, openrouter, deepseek, chutes, nanogpt, zai, moonshot, mistral, ai21, perplexity, groq, xai, electronhub, fireworks, pollinations, siliconflow, custom.PATCH /chats/:id/metadata and the chatsSvc.mergeChatMetadata() helper re-read the row inside the call so concurrent writers (post-generation expression detection, council result caching, deferred WI/chat-var persistence) can't clobber each other's keys.@ prefix). {{@hp = 100}}, {{@hp -= 15}}, {{@turn++}}. Persisted to chat.metadata.chat_variables after generation. Mutation macros set a dirty flag; the generate service merges into the deferred metadata write.subjective_pronoun, objective_pronoun, possessive_pronoun fields on personas. JanitorAI-compatible aliases {{sub}}, {{obj}}, {{poss}} plus the explicit forms.persona.metadata.addons[] — toggleable content blocks appended to {{persona}}. Global add-ons API (/global-addons) for add-ons not bound to a single persona. Migration 056.PUT /chat/:chatId with { preset_id, linked_to_defaults: true } delegates resolution to the current defaults instead of snapshotting block states.character.extensions.expression_groups: Record<characterName, Record<cleanLabel, imageId>>. Two-stage detection at runtime: heuristic name scan → cheap LLM steering call → scoped expression detection against only that character's labels.chat-utils, cortex, databank, formatting, logic, math, regex-ref, strings. Macros tests under src/macros/macros.test.ts (1088 lines).if.POST /spindle/update-all schedules git-pull + rebuild for every extension the caller can manage. Owner/admin gets all; regular users get their own user-scoped installs. Returns 202 with { started: true, total }. Sequential background execution. Process-wide mutex prevents overlap (re-entry returns 409). Disabled extensions are updated but stay disabled. Per-extension failures collected into errors[]. Progress streams via SPINDLE_BULK_UPDATE_PROGRESS; completion via SPINDLE_BULK_UPDATE_COMPLETE.spawnAsync: git-pull, bun install, bun build no longer block the JS event loop. Single-extension POST /spindle/:id/update benefits from the same migration.spindle.theme.apply() (raw CSS var overrides, mode-aware), applyPalette() (palette-driven theming that preserves Lumiverse-owned alpha/glass/shadow presentation), extractColors(), generateVariables() (full theme variable map). Full theme-sized payloads replace prior scope overrides to avoid stale tokens.spindle.commands.register() / unregister() / onInvoked(). Custom commands appear in the command palette (Cmd/Ctrl+K).spindle.version.getBackend() / getFrontend(). Reads cached semver from each package.json.spindle.chat.getMessages(), appendMessage(), updateMessage(), deleteMessage(), setMessageHidden(), setMessagesHidden() (≤500 ids/call), isMessageHidden(). Hidden flag excludes from chat memory embeddings only; messages remain visible to prompt assembly.getMessage() exposes the swipe array. Action-based emission on MESSAGE_SWIPED (added, updated, deleted, navigated) with swipeId and previousSwipeId.getActivated().world_book_ids from the internal extensions blob. Writes via update({ world_book_ids }) replace the attached set, sanitized for non-string/duplicate IDs.generation_parameters permission can return { messages, parameters? }. Parameters merge into the outgoing LLM request: assembledParams < interceptorParameters < inputParameters. Without the permission, returned params are silently stripped.SPINDLE_CONFIRM_RESULT wired from WebSocket to the event bus.contextmenu dispatch.038–048 cortex, 048 (dream weaver sessions), 049 (regex script id), 050 (cortex vaults), 051 (TTS connections), 052 (cortex perf indexes), 053 (mcp servers), 054 (normalize usernames), 055 (databank), 056 (global addons), 056 (saved prompts), 057 (regex script pack_id), 058 (persona pronouns), 059 (regex script preset_id).
<img="AssetName"> resolution).findJpegZipBoundary(). JPEG portion used as fallback avatar.lumiverse_modules.json for lossless round-trips of expressions, alternate fields/avatars, world books.if boolean and string comparator fixes.lru-cache pinned to a version without the Windows TLA regression.user-docs/ and developer-docs/. Macros reference, prompt block execution order, sovereign hand, preset profiles, glossary, troubleshooting, world books, personas, presets, settings, packs.If you're upgrading from 0.7.6 directly: read the Breaking section before you run migrations. Everything else can wait until you hit it.