diff --git a/public/index.html b/public/index.html
index 1d3f8d75c..3ad57900d 100644
--- a/public/index.html
+++ b/public/index.html
@@ -6383,6 +6383,9 @@
+++
+
+
+
diff --git a/public/script.js b/public/script.js
index 88303011f..7a2f8a988 100644
--- a/public/script.js
+++ b/public/script.js
@@ -282,7 +282,7 @@ import { deriveTemplatesFromChatTemplate } from './scripts/chat-templates.js';
import { getContext } from './scripts/st-context.js';
import { extractReasoningFromData, initReasoning, parseReasoningInSwipes, PromptReasoning, ReasoningHandler, removeReasoningFromString, updateReasoningUI } from './scripts/reasoning.js';
import { accountStorage } from './scripts/util/AccountStorage.js';
-import { initWelcomeScreen, openPermanentAssistantChat, openPermanentAssistantCard } from './scripts/welcome-screen.js';
+import { initWelcomeScreen, openPermanentAssistantChat, openPermanentAssistantCard, getPermanentAssistantAvatar } from './scripts/welcome-screen.js';
// API OBJECT FOR EXTERNAL WIRING
globalThis.SillyTavern = {
@@ -1473,6 +1473,11 @@ function getCharacterBlock(item, id) {
template.toggleClass('is_fav', item.fav || item.fav == 'true');
template.find('.ch_fav').val(item.fav);
+ const isAssistant = item.avatar === getPermanentAssistantAvatar();
+ if (!isAssistant) {
+ template.find('.ch_assistant').remove();
+ }
+
const description = item.data?.creator_notes || '';
if (description) {
template.find('.ch_description').text(description);
diff --git a/public/scripts/welcome-screen.js b/public/scripts/welcome-screen.js
index 20bbe701d..5ea15aaac 100644
--- a/public/scripts/welcome-screen.js
+++ b/public/scripts/welcome-screen.js
@@ -19,9 +19,26 @@ import {
import { is_group_generating } from './group-chats.js';
import { t } from './i18n.js';
import { renderTemplateAsync } from './templates.js';
+import { accountStorage } from './util/AccountStorage.js';
import { timestampToMoment } from './utils.js';
-const permanentAssistantAvatar = 'default_Assistant.png';
+const assistantAvatarKey = 'assistant';
+const defaultAssistantAvatar = 'default_Assistant.png';
+
+export function getPermanentAssistantAvatar() {
+ const assistantAvatar = accountStorage.getItem(assistantAvatarKey);
+ if (assistantAvatar === null) {
+ return defaultAssistantAvatar;
+ }
+
+ const character = characters.find(x => x.avatar === assistantAvatar);
+ if (character === undefined) {
+ accountStorage.removeItem(assistantAvatarKey);
+ return defaultAssistantAvatar;
+ }
+
+ return assistantAvatar;
+}
export async function openWelcomeScreen() {
const currentChatId = getCurrentChatId();
@@ -121,35 +138,32 @@ async function getRecentChats() {
/** @type {RecentChat[]} */
const data = await response.json();
- data.sort((a, b) => b.last_mes - a.last_mes).forEach((chat, index) => {
- const character = characters.find(x => x.avatar === chat.avatar);
- if (!character) {
- console.warn(`Character not found for chat: ${chat.file_name}`);
- data.splice(index, 1);
- return;
- }
-
- const chatTimestamp = timestampToMoment(chat.last_mes);
- chat.char_name = character.name;
- chat.date_short = chatTimestamp.format('l');
- chat.date_long = chatTimestamp.format('LL LT');
- chat.chat_name = chat.file_name.replace('.jsonl', '');
- chat.char_thumbnail = getThumbnailUrl('avatar', character.avatar);
- });
+ data.sort((a, b) => b.last_mes - a.last_mes)
+ .map(chat => ({ chat, character: characters.find(x => x.avatar === chat.avatar) }))
+ .filter(t => t.character)
+ .forEach(({ chat, character }) => {
+ const chatTimestamp = timestampToMoment(chat.last_mes);
+ chat.char_name = character.name;
+ chat.date_short = chatTimestamp.format('l');
+ chat.date_long = chatTimestamp.format('LL LT');
+ chat.chat_name = chat.file_name.replace('.jsonl', '');
+ chat.char_thumbnail = getThumbnailUrl('avatar', character.avatar);
+ });
return data;
}
export async function openPermanentAssistantChat({ tryCreate = true } = {}) {
- const characterId = characters.findIndex(x => x.avatar === permanentAssistantAvatar);
+ const avatar = getPermanentAssistantAvatar();
+ const characterId = characters.findIndex(x => x.avatar === avatar);
if (characterId === -1) {
if (!tryCreate) {
- console.error(`Character not found for avatar ID: ${permanentAssistantAvatar}. Cannot create.`);
+ console.error(`Character not found for avatar ID: ${avatar}. Cannot create.`);
return;
}
try {
- console.log(`Character not found for avatar ID: ${permanentAssistantAvatar}. Creating new assistant.`);
+ console.log(`Character not found for avatar ID: ${avatar}. Creating new assistant.`);
await createPermanentAssistant();
return openPermanentAssistantChat({ tryCreate: false });
}
@@ -177,7 +191,7 @@ async function createPermanentAssistant() {
const formData = new FormData();
formData.append('ch_name', neutralCharacterName);
- formData.append('file_name', permanentAssistantAvatar.replace('.png', ''));
+ formData.append('file_name', defaultAssistantAvatar.replace('.png', ''));
const headers = getRequestHeaders();
delete headers['Content-Type'];
@@ -197,7 +211,8 @@ async function createPermanentAssistant() {
}
export async function openPermanentAssistantCard() {
- const characterId = characters.findIndex(x => x.avatar === permanentAssistantAvatar);
+ const avatar = getPermanentAssistantAvatar();
+ const characterId = characters.findIndex(x => x.avatar === avatar);
if (characterId === -1) {
toastr.info(t`Assistant not found. Try sending a chat message.`);
return;