* feat: enhance asset management with extension categories
Co-authored-by: Copilot <copilot@github.com>
* fix: enhance extension name validation in server endpoints
* feat: display extension author in the extensions list
* fix: unify server error response format
Co-authored-by: Copilot <copilot@github.com>
* feat: add splash on installing third-party for the first time
* fix: add URL format validation, unify validation error messages
Co-authored-by: Copilot <copilot@github.com>
* fix: apply object freeze to EMPTY_AUTHOR value
Co-authored-by: Copilot <copilot@github.com>
* fix: typecheck extensionName in API requests
Co-authored-by: Copilot <copilot@github.com>
* feat: add feature flag guard to extensions endpoints
Co-authored-by: Copilot <copilot@github.com>
* fix: parse URL before checking
Co-authored-by: Copilot <copilot@github.com>
* fix: use case insensitive regex check
* fix: make debug log more useful
Co-authored-by: Copilot <copilot@github.com>
* fix: add pre-validation of URL format and protocol
Co-authored-by: Copilot <copilot@github.com>
* fix: leaner installation success toast
* fix: settings data loss when extensions are disabled
* fix: don't try to auto-focus elements that don't exist
Co-authored-by: Copilot <copilot@github.com>
* fix: set Popup.defaultResult to negative
Co-authored-by: Copilot <copilot@github.com>
* revert: restore undefined default result
---------
Co-authored-by: Copilot <copilot@github.com>
* feat: add bulk extension field updates with UNSET_VALUE sentinel for key deletion
- Add `UNSET_VALUE` sentinel constant to signal complete field removal from character cards
- Add `writeExtensionFieldBulk()` function to update extension fields across multiple characters in a single API call
- Add `deleteValueByPath()` utility function to remove nested object keys by dot-path
- Update `writeExtensionField()` to support `UNSET_VALUE` for deleting extension keys
- Extend `/api/characters/merge-attributes
* Revert package-lock.json changes
* Allow null values in merge-attributes filter path validation
Change filter.path existence check to only skip on undefined, not null. This allows merging attributes when the existing value is explicitly null, treating null as a valid value rather than absence of a value.
* fix: share forbiddenRegExp between modules
* feat: add writeExtensionFieldBulk and UNSET_VALUE constant to getContext
* Update src/endpoints/characters.js
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix: validate for .png extension
* Update public/scripts/extensions.js
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* refactor: extract shouldSkip logic as a function param to avoid double parsing
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@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>
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.
* Refactor loader.js to use action-loader system and move overlay management into action-loader module
- Deprecate showLoader() and hideLoader() in favor of action-loader API
- Implement legacy functions as thin wrappers around ActionLoaderHandle
- Move overlay management (showOverlay, hideOverlay, isOverlayDisplayed) into action-loader.js
- Move Popup-based loader implementation and preloader cleanup to action-loader
- Add loader.isBlocking() method to check for active blocking overlays
* Migrate from legacy loader functions to action-loader API throughout codebase
- Replace showLoader()/hideLoader() imports with loader from action-loader.js
- Update firstLoadInit() to use loader.show() with title, message, and ToastMode.STATIC
- Pass initLoaderHandle to getSettings() for early hide during onboarding flow
- Refactor renameGroupOrCharacterChat() to use loader.show() instead of boolean flag
- Wrap handleDeleteChat() with loader.show() and proper error handling
- Update BulkEditOver...
* Update loader titles and remove redundant reload notification
- Change bookmark loader title from "Bookmark" to "Chat History" for clarity
- Remove loader notification before extensions reload (redundant with browser reload)
* lint fix
* Add splash screen support to action loader with custom overlay content
- Add `overlayContent` option to ActionLoaderOptions for custom HTML in overlay
- Implement splash screen styles with centered logo, spinner, and message
- Update firstLoadInit() to use custom splash screen instead of static toast
- Pass custom content through showOverlay() to replace default spinner
- Adjust non-blocking loader warning to account for custom overlay content
* Refactor loader overlay to use DOM elements instead of HTML strings
- Add createDefaultLoaderOverlay() function to generate fresh loader overlay elements
- Export createOverlay() method on loader utility API for external use
- Change overlayContent parameter type from string-only to string|HTMLElement|null
- Add getOverlayContent() helper to normalize custom content for Popup
- Update firstLoadInit() to build splash screen using DOM manipulation instead of template literals
- Add splash-logo class and
* Use a true ellipsis
* Adjust sizing for desktop
* Even truer ellipsis
* Add transition to splash screen and fix blur animation on hideOverlay (#5338)
* Initial plan
* Blur entire splash screen on hideOverlay, not just spinner
Co-authored-by: Cohee1207 <18619528+Cohee1207@users.noreply.github.com>
Agent-Logs-Url: https://github.com/SillyTavern/SillyTavern/sessions/eee6c06d-7c9d-4363-bc8f-2647ed390368
* Add transition to splash-screen and fix transition detection
Co-authored-by: Cohee1207 <18619528+Cohee1207@users.noreply.github.com>
Agent-Logs-Url: https://github.com/SillyTavern/SillyTavern/sessions/9368bc36-31a0-4a58-aebd-7b569696ff2e
---------
Co-authored-by: anthropic-code-agent[bot] <242468646+Claude@users.noreply.github.com>
Co-authored-by: Cohee1207 <18619528+Cohee1207@users.noreply.github.com>
* Add translations to supported locales
* Localize logo alt on welcome screen
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Co-authored-by: Claude <242468646+Claude@users.noreply.github.com>
* Feat - Allow to bulk toggle all third-party extensions from popup manager
* Fix - Prevent reloading the page if the final state is the same
* Fix - Handle bulk toggle with no extensions installed
* Update - Delete leftover debug logs
* Fix - Simplify extension toggle logic and improve readability
* Update - State that bulk toggle only affects external extensions
* Feat - Allow to restore bulk toggled extensions
* Update - Move bulk toggle to the third-party extensions header
* Uncenter section headers
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Add {{hasExtension}} macro and refactor extension lookup logic
- Move findExtension() from extensions-slashcommands.js to extensions.js and export it
- Update findExtension() to return object with name and enabled properties instead of just name string
- Add {{hasExtension}} macro to check if an extension is enabled
- Update /extension-state and /extension-exists commands to use refactored findExtension()
- Remove duplicate findExtension() implementation from extensions-slashcommands.js
* Refactor extension action callbacks to use extension object instead of separate name and enabled properties
* fix eslint
* feat: preset regex
* refactor: unify `saveScriptsByType`
* fix: default branch for `saveScriptsByType`
* refactor: resolve some reviews
* fix: lint
* refactor: getPresetName -> getCurrentPresetName
* refactor: unify regex allow operation
* feat: notify whether to reload current chat when preset is changed
* refacotr: set timeout for reload current chat notification
* fix: _ -> lodash
* i18n
* Refactor API ID access
* refactor: replace UNKNOWN type with a separate constant
* refactor: consolidate CSS rules for scoped and preset script blocks
* Extend toast timeout
* Fix bug with moving, refactor
* Refactor bulk toggle operations
* Use for..of for preset application
* refactor: enhance parameter documentation for scriptType in regex functions
* fix: await loadRegexScripts in event handlers
* fix: correct script type in saveScriptsByType for preset handling
* fix: add null checks for preset manager and API ID in regex functions
* feat: implement expandable regex script options in UI
* Always show edit/delete buttons
* Add title attribute to regex script name
* fix: correct class name for regex script display
* Remove extra paddings from script blocks
* fix: ensure preset scripts are only disallowed if currently allowed during rename
* fix: reload on bulk script toggle
* feat: add PRESET_RENAMED_BEFORE event type and emit it during preset renaming
* fix: always preserve preset extensions on rename
* Handle horde in getPresetManager
---------
Co-authored-by: ZoinkCN <zoinkcn@outlook.com>
Co-authored-by: StageDog <aksanajw845@gmail.com>
* add ability for exts to req other exts
* Get rid of toasts. Collect errors on load, display in manager
* Remove unused variable
* Only show missing modules/dependencies
* Prefer display names in validation messages
* Prefer internal name for console warn
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Add gallery folder and sort order controls
Closes#3601
* Refactor sort constants to use Object.freeze for immutability
* Add comment
* Remove excessive null propagation
* Update type hint for gallery.folders
* Use defaultSettings.sort as a fallback
* Throw in groups
* Handle rename/deletion events
* Merge init functions
* Fix multiple gallery file uplods
* Add min-height for gallery element
* Fix gallery endpoint not parsing body
* translatable toasts
* Pass folder path in request body
* Change restore pictogram
* Add title to gallery thumbnail images
* Allow optional folder parameter in image list endpoint and handle deprecated usage warning
* Add validation for folder parameter in image list endpoint
* Add border to gallery sort selection
* Remove override if default folder is set to input
* Use server-side path sanitation
* Sanitize gallery folder input before updating
---------
Co-authored-by: Wolfsblvt <wolfsblvt@gmail.com>
* Optimize visibility checks for burger and wand menus
* Optimize message actions visibility toggle
* Run drawer toggle in animation frame
* Replace jQuery slideToggle with a 3rd-party lib
* Refactor export button functionality to manage popup state with a boolean flag
* Do not close the pinned drawer on unpin
* Revert "Do not close the pinned drawer on unpin"
This reverts commit e3b34e9a586db853dd84809f4187d5b29cb9ac36.
* Refactor slideToggle options
* ease-in-out
* Don't skip frame on drawer toggle