Move event types + new events (#4257) * Move app events to separate module * Add event emission for preset changes and deletions * Remove unnecessary blank line at the beginning of events.js * Add await to selectPreset call in initTextGenSettings * Emit events for preset deletion and change in initPresetManager * Move event emit out of PRESET_CHANGED

19a8a8625c62ce1624a6bf9a00cd65dc07841bd1

Cohee <18619528+Cohee1207@users.noreply.github.com>

Signed
8 files changed, +123 -103Showing whitespace changes
public/script.js+6 -95
@@ -204,7 +204,6 @@ import {
204204 applyCharacterTagsToMessageDivs,
205205} from './scripts/tags.js';
206206import { initSecrets, readSecretState } from './scripts/secrets.js';
207-import { EventEmitter } from './lib/eventemitter.js';
208207import { markdownExclusionExt } from './scripts/showdown-exclusion.js';
209208import { markdownUnderscoreExt } from './scripts/showdown-underscore.js';
210209import { NOTE_MODULE_NAME, initAuthorsNote, metadata_keys, setFloatingPrompt, shouldWIAddPrompt } from './scripts/authors-note.js';
@@ -236,7 +235,7 @@ import {
236235} from './scripts/personas.js';
237236import { getBackgrounds, initBackgrounds, loadBackgroundSettings, background_settings } from './scripts/backgrounds.js';
238237import { hideLoader, showLoader } from './scripts/loader.js';
239238import { BulkEditOverlay, CharacterContextMenu } from './scripts/BulkEditOverlay.js';
240239import { initTextGenModels } from './scripts/textgen-models.js';
241240import { appendFileContent, hasPendingFileAttachment, populateFileAttachment, decodeStyleTags, encodeStyleTags, isExternalMediaAllowed, preserveNeutralChat, restoreNeutralChat, formatCreatorNotes, initChatUtilities, addDOMPurifyHooks } from './scripts/chats.js';
242241import { getPresetManager, initPresetManager } from './scripts/preset-manager.js';
@@ -266,6 +265,7 @@ import { initWelcomeScreen, openPermanentAssistantChat, openPermanentAssistantCa
266265import { initDataMaid } from './scripts/data-maid.js';
267266import { clearItemizedPrompts, deleteItemizedPrompts, findItemizedPromptSet, initItemizedPrompts, itemizedParams, itemizedPrompts, loadItemizedPrompts, promptItemize, replaceItemizedPromptText, saveItemizedPrompts } from './scripts/itemized-prompts.js';
268267import { getSystemMessageByType, initSystemMessages, SAFETY_CHAT, sendSystemMessage, system_message_types, system_messages } from './scripts/system-messages.js';
268+import { event_types, eventSource } from './scripts/events.js';
269269
270270// API OBJECT FOR EXTERNAL WIRING
271271globalThis.SillyTavern = {
@@ -301,6 +301,8 @@ export {
301301 system_message_types,
302302 sendSystemMessage,
303303 getSystemMessageByType,
304+ event_types,
305+ eventSource,
304306};
305307
306308/**
@@ -338,99 +340,7 @@ toastr.options = {
338340 },
339341};
340342
341-// Event source init
342-//MARK: event_types
343-export const event_types = {
344- APP_READY: 'app_ready',
345- EXTRAS_CONNECTED: 'extras_connected',
346- MESSAGE_SWIPED: 'message_swiped',
347- MESSAGE_SENT: 'message_sent',
348- MESSAGE_RECEIVED: 'message_received',
349- MESSAGE_EDITED: 'message_edited',
350- MESSAGE_DELETED: 'message_deleted',
351- MESSAGE_UPDATED: 'message_updated',
352- MESSAGE_FILE_EMBEDDED: 'message_file_embedded',
353- MESSAGE_REASONING_EDITED: 'message_reasoning_edited',
354- MESSAGE_REASONING_DELETED: 'message_reasoning_deleted',
355- MORE_MESSAGES_LOADED: 'more_messages_loaded',
356- IMPERSONATE_READY: 'impersonate_ready',
357- CHAT_CHANGED: 'chat_id_changed',
358- GENERATION_AFTER_COMMANDS: 'GENERATION_AFTER_COMMANDS',
359- GENERATION_STARTED: 'generation_started',
360- GENERATION_STOPPED: 'generation_stopped',
361- GENERATION_ENDED: 'generation_ended',
362- SD_PROMPT_PROCESSING: 'sd_prompt_processing',
363- EXTENSIONS_FIRST_LOAD: 'extensions_first_load',
364- EXTENSION_SETTINGS_LOADED: 'extension_settings_loaded',
365- SETTINGS_LOADED: 'settings_loaded',
366- SETTINGS_UPDATED: 'settings_updated',
367- GROUP_UPDATED: 'group_updated',
368- MOVABLE_PANELS_RESET: 'movable_panels_reset',
369- SETTINGS_LOADED_BEFORE: 'settings_loaded_before',
370- SETTINGS_LOADED_AFTER: 'settings_loaded_after',
371- CHATCOMPLETION_SOURCE_CHANGED: 'chatcompletion_source_changed',
372- CHATCOMPLETION_MODEL_CHANGED: 'chatcompletion_model_changed',
373- OAI_PRESET_CHANGED_BEFORE: 'oai_preset_changed_before',
374- OAI_PRESET_CHANGED_AFTER: 'oai_preset_changed_after',
375- OAI_PRESET_EXPORT_READY: 'oai_preset_export_ready',
376- OAI_PRESET_IMPORT_READY: 'oai_preset_import_ready',
377- WORLDINFO_SETTINGS_UPDATED: 'worldinfo_settings_updated',
378- WORLDINFO_UPDATED: 'worldinfo_updated',
379- CHARACTER_EDITED: 'character_edited',
380- CHARACTER_PAGE_LOADED: 'character_page_loaded',
381- CHARACTER_GROUP_OVERLAY_STATE_CHANGE_BEFORE: 'character_group_overlay_state_change_before',
382- CHARACTER_GROUP_OVERLAY_STATE_CHANGE_AFTER: 'character_group_overlay_state_change_after',
383- USER_MESSAGE_RENDERED: 'user_message_rendered',
384- CHARACTER_MESSAGE_RENDERED: 'character_message_rendered',
385- FORCE_SET_BACKGROUND: 'force_set_background',
386- CHAT_DELETED: 'chat_deleted',
387- CHAT_CREATED: 'chat_created',
388- GROUP_CHAT_DELETED: 'group_chat_deleted',
389- GROUP_CHAT_CREATED: 'group_chat_created',
390- GENERATE_BEFORE_COMBINE_PROMPTS: 'generate_before_combine_prompts',
391- GENERATE_AFTER_COMBINE_PROMPTS: 'generate_after_combine_prompts',
392- GENERATE_AFTER_DATA: 'generate_after_data',
393- GROUP_MEMBER_DRAFTED: 'group_member_drafted',
394- GROUP_WRAPPER_STARTED: 'group_wrapper_started',
395- GROUP_WRAPPER_FINISHED: 'group_wrapper_finished',
396- WORLD_INFO_ACTIVATED: 'world_info_activated',
397- TEXT_COMPLETION_SETTINGS_READY: 'text_completion_settings_ready',
398- CHAT_COMPLETION_SETTINGS_READY: 'chat_completion_settings_ready',
399- CHAT_COMPLETION_PROMPT_READY: 'chat_completion_prompt_ready',
400- CHARACTER_FIRST_MESSAGE_SELECTED: 'character_first_message_selected',
401- // TODO: Naming convention is inconsistent with other events
402- CHARACTER_DELETED: 'characterDeleted',
403- CHARACTER_DUPLICATED: 'character_duplicated',
404- CHARACTER_RENAMED: 'character_renamed',
405- CHARACTER_RENAMED_IN_PAST_CHAT: 'character_renamed_in_past_chat',
406- /** @deprecated The event is aliased to STREAM_TOKEN_RECEIVED. */
407- SMOOTH_STREAM_TOKEN_RECEIVED: 'stream_token_received',
408- STREAM_TOKEN_RECEIVED: 'stream_token_received',
409- STREAM_REASONING_DONE: 'stream_reasoning_done',
410- FILE_ATTACHMENT_DELETED: 'file_attachment_deleted',
411- WORLDINFO_FORCE_ACTIVATE: 'worldinfo_force_activate',
412- OPEN_CHARACTER_LIBRARY: 'open_character_library',
413- ONLINE_STATUS_CHANGED: 'online_status_changed',
414- IMAGE_SWIPED: 'image_swiped',
415- CONNECTION_PROFILE_LOADED: 'connection_profile_loaded',
416- CONNECTION_PROFILE_CREATED: 'connection_profile_created',
417- CONNECTION_PROFILE_DELETED: 'connection_profile_deleted',
418- CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',
419- TOOL_CALLS_PERFORMED: 'tool_calls_performed',
420- TOOL_CALLS_RENDERED: 'tool_calls_rendered',
421- CHARACTER_MANAGEMENT_DROPDOWN: 'charManagementDropdown',
422- SECRET_WRITTEN: 'secret_written',
423- SECRET_DELETED: 'secret_deleted',
424- SECRET_ROTATED: 'secret_rotated',
425- SECRET_EDITED: 'secret_edited',
426-};
427-
428-export const eventSource = new EventEmitter([event_types.APP_READY]);
429-
430343export const characterGroupOverlay = new BulkEditOverlay();
431-const characterContextMenu = new CharacterContextMenu(characterGroupOverlay);
432-eventSource.on(event_types.CHARACTER_PAGE_LOADED, characterGroupOverlay.onPageLoad);
433-console.debug('Character context menu initialized', characterContextMenu);
434344
435345// Markdown converter
436346export let mesForShowdownParse; //intended to be used as a context to compare showdown strings against
@@ -9964,10 +9874,11 @@ jQuery(async function () {
99649874 is_delete_mode = false;
99659875 });
99669876
99679877 $('#main_api').on('change', async function () {
99689878 cancelStatusCheck('Canceled because main api changed');
99699879 changeMainAPI();
99709880 saveSettingsDebounced();
9881+ await eventSource.emit(event_types.MAIN_API_CHANGED, { apiId: main_api });
99719882 });
99729883
99739884 ////////////////// OPTIMIZED RANGE SLIDER LISTENERS////////////////
public/scripts/bulk-edit.js+6 -2
@@ -1,6 +1,6 @@
11import { characterGroupOverlay } from '../script.js';
22import { BulkEditOverlay, BulkEditOverlayState, CharacterContextMenu } from './BulkEditOverlay.js';
3-
3+import { event_types, eventSource } from './events.js';
44
55let is_bulk_edit = false;
66
@@ -121,4 +121,8 @@ export function initBulkEdit() {
121121 $('#bulkEditButton').on('click', onEditButtonClick);
122122 $('#bulkSelectAllButton').on('click', onSelectAllButtonClick);
123123 $('#bulkDeleteButton').on('click', onDeleteButtonClick);
124+
125+ const characterContextMenu = new CharacterContextMenu(characterGroupOverlay);
126+ eventSource.on(event_types.CHARACTER_PAGE_LOADED, characterGroupOverlay.onPageLoad);
127+ console.debug('Character context menu initialized', characterContextMenu);
124128}
public/scripts/events.js+91 -0
@@ -0,0 +1,91 @@
1+import { EventEmitter } from '../lib/eventemitter.js';
2+
3+export const event_types = {
4+ APP_READY: 'app_ready',
5+ EXTRAS_CONNECTED: 'extras_connected',
6+ MESSAGE_SWIPED: 'message_swiped',
7+ MESSAGE_SENT: 'message_sent',
8+ MESSAGE_RECEIVED: 'message_received',
9+ MESSAGE_EDITED: 'message_edited',
10+ MESSAGE_DELETED: 'message_deleted',
11+ MESSAGE_UPDATED: 'message_updated',
12+ MESSAGE_FILE_EMBEDDED: 'message_file_embedded',
13+ MESSAGE_REASONING_EDITED: 'message_reasoning_edited',
14+ MESSAGE_REASONING_DELETED: 'message_reasoning_deleted',
15+ MORE_MESSAGES_LOADED: 'more_messages_loaded',
16+ IMPERSONATE_READY: 'impersonate_ready',
17+ CHAT_CHANGED: 'chat_id_changed',
18+ GENERATION_AFTER_COMMANDS: 'GENERATION_AFTER_COMMANDS',
19+ GENERATION_STARTED: 'generation_started',
20+ GENERATION_STOPPED: 'generation_stopped',
21+ GENERATION_ENDED: 'generation_ended',
22+ SD_PROMPT_PROCESSING: 'sd_prompt_processing',
23+ EXTENSIONS_FIRST_LOAD: 'extensions_first_load',
24+ EXTENSION_SETTINGS_LOADED: 'extension_settings_loaded',
25+ SETTINGS_LOADED: 'settings_loaded',
26+ SETTINGS_UPDATED: 'settings_updated',
27+ GROUP_UPDATED: 'group_updated',
28+ MOVABLE_PANELS_RESET: 'movable_panels_reset',
29+ SETTINGS_LOADED_BEFORE: 'settings_loaded_before',
30+ SETTINGS_LOADED_AFTER: 'settings_loaded_after',
31+ CHATCOMPLETION_SOURCE_CHANGED: 'chatcompletion_source_changed',
32+ CHATCOMPLETION_MODEL_CHANGED: 'chatcompletion_model_changed',
33+ OAI_PRESET_CHANGED_BEFORE: 'oai_preset_changed_before',
34+ OAI_PRESET_CHANGED_AFTER: 'oai_preset_changed_after',
35+ OAI_PRESET_EXPORT_READY: 'oai_preset_export_ready',
36+ OAI_PRESET_IMPORT_READY: 'oai_preset_import_ready',
37+ WORLDINFO_SETTINGS_UPDATED: 'worldinfo_settings_updated',
38+ WORLDINFO_UPDATED: 'worldinfo_updated',
39+ CHARACTER_EDITED: 'character_edited',
40+ CHARACTER_PAGE_LOADED: 'character_page_loaded',
41+ CHARACTER_GROUP_OVERLAY_STATE_CHANGE_BEFORE: 'character_group_overlay_state_change_before',
42+ CHARACTER_GROUP_OVERLAY_STATE_CHANGE_AFTER: 'character_group_overlay_state_change_after',
43+ USER_MESSAGE_RENDERED: 'user_message_rendered',
44+ CHARACTER_MESSAGE_RENDERED: 'character_message_rendered',
45+ FORCE_SET_BACKGROUND: 'force_set_background',
46+ CHAT_DELETED: 'chat_deleted',
47+ CHAT_CREATED: 'chat_created',
48+ GROUP_CHAT_DELETED: 'group_chat_deleted',
49+ GROUP_CHAT_CREATED: 'group_chat_created',
50+ GENERATE_BEFORE_COMBINE_PROMPTS: 'generate_before_combine_prompts',
51+ GENERATE_AFTER_COMBINE_PROMPTS: 'generate_after_combine_prompts',
52+ GENERATE_AFTER_DATA: 'generate_after_data',
53+ GROUP_MEMBER_DRAFTED: 'group_member_drafted',
54+ GROUP_WRAPPER_STARTED: 'group_wrapper_started',
55+ GROUP_WRAPPER_FINISHED: 'group_wrapper_finished',
56+ WORLD_INFO_ACTIVATED: 'world_info_activated',
57+ TEXT_COMPLETION_SETTINGS_READY: 'text_completion_settings_ready',
58+ CHAT_COMPLETION_SETTINGS_READY: 'chat_completion_settings_ready',
59+ CHAT_COMPLETION_PROMPT_READY: 'chat_completion_prompt_ready',
60+ CHARACTER_FIRST_MESSAGE_SELECTED: 'character_first_message_selected',
61+ // TODO: Naming convention is inconsistent with other events
62+ CHARACTER_DELETED: 'characterDeleted',
63+ CHARACTER_DUPLICATED: 'character_duplicated',
64+ CHARACTER_RENAMED: 'character_renamed',
65+ CHARACTER_RENAMED_IN_PAST_CHAT: 'character_renamed_in_past_chat',
66+ /** @deprecated The event is aliased to STREAM_TOKEN_RECEIVED. */
67+ SMOOTH_STREAM_TOKEN_RECEIVED: 'stream_token_received',
68+ STREAM_TOKEN_RECEIVED: 'stream_token_received',
69+ STREAM_REASONING_DONE: 'stream_reasoning_done',
70+ FILE_ATTACHMENT_DELETED: 'file_attachment_deleted',
71+ WORLDINFO_FORCE_ACTIVATE: 'worldinfo_force_activate',
72+ OPEN_CHARACTER_LIBRARY: 'open_character_library',
73+ ONLINE_STATUS_CHANGED: 'online_status_changed',
74+ IMAGE_SWIPED: 'image_swiped',
75+ CONNECTION_PROFILE_LOADED: 'connection_profile_loaded',
76+ CONNECTION_PROFILE_CREATED: 'connection_profile_created',
77+ CONNECTION_PROFILE_DELETED: 'connection_profile_deleted',
78+ CONNECTION_PROFILE_UPDATED: 'connection_profile_updated',
79+ TOOL_CALLS_PERFORMED: 'tool_calls_performed',
80+ TOOL_CALLS_RENDERED: 'tool_calls_rendered',
81+ CHARACTER_MANAGEMENT_DROPDOWN: 'charManagementDropdown',
82+ SECRET_WRITTEN: 'secret_written',
83+ SECRET_DELETED: 'secret_deleted',
84+ SECRET_ROTATED: 'secret_rotated',
85+ SECRET_EDITED: 'secret_edited',
86+ PRESET_CHANGED: 'preset_changed',
87+ PRESET_DELETED: 'preset_deleted',
88+ MAIN_API_CHANGED: 'main_api_changed',
89+};
90+
91+export const eventSource = new EventEmitter([event_types.APP_READY]);
public/scripts/kai-settings.js+4 -1
@@ -10,6 +10,8 @@ import {
1010 abortStatusCheck,
1111 startStatusLoading,
1212 setGenerationParamsFromPreset,
13+ eventSource,
14+ event_types,
1315} from '../script.js';
1416import { t } from './i18n.js';
1517import { autoSelectInstructPreset } from './instruct-mode.js';
@@ -516,7 +518,7 @@ export function initKoboldSettings() {
516518 saveSettingsDebounced();
517519 });
518520
519521 $('#settings_preset').on('change', async function () {
520522 if ($('#settings_preset').find(':selected').val() != 'gui') {
521523 kai_settings.preset_settings = $('#settings_preset').find(':selected').text();
522524 const preset = koboldai_settings[koboldai_setting_names[kai_settings.preset_settings]];
@@ -538,5 +540,6 @@ export function initKoboldSettings() {
538540 .sortable('disable');
539541 }
540542 saveSettingsDebounced();
543+ await eventSource.emit(event_types.PRESET_CHANGED, { apiId: 'kobold', name: kai_settings.preset_settings });
541544 });
542545}
public/scripts/nai-settings.js+4 -1
@@ -1,5 +1,7 @@
11import {
22 abortStatusCheck,
3+ event_types,
4+ eventSource,
35 getRequestHeaders,
46 getStoppingStrings,
57 resultCheckStatus,
@@ -890,11 +892,12 @@ export function initNovelAISettings() {
890892 await getStatusNovel();
891893 });
892894
893895 $('#settings_preset_novel').on('change', async function () {
894896 nai_settings.preset_settings_novel = $('#settings_preset_novel').find(':selected').text();
895897 const preset = novelai_settings[novelai_setting_names[nai_settings.preset_settings_novel]];
896898 loadNovelPreset(preset);
897899 saveSettingsDebounced();
900+ await eventSource.emit(event_types.PRESET_CHANGED, { apiId: 'novel', name: nai_settings.preset_settings_novel });
898901 });
899902
900903 $('#streaming_novel').on('input', function () {
public/scripts/openai.js+4 -2
@@ -4413,6 +4413,7 @@ async function onDeletePresetClick() {
44134413 toastr.warning(t`Preset was not deleted from server`);
44144414 } else {
44154415 toastr.success(t`Preset deleted`);
4416+ await eventSource.emit(event_types.PRESET_DELETED, { apiId: 'openai', name: nameToDelete });
44164417 }
44174418
44184419 saveSettingsDebounced();
@@ -4469,7 +4470,7 @@ function onSettingsPresetChange() {
44694470 settings: oai_settings,
44704471 savePreset: saveOpenAIPreset,
44714472 presetNameBefore: presetNameBefore,
44724473 }).finally(rasync () => {
44734474 if (oai_settings.bind_preset_to_connection) {
44744475 $('.model_custom_select').empty();
44754476 }
@@ -4504,7 +4505,8 @@ function onSettingsPresetChange() {
45044505 $('#openai_logit_bias_preset').trigger('change');
45054506
45064507 saveSettingsDebounced();
45074508 await eventSource.emit(event_types.OAI_PRESET_CHANGED_AFTER);
4509+ await eventSource.emit(event_types.PRESET_CHANGED, { apiId: 'openai', name: presetName });
45084510 });
45094511}
45104512
public/scripts/preset-manager.js+5 -0
@@ -1035,6 +1035,9 @@ export async function initPresetManager() {
10351035
10361036 await presetManager.renamePreset(newName);
10371037
1038+ await eventSource.emit(event_types.PRESET_DELETED, { apiId: apiId, name: oldName });
1039+ await eventSource.emit(event_types.PRESET_CHANGED, { apiId: apiId, name: newName });
1040+
10381041 if (apiId === 'openai') {
10391042 // This is a horrible mess, but prevents the renamed preset from being corrupted.
10401043 $('#update_oai_preset').trigger('click');
@@ -1107,6 +1110,7 @@ export async function initPresetManager() {
11071110 return;
11081111 }
11091112
1113+ const name = presetManager.getSelectedPresetName();
11101114 const result = await presetManager.deletePreset();
11111115
11121116 if (result) {
@@ -1118,6 +1122,7 @@ export async function initPresetManager() {
11181122 }
11191123
11201124 saveSettingsDebounced();
1125+ await eventSource.emit(event_types.PRESET_DELETED, { apiId: apiId, name: name });
11211126 });
11221127
11231128 $(document).on('click', '[data-preset-manager-restore]', async function () {
public/scripts/textgen-settings.js+3 -2
@@ -906,9 +906,10 @@ export function initTextGenSettings() {
906906 saveSettingsDebounced();
907907 });
908908
909909 $('#settings_preset_textgenerationwebui').on('change', async function () {
910910 const presetName = $(this).val();
911911 await selectPreset(presetName);
912+ await eventSource.emit(event_types.PRESET_CHANGED, { apiId: 'textgenerationwebui', name: presetName });
912913 });
913914
914915 $('#samplerResetButton').off('click').on('click', function () {