Set any char as assistant. Rework welcome prompt
| @@ -5362,6 +5362,9 @@ | |||
| 5362 | <option id="import_tags" data-i18n="Import Tags"> | 5362 | <option id="import_tags" data-i18n="Import Tags"> |
| 5363 | Import Tags | 5363 | Import Tags |
| 5364 | </option> | 5364 | </option> |
| 5365 | <option id="set_as_assistant" data-i18n="Set / Unset as Welcome Page Assistant"> | ||
| 5366 | Set / Unset as Welcome Page Assistant | ||
| 5367 | </option> | ||
| 5365 | <!--<option id="dupe_button"> | 5368 | <!--<option id="dupe_button"> |
| 5366 | Duplicate | 5369 | Duplicate |
| 5367 | </option> | 5370 | </option> |
| @@ -530,6 +530,7 @@ export const event_types = { | |||
| 530 | CONNECTION_PROFILE_UPDATED: 'connection_profile_updated', | 530 | CONNECTION_PROFILE_UPDATED: 'connection_profile_updated', |
| 531 | TOOL_CALLS_PERFORMED: 'tool_calls_performed', | 531 | TOOL_CALLS_PERFORMED: 'tool_calls_performed', |
| 532 | TOOL_CALLS_RENDERED: 'tool_calls_rendered', | 532 | TOOL_CALLS_RENDERED: 'tool_calls_rendered', |
| 533 | CHARACTER_MANAGEMENT_DROPDOWN: 'charManagementDropdown', | ||
| 533 | }; | 534 | }; |
| 534 | 535 | ||
| 535 | export const eventSource = new EventEmitter([event_types.APP_READY]); | 536 | export const eventSource = new EventEmitter([event_types.APP_READY]); |
| @@ -12141,7 +12142,7 @@ jQuery(async function () { | |||
| 12141 | ); | 12142 | ); |
| 12142 | break;*/ | 12143 | break;*/ |
| 12143 | default: | 12144 | default: |
| 12144 | await eventSource.emit('charManagementDropdown', target); | 12145 | await eventSource.emit(event_types.CHARACTER_MANAGEMENT_DROPDOWN, target); |
| 12145 | } | 12146 | } |
| 12146 | $('#char-management-dropdown').prop('selectedIndex', 0); | 12147 | $('#char-management-dropdown').prop('selectedIndex', 0); |
| 12147 | }); | 12148 | }); |
| @@ -710,7 +710,7 @@ async function listGalleryCommand(args) { | |||
| 710 | delete context.extensionSettings.gallery.folders[avatar]; | 710 | delete context.extensionSettings.gallery.folders[avatar]; |
| 711 | context.saveSettingsDebounced(); | 711 | context.saveSettingsDebounced(); |
| 712 | }); | 712 | }); |
| 713 | eventSource.on('charManagementDropdown', (selectedOptionId) => { | 713 | eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (selectedOptionId) => { |
| 714 | if (selectedOptionId === 'show_char_gallery') { | 714 | if (selectedOptionId === 'show_char_gallery') { |
| 715 | showCharGallery(); | 715 | showCharGallery(); |
| 716 | } | 716 | } |
| @@ -1970,7 +1970,7 @@ export async function initPersonas() { | |||
| 1970 | 1970 | ||
| 1971 | $('#char_connections_button').on('click', showCharConnections); | 1971 | $('#char_connections_button').on('click', showCharConnections); |
| 1972 | 1972 | ||
| 1973 | eventSource.on('charManagementDropdown', (target) => { | 1973 | eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) => { |
| 1974 | if (target === 'convert_to_persona') { | 1974 | if (target === 'convert_to_persona') { |
| 1975 | convertCharacterToPersona(); | 1975 | convertCharacterToPersona(); |
| 1976 | } | 1976 | } |
| @@ -1,7 +1,3 @@ | |||
| 1 | <strong data-i18n="If you're connected to an API, try asking me something!"> | ||
| 2 | If you're connected to an API, try asking me something! | ||
| 3 | </strong> | ||
| 4 | |||
| 5 | <div class="flex-container"> | 1 | <div class="flex-container"> |
| 6 | <button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button"> | 2 | <button class="menu_button menu_button_icon drawer-opener inline-flex" data-target="sys-settings-button"> |
| 7 | <i class="fa-solid fa-plug"></i> | 3 | <i class="fa-solid fa-plug"></i> |
| @@ -1,5 +1,7 @@ | |||
| 1 | import { | 1 | import { |
| 2 | addOneMessage, | ||
| 2 | characters, | 3 | characters, |
| 4 | chat, | ||
| 3 | displayVersion, | 5 | displayVersion, |
| 4 | doNewChat, | 6 | doNewChat, |
| 5 | event_types, | 7 | event_types, |
| @@ -12,9 +14,12 @@ import { | |||
| 12 | neutralCharacterName, | 14 | neutralCharacterName, |
| 13 | newAssistantChat, | 15 | newAssistantChat, |
| 14 | openCharacterChat, | 16 | openCharacterChat, |
| 17 | printCharactersDebounced, | ||
| 15 | selectCharacterById, | 18 | selectCharacterById, |
| 16 | sendSystemMessage, | 19 | sendSystemMessage, |
| 20 | system_avatar, | ||
| 17 | system_message_types, | 21 | system_message_types, |
| 22 | this_chid, | ||
| 18 | } from '../script.js'; | 23 | } from '../script.js'; |
| 19 | import { is_group_generating } from './group-chats.js'; | 24 | import { is_group_generating } from './group-chats.js'; |
| 20 | import { t } from './i18n.js'; | 25 | import { t } from './i18n.js'; |
| @@ -47,9 +52,29 @@ export async function openWelcomeScreen() { | |||
| 47 | } | 52 | } |
| 48 | 53 | ||
| 49 | await sendWelcomePanel(); | 54 | await sendWelcomePanel(); |
| 55 | sendAssistantMessage(); | ||
| 50 | sendSystemMessage(system_message_types.WELCOME_PROMPT); | 56 | sendSystemMessage(system_message_types.WELCOME_PROMPT); |
| 51 | } | 57 | } |
| 52 | 58 | ||
| 59 | function sendAssistantMessage() { | ||
| 60 | const currentAssistantAvatar = getPermanentAssistantAvatar(); | ||
| 61 | const character = characters.find(x => x.avatar === currentAssistantAvatar); | ||
| 62 | const name = character ? character.name : neutralCharacterName; | ||
| 63 | const avatar = character ? getThumbnailUrl('avatar', character.avatar) : system_avatar; | ||
| 64 | |||
| 65 | const message = { | ||
| 66 | name: name, | ||
| 67 | force_avatar: avatar, | ||
| 68 | mes: t`If you're connected to an API, try asking me something!`, | ||
| 69 | is_system: false, | ||
| 70 | is_user: false, | ||
| 71 | extra: {}, | ||
| 72 | }; | ||
| 73 | |||
| 74 | chat.push(message); | ||
| 75 | addOneMessage(message); | ||
| 76 | } | ||
| 77 | |||
| 53 | async function sendWelcomePanel() { | 78 | async function sendWelcomePanel() { |
| 54 | try { | 79 | try { |
| 55 | const chatElement = document.getElementById('chat'); | 80 | const chatElement = document.getElementById('chat'); |
| @@ -207,6 +232,15 @@ async function createPermanentAssistant() { | |||
| 207 | const formData = new FormData(); | 232 | const formData = new FormData(); |
| 208 | formData.append('ch_name', neutralCharacterName); | 233 | formData.append('ch_name', neutralCharacterName); |
| 209 | formData.append('file_name', defaultAssistantAvatar.replace('.png', '')); | 234 | formData.append('file_name', defaultAssistantAvatar.replace('.png', '')); |
| 235 | formData.append('creator_notes', t`Automatically created character. Feel free to edit.`); | ||
| 236 | |||
| 237 | try { | ||
| 238 | const avatarResponse = await fetch(system_avatar); | ||
| 239 | const avatarBlob = await avatarResponse.blob(); | ||
| 240 | formData.append('avatar', avatarBlob, defaultAssistantAvatar); | ||
| 241 | } catch (error) { | ||
| 242 | console.warn('Error fetching system avatar. Fallback image will be used.', error); | ||
| 243 | } | ||
| 210 | 244 | ||
| 211 | const headers = getRequestHeaders(); | 245 | const headers = getRequestHeaders(); |
| 212 | delete headers['Content-Type']; | 246 | delete headers['Content-Type']; |
| @@ -241,4 +275,40 @@ export function initWelcomeScreen() { | |||
| 241 | for (const event of events) { | 275 | for (const event of events) { |
| 242 | eventSource.makeFirst(event, openWelcomeScreen); | 276 | eventSource.makeFirst(event, openWelcomeScreen); |
| 243 | } | 277 | } |
| 278 | |||
| 279 | eventSource.on(event_types.CHARACTER_MANAGEMENT_DROPDOWN, (target) =>{ | ||
| 280 | if (target !== 'set_as_assistant') { | ||
| 281 | return; | ||
| 282 | } | ||
| 283 | if (this_chid === undefined) { | ||
| 284 | return; | ||
| 285 | } | ||
| 286 | /** @type {import('./char-data.js').v1CharData} */ | ||
| 287 | const character = characters[this_chid]; | ||
| 288 | if (!character) { | ||
| 289 | return; | ||
| 290 | } | ||
| 291 | |||
| 292 | const currentAssistantAvatar = getPermanentAssistantAvatar(); | ||
| 293 | if (currentAssistantAvatar === character.avatar) { | ||
| 294 | if (character.avatar === defaultAssistantAvatar) { | ||
| 295 | toastr.info(t`${character.name} is a system assistant. Choose another character.`); | ||
| 296 | return; | ||
| 297 | } | ||
| 298 | |||
| 299 | toastr.info(t`${character.name} is no longer your assistant.`); | ||
| 300 | accountStorage.removeItem(assistantAvatarKey); | ||
| 301 | return; | ||
| 302 | } | ||
| 303 | |||
| 304 | accountStorage.setItem(assistantAvatarKey, character.avatar); | ||
| 305 | printCharactersDebounced(); | ||
| 306 | toastr.success(t`Set ${character.name} as your assistant.`); | ||
| 307 | }); | ||
| 308 | |||
| 309 | eventSource.on(event_types.CHARACTER_RENAMED, (oldAvatar, newAvatar) => { | ||
| 310 | if (oldAvatar === getPermanentAssistantAvatar()) { | ||
| 311 | accountStorage.setItem(assistantAvatarKey, newAvatar); | ||
| 312 | } | ||
| 313 | }); | ||
| 244 | } | 314 | } |