From 94a3308dc1335688a173ebcc6ed8eee75b07130a Mon Sep 17 00:00:00 2001 From: veguAI <152010387+vegu-ai-tools@users.noreply.github.com> Date: Wed, 5 Aug 2026 19:01:07 +0300 Subject: [PATCH] 0.39.0 polish pass (#189) (#190) * 0.39.0 polish pass: compact help-chat alert, quick-load hover pop, unsaved-settings confirmation, openrouter default model (#189) * address PR #190 review: openrouter reasoning defaults, guard click-path routing, dialog save eligibility + action separation, docs sync (#189) * review round 2: gate wizard Add Client on loaded client types, fix stale reasoning-default strings (#189) --- CHANGELOG.yaml | 5 + docs/getting-started/setup-wizard.md | 2 +- docs/img/0.39.0/client-openrouter.png | Bin 37174 -> 36348 bytes docs/user-guide/app-settings/game.md | 2 +- src/talemate/agents/help/docs-index.yaml | 8 +- src/talemate/client/openrouter.py | 7 +- .../src/components/AppSettings.vue | 19 ++- talemate_frontend/src/components/HelpChat.vue | 7 +- .../src/components/IntroRecentScenes.vue | 20 +++ .../src/components/OnboardingWizard.vue | 10 +- .../src/components/TalemateApp.vue | 121 +++++++++++++++++- 11 files changed, 182 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.yaml b/CHANGELOG.yaml index 01599b5e..02dd5c70 100644 --- a/CHANGELOG.yaml +++ b/CHANGELOG.yaml @@ -19,6 +19,7 @@ - "Per-Scene Agent Overrides: Every agent action that can be switched off globally can now also be switched off for a single scene. Previously only the Visualizer's Prompt Finalization could — a scene could retune how Auto Narration, Revision, Scene Analysis or Long Term Memory behave, but not turn any of them off. The quick-toggle chips in the agent panel follow the same rule: a chip shows the value the loaded scene is actually running on and toggles exactly that value — the scene's override when one is active (marked with a small scene icon, the global value shown in the chip's tooltip), the global setting otherwise." - "Application Settings Redesign: The application settings moved out of their cramped modal into the main view as an always-available Settings tab, matching the World Editor and Templates. The nested tabs-within-tabs layout is replaced by a single sidebar navigation grouped by topic (Game, Appearance, Connections, Presets, Storytelling), with a settings search that finds any setting by name — including individual API-key providers — and jumps straight to it, highlighting the target. All API keys now live on one scrollable page instead of ten separate per-provider pages. Edits are tracked against the stored configuration: an Unsaved-changes indicator with Save and Discard appears in the toolbar, unsaved edits survive switching to other tabs, and configuration changed elsewhere (another window, the help agent) while you are editing is flagged instead of silently overwriting or being overwritten. Existing deep links — for example the 'Set API key' action on a misconfigured client — land on the correct page as before." - "Application Settings: The Settings tab in the top navigation now shows a warning badge with a tooltip while there are unsaved changes, so the state stays visible after switching away. The settings toolbar is also capped to the content width and groups Save / Discard next to the page title on the left instead of the far viewport edge." + - "Application Settings: Switching away from the Settings tab while there are unsaved changes now asks what to do with them — Ignore keeps them pending, Save writes them, Discard Changes reverts them — since the warning badge alone was too easy to miss." - "Help Agent: The documentation index is no longer embedded in the chat prompt - the prompt now carries only a compact section overview (~15k fewer tokens per message), and a new find_docs lookup locates the right documentation pages on demand, so the help chat works with small context windows typical of local models." - "Uniform Settings Framework: Agent settings and client settings now share one field-definition schema on the backend and one field renderer on the frontend. Client-specific settings gain the full widget set previously exclusive to agents (sliders, autocompletes, selects with rich choices, per-value notes) plus conditional visibility, and choice lists are delivered to the frontend in a single normalized shape." - "MistralAI Client: Added a Concurrent Inference toggle so batch operations can dispatch multiple requests in parallel. Off by default." @@ -29,9 +30,13 @@ - "Pi Bridge Client: The Docker image now ships with pi preinstalled, and pi's configuration directory (models.json, auth.json) is mounted from ./pi next to the compose file, so the client works in Docker out of the box." - "Scene Browser Landing Page: The Quick Load recent-scene cards are smaller and scale with the viewport width, so a full row of recents no longer pushes the Scene Library far down the page." - "Scene Browser Landing Page: The Quick Load card menu trigger moved below each card, so it no longer crowds the card title. Scene save files in the Scene Library gained the same context menu — Timeline, Remove from Quick Load (shown when the save is in Quick Load), and Delete — replacing the bare delete button." + - "Scene Browser Landing Page: The Quick Load cards now pop out slightly on mouse hover, without shifting the cards around them." changes: - "Dependencies: Refreshed the dependency lock across the board, including a setuptools bump to 83.0.0 which carries a fix for a source-distribution file-exclusion vulnerability (GHSA-h35f-9h28-mq5c). No dependency required code migrations." + - "OpenRouter Client: The default model for newly created OpenRouter clients is now google/gemini-3.6-flash." + - "OpenRouter Client: New OpenRouter clients now have reasoning enabled by default, with a budget of 2048 reasoning tokens, so the default model works out of the box. With reasoning off Talemate pre-fills the start of the response to steer it, and some providers — Google and Anthropic among them — reject requests that do that." fixes: + - "Help Chat: The warning shown while the Help agent has no configured client no longer stretches to fill the entire help panel — it renders as a compact notice above the chat." - "Character Card Import: A failed description or example dialogue generation no longer wipes the card's own text. Both steps clear the field before regenerating it so the card's version doesn't bias the rewrite, but a generation that errored out or came back empty left the character with nothing at all — an empty description then also blinded the attribute extraction that runs right after it. The card's original description and example dialogue are now restored whenever generation fails, returns nothing, or is cancelled, matching what the import already does when those generation steps are switched off." - "Character Card Import: A failed attribute extraction no longer overwrites the card's attributes. A generation that errored out or came back empty was still written to the character — as a sheet containing nothing but the character's own name — which dropped whatever attributes the card supplied (its gender, for example) and shadowed the character description in every prompt that renders the character sheet. An extraction that produces nothing now keeps the card's attributes, matching what the import already does when the attribute step is switched off." - "Character Card Import: The director's 'Limit character attributes' setting now applies to character card import. The setting governs every other character creation path the director manages, but import ignored it entirely — importing a card with a limit of 5 configured still produced an unbounded sheet, with nothing indicating why. Both import paths (the per-aspect flow and the Creator's Fast one-shot) now generate at most the configured number of attributes. Attributes the card itself supplies are untouched when attribute extraction is switched off." diff --git a/docs/getting-started/setup-wizard.md b/docs/getting-started/setup-wizard.md index 1882a6f4..318240f1 100644 --- a/docs/getting-started/setup-wizard.md +++ b/docs/getting-started/setup-wizard.md @@ -40,7 +40,7 @@ Select your preferred client from the dropdown and click **Add Client** to open Once you complete the client configuration, the wizard will automatically advance to the next step. !!! info "Reasoning Models" - If you are using a reasoning model (like DeepSeek R1 or GLM), you will need to enable reasoning in the client settings after setup. For OpenRouter users, the default model selected during the wizard (Gemini 3 Flash) has reasoning enabled automatically, but if you switch to a different reasoning-capable model, you'll need to enable it manually in the client settings. + If you are using a reasoning model (like DeepSeek R1 or GLM), you will need to enable reasoning in the client settings after setup. For OpenRouter users, new clients have reasoning enabled by default with a budget of 2048 reasoning tokens, so the default model selected during the wizard (Gemini 3.6 Flash) and other reasoning models work out of the box. If you switch to a model that does not reason, you can turn reasoning off in the client settings. ## Step 3: Configure Long-term Memory diff --git a/docs/img/0.39.0/client-openrouter.png b/docs/img/0.39.0/client-openrouter.png index 9835ba98d5841572f6c9b067f661bfd1ba0bd609..b2f412d87d194066ca889cb6800969adbb0826c8 100644 GIT binary patch literal 36348 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 VaVl@4ONc+KB(E-)bNa8V{|j)De7XPt literal 37174 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 {{ currentPage?.icon || 'mdi-cog' }} {{ currentPage?.group }} / {{ currentPage?.title }} - Save + Save Discard Unsaved changes. @@ -128,6 +128,7 @@ export default { 'appearance-preview-clear', 'page-changed', 'dirty-changed', + 'save-state-changed', ], data() { return { @@ -156,6 +157,14 @@ export default { // applies an embedding set — only block saving from that page return this.busy && this.page === 'presets-embeddings'; }, + canSave() { + return this.dirty && !this.embeddingsBusy; + }, + saveState() { + // what a save from outside this component (the unsaved changes + // prompt) needs to know before offering one + return { canSave: this.canSave, externalChange: this.externalChange }; + }, }, watch: { page(newPage) { @@ -164,6 +173,9 @@ export default { dirty(isDirty) { this.$emit('dirty-changed', isDirty); }, + saveState(state) { + this.$emit('save-state-changed', state); + }, visible(isVisible) { if (!isVisible) { // leaving the settings tab — the scene should show the saved @@ -354,6 +366,11 @@ export default { }, saveConfig() { + if (!this.canSave) { + // callers outside this component (the unsaved changes prompt) + // can't see what disables the toolbar's Save button + return; + } this.mergeSubcomponentConfigs(); this.saving = true; this.sendRequest({ diff --git a/talemate_frontend/src/components/HelpChat.vue b/talemate_frontend/src/components/HelpChat.vue index 04c56087..e2510dfb 100644 --- a/talemate_frontend/src/components/HelpChat.vue +++ b/talemate_frontend/src/components/HelpChat.vue @@ -80,7 +80,7 @@ - + {{ helpUnavailableReason }} @@ -447,6 +447,11 @@ export default { flex-direction: column; height: 100%; } +/* keep the alert at its natural height - the flex column root would otherwise + stretch it to fill the space above the chat card */ +.help-unavailable-alert { + flex: 0 0 auto; +} .chat-card { display: flex; flex-direction: column; diff --git a/talemate_frontend/src/components/IntroRecentScenes.vue b/talemate_frontend/src/components/IntroRecentScenes.vue index e7d04d08..e0c5b99c 100644 --- a/talemate_frontend/src/components/IntroRecentScenes.vue +++ b/talemate_frontend/src/components/IntroRecentScenes.vue @@ -228,6 +228,17 @@ export default { gap: 12px; } +.tile { + position: relative; +} + +/* z-index sits on the tile, not the card: it isn't transitionable, so keeping it + tied to the card's own :hover would drop it the instant the pointer leaves, + letting a later sibling paint over the card while it scales back down */ +.tile:hover { + z-index: 1; +} + .tile :deep(.v-card-title) { font-size: 0.9rem; line-height: 1.3; @@ -246,6 +257,15 @@ export default { padding-bottom: 0; } +.tile :deep(.v-card) { + transition: transform 0.2s ease; +} + +/* scale instead of size changes so neighbouring tiles don't shift */ +.tile :deep(.v-card:not(.v-card--disabled):hover) { + transform: scale(1.04); +} + .v-card:disabled { opacity: 0.5; } diff --git a/talemate_frontend/src/components/OnboardingWizard.vue b/talemate_frontend/src/components/OnboardingWizard.vue index caabe7f6..a60473ad 100644 --- a/talemate_frontend/src/components/OnboardingWizard.vue +++ b/talemate_frontend/src/components/OnboardingWizard.vue @@ -111,7 +111,7 @@
- Google's gemini 3 model will be selected by default. Since it's a reasoning model, reasoning will be enabled automatically. If you change to a non-reasoning model in the next setup step (or at a later point), you should turn reasoning off in the client settings. + Google's Gemini 3.6 Flash model will be selected by default. Since it's a reasoning model, reasoning will be enabled automatically. If you change to a non-reasoning model in the next setup step (or at a later point), you should turn reasoning off in the client settings.
@@ -134,7 +134,7 @@ - + Add Client @@ -750,12 +750,6 @@ export default { this.ensureSelectedPreset(); const preset = this.buildClientPreset(this.selectedClientPreset); preset._simpleMode = true; - - // Default reason_enabled to true for OpenRouter - if (this.selectedClientPreset === 'openrouter') { - preset.reason_enabled = true; - } - this.$emit('open-client-modal', preset); }, nextOrFinish() { diff --git a/talemate_frontend/src/components/TalemateApp.vue b/talemate_frontend/src/components/TalemateApp.vue index 670586b1..44d4d32b 100644 --- a/talemate_frontend/src/components/TalemateApp.vue +++ b/talemate_frontend/src/components/TalemateApp.vue @@ -68,7 +68,7 @@ - + {{ tab.icon() }} {{ tab.title() }} @@ -376,7 +376,8 @@ @appearance-preview="onAppearancePreview" @appearance-preview-clear="onAppearancePreviewClear" @page-changed="(page) => appSettingsPage = page" - @dirty-changed="(dirty) => appSettingsDirty = dirty" /> + @dirty-changed="(dirty) => appSettingsDirty = dirty" + @save-state-changed="(state) => appSettingsSaveState = state" /> @@ -401,6 +402,26 @@ + + + + mdi-content-save-alert-outline + You have unsaved settings + + + You have unsaved changes in Settings. Save them, discard them, or leave them pending and return to Settings later. +

+ The configuration was changed outside this view while you have unsaved edits — saving overwrites it. +

+
+ + Discard Changes + + Ignore + Save + +
+
{{ errorMessage }} @@ -662,6 +683,18 @@ export default { // Synced page state between AppSettingsMenu and AppSettings appSettingsPage: 'gameplay', appSettingsDirty: false, + // Whether AppSettings would accept a save right now, and whether the + // configuration changed elsewhere while it holds unsaved edits + appSettingsSaveState: { canSave: false, externalChange: false }, + // Unsaved settings guard: tab the user tried to leave for, held while + // the confirmation dialog is open + unsavedSettingsPrompt: false, + unsavedSettingsTarget: null, + suppressUnsavedSettingsPrompt: false, + revertingTab: false, + // The tab the view is actually on — `tab` transiently holds a target + // the unsaved settings guard vetoes + committedTab: 'home', // Count of outdated prompt template overrides promptsOutdatedCount: 0, // Flag to ensure new-scene navigation only happens once per scene load @@ -681,6 +714,11 @@ export default { }, tab: { handler(newTab, oldTab) { + if(this.guardUnsavedSettings(newTab)) { + return; + } + this.committedTab = newTab; + // Save scroll position when leaving main tab if(oldTab === 'main' && this.sceneActive) { this.mainTabScrollPosition = window.scrollY; @@ -1597,7 +1635,10 @@ export default { } this.tab = 'world'; this.$nextTick(() => { - this.$refs.worldStateManager.show(tab, sub1, sub2, sub3); + // the unsaved settings guard can veto the switch above, leaving the + // world window item unrendered — its commit path replays the tab's + // click, only this sub-navigation is dropped + this.$refs.worldStateManager?.show(tab, sub1, sub2, sub3); }); }, onOpenAgentMessages(agent_name) { @@ -1673,6 +1714,80 @@ export default { } }); }, + onTabClick(tabDef) { + // the tab's side effect acts on a view the guard may refuse to switch + // to — leaveSettingsTab() replays it once the user commits + if(this.settingsNavigationBlocked(tabDef.value)) { + return; + } + tabDef.click(); + }, + settingsNavigationBlocked(target) { + // leaving settings while edits are pending needs a decision first. + // Checked against committedTab, not `tab`: v-tabs updates the model + // before the click handler runs, so `tab` may already hold the target + return this.committedTab === 'settings' + && target !== 'settings' + && this.appSettingsDirty + && !this.suppressUnsavedSettingsPrompt; + }, + guardUnsavedSettings(newTab) { + // Re-entrant call caused by the revert below: the view never left the + // settings tab, so no tab change side effect should run + if(this.revertingTab) { + this.revertingTab = false; + return true; + } + if(!this.settingsNavigationBlocked(newTab)) { + return false; + } + // hold the view on settings and let the user decide what to do with + // the edits + this.unsavedSettingsTarget = newTab; + this.unsavedSettingsPrompt = true; + this.revertingTab = true; + this.tab = 'settings'; + return true; + }, + onUnsavedSettingsIgnore() { + this.leaveSettingsTab(); + }, + onUnsavedSettingsSave() { + // fire and forget: the save is a websocket round-trip, the dirty + // state clears (and with it the tab badge) when it comes back + this.$refs.appSettings.saveConfig(); + this.leaveSettingsTab(); + }, + onUnsavedSettingsDiscard() { + this.$refs.appSettings.discard(); + this.leaveSettingsTab(); + }, + leaveSettingsTab() { + const target = this.unsavedSettingsTarget; + this.unsavedSettingsPrompt = false; + this.unsavedSettingsTarget = null; + if(!target) { + return; + } + // the target may have disappeared while the prompt was open (a scene + // unload removes 'main', 'world', ...) — the availableTabs watcher + // won't correct it, it already ran while settings (always available) + // was selected + const targetTab = this.availableTabs.find(tab => tab.value === target) + || this.availableTabs.find(tab => tab.value === 'home'); + if(!targetTab) { + return; + } + // the edits may still be unsaved (Ignore, or a save whose round-trip + // hasn't landed yet) — suppress the guard so completing the navigation + // doesn't re-open the dialog + this.suppressUnsavedSettingsPrompt = true; + this.tab = targetTab.value; + this.$nextTick(() => { this.suppressUnsavedSettingsPrompt = false; }); + // take the same path a real click does — the side effect was skipped + // when the guard vetoed the navigation + targetTab.click(); + }, onAppSettingsNavigate({ page, anchor }) { if (this.$refs.appSettings) { this.$refs.appSettings.navigate(page, anchor);