* fix: extensions OpenRouter model lists
* fix: update JSDoc for optional mapping function parameter in fetchModelsByModality
* fix: update JSDoc to clarify return type of fetchModelsByModality function
* fix: encode output modality in fetchModelsByModality API request
* enable interleaved tool reasoning for custom OpenAI-compat endpoints
Add chat_completion_sources.CUSTOM to interleaved_reasoning_providers so
that local OpenAI-compatible endpoints (e.g. KoboldCPP in Chat Completions
mode) can forward reasoning context in tool-call chains when the user has
configured Interleaved Thinking.
Also expose the Interleaved Thinking UI control for the Custom source so
users can actually opt in — previously the dropdown was hidden behind a
data-source="openrouter" guard.
The custom streaming path already correctly accumulates delta.reasoning_content
from streaming chunks; this change only removes the provider gate that was
silently discarding that data before it reached the API payload.
* don't override invocation reasoning with prior-turn assistant reasoning
When an invocation already has its own reasoning captured at execution
time, preserve it instead of replacing it with previousAssistantReasoning
from the backward scan. The override was correct when invocations never
carried their own reasoning, but now that the custom/openrouter paths
capture per-invocation reasoning, the unconditional replacement caused
all tool calls in a chain to receive the same stale reasoning from an
earlier unrelated assistant turn.
Fall back to previousAssistantReasoning only when clone.reasoning is empty.
* Add StreamingDisplay class for live LLM generation output with floating toast panel
- Add StreamingDisplay class to show streaming reasoning and content in a floating toast panel
- Extract createModelIcon() helper from insertSVGIcon() for reusable API/model icon creation
- StreamingDisplay automatically appends inside topmost open dialog (same pattern as fixToastrForDialogs)
- Add CSS with fade-in animation, pulsating activity indicator, and separate reasoning/content sections
- Support optional model icon in header
* Add ConnectionManagerRequestService.getProfileIcon() method for retrieving profile API icons
- Add static getProfileIcon() method to ConnectionManagerRequestService
- Returns HTMLImageElement created via createModelIcon() for a given profile's API/model
- Accepts optional profileId parameter, defaults to currently selected profile
- Returns null if Connection Manager is disabled, profile not found, or profile has no API
- Import createModelIcon from script.js
* Use animation_duration directly in hide() and CSS transition instead of constant
- Remove ANIMATION_DURATION_MS constant and use animation_duration directly in hide() method
- Replace hardcoded 0.3s CSS transitions with CSS variable var(--animation-duration, 125ms)
- Read animation_duration value inline in hide() for accurate timing
* Add /genstream slash command with live streaming display and reasoning support
- Add /genstream slash command that generates text via Connection Manager with live streaming UI
- Add formatReasoning() helper function (inverse of parseReasoningFromString) to format reasoning/content into template-wrapped strings
- Add connectionProfiles enum provider for profile selection in slash commands
- StreamingDisplay: add delay parameter to hide() method (default 1000ms) to show final result before dismiss
* Add /reasoning-format slash command to format reasoning and content into template-wrapped strings
- Add /reasoning-format (alias: /format-reasoning) slash command that wraps reasoning/content using Reasoning Formatting settings
- Accept required 'reasoning' named argument and optional unnamed 'content' argument
- Validate that prefix/suffix are configured before formatting
- Return formatted string via formatReasoning() helper for use with /reasoning-parse
- Show warning toasts if prefix/suffix missing
* Rename /genstream command to /profile-genstream and move to appropriate module
* Apply messageFormatting to StreamingDisplay reasoning and content text for proper rendering
- Import messageFormatting from script.js
- Replace textContent with innerHTML using messageFormatting() in updateReasoning() and updateText()
- Pass isSystem=true for reasoning, isSystem=false for content to match formatting expectations
- Update css to utilize pre-formatted paragraphs correctly
* Strip auto-added quotes from <q> tags in StreamingDisplay and add 'mes_text' class for consistent chat message formatting
- Add CSS rules to remove browser-default quotes from <q> tags in reasoning and content sections
- Add 'mes_text' class to textContent div to match chat message formatting behavior
- Prevents double quotes when messageFormatting already adds them via <q> tags
* Add minimize/close buttons and complete state to StreamingDisplay with configurable auto-hide
- Add minimize button to collapse/restore content sections while keeping header visible
- Add close button to manually dismiss display (generation continues in background)
- Replace CSS pseudo-element with explicit LED indicator element for better state control
- Add complete() method to mark generation done: changes LED from pulsing orange to solid green
- Add configurable auto-hide delay after completion
* Add stop button to StreamingDisplay with abort support and onStop/onComplete closures for /profile-genstream
- Add stop button to StreamingDisplay when onStop handler is provided
- Add markStopped() method with solid red LED state indicator
- Add AbortController integration to /profile-genstream for request cancellation
- Add onStop and onComplete closure arguments to /profile-genstream command
- Update complete() method signature to use options object with label and delay
- Disable stop button immediately
* Position StreamingDisplay above bottom form block using CSS variable with fallback
- Change bottom positioning from fixed 20px to dynamic calculation
- Use max() to position above --bottomFormBlockSize + 5px or minimum 20px
- Ensures StreamingDisplay doesn't overlap with bottom UI elements
* Rename /profile-genstream arguments for clarity: label→generating, completedLabel→completed, hideDelay→delay
- Rename `label` argument to `generating` to better reflect its purpose as the in-progress state label
- Rename `completedLabel` to `completed` for consistency and brevity
- Rename `hideDelay` to `delay` for simpler naming
- Update all internal references and variable names to match new argument names
- Update argument descriptions and default values accordingly
* Remove variable resolution from /profile-genstream arguments: system, length, and delay
- Remove ARGUMENT_TYPE.VARIABLE_NAME from typeList for system, length, and delay arguments
- Replace resolveVariable() calls with direct argument access for system, length, and delay
- Simplify type checking to use typeof directly on args properties
- Maintain existing default values and validation logic
* Add warning toast and early return when connection profile not found in /profile-genstream
- Display toastr warning when fuzzy search fails to find matching profile
- Return empty string to prevent execution with invalid profile
- Improves user feedback for incorrect profile names or IDs
* Extract buildResultText() helper in /profile-genstream to return partial results when stopped
- Add buildResultText() helper function to centralize result formatting logic
- Return partial generated text when user stops generation instead of empty string
- Reuse buildResultText() for both stopped and completed states
- Maintains consistent reasoning formatting in both cases
* fix lint
* Update documentation to reflect argument name change from hideDelay to delay
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* feat: emit PERSONA_CREATED event when duplicating a persona
Adds PERSONA_CREATED event emission in duplicatePersona() to notify listeners when a persona is duplicated. Includes the new avatarId, name, and duplicatedFromAvatarId in the event payload.
* fix: event data and execution order
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Add 'clean' extension hook support with optional cleanup on delete
- Add hasExtensionHook() helper to check if an extension defines a specific manifest hook
- Add 'clean' hook type to callExtensionHook() JSDoc
- Add clean button to extension UI when 'clean' hook is present
- Add onCleanClick() handler to run clean hook with confirmation
- Add cleanExtension() function to execute clean hook and reload page
- Modify deleteExtension() to optionally run clean hook before deletion
- Show cleanup checkbox on extension delete popup
* fix lint
Remove unused `callGenericPopup` import from extensions.js
* Force save settings before page reload in extension clean and delete operations
Add explicit saveSettings() calls in cleanExtension() and deleteExtension() to prevent race conditions where clean/delete hooks might update settings that get lost during the subsequent page reload.
* Remove admin permission check from extension clean operation
The clean hook is extension-defined and may not require admin privileges. Permission checks should be handled by the extension's clean hook implementation if needed, rather than enforcing a blanket restriction at the UI level.
* fix: show clean button for built-ins
* Update hasExtensionHook to support built-in extensions
* Revert "Update hasExtensionHook to support built-in extensions"
This reverts commit 31be55ea66430ffe6a8d149d519b3d6d149da9ea.
* Revert "fix: show clean button for built-ins"
This reverts commit 5f86fec70c2b7d5cd99e4dee7f14af5a3372d58f.
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* allow grammar to keep place during continue
* lint
* fix: require kai flag for grammar to be set
* fix: don't retain if grammar is empty
* fix: default to undefined if not retain
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Adds optional `disabled` boolean property to PopupInputConfiguration JSDoc and implements it across all input types (checkbox, text, textarea, number). When set to true, the input element will be rendered in a disabled state.
Returns a structuredClone of the loaded manifest for the given extension name.
Accepts either the short name or full internal key (third-party/...).
Returns null if the extension is not registered.
* feat: add /regex-state command to check script enabled status
Adds a new slash command that returns 'on' or 'off' to indicate whether a regex script is currently enabled or disabled.
* refactor: change /regex-state return values from 'on'/'off' to 'true'/'false'
Updates the /regex-state slash command to return boolean string values ('true'/'false') instead of ('on'/'off') for better consistency with standard boolean conventions.
* fix: include model field in sd.cpp SDAPI requests and preserve URL path
The sd.cpp integration overwrites the URL pathname when constructing
requests, which breaks proxy servers like llama-swap that use path-based
routing (e.g. /upstream/model-name). Additionally, the model field was
never included in SDAPI requests, which is required by llama-swap to
route requests to the correct backend.
Changes:
- Server: Append to URL pathname instead of overwriting (same pattern as #5178)
- Server: Pass model field through to sd-server payload
- Client: Add model name text input for sd.cpp source settings
- Client: Send model name in generate request payload
* fix: fetch models from server and populate standard Model dropdown
Instead of a separate text input for the model name, fetch the model
list from the sd.cpp server's /v1/models endpoint and populate the
standard Model dropdown. This provides a seamless experience where
users just pick a model from the dropdown like any other source.
Works with both standalone sd-server and proxy servers like llama-swap
that expose multiple models via the OpenAI-compatible models endpoint.
* fix: don't send clip_skip=1 to sd.cpp, it produces blank images
sd-server generates blank white images when clip_skip is set to 1.
Since clip_skip=1 means 'use all CLIP layers' (the default behavior),
only send the parameter when it's > 1.
* Fix eslint
* Replace string appends with urlJoin
* fix: convert URL strings to URL objects in sdcpp routes
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Extends the #logDeprecated helper to accept and log the arguments passed to deprecated methods, providing better debugging context for migration. Updates all deprecated method calls (get, has, registerMacro, unregisterMacro) to forward their arguments to the deprecation logger.
Prevents invalid CSS by skipping rules containing `::` (pseudo-elements like `::before`, `::after`, `::-webkit-scrollbar`) when converting `:hover` to `:focus-visible`, as pseudo-elements cannot receive focus.
Previously only exact 'en' was accepted as fallback when a language wasn't found. Now accepts any English variant (en-US, en-AU, etc.) to prevent spurious warnings for valid English locales.
* feat: add Workers AI text embeddings and multimodal captioning
Extends the Cloudflare Workers AI integration to the vectors and
caption extensions.
Embeddings: adds workers_ai source to the vectors extension using the
OpenAI-compatible /v1/embeddings endpoint, with dynamic model listing
from the Cloudflare model search API.
Captioning: adds workers_ai as a multimodal caption API with dynamic
vision model discovery via the multimodal-models endpoint.
* Add logo svg
* Refactor caption dropdown population
* Fix order of sources
* feat: add error handling for missing Workers AI account ID
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* refactor(tts): remove redundant 4-space codeblock filter
- Deleted the regex that removed lines starting with four spaces.
- Original intent was to strip "indented code blocks" (Markdown legacy syntax).
- In practice, SillyTavern already handles explicit code fences (```...``` and ~~~...~~~).
- Indented code blocks are rarely used and the regex caused unnecessary text loss in normal messages.
- Simplifies codeblock skipping logic and avoids accidental removal of valid content.
* Remove commented out code
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* feat: add entry preview to world info deletion confirmation dialog
Displays entry comment or first two lines of content in the deletion confirmation popup to help users verify they're deleting the correct entry.
* fix: sanitize world info entry preview text in deletion confirmation dialog
Adds DOMPurify sanitization to the entry preview text displayed in the deletion confirmation popup to prevent potential XSS vulnerabilities from unsanitized user content.
* DOMPurify -> escapeHtml
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* feat: add Cloudflare Workers AI provider
Adds support for Cloudflare Workers AI using its OpenAI-compatible API.
Workers AI-specific stuff includes:
- Model list fetching and capabilities detection
- Tokenizer auto-detection for typical hosted model families
- Streaming not supported when using structured output
Closes#5305
* Make the entire header clickable
* Add missing samplers
* Fix non-streaming reasoning parsing
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Add unit tests for prompt-converters.js
* fix: add type annotation for prompt-converters module
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Skip TTS for voices explicitly set to disabled (fixes#4970)
* Always show disabled message in commands and fix restoring voice map UI
* Always show a message on manual TTS trigger
* Fix null current job on disabled
* Adjust type annotation
* Force update worker when disabled play is attempted
* Treat audio control queue as manual
* Update TTS message processing to include manual flag
* Don't show toast if was already shown by manual playback
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Use custom init script instead of postinstall
* Revert changes to start scripts in src\electron
* Add global data to content manager
* Add migration for public overrides and user.css location update
* Update npm publish workflow to use 'omit=dev' flag in npm ci commands
* Rename user.css readme file
* Fix indentation in userCssMiddleware function
* Add directory creation for content target
* Restore template compile location
* Move stylesheet up in index.json
* Use path.resolve for user.css file path in userCssMiddleware
* Correct capitalization in "Not Found" error page title and heading
* Remove init run from startup scripts
* Simplify user CSS file path resolution
* Update userCssMiddleware comment
* Use custom init script instead of postinstall
* Revert changes to start scripts in src\electron
* feat: add --ignore-scripts flag to npm install commands in batch and shell scripts
* feat: add --ignore-scripts flag to npm ci in Dockerfile
* fix: require long press to open swipe picker on phones
* fix: clarify parameter description in assignLorebookToChat function
* fix: update event parameter type in onSwipeCounterClick to include TouchEvent
* fix: update event parameter types in onSwipeCounterClick and addLongPressEvent
* fix: return Error objects from invokeFunctionTool and create error invocations
invokeFunctionTool previously called .toString() on caught errors,
converting them to plain strings. This made the instanceof Error
check in invokeFunctionTools dead code.
Changes:
- Return Error objects directly from invokeFunctionTool
- Create error invocations with error: true flag when tools fail
- Record failed stealth tools in stealthCalls
- Preserve signature/reasoning on error invocations
- Add error field to ToolInvocation typedef
* fix: use Error.toString to avoid behavioral changes
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* feat(secrets): update readSecret function to accept optional secret ID
* add secret_id to ConnectionManagerRequestService payload
* fix: pass secret_id for Text Completion types
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>