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,