From 2f7d694f5429fd95e342bd0825e96eee1cc66170 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:33:24 +0000 Subject: [PATCH] Migrate sysprompts from instruct --- public/scripts/sysprompt.js | 16 ++++++++++++++++ server.js | 1 + src/users.js | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/public/scripts/sysprompt.js b/public/scripts/sysprompt.js index b5107c27d..a9d752012 100644 --- a/public/scripts/sysprompt.js +++ b/public/scripts/sysprompt.js @@ -9,6 +9,21 @@ const $select = $('#sysprompt_select'); const $content = $('#sysprompt_content'); const $contentBlock = $('#SystemPromptBlock'); +function migrateSystemPromptFromInstructMode() { + if ('system_prompt' in power_user.instruct) { + power_user.sysprompt.enabled = power_user.instruct.enabled; + power_user.sysprompt.content = String(power_user.instruct.system_prompt); + delete power_user.instruct.system_prompt; + + if (system_prompts.some(x => x.name === power_user.instruct.preset)) { + power_user.sysprompt.name = power_user.instruct.preset; + } + + saveSettingsDebounced(); + toastr.info('System prompt settings have been moved from the Instruct Mode.', 'Migration notice', { timeOut: 5000 }); + } +} + /** * Loads sysprompt settings from the given data object. * @param {object} data Settings data object. @@ -18,6 +33,7 @@ export async function loadSystemPrompts(data) { system_prompts = data.sysprompt; } + migrateSystemPromptFromInstructMode(); toggleSyspromptDisabledControls(); for (const prompt of system_prompts) { diff --git a/server.js b/server.js index 84a5f9fe9..677561517 100644 --- a/server.js +++ b/server.js @@ -932,6 +932,7 @@ async function verifySecuritySettings() { userModule.initUserStorage(dataRoot) .then(userModule.ensurePublicDirectoriesExist) .then(userModule.migrateUserData) + .then(userModule.migrateSystemPrompts) .then(verifySecuritySettings) .then(preSetupTasks) .finally(startServer); diff --git a/src/users.js b/src/users.js index d304d2942..b2a2f65f0 100644 --- a/src/users.js +++ b/src/users.js @@ -9,6 +9,7 @@ const storage = require('node-persist'); const express = require('express'); const mime = require('mime-types'); const archiver = require('archiver'); +const writeFileAtomicSync = require('write-file-atomic').sync; const { USER_DIRECTORY_TEMPLATE, DEFAULT_USER, PUBLIC_DIRECTORIES, DEFAULT_AVATAR, SETTINGS_FILE } = require('./constants'); const { getConfigValue, color, delay, setConfigValue, generateTimestamp } = require('./util'); @@ -323,6 +324,36 @@ async function migrateUserData() { console.log(color.green('Migration completed!')); } +async function migrateSystemPrompts() { + const directories = await getUserDirectoriesList(); + for (const directory of directories) { + try { + const migrateMarker = path.join(directory.sysprompt, '.migrated'); + if (fs.existsSync(migrateMarker)) { + continue; + } + const instucts = fs.readdirSync(directory.instruct); + for (const instruct of instucts) { + const instructPath = path.join(directory.instruct, instruct); + const syspromptPath = path.join(directory.sysprompt, instruct); + if (path.extname(instruct) === '.json' && !fs.existsSync(syspromptPath)) { + const instructData = JSON.parse(fs.readFileSync(instructPath, 'utf8')); + if ('system_prompt' in instructData && 'name' in instructData) { + const syspromptData = { name: instructData.name, content: instructData.system_prompt }; + writeFileAtomicSync(syspromptPath, JSON.stringify(syspromptData, null, 4)); + delete instructData.system_prompt; + writeFileAtomicSync(instructPath, JSON.stringify(instructData, null, 4)); + console.log(`Migrated system prompt ${instruct} for ${directory.root.split(path.sep).pop()}`); + } + } + } + writeFileAtomicSync(migrateMarker, ''); + } catch { + // Ignore errors + } + } +} + /** * Converts a user handle to a storage key. * @param {string} handle User handle @@ -724,6 +755,7 @@ module.exports = { requireLoginMiddleware, requireAdminMiddleware, migrateUserData, + migrateSystemPrompts, getPasswordSalt, getPasswordHash, getCsrfSecret,