import { showDetail } from './ui_detail.js'; import { showEditModal } from './ui_model_editor.js'; import { _openAdvancedModelSelector, setWidgetValuePath } from './ui_model_selector.js'; import { loadModels, applyModelToCanvas, stopMediaInContainer } from './ui_grid.js'; import { createDOM, renderSidebar, loadFolders } from './ui_sidebar.js'; import { closeWorkspace, hideAllPanels } from './ui_browser_navigation.js'; import { openScanWizard, triggerDirectModelScan } from './ui_scan_wizard.js'; import { openFolderManager } from './ui_folder_manager.js'; import { showHelp } from './ui_help.js'; import { loadGalleryImages, refreshGalleryImages, showGeneratedGallery, showGallerySelectMode, showGalleryViewer } from './ui_gallery.js'; import { showNotebooks, refreshNotebooks, saveCurrentNotebook, deleteCurrentNotebook } from './ui_notebooks.js'; import { renderNotebookEditor, fillNotebookGalleries } from './ui_notebook_editor.js'; import { sendNotebookToCanvas } from './notebook_canvas.js'; import { showRecipes, refreshRecipes } from './ui_recipe_catalog.js'; import { renderRecipeList, handleSaveRecipe } from './ui_recipes.js'; import { showMaterials, refreshMaterials, openSavedMaterial, openMaterialLibrary } from './ui_materials.js'; import { openPromptStudio } from './ui_prompt_composer.js'; import { openPromptTranslator } from './ui_prompt_translator.js'; import { closeUpdateGuide } from './ui_update_guide.js'; import { showImageWorkbench } from './ui_gallery_detail.js'; import { initDoctorPanel, diagnoseNode, renderGlobalDashboard, openLoraInsertionPicker, runGlobalDoctorScan } from './ui_doctor.js'; import { initAssistantPanel, renderAssistantModelCard, _loadAssistantHistory } from './ui_node_assistant.js'; import { _openGalleryReplacer } from './ui_node_model_picker.js'; import { renderAudioStudio, stopAudioStudioPlayback } from './ui_audio_studio.js'; import { renderAudioGallery, stopGalleryAudio } from './ui_audio_gallery.js'; import { getActiveDomain } from './ui_domain_switcher.js'; export class AnomalousBrowser { constructor() { this.modal = null; this.sidebar = null; this.grid = null; this.detailPanel = null; this.currentType = 'loras'; this.currentPathIdx = 0; this.currentSubfolder = '/'; this.foldersData = null; this.expandedFolders = new Set(['/', 'checkpoints', 'loras', 'unet', 'diffusion_models']); this.energySaving = localStorage.getItem('anomalous_energy_saving') === 'true'; this.cardThumbnailMode = localStorage.getItem('anomalous_card_thumbnail_mode') === 'original' ? 'original' : 'balanced'; this.entryMode = 'floating'; this.createDOM(); } show() { if (this._idleReleaseTimer) { clearTimeout(this._idleReleaseTimer); this._idleReleaseTimer = null; } this.setTriggerVisible(false); this.modal.classList.add('visible'); this.updateHeaderTabs?.(getActiveDomain()); if (getActiveDomain() === 'audio') { this.handleDomainChange('audio'); return; } if (!this.foldersData) { this.loadFolders(); } else { this.loadModels(); } } handleDomainChange(domain) { this.updateHeaderTabs?.(domain); if (domain === 'audio') { this.hideAllPanels(); if (this.sidebarActions) this.sidebarActions.style.display = 'none'; if (this.modelsBtn) this.setActiveHeaderTab?.(this.modelsBtn); if (this.audioStudioPanel) { this.audioStudioPanel.style.display = 'block'; renderAudioStudio(this.audioStudioPanel); } this.renderSidebar(); } else { if (this.sidebarActions) this.sidebarActions.style.display = 'flex'; if (this.modelsBtn) this.setActiveHeaderTab?.(this.modelsBtn); this.hideAllPanels(); this.grid.style.display = 'grid'; this.renderSidebar(); if (!this.foldersData) { this.loadFolders(); } else { this.loadModels(); } } } switchAudioTab(tabName, filter = null) { this.hideAllPanels(); if (tabName === 'gallery') { if (this.galleryBtn) this.setActiveHeaderTab?.(this.galleryBtn); if (this.audioGalleryPanel) { this.audioGalleryPanel.style.display = 'block'; renderAudioGallery(this.audioGalleryPanel); } } else { if (this.modelsBtn) this.setActiveHeaderTab?.(this.modelsBtn); if (this.audioStudioPanel) { this.audioStudioPanel.style.display = 'block'; renderAudioStudio(this.audioStudioPanel, filter); } } } close() { closeUpdateGuide(this); this.modal.classList.remove('visible'); this.setTriggerVisible(true); if (typeof stopAudioStudioPlayback === 'function') stopAudioStudioPlayback(); if (typeof stopGalleryAudio === 'function') stopGalleryAudio(); const canvas = document.getElementById('graph-canvas'); if (canvas instanceof HTMLElement) canvas.focus({ preventScroll: true }); if (this._modelLoadController) this._modelLoadController.abort(); if (this._modelMediaObserver) this._modelMediaObserver.disconnect(); this.modal.querySelectorAll('video, audio').forEach(media => media.pause()); this.stopMediaInContainer(this.grid); if (this._idleReleaseTimer) clearTimeout(this._idleReleaseTimer); this._idleReleaseTimer = setTimeout(() => { if (this.modal.classList.contains('visible')) return; this.stopMediaInContainer(this.grid); this.grid.replaceChildren(); this.models = []; }, 90000); } setTriggerVisible(visible) { const trigger = this.triggerButton || document.getElementById('anomalous-trigger-btn'); trigger?.classList.toggle('anomalous-trigger-hidden', !visible || this.entryMode !== 'floating'); } } AnomalousBrowser.prototype.initDoctorPanel = initDoctorPanel; AnomalousBrowser.prototype.diagnoseNode = diagnoseNode; AnomalousBrowser.prototype.renderGlobalDashboard = renderGlobalDashboard; AnomalousBrowser.prototype.initAssistantPanel = initAssistantPanel; AnomalousBrowser.prototype.renderAssistantModelCard = renderAssistantModelCard; AnomalousBrowser.prototype._loadAssistantHistory = _loadAssistantHistory; AnomalousBrowser.prototype._openGalleryReplacer = _openGalleryReplacer; AnomalousBrowser.prototype.openLoraInsertionPicker = openLoraInsertionPicker; AnomalousBrowser.prototype.runGlobalDoctorScan = runGlobalDoctorScan; AnomalousBrowser.prototype.showNotebooks = showNotebooks; AnomalousBrowser.prototype.closeWorkspace = closeWorkspace; AnomalousBrowser.prototype.refreshNotebooks = refreshNotebooks; AnomalousBrowser.prototype.saveCurrentNotebook = saveCurrentNotebook; AnomalousBrowser.prototype.deleteCurrentNotebook = deleteCurrentNotebook; AnomalousBrowser.prototype.renderNotebookEditor = renderNotebookEditor; AnomalousBrowser.prototype.fillNotebookGalleries = fillNotebookGalleries; AnomalousBrowser.prototype.sendNotebookToCanvas = sendNotebookToCanvas; AnomalousBrowser.prototype.showRecipes = showRecipes; AnomalousBrowser.prototype.refreshRecipes = refreshRecipes; AnomalousBrowser.prototype.renderRecipeList = renderRecipeList; AnomalousBrowser.prototype.handleSaveRecipe = handleSaveRecipe; AnomalousBrowser.prototype.showMaterials = showMaterials; AnomalousBrowser.prototype.openSavedMaterial = openSavedMaterial; AnomalousBrowser.prototype.openMaterialLibrary = openMaterialLibrary; AnomalousBrowser.prototype.openPromptStudio = openPromptStudio; AnomalousBrowser.prototype.openPromptTranslator = function() { openPromptTranslator(this); }; AnomalousBrowser.prototype.refreshMaterials = refreshMaterials; AnomalousBrowser.prototype.loadGalleryImages = loadGalleryImages; AnomalousBrowser.prototype.refreshGalleryImages = refreshGalleryImages; AnomalousBrowser.prototype.showGeneratedGallery = showGeneratedGallery; AnomalousBrowser.prototype.showGallerySelectMode = showGallerySelectMode; AnomalousBrowser.prototype.showGalleryViewer = showGalleryViewer; AnomalousBrowser.prototype.showImageWorkbench = showImageWorkbench; AnomalousBrowser.prototype.createDOM = createDOM; AnomalousBrowser.prototype.openScanWizard = openScanWizard; AnomalousBrowser.prototype.scanSingleModel = triggerDirectModelScan; AnomalousBrowser.prototype.openFolderManager = openFolderManager; AnomalousBrowser.prototype.renderSidebar = renderSidebar; AnomalousBrowser.prototype.loadFolders = loadFolders; AnomalousBrowser.prototype.showHelp = showHelp; AnomalousBrowser.prototype.hideAllPanels = hideAllPanels; AnomalousBrowser.prototype.loadModels = loadModels; AnomalousBrowser.prototype.applyModelToCanvas = applyModelToCanvas; AnomalousBrowser.prototype.stopMediaInContainer = stopMediaInContainer; AnomalousBrowser.prototype.showDetail = showDetail; AnomalousBrowser.prototype.showEditModal = showEditModal; AnomalousBrowser.prototype._openAdvancedModelSelector = _openAdvancedModelSelector; AnomalousBrowser.prototype.setWidgetValuePath = setWidgetValuePath;