Migrate author's note to chat metadata

This commit is contained in:
SillyLossy
2023-04-07 21:17:24 +03:00
parent 2a86cf7905
commit 9aeeda3602
3 changed files with 168 additions and 75 deletions

View File

@ -1,46 +1,57 @@
import { getContext } from "../../extensions.js";
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;
let lastMessageNumber = null;
let promptInsertionInterval = 1;
let promptInsertionPosition = 1;
let promptInsertionDepth = 0;
let defaultNote = '';
const DEFAULT_DEPTH = 4;
const DEFAULT_POSITION = 1;
const DEFAULT_INTERVAL = 1;
function onExtensionFloatingPromptInput() {
saveSettings();
const metadata_keys = {
prompt: 'note_prompt',
interval: 'note_interval',
depth: 'note_depth',
position: 'note_position',
}
function onExtensionFloatingIntervalInput() {
promptInsertionInterval = Number($(this).val());
saveSettings();
async function onExtensionFloatingPromptInput() {
chat_metadata[metadata_keys.prompt] = $(this).val();
saveChatDebounced();
}
function onExtensionFloatingDepthInput() {
async function onExtensionFloatingIntervalInput() {
chat_metadata[metadata_keys.interval] = Number($(this).val());
saveChatDebounced();
}
async function onExtensionFloatingDepthInput() {
let value = Number($(this).val());
if (promptInsertionDepth < 0) {
if (value < 0) {
value = Math.abs(value);
$(this).val(value);
}
promptInsertionDepth = value;
saveSettings();
chat_metadata[metadata_keys.depth] = value;
saveChatDebounced();
}
function onExtensionFloatingPositionInput(e) {
promptInsertionPosition = e.target.value;
saveSettings();
async function onExtensionFloatingPositionInput(e) {
chat_metadata[metadata_keys.position] = e.target.value;
saveChatDebounced();
}
function onExtensionFloatingDefaultInput() {
defaultNote = $(this).val();
saveSettings();
extension_settings.note.default = $(this).val();
saveSettingsDebounced();
}
// TODO Remove in next release
function getLocalStorageKeys() {
const context = getContext();
@ -65,27 +76,60 @@ function getLocalStorageKeys() {
};
}
function loadSettings() {
function migrateFromLocalStorage() {
const keys = getLocalStorageKeys();
defaultNote = localStorage.getItem(keys.default) ?? '';
const prompt = localStorage.getItem(keys.prompt) ?? defaultNote ?? '';
const interval = localStorage.getItem(keys.interval) ?? 1;
const position = localStorage.getItem(keys.position) ?? 1;
const depth = localStorage.getItem(keys.depth) ?? 0;
$('#extension_floating_prompt').val(prompt).trigger('input');
$('#extension_floating_interval').val(interval).trigger('input');
$('#extension_floating_depth').val(depth).trigger('input');
$(`input[name="extension_floating_position"][value="${position}"]`).prop('checked', true).trigger('change');
$('#extension_floating_default').val(defaultNote);
const defaultNote = localStorage.getItem(keys.default);
const prompt = localStorage.getItem(keys.prompt);
const interval = localStorage.getItem(keys.interval);
const position = localStorage.getItem(keys.position);
const depth = localStorage.getItem(keys.depth);
if (defaultNote !== null) {
if (typeof extension_settings.note !== 'object') {
extension_settings.note = {};
}
extension_settings.note.default = defaultNote;
saveSettingsDebounced();
localStorage.removeItem(keys.default);
}
if (chat_metadata) {
if (interval !== null) {
chat_metadata[metadata_keys.interval] = interval;
localStorage.removeItem(keys.interval);
}
if (depth !== null) {
chat_metadata[metadata_keys.depth] = depth;
localStorage.removeItem(keys.depth);
}
if (position !== null) {
chat_metadata[metadata_keys.position] = position;
localStorage.removeItem(keys.position);
}
if (prompt !== null) {
chat_metadata[metadata_keys.prompt] = prompt;
localStorage.removeItem(keys.prompt);
saveChatDebounced();
}
}
}
function saveSettings() {
const keys = getLocalStorageKeys();
localStorage.setItem(keys.prompt, $('#extension_floating_prompt').val());
localStorage.setItem(keys.interval, $('#extension_floating_interval').val());
localStorage.setItem(keys.depth, $('#extension_floating_depth').val());
localStorage.setItem(keys.position, $('input:radio[name="extension_floating_position"]:checked').val());
localStorage.setItem(keys.default, defaultNote);
function loadSettings() {
migrateFromLocalStorage();
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() {
@ -98,24 +142,24 @@ async function moduleWorker() {
loadSettings();
// take the count of messages
lastMessageNumber = Array.isArray(context.chat) && context.chat.length ? context.chat.filter(m => m.is_user).length : 0;
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 || promptInsertionInterval <= 0) {
if (lastMessageNumber <= 0 || chat_metadata[metadata_keys.interval] <= 0) {
$('#extension_floating_counter').text('No');
return;
}
const messagesTillInsertion = lastMessageNumber >= promptInsertionInterval
? (lastMessageNumber % promptInsertionInterval)
: (promptInsertionInterval - lastMessageNumber);
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, promptInsertionPosition, promptInsertionDepth);
context.setExtensionPrompt(MODULE_NAME, prompt, chat_metadata[metadata_keys.position], chat_metadata[metadata_keys.depth]);
$('#extension_floating_counter').text(shouldAddPrompt ? 'This' : messagesTillInsertion);
}