From b84e6e07d18877efff394243ed5b076165ca67df Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Mon, 9 Oct 2023 17:21:12 +0300 Subject: [PATCH 1/7] Assets extensions visual touch-up --- public/css/extensions-panel.css | 18 +++++++-------- public/scripts/extensions/assets/index.js | 4 +++- public/scripts/extensions/assets/style.css | 24 +++++++++++++------- public/scripts/extensions/assets/window.html | 2 +- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/public/css/extensions-panel.css b/public/css/extensions-panel.css index 1b866fb45..7c6832115 100644 --- a/public/css/extensions-panel.css +++ b/public/css/extensions-panel.css @@ -103,39 +103,39 @@ input.extension_missing[type="checkbox"] { } /** LEFT COLUMN **/ -#extensions_settings>.expression_settings { +#extensions_settings>#assets_ui { order: 1; } -#extensions_settings>.background_settings { +#extensions_settings>.expression_settings { order: 2; } -#extensions_settings>.sd_settings { +#extensions_settings>.background_settings { order: 3; } -#extensions_settings>#tts_settings { +#extensions_settings>.sd_settings { order: 4; } -#extensions_settings>#rvc_settings { +#extensions_settings>#tts_settings { order: 5; } -#extensions_settings>.objective-settings { +#extensions_settings>#rvc_settings { order: 6; } -#extensions_settings>#speech_recognition_settings { +#extensions_settings>.objective-settings { order: 7; } -#extensions_settings>#audio_settings { +#extensions_settings>#speech_recognition_settings { order: 8; } -#extensions_settings>#assets_ui { +#extensions_settings>#audio_settings { order: 9; } diff --git a/public/scripts/extensions/assets/index.js b/public/scripts/extensions/assets/index.js index ca149a1cb..6133916d3 100644 --- a/public/scripts/extensions/assets/index.js +++ b/public/scripts/extensions/assets/index.js @@ -48,8 +48,10 @@ function downloadAssetsList(url) { } console.debug(DEBUG_PREFIX, "Updated available assets to", availableAssets); + // First extensions, then everything else + const assetTypes = Object.keys(availableAssets).sort((a, b) => (a === 'extension') ? -1 : (b === 'extension') ? 1 : 0); - for (const assetType in availableAssets) { + for (const assetType of assetTypes) { let assetTypeMenu = $('
', { id: "assets_audio_ambient_div", class: "assets-list-div" }); assetTypeMenu.append(`

${assetType}

`) for (const i in availableAssets[assetType]) { diff --git a/public/scripts/extensions/assets/style.css b/public/scripts/extensions/assets/style.css index bceff2ea0..e14181314 100644 --- a/public/scripts/extensions/assets/style.css +++ b/public/scripts/extensions/assets/style.css @@ -13,6 +13,10 @@ padding: 5px; } +.assets-list-div h3 { + text-transform: capitalize; +} + .assets-list-div i { display: flex; flex-direction: row; @@ -22,10 +26,14 @@ font-style: normal; } -.assets-list-div i span{ +.assets-list-div i span { margin-left: 10px; } +.assets-list-div i span:first-of-type { + font-weight: bold; +} + .asset-download-button { position: relative; width: 50px; @@ -34,7 +42,7 @@ outline: none; border-radius: 2px; cursor: pointer; - } +} .asset-download-button:active { background: #007a63; @@ -68,11 +76,11 @@ } @keyframes asset-download-button-loading-spinner { -from { - transform: rotate(0turn); -} + from { + transform: rotate(0turn); + } -to { - transform: rotate(1turn); -} + to { + transform: rotate(1turn); + } } diff --git a/public/scripts/extensions/assets/window.html b/public/scripts/extensions/assets/window.html index a85cfe5e8..a344290f7 100644 --- a/public/scripts/extensions/assets/window.html +++ b/public/scripts/extensions/assets/window.html @@ -1,7 +1,7 @@
- Assets + Download Extensions & Assets
From d81151efa2de79516a91b24bed22fdc0952384e2 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Mon, 9 Oct 2023 18:22:50 +0300 Subject: [PATCH 2/7] Fix first message duplication --- public/script.js | 1 - 1 file changed, 1 deletion(-) diff --git a/public/script.js b/public/script.js index ecd7f4b39..06374aa02 100644 --- a/public/script.js +++ b/public/script.js @@ -4554,7 +4554,6 @@ async function getChatResult() { if (chat.length === 1) { const chat_id = (chat.length - 1); await eventSource.emit(event_types.MESSAGE_RECEIVED, chat_id); - addOneMessage(chat[chat_id]); await eventSource.emit(event_types.CHARACTER_MESSAGE_RENDERED, chat_id); } } From 0873d3eaf9629f4ece5ad454794b92b1b2158b45 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Mon, 9 Oct 2023 19:09:33 +0300 Subject: [PATCH 3/7] Filter out invalid/broken characters --- server.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server.js b/server.js index 12fc3fc3f..c4fbf3fbe 100644 --- a/server.js +++ b/server.js @@ -1360,6 +1360,12 @@ app.post("/getcharacters", jsonParser, function (request, response) { let processingPromises = pngFiles.map((file, index) => processCharacter(file, index)); await Promise.all(processingPromises); performance.mark('B'); + // Filter out invalid/broken characters + characters = Object.values(characters).filter(x => x?.name).reduce((acc, val, index) => { + acc[index] = val; + return acc; + }, {}); + response.send(JSON.stringify(characters)); }); }); From 96ddd5f4e50d821044ea78050d7b2acaa471109c Mon Sep 17 00:00:00 2001 From: RossAscends <124905043+RossAscends@users.noreply.github.com> Date: Tue, 10 Oct 2023 04:49:35 +0900 Subject: [PATCH 4/7] draggable popout for Summary --- public/css/mobile-styles.css | 3 +- public/css/toggle-dependent.css | 3 +- public/scripts/extensions/memory/index.js | 231 ++++++++++++++-------- public/scripts/power-user.js | 3 +- public/style.css | 25 ++- 5 files changed, 181 insertions(+), 84 deletions(-) diff --git a/public/css/mobile-styles.css b/public/css/mobile-styles.css index ec2d80e4f..dd448c5e9 100644 --- a/public/css/mobile-styles.css +++ b/public/css/mobile-styles.css @@ -188,7 +188,8 @@ #showRawPrompt, #copyPromptToClipboard, - #groupCurrentMemberPopoutButton { + #groupCurrentMemberPopoutButton, + #summaryExtensionPopoutButton { display: none; } diff --git a/public/css/toggle-dependent.css b/public/css/toggle-dependent.css index 9dac7e9d8..fa60bd0ce 100644 --- a/public/css/toggle-dependent.css +++ b/public/css/toggle-dependent.css @@ -329,7 +329,8 @@ body.movingUI #expression-holder, body.movingUI .zoomed_avatar, body.movingUI .draggable, body.movingUI #floatingPrompt, -body.movingUI #groupMemberListPopout { +body.movingUI #groupMemberListPopout, +body.movingUI #summaryExtensionPopout { resize: both; } diff --git a/public/scripts/extensions/memory/index.js b/public/scripts/extensions/memory/index.js index 8bc6a630f..4d2f1c31a 100644 --- a/public/scripts/extensions/memory/index.js +++ b/public/scripts/extensions/memory/index.js @@ -3,6 +3,8 @@ import { getContext, getApiUrl, extension_settings, doExtrasFetch, modules } fro import { eventSource, event_types, extension_prompt_types, generateQuietPrompt, is_send_press, saveSettingsDebounced, substituteParams } from "../../../script.js"; import { is_group_generating, selected_group } from "../../group-chats.js"; import { registerSlashCommand } from "../../slash-commands.js"; +import { loadMovingUIState } from '../../power-user.js'; +import { dragElement } from "../../RossAscends-mods.js"; export { MODULE_NAME }; const MODULE_NAME = '1_memory'; @@ -547,100 +549,175 @@ function setMemoryContext(value, saveToMessage) { } } +function doPopout(e) { + const target = e.target; + //repurposes the zoomed avatar template to server as a floating div + if ($("#summaryExtensionPopout").length === 0) { + console.debug('did not see popout yet, creating') + const originalHTMLClone = $(target).parent().parent().parent().find('.inline-drawer-content').html() + const originalElement = $(target).parent().parent().parent().find('.inline-drawer-content') + const template = $('#zoomed_avatar_template').html(); + const controlBarHtml = `
+
+
+
` + const newElement = $(template); + newElement.attr('id', 'summaryExtensionPopout'); + newElement.removeClass('zoomed_avatar') + newElement.empty() + const prevSummaryBoxContents = $('#memory_contents').val(); //copy summary box before emptying + originalElement.empty(); + originalElement.html(`
Currently popped out
`) + newElement.append(controlBarHtml).append(originalHTMLClone) + $('body').append(newElement); + $("#summaryExtensionDrawerContents").addClass('scrollableInnerFull') + setMemoryContext(prevSummaryBoxContents, false); //paste prev summary box contents into popout box + setupListeners(); + loadSettings(); + loadMovingUIState(); + + $("#summaryExtensionPopout").fadeIn(250); + dragElement(newElement); + + //setup listener for close button to restore extensions menu + $('#summaryExtensionPopoutClose').off('click').on('click', function () { + $("#summaryExtensionDrawerContents").removeClass('scrollableInnerFull') + const summaryPopoutHTML = $("#summaryExtensionDrawerContents") + $("#summaryExtensionPopout").fadeOut(250, () => { + originalElement.empty(); + originalElement.html(summaryPopoutHTML); + $("#summaryExtensionPopout").remove() + }) + loadSettings(); + }) + } else { + console.debug('saw existing popout, removing') + $("#summaryExtensionPopout").fadeOut(250, () => { $("#summaryExtensionPopoutClose").trigger('click') }); + } +} + +function setupListeners() { + //setup shared listeners for popout and regular ext menu + $('#memory_restore').off('click').on('click', onMemoryRestoreClick); + $('#memory_contents').off('click').on('input', onMemoryContentInput); + $('#memory_long_length').off('click').on('input', onMemoryLongInput); + $('#memory_short_length').off('click').on('input', onMemoryShortInput); + $('#memory_repetition_penalty').off('click').on('input', onMemoryRepetitionPenaltyInput); + $('#memory_temperature').off('click').on('input', onMemoryTemperatureInput); + $('#memory_length_penalty').off('click').on('input', onMemoryLengthPenaltyInput); + $('#memory_frozen').off('click').on('input', onMemoryFrozenInput); + $('#summary_source').off('click').on('change', onSummarySourceChange); + $('#memory_prompt_words').off('click').on('input', onMemoryPromptWordsInput); + $('#memory_prompt_interval').off('click').on('input', onMemoryPromptIntervalInput); + $('#memory_prompt').off('click').on('input', onMemoryPromptInput); + $('#memory_force_summarize').off('click').on('click', forceSummarizeChat); + $('#memory_template').off('click').on('input', onMemoryTemplateInput); + $('#memory_depth').off('click').on('input', onMemoryDepthInput); + $('input[name="memory_position"]').off('click').on('change', onMemoryPositionChange); + $('#memory_prompt_words_force').off('click').on('input', onMemoryPromptWordsForceInput); + $("#summarySettingsBlockToggle").off('click').on('click', function () { + console.log('saw settings button click') + $("#summarySettingsBlock").slideToggle(200, "swing"); //toggleClass("hidden"); + }); +} + jQuery(function () { function addExtensionControls() { const settingsHtml = `
- Summarize +
Summarize
- - - - -
- - -
-
- - -
- -
- - - -
-
-
-
-
`; $('#extensions_settings2').append(settingsHtml); - $('#memory_restore').on('click', onMemoryRestoreClick); - $('#memory_contents').on('input', onMemoryContentInput); - $('#memory_long_length').on('input', onMemoryLongInput); - $('#memory_short_length').on('input', onMemoryShortInput); - $('#memory_repetition_penalty').on('input', onMemoryRepetitionPenaltyInput); - $('#memory_temperature').on('input', onMemoryTemperatureInput); - $('#memory_length_penalty').on('input', onMemoryLengthPenaltyInput); - $('#memory_frozen').on('input', onMemoryFrozenInput); - $('#summary_source').on('change', onSummarySourceChange); - $('#memory_prompt_words').on('input', onMemoryPromptWordsInput); - $('#memory_prompt_interval').on('input', onMemoryPromptIntervalInput); - $('#memory_prompt').on('input', onMemoryPromptInput); - $('#memory_force_summarize').on('click', forceSummarizeChat); - $('#memory_template').on('input', onMemoryTemplateInput); - $('#memory_depth').on('input', onMemoryDepthInput); - $('input[name="memory_position"]').on('change', onMemoryPositionChange); - $('#memory_prompt_words_force').on('input', onMemoryPromptWordsForceInput); + setupListeners(); + $("#summaryExtensionPopoutButton").off('click').on('click', function (e) { + doPopout(e); + e.stopPropagation(); + }); } addExtensionControls(); diff --git a/public/scripts/power-user.js b/public/scripts/power-user.js index 1c7ce81b6..da4849392 100644 --- a/public/scripts/power-user.js +++ b/public/scripts/power-user.js @@ -1410,7 +1410,8 @@ async function resetMovablePanels(type) { 'WorldInfo', 'floatingPrompt', 'expression-holder', - 'groupMemberListPopout' + 'groupMemberListPopout', + 'summaryExtensionPopout' ]; const panelStyles = ['top', 'left', 'right', 'bottom', 'height', 'width', 'margin',]; diff --git a/public/style.css b/public/style.css index daccef727..3abb7de87 100644 --- a/public/style.css +++ b/public/style.css @@ -3200,6 +3200,12 @@ a { height: calc(100% - 30px); } +.scrollableInnerFull { + height: 100%; + overflow-Y: auto; + overflow-X: hidden; +} + .fillLeft .scrollableInner { padding: 0.5em 1em 0.5em 0.5em } @@ -3404,7 +3410,8 @@ a { } .zoomed_avatar, -#groupMemberListPopout { +#groupMemberListPopout, +#summaryExtensionPopout { min-width: 100px; min-height: 100px; max-height: 90vh; @@ -3413,15 +3420,25 @@ a { /* width: calc((100vw - var(--sheldWidth)) /2); */ position: absolute; padding: 0; - filter: drop-shadow(2px 2px 2px var(--grey7070a)); + /* filter: drop-shadow(2px 2px 2px var(--grey7070a)); */ + box-shadow: 1px 2px 2px var(--black30a); z-index: 29; overflow: hidden; display: none; bottom: 0; - aspect-ratio: 2 / 3; border-radius: 10px; } +.zoomed_avatar { + aspect-ratio: 2 / 3; +} + +#groupMemberListPopout, +#summaryExtensionPopout { + border: 1px solid var(--SmartThemeBorderColor); + padding: 5px; +} + .draggable { min-width: 100px; min-height: 100px; @@ -3621,4 +3638,4 @@ a { height: 100vh; z-index: 9999; } -} +} \ No newline at end of file From 1239026a8f8e60da0c04a80189edf0e8ea00d148 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Mon, 9 Oct 2023 23:45:09 +0300 Subject: [PATCH 5/7] Auto-update extensions on version change --- package-lock.json | 4 ++-- package.json | 2 +- public/script.js | 6 ++++- public/scripts/extensions.js | 46 +++++++++++++++++++++++++++++++----- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3941462d2..19eb2d6fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sillytavern", - "version": "1.10.5", + "version": "1.10.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sillytavern", - "version": "1.10.5", + "version": "1.10.6", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index d2c9b7dd3..185af0b1d 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "type": "git", "url": "https://github.com/SillyTavern/SillyTavern.git" }, - "version": "1.10.5", + "version": "1.10.6", "scripts": { "start": "node server.js", "start-multi": "node server.js --disableCsrf", diff --git a/public/script.js b/public/script.js index 06374aa02..dc718241d 100644 --- a/public/script.js +++ b/public/script.js @@ -339,6 +339,7 @@ export let isChatSaving = false; let chat_create_date = 0; let firstRun = false; let settingsReady = false; +let currentVersion = "0.0.0"; const default_ch_mes = "Hello"; let count_view_mes = 0; @@ -537,6 +538,7 @@ async function getClientVersion() { const data = await response.json(); CLIENT_VERSION = data.agent; let displayVersion = `SillyTavern ${data.pkgVersion}`; + currentVersion = data.pkgVersion; if (data.gitRevision && data.gitBranch) { displayVersion += ` '${data.gitBranch}' (${data.gitRevision})`; @@ -5045,7 +5047,8 @@ async function getSettings(type) { selected_button = settings.selected_button; if (data.enable_extensions) { - await loadExtensionSettings(settings); + const isVersionChanged = settings.currentVersion !== currentVersion; + await loadExtensionSettings(settings, isVersionChanged); eventSource.emit(event_types.EXTENSION_SETTINGS_LOADED); } } @@ -5071,6 +5074,7 @@ async function saveSettings(type) { url: "/savesettings", data: JSON.stringify({ firstRun: firstRun, + currentVersion: currentVersion, username: name1, active_character: active_character, active_group: active_group, diff --git a/public/scripts/extensions.js b/public/scripts/extensions.js index c62a24e5c..76c3c2b64 100644 --- a/public/scripts/extensions.js +++ b/public/scripts/extensions.js @@ -609,6 +609,15 @@ async function showExtensionsDetails() { */ async function onUpdateClick() { const extensionName = $(this).data('name'); + await updateExtension(extensionName, false); +} + +/** + * Updates a third-party extension via the API. + * @param {string} extensionName Extension folder name + * @param {boolean} quiet If true, don't show a success message + */ +async function updateExtension(extensionName, quiet) { try { const response = await fetch('/api/extensions/update', { method: 'POST', @@ -618,15 +627,20 @@ async function onUpdateClick() { const data = await response.json(); if (data.isUpToDate) { - toastr.success('Extension is already up to date'); + if (!quiet) { + toastr.success('Extension is already up to date'); + } } else { - toastr.success(`Extension updated to ${data.shortCommitHash}`); + toastr.success(`Extension ${extensionName} updated to ${data.shortCommitHash}`); + } + + if (!quiet) { + showExtensionsDetails(); } - showExtensionsDetails(); } catch (error) { console.error('Error:', error); } -}; +} /** * Handles the click event for the delete button of an extension. @@ -706,11 +720,16 @@ export async function installExtension(url) { const response = await request.json(); toastr.success(`Extension "${response.display_name}" by ${response.author} (version ${response.version}) has been imported successfully!`, 'Extension import successful'); console.debug(`Extension "${response.display_name}" has been imported successfully at ${response.extensionPath}`); - await loadExtensionSettings({}); + await loadExtensionSettings({}, false); eventSource.emit(event_types.EXTENSION_SETTINGS_LOADED); } -async function loadExtensionSettings(settings) { +/** + * Loads extension settings from the app settings. + * @param {object} settings App Settings + * @param {boolean} versionChanged Is this a version change? + */ +async function loadExtensionSettings(settings, versionChanged) { if (settings.extension_settings) { Object.assign(extension_settings, settings.extension_settings); } @@ -723,10 +742,25 @@ async function loadExtensionSettings(settings) { eventSource.emit(event_types.EXTENSIONS_FIRST_LOAD); extensionNames = await discoverExtensions(); manifests = await getManifests(extensionNames) + + if (versionChanged) { + await autoUpdateExtensions(); + } + await activateExtensions(); if (extension_settings.autoConnect && extension_settings.apiUrl) { connectToApi(extension_settings.apiUrl); } + +} + +async function autoUpdateExtensions() { + for (const [id, manifest] of Object.entries(manifests)) { + if (manifest.auto_update && id.startsWith('third-party')) { + console.debug(`Auto-updating 3rd-party extension: ${manifest.display_name} (${id})`); + await updateExtension(id.replace('third-party', ''), true); + } + } } async function runGenerationInterceptors(chat, contextSize) { From b1769153c788c9167727ea6040f4ada271d39fe3 Mon Sep 17 00:00:00 2001 From: RossAscends <124905043+RossAscends@users.noreply.github.com> Date: Tue, 10 Oct 2023 05:52:06 +0900 Subject: [PATCH 6/7] add background coloring to popped out Summary --- public/style.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/style.css b/public/style.css index 3abb7de87..0cbc9f010 100644 --- a/public/style.css +++ b/public/style.css @@ -3477,7 +3477,8 @@ a { transition: all 250ms; } -#groupMemberListPopout { +#groupMemberListPopout, +#summaryExtensionPopout { aspect-ratio: unset; padding: 0; backdrop-filter: blur(var(--SmartThemeBlurStrength)); From f88f360404b3b0713b4a159b84ba74a32dfae063 Mon Sep 17 00:00:00 2001 From: RossAscends <124905043+RossAscends@users.noreply.github.com> Date: Tue, 10 Oct 2023 05:53:55 +0900 Subject: [PATCH 7/7] add padding back to summary popout --- public/style.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/style.css b/public/style.css index 0cbc9f010..af6d74f3e 100644 --- a/public/style.css +++ b/public/style.css @@ -3480,12 +3480,15 @@ a { #groupMemberListPopout, #summaryExtensionPopout { aspect-ratio: unset; - padding: 0; backdrop-filter: blur(var(--SmartThemeBlurStrength)); background-color: var(--SmartThemeBlurTintColor); overflow: auto; } +#groupMemberListPopout { + padding: 0; +} + #groupMemberListPopout #rm_group_members { /* background-color: var(--SmartThemeBlurTintColor); */ margin: 0;