From f3521e70075af7cd1c59c22d58385fe48e7da815 Mon Sep 17 00:00:00 2001 From: Wolfsblvt Date: Thu, 9 Apr 2026 22:49:55 +0200 Subject: [PATCH] Migrate built-in extensions to use manifest-based activate hooks (#5435) * Convert jQuery/IIFE wrappers to exported init() functions and register activate hooks in 8 extension manifests * Convert remaining extensions to exported init() with activate hooks and await initExtensions() - Convert jQuery/IIFE wrappers to exported init() functions in expressions, memory, quick-reply, regex, stable-diffusion, translate, tts, and vectors extensions - Register init functions as activate hooks in extension manifests - Properly await async initExtensions() in firstLoadInit() * Fix eslint --------- Co-authored-by: Cohee <18619528+Cohee1207@users.noreply.github.com> --- public/script.js | 2 +- public/scripts/extensions/assets/index.js | 4 ++-- public/scripts/extensions/assets/manifest.json | 5 ++++- public/scripts/extensions/attachments/index.js | 4 ++-- public/scripts/extensions/attachments/manifest.json | 5 ++++- public/scripts/extensions/caption/index.js | 4 ++-- public/scripts/extensions/caption/manifest.json | 5 ++++- public/scripts/extensions/connection-manager/index.js | 4 ++-- public/scripts/extensions/connection-manager/manifest.json | 5 ++++- public/scripts/extensions/expressions/index.js | 4 ++-- public/scripts/extensions/expressions/manifest.json | 5 ++++- public/scripts/extensions/gallery/index.js | 4 ++-- public/scripts/extensions/gallery/manifest.json | 5 ++++- public/scripts/extensions/memory/index.js | 4 ++-- public/scripts/extensions/memory/manifest.json | 5 ++++- public/scripts/extensions/quick-reply/index.js | 7 ++++--- public/scripts/extensions/quick-reply/manifest.json | 5 ++++- public/scripts/extensions/regex/index.js | 4 ++-- public/scripts/extensions/regex/manifest.json | 5 ++++- public/scripts/extensions/stable-diffusion/index.js | 4 ++-- public/scripts/extensions/stable-diffusion/manifest.json | 5 ++++- public/scripts/extensions/token-counter/index.js | 4 ++-- public/scripts/extensions/token-counter/manifest.json | 5 ++++- public/scripts/extensions/translate/index.js | 4 ++-- public/scripts/extensions/translate/manifest.json | 5 ++++- public/scripts/extensions/tts/index.js | 4 ++-- public/scripts/extensions/tts/manifest.json | 5 ++++- public/scripts/extensions/vectors/index.js | 4 ++-- public/scripts/extensions/vectors/manifest.json | 5 ++++- 29 files changed, 87 insertions(+), 44 deletions(-) diff --git a/public/script.js b/public/script.js index 797ad3770..e39f9258d 100644 --- a/public/script.js +++ b/public/script.js @@ -741,7 +741,7 @@ async function firstLoadInit() { initKoboldSettings(); initNovelAISettings(); initSystemPrompts(); - initExtensions(); + await initExtensions(); initExtensionSlashCommands(); ToolManager.initToolSlashCommands(); await initPresetManager(); diff --git a/public/scripts/extensions/assets/index.js b/public/scripts/extensions/assets/index.js index e72fc549f..965d59199 100644 --- a/public/scripts/extensions/assets/index.js +++ b/public/scripts/extensions/assets/index.js @@ -435,7 +435,7 @@ async function updateCurrentAssets() { //#############################// // This function is called when the extension is loaded -jQuery(async () => { +export async function init() { // This is an example of loading HTML from a file const windowTemplate = await renderExtensionTemplateAsync(MODULE_NAME, 'window', {}); const windowHtml = $(windowTemplate); @@ -496,4 +496,4 @@ jQuery(async () => { eventSource.on(event_types.OPEN_CHARACTER_LIBRARY, async (forceDefault) => { openCharacterBrowser(forceDefault); }); -}); +} diff --git a/public/scripts/extensions/assets/manifest.json b/public/scripts/extensions/assets/manifest.json index 39ba8af1d..f10a02a70 100644 --- a/public/scripts/extensions/assets/manifest.json +++ b/public/scripts/extensions/assets/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "Keij#6799", "version": "0.1.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/attachments/index.js b/public/scripts/extensions/attachments/index.js index 0583d4d9e..31e858fd7 100644 --- a/public/scripts/extensions/attachments/index.js +++ b/public/scripts/extensions/attachments/index.js @@ -243,7 +243,7 @@ function handleCharacterRename(oldAvatar, newAvatar) { } } -jQuery(async () => { +export async function init() { eventSource.on(event_types.APP_READY, cleanUpAttachments); eventSource.on(event_types.CHARACTER_DELETED, cleanUpCharacterAttachments); eventSource.on(event_types.CHARACTER_RENAMED, handleCharacterRename); @@ -407,4 +407,4 @@ jQuery(async () => { }), ], })); -}); +} diff --git a/public/scripts/extensions/attachments/manifest.json b/public/scripts/extensions/attachments/manifest.json index 27f55f77c..0b2fdf027 100644 --- a/public/scripts/extensions/attachments/manifest.json +++ b/public/scripts/extensions/attachments/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "Cohee1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/caption/index.js b/public/scripts/extensions/caption/index.js index 2127a9762..8b666945b 100644 --- a/public/scripts/extensions/caption/index.js +++ b/public/scripts/extensions/caption/index.js @@ -455,7 +455,7 @@ function isVideoCaptioningAvailable() { return ['google', 'vertexai', 'zai'].includes(extension_settings.caption.multimodal_api); } -jQuery(async function () { +export async function init() { function addSendPictureButton() { const sendButton = $(`
@@ -808,4 +808,4 @@ jQuery(async function () { })); document.body.classList.add('caption'); -}); +} diff --git a/public/scripts/extensions/caption/manifest.json b/public/scripts/extensions/caption/manifest.json index 56b03acb0..f5099a01c 100644 --- a/public/scripts/extensions/caption/manifest.json +++ b/public/scripts/extensions/caption/manifest.json @@ -9,5 +9,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/connection-manager/index.js b/public/scripts/extensions/connection-manager/index.js index e809677ee..d4197f933 100644 --- a/public/scripts/extensions/connection-manager/index.js +++ b/public/scripts/extensions/connection-manager/index.js @@ -474,7 +474,7 @@ async function renderDetailsContent(detailsContent) { } } -(async function () { +export async function init() { extension_settings.connectionManager = extension_settings.connectionManager || structuredClone(DEFAULT_SETTINGS); for (const key of Object.keys(DEFAULT_SETTINGS)) { @@ -824,4 +824,4 @@ async function renderDetailsContent(detailsContent) { return JSON.stringify(profile); }, })); -})(); +} diff --git a/public/scripts/extensions/connection-manager/manifest.json b/public/scripts/extensions/connection-manager/manifest.json index 601f8970c..0bbffc0d4 100644 --- a/public/scripts/extensions/connection-manager/manifest.json +++ b/public/scripts/extensions/connection-manager/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "Cohee1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/expressions/index.js b/public/scripts/extensions/expressions/index.js index 185bea349..042d41dfa 100644 --- a/public/scripts/extensions/expressions/index.js +++ b/public/scripts/extensions/expressions/index.js @@ -2140,7 +2140,7 @@ function migrateSettings() { } } -(async function () { +export async function init() { function addExpressionImage() { const html = `
@@ -2511,4 +2511,4 @@ function migrateSettings() {
`, })); -})(); +} diff --git a/public/scripts/extensions/expressions/manifest.json b/public/scripts/extensions/expressions/manifest.json index 2c8076e45..d063c427f 100644 --- a/public/scripts/extensions/expressions/manifest.json +++ b/public/scripts/extensions/expressions/manifest.json @@ -9,5 +9,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/gallery/index.js b/public/scripts/extensions/gallery/index.js index ecd20d088..6a581cbcb 100644 --- a/public/scripts/extensions/gallery/index.js +++ b/public/scripts/extensions/gallery/index.js @@ -818,7 +818,7 @@ function addGalleryWandButton() { } // On extension load, ensure the settings are initialized -(function () { +export async function init() { initSettings(); eventSource.on(event_types.CHARACTER_RENAMED, (oldAvatar, newAvatar) => { const context = SillyTavern.getContext(); @@ -850,4 +850,4 @@ function addGalleryWandButton() { }), ); addGalleryWandButton(); -})(); +} diff --git a/public/scripts/extensions/gallery/manifest.json b/public/scripts/extensions/gallery/manifest.json index 0ba46c135..8fcf0e83b 100644 --- a/public/scripts/extensions/gallery/manifest.json +++ b/public/scripts/extensions/gallery/manifest.json @@ -8,5 +8,8 @@ "css": "style.css", "author": "City-Unit", "version": "1.5.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/memory/index.js b/public/scripts/extensions/memory/index.js index e9d3da624..af268ba58 100644 --- a/public/scripts/extensions/memory/index.js +++ b/public/scripts/extensions/memory/index.js @@ -1063,7 +1063,7 @@ function setupListeners() { }); } -jQuery(async function () { +export async function init() { async function addExtensionControls() { const settingsHtml = await renderExtensionTemplateAsync('memory', 'settings', { defaultSettings }); $('#summarize_container').append(settingsHtml); @@ -1128,4 +1128,4 @@ jQuery(async function () { () => summaryMacroHandler(), 'Returns the latest memory/summary from the current chat.'); } -}); +} diff --git a/public/scripts/extensions/memory/manifest.json b/public/scripts/extensions/memory/manifest.json index 76deda81e..791e43ffe 100644 --- a/public/scripts/extensions/memory/manifest.json +++ b/public/scripts/extensions/memory/manifest.json @@ -9,5 +9,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/quick-reply/index.js b/public/scripts/extensions/quick-reply/index.js index 42d5f2289..fd699945b 100644 --- a/public/scripts/extensions/quick-reply/index.js +++ b/public/scripts/extensions/quick-reply/index.js @@ -169,7 +169,7 @@ const handleCharChange = () => { settings.charConfig = charConfig; }; -const init = async () => { +export async function init() { await loadSets(); await loadSettings(); log('settings: ', settings); @@ -214,7 +214,8 @@ const init = async () => { eventSource.on(event_types.APP_READY, async () => await finalizeInit()); globalThis.quickReplyApi = quickReplyApi; -}; +} + const finalizeInit = async () => { debug('executing startup'); await autoExec.handleStartup(); @@ -229,7 +230,7 @@ const finalizeInit = async () => { isReady = true; debug('READY'); }; -await init(); + const purgeCharacterQuickReplySets = ({ character }) => { // Remove the character's Quick Reply Sets from the settings. diff --git a/public/scripts/extensions/quick-reply/manifest.json b/public/scripts/extensions/quick-reply/manifest.json index 4c773fe11..31cdff787 100644 --- a/public/scripts/extensions/quick-reply/manifest.json +++ b/public/scripts/extensions/quick-reply/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "RossAscends#1779", "version": "2.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/regex/index.js b/public/scripts/extensions/regex/index.js index 318eb4a53..33e6e2bc0 100644 --- a/public/scripts/extensions/regex/index.js +++ b/public/scripts/extensions/regex/index.js @@ -1709,7 +1709,7 @@ function onPresetRenamed({ apiId, oldName, newName }) { // Workaround for loading in sequence with other extensions // NOTE: Always puts extension at the top of the list, but this is fine since it's static -jQuery(async () => { +export async function init() { if (!Array.isArray(extension_settings.regex)) { extension_settings.regex = []; } @@ -2154,4 +2154,4 @@ jQuery(async () => { presetManager.setupEventListeners(); presetManager.registerSlashCommands(); -}); +} diff --git a/public/scripts/extensions/regex/manifest.json b/public/scripts/extensions/regex/manifest.json index d2e4215be..431af371c 100644 --- a/public/scripts/extensions/regex/manifest.json +++ b/public/scripts/extensions/regex/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "kingbri", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/stable-diffusion/index.js b/public/scripts/extensions/stable-diffusion/index.js index 247f2dfac..ea95f4959 100644 --- a/public/scripts/extensions/stable-diffusion/index.js +++ b/public/scripts/extensions/stable-diffusion/index.js @@ -5470,7 +5470,7 @@ function registerFunctionTool() { }); } -jQuery(async () => { +export async function init() { await addSDGenButtons(); const getSelectEnumProvider = (id, text) => () => Array.from(document.querySelectorAll(`#${id} > [value]`)).map(x => new SlashCommandEnumValue(x.getAttribute('value'), text ? x.textContent : null)); @@ -5977,4 +5977,4 @@ jQuery(async () => { t`Character's negative Image Generation prompt prefix`, ); } -}); +} diff --git a/public/scripts/extensions/stable-diffusion/manifest.json b/public/scripts/extensions/stable-diffusion/manifest.json index 79223483c..1ecdc6f26 100644 --- a/public/scripts/extensions/stable-diffusion/manifest.json +++ b/public/scripts/extensions/stable-diffusion/manifest.json @@ -10,5 +10,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/token-counter/index.js b/public/scripts/extensions/token-counter/index.js index 721597c98..ed952867c 100644 --- a/public/scripts/extensions/token-counter/index.js +++ b/public/scripts/extensions/token-counter/index.js @@ -101,7 +101,7 @@ async function doCount() { return count; } -jQuery(() => { +export function init() { const buttonHtml = `
` + @@ -115,4 +115,4 @@ jQuery(() => { returns: 'number of tokens', helpString: 'Counts the number of tokens in the current chat.', })); -}); +} diff --git a/public/scripts/extensions/token-counter/manifest.json b/public/scripts/extensions/token-counter/manifest.json index b05dd6e31..caa0ad15d 100644 --- a/public/scripts/extensions/token-counter/manifest.json +++ b/public/scripts/extensions/token-counter/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/translate/index.js b/public/scripts/extensions/translate/index.js index 58de36839..9ff1c234d 100644 --- a/public/scripts/extensions/translate/index.js +++ b/public/scripts/extensions/translate/index.js @@ -707,7 +707,7 @@ const handleMessageReasoningDelete = createEventHandler(removeReasoningDisplayTe globalThis.translate = translate; -jQuery(async () => { +export async function init() { const html = await renderExtensionTemplateAsync('translate', 'index'); const buttonHtml = await renderExtensionTemplateAsync('translate', 'buttons'); @@ -801,4 +801,4 @@ jQuery(async () => { }, returns: ARGUMENT_TYPE.STRING, })); -}); +} diff --git a/public/scripts/extensions/translate/manifest.json b/public/scripts/extensions/translate/manifest.json index b40a2aed1..9ec8c918a 100644 --- a/public/scripts/extensions/translate/manifest.json +++ b/public/scripts/extensions/translate/manifest.json @@ -7,5 +7,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/tts/index.js b/public/scripts/extensions/tts/index.js index f82acdd31..1f213e11e 100644 --- a/public/scripts/extensions/tts/index.js +++ b/public/scripts/extensions/tts/index.js @@ -1531,7 +1531,7 @@ async function initVoiceMapInternal(unrestricted) { updateVoiceMap(); } -jQuery(async function () { +export async function init() { async function addExtensionControls() { const settingsHtml = $(await renderExtensionTemplateAsync('tts', 'settings')); $('#tts_container').append(settingsHtml); @@ -1619,4 +1619,4 @@ jQuery(async function () { })); document.body.appendChild(audioElement); -}); +} diff --git a/public/scripts/extensions/tts/manifest.json b/public/scripts/extensions/tts/manifest.json index 2f8afd419..509d3a54b 100644 --- a/public/scripts/extensions/tts/manifest.json +++ b/public/scripts/extensions/tts/manifest.json @@ -11,5 +11,8 @@ "css": "style.css", "author": "Ouoertheo#7264", "version": "1.0.0", - "homePage": "None" + "homePage": "None", + "hooks": { + "activate": "init" + } } diff --git a/public/scripts/extensions/vectors/index.js b/public/scripts/extensions/vectors/index.js index 0b1d2d9f5..5e95da528 100644 --- a/public/scripts/extensions/vectors/index.js +++ b/public/scripts/extensions/vectors/index.js @@ -1760,7 +1760,7 @@ async function activateWorldInfo(chat) { await eventSource.emit(event_types.WORLDINFO_FORCE_ACTIVATE, activatedEntries); } -jQuery(async () => { +export async function init() { if (!extension_settings.vectors) { extension_settings.vectors = settings; } @@ -2376,4 +2376,4 @@ jQuery(async () => { } await purgeAllVectorIndexes(); }); -}); +} diff --git a/public/scripts/extensions/vectors/manifest.json b/public/scripts/extensions/vectors/manifest.json index 5f2462832..1849d9c88 100644 --- a/public/scripts/extensions/vectors/manifest.json +++ b/public/scripts/extensions/vectors/manifest.json @@ -10,5 +10,8 @@ "css": "style.css", "author": "Cohee#1207", "version": "1.0.0", - "homePage": "https://github.com/SillyTavern/SillyTavern" + "homePage": "https://github.com/SillyTavern/SillyTavern", + "hooks": { + "activate": "init" + } }