chore: final cleanup

This commit is contained in:
Subarashimo
2025-12-05 18:10:21 +01:00
parent 38328de1bf
commit 7e47dbfd7c
29 changed files with 338 additions and 2168 deletions
+26 -150
View File
@@ -1,36 +1,11 @@
import { getContext, renderExtensionTemplateAsync, extension_settings as st_extension_settings } from '../../../extensions.js';
import { eventSource, event_types, substituteParams, chat, generateRaw, saveSettingsDebounced, chat_metadata, saveChatDebounced, user_avatar, getThumbnailUrl, characters, this_chid, extension_prompt_types, extension_prompt_roles, setExtensionPrompt, reloadCurrentChat, Generate, getRequestHeaders } from '../../../../script.js';
import { selected_group, getGroupMembers } from '../../../group-chats.js';
import { power_user } from '../../../power-user.js';
import { event_types, saveSettingsDebounced, getRequestHeaders } from '../../../../script.js';
// Core modules
import { extensionName, extensionFolderPath } from './src/core/config.js';
import { i18n } from './src/core/i18n.js';
import {
extensionSettings,
lastGeneratedData,
committedTrackerData,
lastActionWasSwipe,
isGenerating,
isPlotProgression,
pendingDiceRoll,
FALLBACK_AVATAR_DATA_URI,
$panelContainer,
$userStatsContainer,
$infoBoxContainer,
$thoughtsContainer,
$inventoryContainer,
$questsContainer,
setExtensionSettings,
updateExtensionSettings,
setLastGeneratedData,
updateLastGeneratedData,
setCommittedTrackerData,
updateCommittedTrackerData,
setLastActionWasSwipe,
setIsGenerating,
setIsPlotProgression,
setPendingDiceRoll,
setPanelContainer,
setUserStatsContainer,
setInfoBoxContainer,
@@ -39,28 +14,19 @@ import {
setInventoryContainer,
setQuestsContainer
} from './src/core/state.js';
import { loadSettings, saveSettings, saveChatData, loadChatData, updateMessageSwipeData } from './src/core/persistence.js';
import { loadSettings, saveSettings, loadChatData } from './src/core/persistence.js';
import { registerAllEvents } from './src/core/events.js';
// Generation & Parsing modules
import {
generateContextualSummary,
generateRPGPromptText,
generateSeparateUpdatePrompt
} from './src/systems/generation/promptBuilder.js';
import { parseResponse, parseUserStats, parseSkills } from './src/systems/generation/parser.js';
import { updateRPGData } from './src/systems/generation/apiClient.js';
import { onGenerationStarted } from './src/systems/generation/injector.js';
// Rendering modules
import { getSafeThumbnailUrl } from './src/utils/avatars.js';
import { renderUserStats } from './src/systems/rendering/userStats.js';
import { renderInfoBox, updateInfoBoxField } from './src/systems/rendering/infoBox.js';
import { renderInfoBox } from './src/systems/rendering/infoBox.js';
import {
renderThoughts,
updateCharacterField,
updateChatThoughts,
createThoughtPanel
updateChatThoughts
} from './src/systems/rendering/thoughts.js';
import { renderInventory } from './src/systems/rendering/inventory.js';
import { renderQuests } from './src/systems/rendering/quests.js';
@@ -75,12 +41,9 @@ import {
applyCustomTheme,
toggleCustomColors,
toggleAnimations,
updateSettingsPopupTheme,
applyCustomThemeToSettingsPopup
updateSettingsPopupTheme
} from './src/systems/ui/theme.js';
import {
DiceModal,
SettingsModal,
setupDiceRoller,
setupSettingsPopup,
updateDiceDisplay,
@@ -92,7 +55,6 @@ import {
} from './src/systems/ui/trackerEditor.js';
import {
togglePlotButtons,
updateCollapseToggleIcon,
setupCollapseToggle,
updatePanelVisibility,
updateSectionVisibility,
@@ -101,9 +63,6 @@ import {
} from './src/systems/ui/layout.js';
import {
setupMobileToggle,
constrainFabToViewport,
setupMobileTabs,
removeMobileTabs,
setupMobileKeyboardHandling,
setupContentEditableScrolling,
updateMobileTabLabels
@@ -123,7 +82,6 @@ import { DEFAULT_HTML_PROMPT, DEFAULT_JSON_TRACKER_PROMPT, DEFAULT_MESSAGE_INTER
// Integration modules
import {
commitTrackerData,
onMessageSent,
onMessageReceived,
onCharacterChanged,
@@ -132,27 +90,6 @@ import {
clearExtensionPrompts
} from './src/systems/integration/sillytavern.js';
// Old state variable declarations removed - now imported from core modules
// (extensionSettings, lastGeneratedData, committedTrackerData, etc. are now in src/core/state.js)
// Utility functions removed - now imported from src/utils/avatars.js
// (getSafeThumbnailUrl)
// Persistence functions removed - now imported from src/core/persistence.js
// (loadSettings, saveSettings, saveChatData, loadChatData, updateMessageSwipeData)
// Theme functions removed - now imported from src/systems/ui/theme.js
// (applyTheme, applyCustomTheme, toggleCustomColors, toggleAnimations,
// updateSettingsPopupTheme, applyCustomThemeToSettingsPopup)
// Layout functions removed - now imported from src/systems/ui/layout.js
// (togglePlotButtons, updateCollapseToggleIcon, setupCollapseToggle,
// updatePanelVisibility, updateSectionVisibility, applyPanelPosition)
// Note: closeMobilePanelWithAnimation is only used internally by mobile.js
// Mobile UI functions removed - now imported from src/systems/ui/mobile.js
// (setupMobileToggle, constrainFabToViewport, setupMobileTabs, removeMobileTabs,
// setupMobileKeyboardHandling, setupContentEditableScrolling)
/**
* Updates UI elements that are dynamically generated and not covered by data-i18n-key.
@@ -351,20 +288,17 @@ async function initUI() {
setInventoryContainer($('#rpg-inventory'));
setQuestsContainer($('#rpg-quests'));
// Re-apply translations to the entire body to catch all new elements from the template
i18n.applyTranslations(document.body);
i18n.applyTranslations(document.body);
// Set up event listeners (enable/disable is handled in Extensions tab)
$('#rpg-toggle-auto-update').on('change', function() {
$('#rpg-toggle-auto-update').on('change', function() {
extensionSettings.autoUpdate = $(this).prop('checked');
saveSettings();
});
$('#rpg-position-select').on('change', function() {
$('#rpg-position-select').on('change', function() {
extensionSettings.panelPosition = String($(this).val());
saveSettings();
applyPanelPosition();
// Recreate thought bubbles to update their position
updateChatThoughts();
});
@@ -417,11 +351,10 @@ async function initUI() {
updateSectionVisibility();
});
$('#rpg-toggle-inventory').on('change', function() {
$('#rpg-toggle-inventory').on('change', function() {
extensionSettings.showInventory = $(this).prop('checked');
saveSettings();
updateSectionVisibility();
// Re-setup desktop tabs to show/hide inventory tab
if (window.innerWidth > 1000) {
removeDesktopTabs();
setupDesktopTabs();
@@ -431,15 +364,14 @@ async function initUI() {
$('#rpg-toggle-simplified-inventory').on('change', function() {
extensionSettings.useSimplifiedInventory = $(this).prop('checked');
saveSettings();
renderInventory(); // Re-render inventory with new mode
renderInventory();
});
$('#rpg-toggle-quests').on('change', function() {
extensionSettings.showQuests = $(this).prop('checked');
saveSettings();
updateSectionVisibility();
renderQuests(); // Re-render quests
// Re-setup desktop tabs to show/hide quests tab
renderQuests();
if (window.innerWidth > 1000) {
removeDesktopTabs();
setupDesktopTabs();
@@ -450,8 +382,7 @@ async function initUI() {
extensionSettings.showSkills = $(this).prop('checked');
saveSettings();
updateSectionVisibility();
renderSkills(); // Render skills section
// Re-setup desktop tabs to show/hide skills tab
renderSkills();
if (window.innerWidth > 1000) {
removeDesktopTabs();
setupDesktopTabs();
@@ -461,7 +392,6 @@ async function initUI() {
$('#rpg-toggle-item-skill-links').on('change', function() {
extensionSettings.enableItemSkillLinks = $(this).prop('checked');
saveSettings();
// Re-render skills to show/hide link badges
renderSkills();
});
@@ -472,7 +402,6 @@ async function initUI() {
$('#rpg-toggle-thoughts-in-chat').on('change', function() {
extensionSettings.showThoughtsInChat = $(this).prop('checked');
// console.log('[RPG Companion] Toggle showThoughtsInChat changed to:', extensionSettings.showThoughtsInChat);
saveSettings();
updateChatThoughts();
});
@@ -480,17 +409,14 @@ async function initUI() {
$('#rpg-toggle-always-show-bubble').on('change', function() {
extensionSettings.alwaysShowThoughtBubble = $(this).prop('checked');
saveSettings();
// Force immediate save to ensure setting is persisted before any other code runs
const context = getContext();
const extension_settings = context.extension_settings || context.extensionSettings;
extension_settings[extensionName] = extensionSettings;
// Re-render thoughts to apply the setting
updateChatThoughts();
});
$('#rpg-toggle-html-prompt').on('change', function() {
extensionSettings.enableHtmlPrompt = $(this).prop('checked');
// console.log('[RPG Companion] Toggle enableHtmlPrompt changed to:', extensionSettings.enableHtmlPrompt);
saveSettings();
});
@@ -544,7 +470,6 @@ async function initUI() {
$('#rpg-toggle-plot-buttons').on('change', function() {
extensionSettings.enablePlotButtons = $(this).prop('checked');
// console.log('[RPG Companion] Toggle enablePlotButtons changed to:', extensionSettings.enablePlotButtons);
saveSettings();
togglePlotButtons();
});
@@ -557,7 +482,6 @@ async function initUI() {
$('#rpg-manual-update').on('click', async function() {
if (!extensionSettings.enabled) {
// console.log('[RPG Companion] Extension is disabled. Please enable it in the Extensions tab.');
return;
}
await updateRPGData(renderUserStats, renderInfoBox, renderThoughts, renderInventory);
@@ -566,23 +490,22 @@ async function initUI() {
$('#rpg-stat-bar-color-low').on('change', function() {
extensionSettings.statBarColorLow = String($(this).val());
saveSettings();
renderUserStats(); // Re-render with new colors
renderUserStats();
});
$('#rpg-stat-bar-color-high').on('change', function() {
extensionSettings.statBarColorHigh = String($(this).val());
saveSettings();
renderUserStats(); // Re-render with new colors
renderUserStats();
});
// Theme selection
$('#rpg-theme-select').on('change', function() {
extensionSettings.theme = String($(this).val());
saveSettings();
applyTheme();
toggleCustomColors();
updateSettingsPopupTheme(getSettingsModal()); // Update popup theme instantly
updateChatThoughts(); // Recreate thought bubbles with new theme
updateSettingsPopupTheme(getSettingsModal());
updateChatThoughts();
});
// Custom color pickers
@@ -591,8 +514,8 @@ async function initUI() {
saveSettings();
if (extensionSettings.theme === 'custom') {
applyCustomTheme();
updateSettingsPopupTheme(getSettingsModal()); // Update popup theme instantly
updateChatThoughts(); // Update thought bubbles
updateSettingsPopupTheme(getSettingsModal());
updateChatThoughts();
}
});
@@ -601,8 +524,8 @@ async function initUI() {
saveSettings();
if (extensionSettings.theme === 'custom') {
applyCustomTheme();
updateSettingsPopupTheme(getSettingsModal()); // Update popup theme instantly
updateChatThoughts(); // Update thought bubbles
updateSettingsPopupTheme(getSettingsModal());
updateChatThoughts();
}
});
@@ -611,8 +534,8 @@ async function initUI() {
saveSettings();
if (extensionSettings.theme === 'custom') {
applyCustomTheme();
updateSettingsPopupTheme(getSettingsModal()); // Update popup theme instantly
updateChatThoughts(); // Update thought bubbles
updateSettingsPopupTheme(getSettingsModal());
updateChatThoughts();
}
});
@@ -621,12 +544,11 @@ async function initUI() {
saveSettings();
if (extensionSettings.theme === 'custom') {
applyCustomTheme();
updateSettingsPopupTheme(getSettingsModal()); // Update popup theme instantly
updateChatThoughts(); // Update thought bubbles
updateSettingsPopupTheme(getSettingsModal());
updateChatThoughts();
}
});
// Initialize UI state (enable/disable is in Extensions tab)
$('#rpg-toggle-auto-update').prop('checked', extensionSettings.autoUpdate);
$('#rpg-position-select').val(extensionSettings.panelPosition);
$('#rpg-update-depth').val(extensionSettings.updateDepth);
@@ -647,18 +569,11 @@ async function initUI() {
$('#rpg-toggle-message-interception').prop('checked', extensionSettings.enableMessageInterception);
updateInterceptionToggleVisibility();
// Set default HTML prompt as actual text if no custom prompt exists
$('#rpg-custom-html-prompt').val(extensionSettings.customHtmlPrompt || DEFAULT_HTML_PROMPT);
// Set default tracker prompt as actual text if no custom prompt exists
$('#rpg-custom-tracker-prompt').val(extensionSettings.customTrackerPrompt || DEFAULT_JSON_TRACKER_PROMPT);
// Set default message interception prompt as actual text if no custom prompt exists
$('#rpg-custom-message-interception-prompt').val(
extensionSettings.customMessageInterceptionPrompt || DEFAULT_MESSAGE_INTERCEPTION_PROMPT
);
// Message interception depth
$('#rpg-message-interception-depth').val(
extensionSettings.messageInterceptionContextDepth || extensionSettings.updateDepth || 4
);
@@ -683,18 +598,14 @@ async function initUI() {
toggleCustomColors();
toggleAnimations();
// Setup mobile toggle button
setupMobileToggle();
// Setup desktop tabs (only on desktop viewport)
if (window.innerWidth > 1000) {
setupDesktopTabs();
}
// Setup collapse/expand toggle button
setupCollapseToggle();
// Render initial data if available
renderUserStats();
renderInfoBox();
renderThoughts();
@@ -712,11 +623,7 @@ async function initUI() {
setupMobileKeyboardHandling();
setupContentEditableScrolling();
initInventoryEventListeners();
// Setup Memory Recollection button in World Info
setupMemoryRecollectionButton();
// Initialize Lorebook Limiter
initLorebookLimiter();
}
@@ -724,13 +631,6 @@ async function initUI() {
// Rendering functions removed - now imported from src/systems/rendering/*
// (renderUserStats, renderInfoBox, renderThoughts, updateInfoBoxField,
// updateCharacterField, updateChatThoughts, createThoughtPanel)
// Event handlers removed - now imported from src/systems/integration/sillytavern.js
// (commitTrackerData, onMessageSent, onMessageReceived, onCharacterChanged,
// onMessageSwiped, updatePersonaAvatar, clearExtensionPrompts)
/**
* Ensures the "RPG Companion Trackers" preset exists in the user's OpenAI Settings.
@@ -803,79 +703,57 @@ jQuery(async () => {
try {
console.log('[RPG Companion] Starting initialization...');
// Load settings with validation
try {
loadSettings();
} catch (error) {
console.error('[RPG Companion] Settings load failed, continuing with defaults:', error);
}
// Initialize i18n early for the settings panel
await i18n.init();
// Set up a central listener for language changes to update dynamic UI parts
i18n.addEventListener('languageChanged', updateDynamicLabels);
// Add extension settings to Extensions tab
try {
await addExtensionSettings();
} catch (error) {
console.error('[RPG Companion] Failed to add extension settings tab:', error);
// Don't throw - extension can still work without settings tab
}
// Initialize UI
try {
await initUI();
} catch (error) {
console.error('[RPG Companion] UI initialization failed:', error);
throw error; // This is critical - can't continue without UI
throw error;
}
// Load chat-specific data for current chat
try {
loadChatData();
} catch (error) {
console.error('[RPG Companion] Chat data load failed, using defaults:', error);
}
// Import the HTML cleaning regex if needed
try {
await ensureHtmlCleaningRegex(st_extension_settings, saveSettingsDebounced);
} catch (error) {
console.error('[RPG Companion] HTML regex import failed:', error);
// Non-critical - continue without it
}
// Import the RPG Companion Trackers preset if needed
try {
await ensureTrackerPresetExists();
} catch (error) {
console.error('[RPG Companion] Preset import failed:', error);
// Non-critical - users can manually import if needed
}
// Detect conflicting regex scripts from old manual formatters
try {
const conflicts = detectConflictingRegexScripts(st_extension_settings);
if (conflicts.length > 0) {
console.log('[RPG Companion] ⚠️ Detected old manual formatting regex scripts that may conflict:');
conflicts.forEach(name => console.log(` - ${name}`));
console.log('[RPG Companion] Consider disabling these regexes as the extension now handles formatting automatically.');
// Show user-friendly warning (non-blocking)
// toastr.warning(
// `Found ${conflicts.length} old RPG formatting regex script(s). These may conflict with the extension. Check console for details.`,
// 'RPG Companion Warning',
// { timeOut: 8000 }
// );
}
} catch (error) {
console.error('[RPG Companion] Conflict detection failed:', error);
// Non-critical - continue anyway
}
// Register all event listeners
try {
registerAllEvents({
[event_types.MESSAGE_SENT]: onMessageSent,
@@ -888,15 +766,13 @@ jQuery(async () => {
});
} catch (error) {
console.error('[RPG Companion] Event registration failed:', error);
throw error; // This is critical - can't continue without events
throw error;
}
console.log('[RPG Companion] ✅ Extension loaded successfully');
} catch (error) {
console.error('[RPG Companion] ❌ Critical initialization failure:', error);
console.error('[RPG Companion] Error details:', error.message, error.stack);
// Show user-friendly error message
toastr.error(
'RPG Companion failed to initialize. Check console for details. Please try refreshing the page or resetting extension settings.',
'RPG Companion Error',