+
+
+
+
+
+
+
+
-
-
+
+
+
diff --git a/public/script.js b/public/script.js
index 6ab1ddccc..79fb6a917 100644
--- a/public/script.js
+++ b/public/script.js
@@ -1291,7 +1291,7 @@ async function replaceCurrentChat() {
// start new chat
else {
- characters[this_chid].chat = name2 + ' - ' + humanizedDateTime();
+ characters[this_chid].chat = `${name2} - ${humanizedDateTime()}`;
$('#selected_chat_pole').val(characters[this_chid].chat);
saveCharacterDebounced();
await getChat();
@@ -8026,7 +8026,7 @@ jQuery(async function () {
else {
//RossAscends: added character name to new chat filenames and replaced Date.now() with humanizedDateTime;
chat_metadata = {};
- characters[this_chid].chat = name2 + '-' + humanizedDateTime();
+ characters[this_chid].chat = `${name2} - ${humanizedDateTime()}`;
$('#selected_chat_pole').val(characters[this_chid].chat);
await getChat();
await createOrEditCharacter();
@@ -8427,6 +8427,7 @@ jQuery(async function () {
select_rm_characters();
sendSystemMessage(system_message_types.WELCOME);
eventSource.emit(event_types.CHAT_CHANGED, getCurrentChatId());
+ await getClientVersion();
} else {
toastr.info('Please stop the message generation first.');
}
diff --git a/public/scripts/openai.js b/public/scripts/openai.js
index 444f08717..30f4c6e29 100644
--- a/public/scripts/openai.js
+++ b/public/scripts/openai.js
@@ -1176,7 +1176,7 @@ async function sendWindowAIRequest(messages, signal, stream) {
await delay(1);
if (lastContent !== content) {
- yield content;
+ yield { text: content, swipes: [] };
}
lastContent = content;
diff --git a/public/scripts/slash-commands.js b/public/scripts/slash-commands.js
index 4ff362e63..8b9f084c4 100644
--- a/public/scripts/slash-commands.js
+++ b/public/scripts/slash-commands.js
@@ -597,7 +597,7 @@ async function generateCallback(args, value) {
}
async function echoCallback(args, value) {
- const safeValue = DOMPurify.sanitize(value || '');
+ const safeValue = DOMPurify.sanitize(String(value) || '');
if (safeValue === '') {
console.warn('WARN: No argument provided for /echo command');
return;
@@ -619,6 +619,7 @@ async function echoCallback(args, value) {
toastr.info(safeValue, title);
break;
}
+ return value;
}
async function addSwipeCallback(_, arg) {
diff --git a/public/scripts/variables.js b/public/scripts/variables.js
index 6612dd01b..99175d9c4 100644
--- a/public/scripts/variables.js
+++ b/public/scripts/variables.js
@@ -11,7 +11,15 @@ function getLocalVariable(name, args = {}) {
if (args.index !== undefined) {
try {
localVariable = JSON.parse(localVariable);
- localVariable = localVariable[Number(args.index)];
+ const numIndex = Number(args.index);
+ if (Number.isNaN(numIndex)) {
+ localVariable = localVariable[args.index];
+ } else {
+ localVariable = localVariable[Number(args.index)];
+ }
+ if (typeof localVariable == 'object') {
+ localVariable = JSON.stringify(localVariable);
+ }
} catch {
// that didn't work
}
@@ -35,7 +43,15 @@ function getGlobalVariable(name, args = {}) {
if (args.index !== undefined) {
try {
globalVariable = JSON.parse(globalVariable);
- globalVariable = globalVariable[Number(args.index)];
+ const numIndex = Number(args.index);
+ if (Number.isNaN(numIndex)) {
+ globalVariable = globalVariable[args.index];
+ } else {
+ globalVariable = globalVariable[Number(args.index)];
+ }
+ if (typeof globalVariable == 'object') {
+ globalVariable = JSON.stringify(globalVariable);
+ }
} catch {
// that didn't work
}
diff --git a/public/scripts/world-info.js b/public/scripts/world-info.js
index d29cbe222..a56879b85 100644
--- a/public/scripts/world-info.js
+++ b/public/scripts/world-info.js
@@ -295,7 +295,7 @@ function registerWorldInfoSlashCommands() {
return '';
}
- const entry = entries.find(x => x.uid === uid);
+ const entry = entries.find(x => String(x.uid) === String(uid));
if (!entry) {
toastr.warning('Valid UID is required');
@@ -1102,6 +1102,19 @@ function getWorldEntry(name, data, entry) {
orderInput.val(entry.order).trigger('input');
orderInput.css('width', 'calc(3em + 15px)');
+ // group
+ const groupInput = template.find('input[name="group"]');
+ groupInput.data('uid', entry.uid);
+ groupInput.on('input', function () {
+ const uid = $(this).data('uid');
+ const value = String($(this).val()).trim();
+
+ data.entries[uid].group = value;
+ setOriginalDataValue(data, uid, 'extensions.group', data.entries[uid].group);
+ saveWorldInfo(name, data);
+ });
+ groupInput.val(entry.group ?? '').trigger('input');
+
// probability
if (entry.probability === undefined) {
entry.probability = null;
@@ -1810,8 +1823,8 @@ async function checkWorldInfo(chat, maxContext) {
console.debug(`(NOT ANY Check) Activating WI Entry ${entry.uid}, no secondary keywords found.`);
activatedNow.add(entry);
}
- // Handle cases where secondary is empty
} else {
+ // Handle cases where secondary is empty
console.debug(`WI UID ${entry.uid}: Activated without filter logic.`);
activatedNow.add(entry);
break primary;
@@ -1827,11 +1840,13 @@ async function checkWorldInfo(chat, maxContext) {
let newContent = '';
const textToScanTokens = getTokenCount(allActivatedText);
const probabilityChecksBefore = failedProbabilityChecks.size;
+
+ filterByInclusionGroups(newEntries, allActivatedEntries);
+
console.debug('-- PROBABILITY CHECKS BEGIN --');
for (const entry of newEntries) {
const rollValue = Math.random() * 100;
-
if (entry.useProbability && rollValue > entry.probability) {
console.debug(`WI entry ${entry.uid} ${entry.key} failed probability check, skipping`);
failedProbabilityChecks.add(entry);
@@ -1939,6 +1954,72 @@ async function checkWorldInfo(chat, maxContext) {
return { worldInfoBefore, worldInfoAfter, WIDepthEntries };
}
+/**
+ * Filters entries by inclusion groups.
+ * @param {object[]} newEntries Entries activated on current recursion level
+ * @param {Set