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 = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
`;
$('#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;