* Unify chat lorebook button click behavior with character lorebook button
* Update locale strings for chat lorebook button
* Unify chat lorebook button click behavior with character lorebook button
* Update locale strings for chat lorebook button
* Also unify character lorebook button to support Alt modifier
* Update locale strings for character lorebook button
* Update public/locales/fr-fr.json
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Add long-press support for lorebook buttons on mobile
* Update locale strings for lorebook button long-press
* Fix long-press to use event delegation for dynamic elements
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* feat: add array-wrap and array-unwrap commands
* Add LIST as available argument type
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Throw when trying to wrap a closure
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Throw on closure in array-unwrap
* Add the rest of argument types for array-unwrap
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add Python-friendly aliases
* Don't filter out just strings
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Proper primitive value unwrapping
* Throw on multiple unnamed arguments
* Enhance parsed object wrapping
* Update comment to clarify boolean support in value wrapping
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* fix(extensions/Summarize): prioritize UI memory content for {{summary}} macro
The {{summary}} macro previously relied solely on history-based metadata, causing it to return empty when starting a new chat if 'None (not injected)' was selected as the injection position.
This change prioritizes the #memory_contents UI value to ensure the macro resolves immediately, even before the first history-based summary is generated.
* Implement for legacy macro
* Restore original trim call
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* add Slash commands regenerate and swipe
* Update /swipe slash command direction handling
* Fix await not working in groups
* Add SLASH_COMMAND source to swipe functionality and update constants
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* group add
* make button not wide
* make single and batch add to folder use the same style popup
* prevent stuck UI, allow scrolling, prevent ::after conflicts
* extremely large commit, beware
* clear everything after performing bulk actions
* Unify bulk selection design language
---------
Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com>
* Add gpt-5.3-chat-latest model support
- Add to OpenAI model dropdown (index.html)
- Add to captioning multimodal model list (caption/settings.html)
- Add to OPENAI_REASONING_EFFORT_MODELS (constants.js)
- Add OPENAI_FIXED_REASONING_EFFORT map to clamp effort to 'medium' (the only value this model accepts)
- Apply fixed effort override in both Azure and general OpenAI request paths (chat-completions.js)
- Update frontend gpt-5.x regex for parameter handling (openai.js)
* Update public/scripts/openai.js
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
System messages in the OpenRouter messages array were being counted
toward depth and could receive cache_control breakpoints. Since
OpenRouter hoists system messages into Claude's separate system
parameter, this misplaced breakpoints and could prevent caching
entirely if the hoisted content fell below minimum cache size.
Closes#5227
77 tests covering 24 pure functions: keyToEnv, getBasicAuthHeader,
getHexString, normalizeZipEntryPath, deepMerge, uuidv4,
humanizedDateTime, tryParse, clientRelativePath, getUniqueName,
removeFileExtension, removeColorFormatting, getSeparator, isValidUrl,
urlHostnameToIPv6, toBoolean, stringToBool, trimV1, trimTrailingSlash,
mutateJsonString, isPathUnderParent, isFileURL, getRequestURL, and
formatBytes (via getBasicAuthHeader pattern).
These are all deterministic, side-effect-free functions tested without
any mocking. Placed in a separate file from the existing util.test.js
to keep concerns separated.