diff --git a/public/index.html b/public/index.html
index 489d8706a..d8c7e99d2 100644
--- a/public/index.html
+++ b/public/index.html
@@ -5276,6 +5276,12 @@
Prevent further recursion (this entry will not activate others)
+
diff --git a/public/scripts/char-data.js b/public/scripts/char-data.js
index fa2f03382..20e484f31 100644
--- a/public/scripts/char-data.js
+++ b/public/scripts/char-data.js
@@ -24,6 +24,7 @@
* @property {boolean} group_override - Overrides any existing group assignment for the extension.
* @property {number} group_weight - A value used for prioritizing extensions within the same group.
* @property {boolean} prevent_recursion - Completely disallows recursive application of the extension.
+ * @property {boolean} delay_until_recursion - Will only be checked during recursion.
* @property {number} scan_depth - The maximum depth to search for matches when applying the extension.
* @property {boolean} match_whole_words - Specifies if only entire words should be matched during extension application.
* @property {boolean} use_group_scoring - Indicates if group weight is considered when selecting extensions.
diff --git a/public/scripts/world-info.js b/public/scripts/world-info.js
index d454ad104..630982578 100644
--- a/public/scripts/world-info.js
+++ b/public/scripts/world-info.js
@@ -1234,6 +1234,7 @@ const originalDataKeyMap = {
'displayIndex': 'extensions.display_index',
'excludeRecursion': 'extensions.exclude_recursion',
'preventRecursion': 'extensions.prevent_recursion',
+ 'delayUntilRecursion': 'extensions.delay_until_recursion',
'selectiveLogic': 'selectiveLogic',
'comment': 'comment',
'constant': 'constant',
@@ -1891,6 +1892,18 @@ function getWorldEntry(name, data, entry) {
});
preventRecursionInput.prop('checked', entry.preventRecursion).trigger('input');
+ // delay until recursion
+ const delayUntilRecursionInput = template.find('input[name="delay_until_recursion"]');
+ delayUntilRecursionInput.data('uid', entry.uid);
+ delayUntilRecursionInput.on('input', function () {
+ const uid = $(this).data('uid');
+ const value = $(this).prop('checked');
+ data.entries[uid].delayUntilRecursion = value;
+ setOriginalDataValue(data, uid, 'extensions.delay_until_recursion', data.entries[uid].delayUntilRecursion);
+ saveWorldInfo(name, data);
+ });
+ delayUntilRecursionInput.prop('checked', entry.delayUntilRecursion).trigger('input');
+
// duplicate button
const duplicateButton = template.find('.duplicate_entry_button');
duplicateButton.data('uid', entry.uid);
@@ -2152,6 +2165,7 @@ const newEntryTemplate = {
position: 0,
disable: false,
excludeRecursion: false,
+ delayUntilRecursion: false,
probability: 100,
useProbability: true,
depth: DEFAULT_DEPTH,
@@ -2519,7 +2533,7 @@ async function checkWorldInfo(chat, maxContext) {
continue;
}
- if (allActivatedEntries.has(entry) || entry.disable == true || (count > 1 && world_info_recursive && entry.excludeRecursion)) {
+ if (allActivatedEntries.has(entry) || entry.disable == true || (count > 1 && world_info_recursive && entry.excludeRecursion) || (count == 1 && entry.delayUntilRecursion)) {
continue;
}
@@ -2887,6 +2901,7 @@ function convertAgnaiMemoryBook(inputObj) {
disable: !entry.enabled,
addMemo: !!entry.name,
excludeRecursion: false,
+ delayUntilRecursion: false,
displayIndex: index,
probability: 100,
useProbability: true,
@@ -2925,6 +2940,7 @@ function convertRisuLorebook(inputObj) {
disable: false,
addMemo: true,
excludeRecursion: false,
+ delayUntilRecursion: false,
displayIndex: index,
probability: entry.activationPercent ?? 100,
useProbability: entry.activationPercent ?? true,
@@ -2968,6 +2984,7 @@ function convertNovelLorebook(inputObj) {
disable: !entry.enabled,
addMemo: addMemo,
excludeRecursion: false,
+ delayUntilRecursion: false,
displayIndex: index,
probability: 100,
useProbability: true,
@@ -3008,6 +3025,7 @@ function convertCharacterBook(characterBook) {
position: entry.extensions?.position ?? (entry.position === 'before_char' ? world_info_position.before : world_info_position.after),
excludeRecursion: entry.extensions?.exclude_recursion ?? false,
preventRecursion: entry.extensions?.prevent_recursion ?? false,
+ delayUntilRecursion: entry.extensions?.delay_until_recursion ?? false,
disable: !entry.enabled,
addMemo: entry.comment ? true : false,
displayIndex: entry.extensions?.display_index ?? index,
diff --git a/src/endpoints/characters.js b/src/endpoints/characters.js
index 2e3171880..fc7ae3ef8 100644
--- a/src/endpoints/characters.js
+++ b/src/endpoints/characters.js
@@ -436,6 +436,7 @@ function convertWorldInfoToCharacterBook(name, entries) {
group_override: entry.groupOverride ?? false,
group_weight: entry.groupWeight ?? null,
prevent_recursion: entry.preventRecursion ?? false,
+ delay_until_recursion: entry.delayUntilRecursion ?? false,
scan_depth: entry.scanDepth ?? null,
match_whole_words: entry.matchWholeWords ?? null,
use_group_scoring: entry.useGroupScoring ?? false,