import { chat_metadata, saveSettingsDebounced } from "../../../script.js"; import { extension_settings, getContext } from "../../extensions.js"; import { debounce } from "../../utils.js"; export { MODULE_NAME }; const saveChatDebounced = debounce(async () => await getContext().saveChat(), 1000); const MODULE_NAME = '2_floating_prompt'; // <= Deliberate, for sorting lower than memory const UPDATE_INTERVAL = 1000; const DEFAULT_DEPTH = 4; const DEFAULT_POSITION = 1; const DEFAULT_INTERVAL = 1; const metadata_keys = { prompt: 'note_prompt', interval: 'note_interval', depth: 'note_depth', position: 'note_position', } async function onExtensionFloatingPromptInput() { chat_metadata[metadata_keys.prompt] = $(this).val(); saveChatDebounced(); } async function onExtensionFloatingIntervalInput() { chat_metadata[metadata_keys.interval] = Number($(this).val()); saveChatDebounced(); } async function onExtensionFloatingDepthInput() { let value = Number($(this).val()); if (value < 0) { value = Math.abs(value); $(this).val(value); } chat_metadata[metadata_keys.depth] = value; saveChatDebounced(); } async function onExtensionFloatingPositionInput(e) { chat_metadata[metadata_keys.position] = e.target.value; saveChatDebounced(); } function onExtensionFloatingDefaultInput() { extension_settings.note.default = $(this).val(); saveSettingsDebounced(); } function loadSettings() { chat_metadata[metadata_keys.prompt] = chat_metadata[metadata_keys.prompt] ?? extension_settings.note.default ?? ''; chat_metadata[metadata_keys.interval] = chat_metadata[metadata_keys.interval] ?? DEFAULT_INTERVAL; chat_metadata[metadata_keys.position] = chat_metadata[metadata_keys.position] ?? DEFAULT_POSITION; chat_metadata[metadata_keys.depth] = chat_metadata[metadata_keys.depth] ?? DEFAULT_DEPTH; $('#extension_floating_prompt').val(chat_metadata[metadata_keys.prompt]); $('#extension_floating_interval').val(chat_metadata[metadata_keys.interval]); $('#extension_floating_depth').val(chat_metadata[metadata_keys.depth]); $(`input[name="extension_floating_position"][value="${chat_metadata[metadata_keys.position]}"]`).prop('checked', true); $('#extension_floating_default').val(extension_settings.note.default); } async function moduleWorker() { const context = getContext(); if (!context.groupId && !context.characterId) { return; } loadSettings(); // take the count of messages let lastMessageNumber = Array.isArray(context.chat) && context.chat.length ? context.chat.filter(m => m.is_user).length : 0; // special case for new chat if (Array.isArray(context.chat) && context.chat.length === 1) { lastMessageNumber = 1; } if (lastMessageNumber <= 0 || chat_metadata[metadata_keys.interval] <= 0) { context.setExtensionPrompt(MODULE_NAME, ''); $('#extension_floating_counter').text('No'); return; } const messagesTillInsertion = lastMessageNumber >= chat_metadata[metadata_keys.interval] ? (lastMessageNumber % chat_metadata[metadata_keys.interval]) : (chat_metadata[metadata_keys.interval] - lastMessageNumber); const shouldAddPrompt = messagesTillInsertion == 0; const prompt = shouldAddPrompt ? $('#extension_floating_prompt').val() : ''; context.setExtensionPrompt(MODULE_NAME, prompt, chat_metadata[metadata_keys.position], chat_metadata[metadata_keys.depth]); $('#extension_floating_counter').text(shouldAddPrompt ? 'This' : messagesTillInsertion); } (function() { function addExtensionsSettings() { const settingsHtml = `

Author's Note / Character Bias

Appending to the prompt in next: No message(s)
Default note for new chats
`; $('#extensions_settings').append(settingsHtml); $('#extension_floating_prompt').on('input', onExtensionFloatingPromptInput); $('#extension_floating_interval').on('input', onExtensionFloatingIntervalInput); $('#extension_floating_depth').on('input', onExtensionFloatingDepthInput); $('#extension_floating_default').on('input', onExtensionFloatingDefaultInput); $('input[name="extension_floating_position"]').on('change', onExtensionFloatingPositionInput); } addExtensionsSettings(); setInterval(moduleWorker, UPDATE_INTERVAL); })();