🎨 优化扩展模块,完成ai接入和对话功能
This commit is contained in:
182
data/st-core-scripts/scripts/system-messages.js
Normal file
182
data/st-core-scripts/scripts/system-messages.js
Normal file
@@ -0,0 +1,182 @@
|
||||
import { lodash } from '../lib.js';
|
||||
import { addOneMessage, chat, displayVersion, setSendButtonState, system_avatar, systemUserName } from '../script.js';
|
||||
import { t } from './i18n.js';
|
||||
import { getMessageTimeStamp } from './RossAscends-mods.js';
|
||||
import { getSlashCommandsHelp } from './slash-commands.js';
|
||||
import { SlashCommandBrowser } from './slash-commands/SlashCommandBrowser.js';
|
||||
import { MacroBrowser, getMacrosHelp } from './macros/MacroBrowser.js';
|
||||
import { renderTemplateAsync } from './templates.js';
|
||||
|
||||
/** @type {Record<string, ChatMessage>} */
|
||||
export const system_messages = {};
|
||||
/** @type {ChatMessage[]} */
|
||||
export const SAFETY_CHAT = [];
|
||||
|
||||
/**
|
||||
* @enum {string} System message types
|
||||
*/
|
||||
export const system_message_types = {
|
||||
HELP: 'help',
|
||||
WELCOME: 'welcome',
|
||||
EMPTY: 'empty',
|
||||
GENERIC: 'generic',
|
||||
NARRATOR: 'narrator',
|
||||
COMMENT: 'comment',
|
||||
SLASH_COMMANDS: 'slash_commands',
|
||||
FORMATTING: 'formatting',
|
||||
HOTKEYS: 'hotkeys',
|
||||
MACROS: 'macros',
|
||||
WELCOME_PROMPT: 'welcome_prompt',
|
||||
ASSISTANT_NOTE: 'assistant_note',
|
||||
ASSISTANT_MESSAGE: 'assistant_message',
|
||||
};
|
||||
|
||||
export async function initSystemMessages() {
|
||||
/** @type {ChatMessage} */
|
||||
const defaultMessage = {
|
||||
name: systemUserName,
|
||||
force_avatar: system_avatar,
|
||||
is_user: false,
|
||||
is_system: true,
|
||||
extra: { swipeable: false },
|
||||
};
|
||||
/** @type {Record<string, ChatMessage>} */
|
||||
const result = {
|
||||
/** @type {ChatMessage} */
|
||||
help: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: await renderTemplateAsync('help'),
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
slash_commands: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: '',
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
hotkeys: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: await renderTemplateAsync('hotkeys'),
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
formatting: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: await renderTemplateAsync('formatting'),
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
macros: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: '',
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
welcome: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: await renderTemplateAsync('welcome', { displayVersion }),
|
||||
extra: {
|
||||
uses_system_ui: true,
|
||||
},
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
empty: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: 'No one hears you. <b>Hint:</b> add more members to the group!',
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
generic: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: 'Generic system message. User `text` parameter to override the contents',
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
welcome_prompt: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: await renderTemplateAsync('welcomePrompt'),
|
||||
extra: {
|
||||
uses_system_ui: true,
|
||||
isSmallSys: true,
|
||||
},
|
||||
}),
|
||||
/** @type {ChatMessage} */
|
||||
assistant_note: lodash.merge(structuredClone(defaultMessage), {
|
||||
mes: await renderTemplateAsync('assistantNote'),
|
||||
extra: {
|
||||
uses_system_ui: true,
|
||||
isSmallSys: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
Object.assign(system_messages, result);
|
||||
|
||||
/** @type {ChatMessage} */
|
||||
const safetyMessage = {
|
||||
name: systemUserName,
|
||||
force_avatar: system_avatar,
|
||||
is_system: true,
|
||||
is_user: false,
|
||||
send_date: getMessageTimeStamp(),
|
||||
mes: t`You deleted a character/chat and arrived back here for safety reasons! Pick another character!`,
|
||||
};
|
||||
SAFETY_CHAT.splice(0, SAFETY_CHAT.length, safetyMessage);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets a system message by type.
|
||||
* By default system messages are not swipeable.
|
||||
* This can be overridden by setting extra.swipeable to true.
|
||||
* @param {string} type Type of system message
|
||||
* @param {string} [text] Text to be sent
|
||||
* @param {ChatMessageExtra} [extra] Additional data to be added to the message
|
||||
* @returns {ChatMessage} System message object
|
||||
*/
|
||||
export function getSystemMessageByType(type, text, extra = {}) {
|
||||
const systemMessage = system_messages[type];
|
||||
|
||||
if (!systemMessage) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newMessage = { ...systemMessage, send_date: getMessageTimeStamp() };
|
||||
|
||||
if (text) {
|
||||
newMessage.mes = text;
|
||||
}
|
||||
|
||||
if (type === system_message_types.SLASH_COMMANDS) {
|
||||
newMessage.mes = getSlashCommandsHelp();
|
||||
}
|
||||
|
||||
if (type === system_message_types.MACROS) {
|
||||
newMessage.mes = getMacrosHelp();
|
||||
}
|
||||
|
||||
if (!newMessage.extra || typeof newMessage.extra !== 'object') {
|
||||
newMessage.extra = {};
|
||||
}
|
||||
|
||||
newMessage.extra = Object.assign(newMessage.extra, extra);
|
||||
newMessage.extra.type = type;
|
||||
return newMessage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a system message to the chat.
|
||||
* @param {string} type Type of system message
|
||||
* @param {string} [text] Text to be sent
|
||||
* @param {ChatMessageExtra} [extra] Additional data to be added to the message
|
||||
*/
|
||||
export function sendSystemMessage(type, text, extra = {}) {
|
||||
const newMessage = getSystemMessageByType(type, text, extra);
|
||||
chat.push(newMessage);
|
||||
addOneMessage(newMessage);
|
||||
setSendButtonState(false);
|
||||
if (type === system_message_types.SLASH_COMMANDS) {
|
||||
const browser = new SlashCommandBrowser();
|
||||
const spinner = document.querySelector('#chat .last_mes .custom-slashHelp');
|
||||
const parent = spinner.parentElement;
|
||||
spinner.remove();
|
||||
browser.renderInto(parent);
|
||||
browser.search.focus();
|
||||
}
|
||||
|
||||
if (type === system_message_types.MACROS) {
|
||||
const browser = new MacroBrowser();
|
||||
const spinner = document.querySelector('#chat .last_mes .custom-macroHelp');
|
||||
if (spinner) {
|
||||
const parent = spinner.parentElement;
|
||||
spinner.remove();
|
||||
browser.renderInto(parent);
|
||||
browser.searchInput?.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user