From 720440507c6263dba87c48b1bf8359494efbffec Mon Sep 17 00:00:00 2001 From: Will Miao Date: Wed, 28 Oct 2026 11:45:01 +0800 Subject: [PATCH 01/13] feat: add opt-in workflow library management Add a Workflows page that manages ComfyUI workflow JSON files as a first-class library alongside loras/checkpoints/embeddings: - opt-in via the new 'Workflow Management' settings toggle (default off) - dedicated workflow folder roots with sidecar/preview support, separate from ComfyUI's own workflow storage; 'Send to ComfyUI' loads a workflow straight into the graph - workflow scanner parses the graph document (UI/API format sniffing, node classes, model/civitai refs) and persists the analysis in the SQLite model cache - settings UI: workflow folder paths editor in the Library tab and the standalone Model Paths page Fixes from sandbox E2E verification: - include the workflow scanner in startup initialization so the page no longer hangs on 'initializing' when enabled without folders - add the missing workflows entry to the frontend page-state map (page init crashed and the sidebar fell back to the loras tree without it) - project workflow analysis fields through the scanner cache entry and persist them in the model cache (new columns with auto-migration) - keep symlinked paths intact in the directory picker (abspath instead of resolve), so stored library paths match what the user sees on disk Also rebuilds the vue-widgets bundle to sync it with web/comfyui/utils.js. --- locales/de.json | 39 +- locales/en.json | 39 +- locales/es.json | 39 +- locales/fr.json | 39 +- locales/he.json | 39 +- locales/ja.json | 39 +- locales/ko.json | 39 +- locales/ru.json | 39 +- locales/zh-CN.json | 39 +- locales/zh-TW.json | 39 +- py/config.py | 122 ++++++- py/lora_manager.py | 9 + py/routes/handlers/misc_handlers.py | 54 ++- py/routes/workflow_routes.py | 207 +++++++++++ py/services/first_run_manager.py | 5 +- py/services/model_scanner.py | 30 ++ py/services/model_service_factory.py | 7 +- py/services/persistent_model_cache.py | 51 +++ py/services/service_registry.py | 21 ++ py/services/settings_manager.py | 62 ++++ py/services/workflow_scanner.py | 126 +++++++ py/services/workflow_service.py | 84 +++++ py/utils/constants.py | 3 + py/utils/directory_browser.py | 6 +- py/utils/models.py | 52 +++ py/utils/workflow_analysis.py | 178 ++++++++++ static/js/api/apiConfig.js | 17 +- static/js/api/modelApiFactory.js | 3 + static/js/api/workflowApi.js | 23 ++ .../ContextMenu/ModelContextMenuMixin.js | 3 +- .../ContextMenu/WorkflowContextMenu.js | 86 +++++ static/js/components/ContextMenu/index.js | 4 + static/js/components/Header.js | 1 + static/js/components/SidebarManager.js | 2 +- .../components/controls/WorkflowControls.js | 62 ++++ static/js/components/controls/index.js | 7 +- static/js/components/first_run.js | 2 +- static/js/components/initialization.js | 3 + static/js/core.js | 2 +- static/js/managers/BannerService.js | 4 +- static/js/managers/FilterManager.js | 4 +- static/js/managers/SearchManager.js | 4 +- static/js/managers/SettingsManager.js | 166 ++++++++- static/js/state/index.js | 40 +++ static/js/utils/infiniteScroll.js | 2 +- static/js/utils/workflowModels.js | 67 ++++ static/js/workflows.js | 57 +++ static/js/workflows_disabled.js | 109 ++++++ templates/components/header.html | 6 + .../components/modals/settings/library.html | 21 ++ templates/workflows.html | 158 +++++++++ tests/config/test_other_paths.py | 2 + .../__snapshots__/test_api_snapshots.ambr | 2 + tests/routes/test_filesystem_paths.py | 23 +- tests/routes/test_misc_routes.py | 3 + tests/routes/test_settings_handler.py | 58 +++ tests/routes/test_workflow_routes.py | 333 ++++++++++++++++++ tests/services/test_settings_manager.py | 41 +++ tests/services/test_workflow_scanner.py | 112 ++++++ tests/utils/test_workflow_analysis.py | 101 ++++++ .../vue-widgets/lora-manager-widgets.js | 32 +- .../vue-widgets/lora-manager-widgets.js.map | 2 +- 62 files changed, 2923 insertions(+), 46 deletions(-) create mode 100644 py/routes/workflow_routes.py create mode 100644 py/services/workflow_scanner.py create mode 100644 py/services/workflow_service.py create mode 100644 py/utils/workflow_analysis.py create mode 100644 static/js/api/workflowApi.js create mode 100644 static/js/components/ContextMenu/WorkflowContextMenu.js create mode 100644 static/js/components/controls/WorkflowControls.js create mode 100644 static/js/utils/workflowModels.js create mode 100644 static/js/workflows.js create mode 100644 static/js/workflows_disabled.js create mode 100644 templates/workflows.html create mode 100644 tests/routes/test_workflow_routes.py create mode 100644 tests/services/test_workflow_scanner.py create mode 100644 tests/utils/test_workflow_analysis.py diff --git a/locales/de.json b/locales/de.json index 1269b71c..d6e36b09 100644 --- a/locales/de.json +++ b/locales/de.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Andere", + "workflows": "[TODO: Translate] Workflows", "statistics": "Statistiken" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "Legen Sie den Standard-ControlNet-Stammordner für Downloads, Importe und Verschiebungen fest", "enableOtherModels": "Verwaltung weiterer Modelle", "enableOtherModelsHelp": "Wenn deaktiviert, werden VAE-, Upscaler-, Text-Encoder-, CLIP-Vision- und ControlNet-Ordner nicht gescannt, die Seite für weitere Modelle bleibt deaktiviert und diese Modelltypen können nicht heruntergeladen werden.", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "Verwaltete Modelltypen", "otherSubTypesHelp": "Wählen Sie, welche Kategorien weiterer Modelle gescannt und auf der Seite für weitere Modelle angezeigt werden.", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Text-Encoder-Pfade", "clip": "CLIP-Pfade (Legacy)", "clip_vision": "CLIP-Vision-Pfade", - "controlnet": "ControlNet-Pfade" + "controlnet": "ControlNet-Pfade", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "Einstellungsordner öffnen" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "Stammverzeichnis", "collapseAll": "Alle Ordner einklappen", @@ -2272,6 +2305,10 @@ "title": "Manager für weitere Modelle wird initialisiert", "message": "Modell-Cache wird gescannt und aufgebaut. Dies kann einige Minuten dauern..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "Rezept Manager wird initialisiert", "message": "Rezepte werden geladen und verarbeitet. Dies kann einige Minuten dauern..." diff --git a/locales/en.json b/locales/en.json index 190f215c..0f85a9f7 100644 --- a/locales/en.json +++ b/locales/en.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Other", + "workflows": "Workflows", "statistics": "Stats" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "Set default ControlNet root directory for downloads, imports and moves", "enableOtherModels": "Other Models Management", "enableOtherModelsHelp": "When off, VAE / upscaler / text encoder / CLIP vision / ControlNet folders are not scanned, the Other Models page stays disabled, and these model types cannot be downloaded.", + "enableWorkflows": "Workflow Management", + "enableWorkflowsHelp": "When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "Workflow Folders", + "workflowFoldersHelp": "Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "Managed Types", "otherSubTypesHelp": "Choose which other-model categories are scanned and shown on the Other Models page.", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Text Encoder Paths", "clip": "CLIP Paths (legacy)", "clip_vision": "CLIP Vision Paths", - "controlnet": "ControlNet Paths" + "controlnet": "ControlNet Paths", + "workflows": "Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "Open Settings Folder" } }, + "workflows": { + "title": "Workflows", + "contextMenu": { + "sendToComfy": "Open in ComfyUI" + }, + "sendToComfy": { + "success": "Workflow sent to ComfyUI", + "failed": "Failed to send workflow: {message}" + }, + "disabled": { + "title": "Workflow management is off", + "description": "Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "Enable Workflows", + "hint": "You can turn the feature off again later in Settings > Library.", + "enableFailed": "Failed to enable Workflows" + }, + "noPaths": { + "title": "No workflow folders found", + "descriptionStandalone": "Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "Open Settings", + "openModelPaths": "Configure Model Folders", + "openSettingsFolder": "Open Settings Folder" + } + }, "sidebar": { "modelRoot": "Root", "collapseAll": "Collapse All Folders", @@ -2272,6 +2305,10 @@ "title": "Initializing Other Models Manager", "message": "Scanning and building model cache. This may take a few minutes..." }, + "workflows": { + "title": "Initializing Workflow Manager", + "message": "Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "Initializing Recipe Manager", "message": "Loading and processing recipes. This may take a few minutes..." diff --git a/locales/es.json b/locales/es.json index 144b4b87..2553a35f 100644 --- a/locales/es.json +++ b/locales/es.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Otros", + "workflows": "[TODO: Translate] Workflows", "statistics": "Estadísticas" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "Establecer el directorio raíz predeterminado de ControlNet para descargas, importaciones y movimientos", "enableOtherModels": "Gestión de otros modelos", "enableOtherModelsHelp": "Cuando está desactivado, las carpetas VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet no se escanean, la página Otros modelos permanece desactivada y estos tipos de modelos no se pueden descargar.", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "Tipos de modelos gestionados", "otherSubTypesHelp": "Elige qué categorías de otros modelos se escanean y se muestran en la página Otros modelos.", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Rutas de Text Encoder", "clip": "Rutas de CLIP (heredadas)", "clip_vision": "Rutas de CLIP Vision", - "controlnet": "Rutas de ControlNet" + "controlnet": "Rutas de ControlNet", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "Abrir carpeta de ajustes" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "Raíz", "collapseAll": "Colapsar todas las carpetas", @@ -2272,6 +2305,10 @@ "title": "Inicializando el gestor de otros modelos", "message": "Escaneando y construyendo la caché de modelos. Esto puede tomar unos minutos..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "Inicializando gestor de recetas", "message": "Cargando y procesando recetas. Esto puede tomar unos minutos..." diff --git a/locales/fr.json b/locales/fr.json index cbfcf345..39e0a0d9 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Autres", + "workflows": "[TODO: Translate] Workflows", "statistics": "Statistiques" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "Définir le répertoire racine ControlNet par défaut pour les téléchargements, imports et déplacements", "enableOtherModels": "Gestion des autres modèles", "enableOtherModelsHelp": "Lorsque cette option est désactivée, les dossiers VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet ne sont pas analysés, la page Autres modèles reste désactivée et ces types de modèles ne peuvent pas être téléchargés.", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "Types de modèles gérés", "otherSubTypesHelp": "Choisissez les catégories d’autres modèles analysées et affichées sur la page Autres modèles.", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Chemins Text Encoder", "clip": "Chemins CLIP (hérité)", "clip_vision": "Chemins CLIP Vision", - "controlnet": "Chemins ControlNet" + "controlnet": "Chemins ControlNet", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "Ouvrir le dossier des paramètres" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "Racine", "collapseAll": "Réduire tous les dossiers", @@ -2272,6 +2305,10 @@ "title": "Initialisation du gestionnaire Autres modèles", "message": "Analyse et construction du cache de modèles. Cela peut prendre quelques minutes..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "Initialisation du gestionnaire de recipes", "message": "Chargement et traitement des recipes. Cela peut prendre quelques minutes..." diff --git a/locales/he.json b/locales/he.json index f0d362f6..6ab90064 100644 --- a/locales/he.json +++ b/locales/he.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "אחרים", + "workflows": "[TODO: Translate] Workflows", "statistics": "סטטיסטיקה" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "הגדר את ספריית השורש המוגדרת כברירת מחדל של ControlNet להורדות, ייבוא והעברות", "enableOtherModels": "ניהול מודלים אחרים", "enableOtherModelsHelp": "כשהאפשרות כבויה, תיקיות VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet אינן נסרקות, עמוד המודלים האחרים נשאר מושבת ולא ניתן להוריד סוגי מודלים אלה.", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "סוגי מודלים מנוהלים", "otherSubTypesHelp": "בחר אילו קטגוריות של מודלים אחרים ייסרקו ויוצגו בעמוד המודלים האחרים.", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "נתיבי Text Encoder", "clip": "נתיבי CLIP (ישן)", "clip_vision": "נתיבי CLIP Vision", - "controlnet": "נתיבי ControlNet" + "controlnet": "נתיבי ControlNet", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "פתח תיקיית הגדרות" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "שורש", "collapseAll": "כווץ את כל התיקיות", @@ -2272,6 +2305,10 @@ "title": "מאתחל את מנהל המודלים האחרים", "message": "סורק ובונה מטמון מודלים. זה עשוי לקחת מספר דקות..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "מאתחל מנהל מתכונים", "message": "טוען ומעבד מתכונים. זה עשוי לקחת מספר דקות..." diff --git a/locales/ja.json b/locales/ja.json index 2d2a9b9b..ddd66ef6 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "その他", + "workflows": "[TODO: Translate] Workflows", "statistics": "統計" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "ダウンロード、インポート、移動用のデフォルトControlNetルートディレクトリを設定", "enableOtherModels": "その他のモデル管理", "enableOtherModelsHelp": "オフにすると、VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet フォルダーはスキャンされず、その他のモデルページは無効のままになり、これらのモデルタイプはダウンロードできません。", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "管理するモデルタイプ", "otherSubTypesHelp": "その他のモデルページでスキャンおよび表示するカテゴリを選択します。", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Text Encoderパス", "clip": "CLIPパス(レガシー)", "clip_vision": "CLIP Visionパス", - "controlnet": "ControlNetパス" + "controlnet": "ControlNetパス", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "設定フォルダーを開く" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "ルート", "collapseAll": "すべてのフォルダを折りたたむ", @@ -2272,6 +2305,10 @@ "title": "その他のモデルマネージャーを初期化中", "message": "モデルキャッシュをスキャンして構築中です。数分かかる場合があります..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "レシピマネージャーを初期化中", "message": "レシピを読み込んで処理中。数分かかる場合があります..." diff --git a/locales/ko.json b/locales/ko.json index ecf14a01..e22a8bfe 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "기타", + "workflows": "[TODO: Translate] Workflows", "statistics": "통계" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "다운로드, 가져오기 및 이동을 위한 기본 ControlNet 루트 디렉토리를 설정합니다", "enableOtherModels": "기타 모델 관리", "enableOtherModelsHelp": "끄면 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 폴더를 스캔하지 않으며, 기타 모델 페이지가 비활성화된 상태로 유지되고 이러한 모델 유형은 다운로드할 수 없습니다.", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "관리할 모델 유형", "otherSubTypesHelp": "기타 모델 페이지에서 스캔하고 표시할 카테고리를 선택합니다.", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Text Encoder 경로", "clip": "CLIP 경로 (레거시)", "clip_vision": "CLIP Vision 경로", - "controlnet": "ControlNet 경로" + "controlnet": "ControlNet 경로", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "설정 폴더 열기" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "루트", "collapseAll": "모든 폴더 접기", @@ -2272,6 +2305,10 @@ "title": "기타 모델 관리자 초기화 중", "message": "모델 캐시를 스캔하고 구축하고 있습니다. 몇 분이 걸릴 수 있습니다..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "레시피 매니저 초기화 중", "message": "레시피를 로딩하고 처리하고 있습니다. 몇 분이 걸릴 수 있습니다..." diff --git a/locales/ru.json b/locales/ru.json index d940c734..4ba7f4aa 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Другое", + "workflows": "[TODO: Translate] Workflows", "statistics": "Статистика" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "Установить корневую папку ControlNet по умолчанию для загрузок, импорта и перемещений", "enableOtherModels": "Управление другими моделями", "enableOtherModelsHelp": "Если выключено, папки VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet не сканируются, страница «Другие модели» остаётся отключённой, а эти типы моделей нельзя загрузить.", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "Управляемые типы моделей", "otherSubTypesHelp": "Выберите, какие категории других моделей сканируются и отображаются на странице «Другие модели».", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Пути Text Encoder", "clip": "Пути CLIP (устаревшие)", "clip_vision": "Пути CLIP Vision", - "controlnet": "Пути ControlNet" + "controlnet": "Пути ControlNet", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "Открыть папку настроек" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "Корень", "collapseAll": "Свернуть все папки", @@ -2272,6 +2305,10 @@ "title": "Инициализация менеджера других моделей", "message": "Сканирование и построение кэша моделей. Это может занять несколько минут..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "Инициализация менеджера рецептов", "message": "Загрузка и обработка рецептов. Это может занять несколько минут..." diff --git a/locales/zh-CN.json b/locales/zh-CN.json index c0f4cec3..4e22f7a0 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "其他", + "workflows": "[TODO: Translate] Workflows", "statistics": "统计" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "设置下载、导入和移动时的默认 ControlNet 根目录", "enableOtherModels": "其他模型管理", "enableOtherModelsHelp": "关闭后,不会扫描 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 文件夹,其他模型页面保持禁用,且无法下载这些模型类型。", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "管理的模型类型", "otherSubTypesHelp": "选择要在其他模型页面中扫描和显示的其他模型类别。", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Text Encoder 路径", "clip": "CLIP 路径(旧版)", "clip_vision": "CLIP Vision 路径", - "controlnet": "ControlNet 路径" + "controlnet": "ControlNet 路径", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "打开设置文件夹" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "根目录", "collapseAll": "折叠所有文件夹", @@ -2272,6 +2305,10 @@ "title": "正在初始化其他模型管理器", "message": "正在扫描并构建模型缓存。这可能需要几分钟..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "初始化配方管理器", "message": "正在加载和处理配方。这可能需要几分钟..." diff --git a/locales/zh-TW.json b/locales/zh-TW.json index b15b4579..2579df38 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -244,6 +244,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "其他", + "workflows": "[TODO: Translate] Workflows", "statistics": "統計" }, "search": { @@ -633,6 +634,10 @@ "defaultControlnetRootHelp": "設定下載、匯入和移動時的預設 ControlNet 根目錄", "enableOtherModels": "其他模型管理", "enableOtherModelsHelp": "關閉後,不會掃描 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 資料夾,其他模型頁面會保持停用,且無法下載這些模型類型。", + "enableWorkflows": "[TODO: Translate] Workflow Management", + "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", + "workflowFolders": "[TODO: Translate] Workflow Folders", + "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", "otherSubTypes": "管理的模型類型", "otherSubTypesHelp": "選擇要在其他模型頁面中掃描和顯示的其他模型類別。", "subTypeVae": "VAE", @@ -686,7 +691,8 @@ "text_encoders": "Text Encoder 路徑", "clip": "CLIP 路徑(舊版)", "clip_vision": "CLIP Vision 路徑", - "controlnet": "ControlNet 路徑" + "controlnet": "ControlNet 路徑", + "workflows": "[TODO: Translate] Workflow Paths" } }, "directoryPicker": { @@ -1447,6 +1453,33 @@ "openSettingsFolder": "開啟設定資料夾" } }, + "workflows": { + "title": "[TODO: Translate] Workflows", + "contextMenu": { + "sendToComfy": "[TODO: Translate] Open in ComfyUI" + }, + "sendToComfy": { + "success": "[TODO: Translate] Workflow sent to ComfyUI", + "failed": "[TODO: Translate] Failed to send workflow: {message}" + }, + "disabled": { + "title": "[TODO: Translate] Workflow management is off", + "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", + "enableButton": "[TODO: Translate] Enable Workflows", + "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", + "enableFailed": "[TODO: Translate] Failed to enable Workflows" + }, + "noPaths": { + "title": "[TODO: Translate] No workflow folders found", + "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", + "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", + "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", + "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", + "openSettings": "[TODO: Translate] Open Settings", + "openModelPaths": "[TODO: Translate] Configure Model Folders", + "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + } + }, "sidebar": { "modelRoot": "根目錄", "collapseAll": "全部摺疊資料夾", @@ -2272,6 +2305,10 @@ "title": "正在初始化其他模型管理器", "message": "正在掃描並建立模型快取。這可能需要幾分鐘..." }, + "workflows": { + "title": "[TODO: Translate] Initializing Workflow Manager", + "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + }, "recipes": { "title": "初始化配方管理器", "message": "正在載入並處理配方,可能需要幾分鐘..." diff --git a/py/config.py b/py/config.py index c8ca7c0e..571c38b0 100644 --- a/py/config.py +++ b/py/config.py @@ -209,6 +209,12 @@ class Config: self.other_root_subtypes: Dict[str, str] = {} self.other_folder_roots: Dict[str, List[str]] = {} self.other_roots = self._init_other_paths() + # Workflow roots (ComfyUI workflow JSON library). Opt-in feature: + # empty while ``enable_workflows`` is off. Not a ComfyUI folder_paths + # category — sourced from LoRA Manager's own settings in both modes. + self.workflows_roots: List[str] = [] + self.extra_workflows_roots: List[str] = [] + self.workflows_roots = self._init_workflow_paths() # Extra paths (only for LoRA Manager, not shared with ComfyUI) self.extra_loras_roots: List[str] = [] self.extra_checkpoints_roots: List[str] = [] @@ -265,8 +271,9 @@ class Config: extra_checkpoint = extra_folder_paths.get("checkpoints", []) or [] extra_unet = extra_folder_paths.get("unet", []) or [] extra_embedding = extra_folder_paths.get("embeddings", []) or [] + extra_workflows = extra_folder_paths.get("workflows", []) or [] - if not any([extra_lora, extra_checkpoint, extra_unet, extra_embedding]): + if not any([extra_lora, extra_checkpoint, extra_unet, extra_embedding, extra_workflows]): return filtered_extra_lora = self._filter_overlapping_extra_lora_paths( @@ -281,6 +288,8 @@ class Config: self.extra_embeddings_roots = self._prepare_embedding_paths( extra_embedding ) + if settings_manager.is_workflows_enabled(): + self.extra_workflows_roots = self._prepare_lora_paths(extra_workflows) if self.extra_loras_roots: logger.info( @@ -460,6 +469,15 @@ class Config: self.embeddings_roots or [], ), } + # Workflow roots live only in our settings (the host has no such + # category); persist them so the whitelist rebuild above does not + # erase the key. Empty lists are still written when the key was + # configured before, so a deliberate removal round-trips. + workflow_configured = self.configured_roots_for("workflow") + if workflow_configured or self.workflows_roots: + target_folder_paths["workflows"] = _append_new_paths( + workflow_configured, self.workflows_roots or [] + ) # Persist the other-model roots under their original folder_paths # keys so library switching round-trips them. for key, roots in (self.other_folder_roots or {}).items(): @@ -1124,6 +1142,8 @@ class Config: preview_roots.update(self._expand_preview_root(root)) for root in self.other_roots or []: preview_roots.update(self._expand_preview_root(root)) + for root in self.workflows_roots or []: + preview_roots.update(self._expand_preview_root(root)) # Include extra paths for preview access for root in self.extra_loras_roots or []: preview_roots.update(self._expand_preview_root(root)) @@ -1133,6 +1153,8 @@ class Config: preview_roots.update(self._expand_preview_root(root)) for root in self.extra_embeddings_roots or []: preview_roots.update(self._expand_preview_root(root)) + for root in self.extra_workflows_roots or []: + preview_roots.update(self._expand_preview_root(root)) if self.recipes_path: preview_roots.update(self._expand_preview_root(self.recipes_path)) @@ -1596,12 +1618,28 @@ class Config: self.other_folder_roots, ) = self._prepare_other_paths(other_path_map) + # Workflow roots ride the same library folder_paths structure but are + # not a ComfyUI category; the live list stays empty while the opt-in + # feature is off. + workflow_paths = folder_paths.get("workflows", []) or [] + self._remember_configured_paths("workflow", workflow_paths) + try: + from .services.settings_manager import get_settings_manager + + workflows_enabled = get_settings_manager().is_workflows_enabled() + except Exception: # pragma: no cover - defensive fallback + workflows_enabled = False + self.workflows_roots = ( + self._prepare_lora_paths(workflow_paths) if workflows_enabled else [] + ) + # Process extra paths (only for LoRA Manager, not shared with ComfyUI) extra_paths = extra_folder_paths or {} extra_lora_paths = extra_paths.get("loras", []) or [] extra_checkpoint_paths = extra_paths.get("checkpoints", []) or [] extra_unet_paths = extra_paths.get("unet", []) or [] extra_embedding_paths = extra_paths.get("embeddings", []) or [] + extra_workflow_paths = extra_paths.get("workflows", []) or [] filtered_extra_lora_paths = self._filter_overlapping_extra_lora_paths( self.loras_roots, @@ -1616,6 +1654,9 @@ class Config: self.extra_embeddings_roots = self._prepare_embedding_paths( extra_embedding_paths ) + self.extra_workflows_roots = ( + self._prepare_lora_paths(extra_workflow_paths) if workflows_enabled else [] + ) # Log extra folder paths if self.extra_loras_roots: @@ -1809,6 +1850,85 @@ class Config: logger.warning(f"Error initializing other model paths: {e}") return [] + def _get_configured_workflow_paths(self) -> List[str]: + """Read the workflows folder_paths entry from the active library. + + "workflows" is not a ComfyUI folder_paths category (the host raises + KeyError for unknown keys), so both modes source workflow roots from + LoRA Manager's own settings. + """ + try: + from .services.settings_manager import get_settings_manager + + library_config = get_settings_manager().get_active_library() + except Exception: + return [] + if not isinstance(library_config, Mapping): + return [] + folder_paths_config = library_config.get("folder_paths") + if not isinstance(folder_paths_config, Mapping): + return [] + raw_paths = folder_paths_config.get("workflows", []) + if not isinstance(raw_paths, list): + return [] + return [path for path in raw_paths if isinstance(path, str) and path.strip()] + + def _init_workflow_paths(self) -> List[str]: + """Initialize and validate workflow roots. + + Opt-in feature: the live root list stays empty while + ``enable_workflows`` is off, but the configured paths are still + remembered so ``save_folder_paths_to_settings()`` round-trips them. + """ + try: + raw_paths = self._get_configured_workflow_paths() + self._remember_configured_paths("workflow", raw_paths) + + from .services.settings_manager import get_settings_manager + + if not get_settings_manager().is_workflows_enabled(): + return [] + + unique_paths = self._prepare_lora_paths(raw_paths) + logger.info( + "Found workflow roots:" + + ("\n - " + "\n - ".join(unique_paths) if unique_paths else "[]") + ) + return unique_paths + except Exception as e: + logger.warning(f"Error initializing workflow paths: {e}") + return [] + + def refresh_workflow_roots(self) -> None: + """Rebuild workflow roots after the opt-in toggle or paths change. + + Called when ``enable_workflows`` or the workflows folder_paths are + updated so the scanner immediately reflects the new folder set + without a full application restart. + """ + self.workflows_roots = self._init_workflow_paths() + try: + from .services.settings_manager import get_settings_manager + + settings_manager = get_settings_manager() + extra_workflows: List[str] = [] + if settings_manager.is_workflows_enabled(): + library_config = settings_manager.get_active_library() + if isinstance(library_config, Mapping): + extra_config = library_config.get("extra_folder_paths") + if isinstance(extra_config, Mapping): + raw_extra = extra_config.get("workflows", []) + if isinstance(raw_extra, list): + extra_workflows = [ + path + for path in raw_extra + if isinstance(path, str) and path.strip() + ] + self.extra_workflows_roots = self._prepare_lora_paths(extra_workflows) + except Exception: # pragma: no cover - defensive fallback + self.extra_workflows_roots = [] + self._rebuild_preview_roots() + def _remember_configured_paths( self, model_type: str, paths: Iterable[str] ) -> None: diff --git a/py/lora_manager.py b/py/lora_manager.py index 39cd9a95..36d9eeec 100644 --- a/py/lora_manager.py +++ b/py/lora_manager.py @@ -275,6 +275,11 @@ class LoraManager: checkpoint_scanner = await ServiceRegistry.get_checkpoint_scanner() embedding_scanner = await ServiceRegistry.get_embedding_scanner() other_scanner = await ServiceRegistry.get_other_scanner() + # Opt-in but always initialized: an empty-roots scan is trivial, and + # without a cache the /workflows page would sit on the initialization + # screen forever (even the "feature disabled" empty state needs the + # scanner past the initializing check). + workflow_scanner = await ServiceRegistry.get_workflow_scanner() # Initialize recipe scanner if needed recipe_scanner = await ServiceRegistry.get_recipe_scanner() @@ -296,6 +301,10 @@ class LoraManager: other_scanner.initialize_in_background(), name="other_cache_init", ), + asyncio.create_task( + workflow_scanner.initialize_in_background(), + name="workflow_cache_init", + ), asyncio.create_task( recipe_scanner.initialize_in_background(), name="recipe_cache_init" ), diff --git a/py/routes/handlers/misc_handlers.py b/py/routes/handlers/misc_handlers.py index a968c6cd..48945e0f 100644 --- a/py/routes/handlers/misc_handlers.py +++ b/py/routes/handlers/misc_handlers.py @@ -716,6 +716,7 @@ class HealthCheckHandler: "checkpoint": ServiceRegistry.get_checkpoint_scanner, "embedding": ServiceRegistry.get_embedding_scanner, "other": ServiceRegistry.get_other_scanner, + "workflow": ServiceRegistry.get_workflow_scanner, "recipe": ServiceRegistry.get_recipe_scanner, } self._first_run_manager = first_run_manager @@ -723,13 +724,14 @@ class HealthCheckHandler: def _active_scanner_getters( self, ) -> Mapping[str, Callable[[], Awaitable[Any]]]: - """Drop the opt-in other scanner while Other Models is disabled.""" - getters = self._scanner_getters - if "other" not in getters: - return getters - if get_settings_manager().is_other_models_enabled(): - return getters - return {name: getter for name, getter in getters.items() if name != "other"} + """Drop the opt-in scanners while their features are disabled.""" + settings = get_settings_manager() + active = dict(self._scanner_getters) + if not settings.is_other_models_enabled(): + active.pop("other", None) + if not settings.is_workflows_enabled(): + active.pop("workflow", None) + return active async def health_check(self, request: web.Request) -> web.Response: return web.json_response({"status": "ok"}) @@ -743,6 +745,7 @@ class HealthCheckHandler: "checkpoints": ("checkpoint",), "embeddings": ("embedding",), "other": ("other",), + "workflows": ("workflow",), "recipes": ("recipe",), } @@ -965,6 +968,7 @@ class DoctorHandler: ("checkpoint", "Checkpoints", ServiceRegistry.get_checkpoint_scanner), ("embedding", "Embeddings", ServiceRegistry.get_embedding_scanner), ("other", "Other Models", ServiceRegistry.get_other_scanner), + ("workflow", "Workflows", ServiceRegistry.get_workflow_scanner), ) ) self._app_version_getter = app_version_getter @@ -972,10 +976,13 @@ class DoctorHandler: def _active_scanner_factories( self, ) -> Sequence[tuple[str, str, Callable[[], Awaitable[Any]]]]: - """Drop the opt-in other scanner while Other Models is disabled.""" - if self._settings.is_other_models_enabled(): - return self._scanner_factories - return tuple(entry for entry in self._scanner_factories if entry[0] != "other") + """Drop the opt-in scanners while their features are disabled.""" + factories = self._scanner_factories + if not self._settings.is_other_models_enabled(): + factories = tuple(entry for entry in factories if entry[0] != "other") + if not self._settings.is_workflows_enabled(): + factories = tuple(entry for entry in factories if entry[0] != "workflow") + return factories async def get_doctor_diagnostics(self, request: web.Request) -> web.Response: try: @@ -1852,6 +1859,15 @@ class SettingsHandler: response_data["other_models_paths_available"] = None standalone_mode = os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1" response_data["standalone_mode"] = standalone_mode + # Workflow roots are LoRA-Manager-only in BOTH modes (the ComfyUI + # host has no such folder category), so expose them to the + # settings UI regardless of standalone_mode. + get_workflow_paths = getattr( + self._settings, "get_workflow_folder_paths", None + ) + response_data["workflow_folder_paths"] = ( + get_workflow_paths() if get_workflow_paths else [] + ) if standalone_mode: # Standalone reads its model roots exclusively from # settings.json, so the Model Paths settings UI needs the @@ -1958,6 +1974,14 @@ class SettingsHandler: proxy_changed = False for key, value in data.items(): + if key == "workflow_folder_paths": + # Pseudo-key: replaces only the workflows entry of the + # active library's folder_paths (core keys are host-owned + # in plugin mode and must not be clobbered), then applies + # the new roots live without a restart. + self._settings.set_workflow_folder_paths(value) + continue + if value == self._settings.get(key): continue @@ -2418,6 +2442,7 @@ class ServiceRegistryAdapter: get_downloaded_version_history_service: Callable[[], Awaitable[Any]] get_backup_service: Callable[[], Awaitable[Any]] = _noop_backup_service get_other_scanner: Callable[[], Awaitable[Any]] = ServiceRegistry.get_other_scanner + get_workflow_scanner: Callable[[], Awaitable[Any]] = ServiceRegistry.get_workflow_scanner class ModelLibraryHandler: @@ -2444,6 +2469,8 @@ class ModelLibraryHandler: return "embedding" if normalized in VALID_OTHER_CIVITAI_TYPES: return "other" + if normalized in {"workflow", "workflows", "comfyworkflows"}: + return "workflow" return None async def _get_scanner_for_type(self, model_type: str | None): @@ -2461,6 +2488,11 @@ class ModelLibraryHandler: if not get_settings_manager().is_other_models_enabled(): return None, None return normalized_type, await self._service_registry.get_other_scanner() + if normalized_type == "workflow": + # Same opt-in posture as other models. + if not get_settings_manager().is_workflows_enabled(): + return None, None + return normalized_type, await self._service_registry.get_workflow_scanner() return None, None async def _get_download_history_service(self): diff --git a/py/routes/workflow_routes.py b/py/routes/workflow_routes.py new file mode 100644 index 00000000..cd278b10 --- /dev/null +++ b/py/routes/workflow_routes.py @@ -0,0 +1,207 @@ +import json +import logging +import os +from typing import Any, Dict + +from aiohttp import web + +from .base_model_routes import BaseModelRoutes +from .model_route_registrar import ModelRouteRegistrar +from ..config import config +from ..services.model_lifecycle_service import _require_path_in_library_roots +from ..services.service_registry import ServiceRegistry +from ..services.workflow_service import WorkflowService +from ..utils.workflow_analysis import load_workflow_file + +logger = logging.getLogger(__name__) + +# CivitAI model types that map onto the workflow library (ComfyWorkflows is +# retired on CivitAI but grandfathered models still carry it). +WORKFLOW_CIVITAI_TYPES = frozenset({"workflows", "comfyworkflows"}) + + +class WorkflowRoutes(BaseModelRoutes): + """Workflow-specific route controller (ComfyUI workflow JSON resources). + + Workflow management is opt-in (``enable_workflows``): while disabled the + page renders an enable-now empty state and CivitAI linking is rejected. + """ + + def __init__(self): + """Initialize Workflow routes with Workflow service""" + super().__init__() + self.template_name = "workflows.html" + + async def initialize_services(self): + """Initialize services from ServiceRegistry""" + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + update_service = await ServiceRegistry.get_model_update_service() + self.service = WorkflowService(workflow_scanner, update_service=update_service) + self.set_model_update_service(update_service) + + # Attach service dependencies + self.attach_service(self.service) + + def setup_routes(self, app: web.Application, prefix: str = "workflows"): + """Setup Workflow routes""" + # Schedule service initialization on app startup + app.on_startup.append(lambda _: self.initialize_services()) + + # Setup common routes with 'workflows' prefix (includes page route) + super().setup_routes(app, prefix) + + def setup_specific_routes(self, registrar: ModelRouteRegistrar, prefix: str): + """Setup Workflow-specific routes""" + # Workflow info by name + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/info/{name}', prefix, self.get_workflow_info + ) + # Push a workflow into the ComfyUI graph (plugin mode only). Accepts + # GET as well: the companion browser extension is GET-only by + # convention (see AGENTS.md). + registrar.add_prefixed_route( + 'POST', '/api/lm/{prefix}/send-to-comfy', prefix, self.send_to_comfy + ) + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/send-to-comfy', prefix, self.send_to_comfy + ) + + def _validate_civitai_model_type(self, model_type: str) -> bool: + """Validate CivitAI model type for workflows (opt-in gated).""" + if not self._settings.is_workflows_enabled(): + return False + return (model_type or "").strip().lower() in WORKFLOW_CIVITAI_TYPES + + def _get_expected_model_types(self) -> str: + """Get expected model types string for error messages""" + return "Workflows or ComfyWorkflows" + + def _find_model_file(self, files): + """Prefer a single-workflow Config .json, then an Archive .zip. + + Mirrors CivitAI's own default pick for Workflow resources + (resource-file.service.ts pickDefaultResourceFile); falls back to the + base-class weight-file behaviour for anything else. + """ + def rank(file_info): + file_type = file_info.get("type") + name = (file_info.get("name") or "").lower() + if file_type == "Config" and name.endswith(".json"): + return 0 + if file_type == "Archive" and name.endswith(".zip"): + return 1 + return 2 + + candidates = [f for f in files if rank(f) < 2] + if candidates: + candidates.sort(key=lambda f: (rank(f), f.get("id", 0))) + return candidates[0] + return super()._find_model_file(files) + + def _get_page_context_provider(self): + """Expose the opt-in feature state to the Workflows page template.""" + return self._page_context_for_workflows + + def _page_context_for_workflows(self, request: web.Request) -> Dict[str, Any]: + if not self._settings.is_workflows_enabled(): + return {"workflows_disabled": True, "workflows_no_paths": False} + + standalone_mode = os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1" + context = { + "workflows_disabled": False, + "workflows_no_paths": not bool(config.workflows_roots), + "standalone_mode": standalone_mode, + } + if standalone_mode: + context["settings_file"] = getattr(self._settings, "settings_file", "") or "" + return context + + async def get_workflow_info(self, request: web.Request) -> web.Response: + """Get detailed information for a specific workflow by name""" + try: + name = request.match_info.get('name', '') + workflow_info = await self.service.get_model_info_by_name(name) # pyright: ignore[reportAttributeAccessIssue] + + if workflow_info: + return web.json_response(workflow_info) + else: + return web.json_response({"error": "Workflow not found"}, status=404) + + except Exception as e: + logger.error(f"Error in get_workflow_info: {e}", exc_info=True) + return web.json_response({"error": str(e)}, status=500) + + async def send_to_comfy(self, request: web.Request) -> web.Response: + """Load a library workflow into the running ComfyUI graph. + + Reads the workflow JSON and broadcasts it over the ``lm_load_workflow`` + websocket channel; the ComfyUI-side extension picks it up and calls + ``loadGraphData`` (same channel as recipe send-workflow). + """ + try: + if os.environ.get("LORA_MANAGER_STANDALONE", "0") == "1": + return web.json_response( + {"success": False, "error": "Standalone Mode Active"}, status=400 + ) + + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + if request.method == "POST": + payload = await self._read_json_body(request) + else: + payload = dict(request.query) + file_path = (payload.get("file_path") or "").strip() + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + workflow = await self._load_workflow_payload(file_path) + if workflow is None: + return web.json_response( + { + "success": False, + "error": "not_a_workflow", + "message": "File is missing or is not a ComfyUI workflow", + }, + status=404, + ) + + # Lazy import: standalone mode replaces the ``server`` module with + # a mock; the standalone check above already guards UX. + from server import PromptServer # pyright: ignore[reportMissingImports] + + PromptServer.instance.send_sync( + "lm_load_workflow", + { + "workflow": workflow, + "name": os.path.splitext(os.path.basename(file_path))[0], + }, + ) + return web.json_response({"success": True, "sent": True}) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error sending workflow to ComfyUI: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + + async def _read_json_body(self, request: web.Request) -> Dict[str, Any]: + try: + payload = await request.json() + except (json.JSONDecodeError, UnicodeDecodeError): + return {} + return payload if isinstance(payload, dict) else {} + + async def _load_workflow_payload(self, file_path: str): + """Read and validate the workflow document off the event loop.""" + import asyncio + + return await asyncio.to_thread(load_workflow_file, file_path) diff --git a/py/services/first_run_manager.py b/py/services/first_run_manager.py index 6a189f6c..47d72f62 100644 --- a/py/services/first_run_manager.py +++ b/py/services/first_run_manager.py @@ -162,13 +162,16 @@ class FirstRunManager: "checkpoints": ServiceRegistry.get_checkpoint_scanner, "embeddings": ServiceRegistry.get_embedding_scanner, "other": ServiceRegistry.get_other_scanner, + "workflows": ServiceRegistry.get_workflow_scanner, } def _active_scanner_getters(self) -> Dict[str, Callable[[], Awaitable[Any]]]: - """Drop the opt-in other scanner while Other Models is disabled.""" + """Drop the opt-in scanners while their features are disabled.""" getters = self._scanner_getters() if "other" in getters and not self._settings.is_other_models_enabled(): getters.pop("other") + if "workflows" in getters and not self._settings.is_workflows_enabled(): + getters.pop("workflows") return getters # ------------------------------------------------------------------ diff --git a/py/services/model_scanner.py b/py/services/model_scanner.py index d4a09394..2c1122ff 100644 --- a/py/services/model_scanner.py +++ b/py/services/model_scanner.py @@ -101,6 +101,7 @@ PAGE_TYPE_MAP = { 'checkpoint': 'checkpoints', 'embedding': 'embeddings', 'other': 'other', + 'workflow': 'workflows', } # Case-insensitive cache matching is a Windows-only safety net (NTFS treats @@ -629,6 +630,7 @@ def _walk_root_for_reconcile( expected_folder_of: Callable[[str], str], walk_path: Optional[str] = None, unreachable: Optional[_UnreachablePaths] = None, + filename_filter: Optional[Callable[[str], bool]] = None, ) -> _RootWalkResult: """Walk one model root and classify every model file found. @@ -711,6 +713,8 @@ def _walk_root_for_reconcile( ext = os.path.splitext(file)[1].lower() if ext not in file_extensions: continue + if filename_filter is not None and not filename_filter(file): + continue result.files_seen += 1 files_since_report += 1 @@ -1211,6 +1215,20 @@ class ModelScanner: if hash_status: entry['hash_status'] = hash_status + # Workflow analysis fields (workflows only): copied through whenever + # the source carries them so the cache and API expose the parsed graph + # summary; other model types never define these keys. + for key in ( + 'workflow_format', + 'node_count', + 'node_classes', + 'model_refs', + 'civitai_refs', + ): + value = get_value(key, None) + if value is not None: + entry[key] = value + return entry def _ensure_license_flags(self, entry: Dict[str, Any]) -> None: @@ -1689,6 +1707,8 @@ class ModelScanner: ext = os.path.splitext(entry.name)[1].lower() if ext not in self.file_extensions: continue + if not self._is_indexable_filename(entry.name): + continue real_file_path = os.path.realpath(entry.path) if real_file_path in seen_real_files: continue @@ -2700,6 +2720,7 @@ class ModelScanner: report_progress=report_progress, expected_folder_of=expected_folder_of, unreachable=unreachable, + filename_filter=self._is_indexable_filename, ) finally: tracker.finish_root(root_path) @@ -3417,6 +3438,15 @@ class ModelScanner: """Hook for subclasses: adjust metadata during scanning""" return metadata + def _is_indexable_filename(self, filename: str) -> bool: + """Hook for subclasses: whether a matching-extension file is indexable. + + Scanners whose extension set collides with sidecar formats (e.g. the + workflow scanner's ``.json`` vs ``.metadata.json``) override this to + keep sidecars out of the library walk. + """ + return True + def adjust_cached_entry(self, entry: Dict[str, Any]) -> Dict[str, Any]: """Hook for subclasses: adjust entries loaded from the persisted cache.""" return entry diff --git a/py/services/model_service_factory.py b/py/services/model_service_factory.py index 61cc2182..00cc2700 100644 --- a/py/services/model_service_factory.py +++ b/py/services/model_service_factory.py @@ -123,10 +123,12 @@ def register_default_model_types(): from ..services.checkpoint_service import CheckpointService from ..services.embedding_service import EmbeddingService from ..services.other_model_service import OtherModelService + from ..services.workflow_service import WorkflowService from ..routes.lora_routes import LoraRoutes from ..routes.checkpoint_routes import CheckpointRoutes from ..routes.embedding_routes import EmbeddingRoutes from ..routes.other_routes import OtherRoutes + from ..routes.workflow_routes import WorkflowRoutes # Register LoRA model type ModelServiceFactory.register_model_type('lora', LoraService, LoraRoutes) @@ -138,4 +140,7 @@ def register_default_model_types(): ModelServiceFactory.register_model_type('embedding', EmbeddingService, EmbeddingRoutes) # Register Other model type (VAE, upscaler, text encoder, ...) - ModelServiceFactory.register_model_type('other', OtherModelService, OtherRoutes) \ No newline at end of file + ModelServiceFactory.register_model_type('other', OtherModelService, OtherRoutes) + + # Register Workflow model type (ComfyUI workflow JSON; opt-in feature) + ModelServiceFactory.register_model_type('workflow', WorkflowService, WorkflowRoutes) \ No newline at end of file diff --git a/py/services/persistent_model_cache.py b/py/services/persistent_model_cache.py index c980d422..17a492b3 100644 --- a/py/services/persistent_model_cache.py +++ b/py/services/persistent_model_cache.py @@ -47,6 +47,30 @@ class PersistedCacheData: DEFAULT_LICENSE_FLAGS = 127 # 127 (0b1111111) encodes default CivitAI permissions with all commercial modes enabled. +def _json_list_or_none(value: Any) -> Optional[str]: + """Encode a list field as JSON for storage; keep None as NULL.""" + + if value is None: + return None + if isinstance(value, str): + return value + return json.dumps(value) + + +def _json_list_from_row(value: Any) -> List[Any]: + """Decode a JSON list column back into a list (empty on bad data).""" + + if not value: + return [] + if isinstance(value, list): + return value + try: + decoded = json.loads(value) + except (json.JSONDecodeError, TypeError): + return [] + return decoded if isinstance(decoded, list) else [] + + class PersistentModelCache: """Persist core model metadata and hash index data in SQLite.""" @@ -88,6 +112,11 @@ class PersistentModelCache: "hf_url", "source_model_id", "source_version_id", + "workflow_format", + "node_count", + "node_classes", + "model_refs", + "civitai_refs", ) _MODEL_UPDATE_COLUMNS: Tuple[str, ...] = _MODEL_COLUMNS[2:] _instances: Dict[str, "PersistentModelCache"] = {} @@ -237,6 +266,12 @@ class PersistentModelCache: "source_model_id": row["source_model_id"] or "", "source_version_id": row["source_version_id"] or "", } + if model_type == "workflow": + item["workflow_format"] = row["workflow_format"] or "" + item["node_count"] = row["node_count"] or 0 + item["node_classes"] = _json_list_from_row(row["node_classes"]) + item["model_refs"] = _json_list_from_row(row["model_refs"]) + item["civitai_refs"] = _json_list_from_row(row["civitai_refs"]) # Legacy rows only carry `hf_url`; derive the canonical pair so # every consumer sees the same shape. normalize_metadata_source(item) @@ -661,6 +696,11 @@ class PersistentModelCache: hf_url TEXT DEFAULT '', source_model_id TEXT DEFAULT '', source_version_id TEXT DEFAULT '', + workflow_format TEXT DEFAULT '', + node_count INTEGER DEFAULT 0, + node_classes TEXT, + model_refs TEXT, + civitai_refs TEXT, PRIMARY KEY (model_type, file_path) ); @@ -734,6 +774,12 @@ class PersistentModelCache: "source_version_id": "TEXT DEFAULT ''", "autov3": "TEXT", "quantization": "TEXT", + # Workflow-specific analysis fields (JSON lists for the *_refs classes). + "workflow_format": "TEXT DEFAULT ''", + "node_count": "INTEGER DEFAULT 0", + "node_classes": "TEXT", + "model_refs": "TEXT", + "civitai_refs": "TEXT", } for column, definition in required_columns.items(): @@ -831,6 +877,11 @@ class PersistentModelCache: item.get("hf_url") or "", item.get("source_model_id") or "", item.get("source_version_id") or "", + item.get("workflow_format") or "", + int(item.get("node_count") or 0), + _json_list_or_none(item.get("node_classes")), + _json_list_or_none(item.get("model_refs")), + _json_list_or_none(item.get("civitai_refs")), ) def _insert_model_sql(self) -> str: diff --git a/py/services/service_registry.py b/py/services/service_registry.py index 99b9e997..b86649c9 100644 --- a/py/services/service_registry.py +++ b/py/services/service_registry.py @@ -356,6 +356,27 @@ class ServiceRegistry: logger.debug(f"Created and registered {service_name}") return scanner + @classmethod + async def get_workflow_scanner(cls): + """Get or create Workflow scanner instance""" + service_name = "workflow_scanner" + + if service_name in cls._services: + return cls._services[service_name] + + async with cls._get_lock(service_name): + # Double-check after acquiring lock + if service_name in cls._services: + return cls._services[service_name] + + # Import here to avoid circular imports + from .workflow_scanner import WorkflowScanner + + scanner = await WorkflowScanner.get_instance() + cls._services[service_name] = scanner + logger.debug(f"Created and registered {service_name}") + return scanner + @classmethod def clear_services(cls): """Clear all registered services - mainly for testing""" diff --git a/py/services/settings_manager.py b/py/services/settings_manager.py index a03c5355..5a1cde7b 100644 --- a/py/services/settings_manager.py +++ b/py/services/settings_manager.py @@ -130,6 +130,8 @@ DEFAULT_SETTINGS: Dict[str, Any] = { # for download until the user turns the feature on. "enable_other_models": False, "enabled_other_sub_types": list(DEFAULT_ENABLED_OTHER_SUB_TYPES), + # Workflow management is likewise opt-in (ComfyUI workflow JSON library). + "enable_workflows": False, "recipes_path": "", "sidecar_storage_mode": "alongside", "sidecar_storage_path": "", @@ -819,6 +821,40 @@ class SettingsManager: """Return True when the opt-in Other Models management is enabled.""" return bool(self.settings.get("enable_other_models", False)) + def is_workflows_enabled(self) -> bool: + """Return True when the opt-in Workflow management is enabled.""" + return bool(self.settings.get("enable_workflows", False)) + + def get_workflow_folder_paths(self) -> List[str]: + """Workflow roots configured for the active library (normalized).""" + folder_paths = self.settings.get("folder_paths", {}) + if not isinstance(folder_paths, Mapping): + return [] + normalized = self._normalize_folder_paths( + {"workflows": folder_paths.get("workflows", [])} + ) + return normalized.get("workflows", []) + + def set_workflow_folder_paths(self, paths: Any) -> List[str]: + """Replace the active library's workflow roots and apply them live. + + Unlike the core folder_paths keys (host-owned in plugin mode, applied + on restart in standalone), workflow roots are LoRA-Manager-only in + both modes, so they merge into the stored folder_paths map and take + effect immediately via ``_apply_workflow_settings_change``. + """ + normalized = self._normalize_folder_paths({"workflows": paths}).get( + "workflows", [] + ) + folder_paths = dict(self.settings.get("folder_paths") or {}) + if normalized: + folder_paths["workflows"] = normalized + else: + folder_paths.pop("workflows", None) + self.set("folder_paths", folder_paths) + self._apply_workflow_settings_change() + return normalized + def get_enabled_other_sub_types(self) -> List[str]: """Return the enabled other-model sub_types (empty when the feature is off).""" if not self.is_other_models_enabled(): @@ -851,6 +887,28 @@ class SettingsManager: except Exception as exc: # pragma: no cover - defensive logging logger.debug("Failed to refresh other scanner after settings change: %s", exc) + def _apply_workflow_settings_change(self) -> None: + """Rebuild workflow roots and refresh the workflow scanner after a toggle.""" + try: + from ..config import config # Local import to avoid circular dependency + + config.refresh_workflow_roots() + except Exception as exc: # pragma: no cover - defensive logging + logger.debug("Failed to refresh workflow roots: %s", exc) + + try: + from .service_registry import ServiceRegistry # pyright: ignore[reportImportCycles] + + scanner = ServiceRegistry.get_service_sync("workflow_scanner") + if scanner is not None and hasattr(scanner, "on_library_changed"): + # reconcile=True lets the scanner pick up newly enabled roots and + # purge rows for folders that are no longer managed. + scanner.on_library_changed(reconcile=True) + except Exception as exc: # pragma: no cover - defensive logging + logger.debug( + "Failed to refresh workflow scanner after settings change: %s", exc + ) + def _has_configured_paths(self, folder_paths: Any) -> bool: if not isinstance(folder_paths, Mapping): return False @@ -2036,6 +2094,8 @@ class SettingsManager: value = normalize_other_sub_types(value) elif key == "enable_other_models": value = bool(value) + elif key == "enable_workflows": + value = bool(value) elif key == "recipes_path": current_recipes_dir = self._get_effective_recipes_dir() value = self._normalize_recipes_path_value(value) @@ -2082,6 +2142,8 @@ class SettingsManager: self._refresh_sidecar_storage_config() if key in ("enable_other_models", "enabled_other_sub_types"): self._apply_other_model_settings_change() + if key == "enable_workflows": + self._apply_workflow_settings_change() if portable_switch_pending: self._finalize_portable_switch() diff --git a/py/services/workflow_scanner.py b/py/services/workflow_scanner.py new file mode 100644 index 00000000..5c2dd367 --- /dev/null +++ b/py/services/workflow_scanner.py @@ -0,0 +1,126 @@ +"""Scanner for ComfyUI workflow resources (.json graph documents).""" + +from __future__ import annotations + +import logging +import os +from datetime import datetime +from typing import List, Optional + +from ..config import config +from ..utils.file_utils import ( + calculate_sha256, + find_preview_file, + normalize_path, +) +from ..utils.metadata_manager import MetadataManager +from ..utils.models import WorkflowMetadata +from ..utils.sidecar_paths import get_preview_dir +from ..utils.workflow_analysis import analyze_workflow_file +from .model_hash_index import ModelHashIndex +from .model_scanner import ModelScanner + +logger = logging.getLogger(__name__) + +# Sidecar files share the .json extension; they must never enter the library. +_SIDECAR_SUFFIXES = (".metadata.json",) + + +class WorkflowScanner(ModelScanner): + """Scan and manage ComfyUI workflow JSON files. + + Unlike weight files, workflow JSON is cheap to hash (eager SHA256) and its + "metadata" comes from parsing the graph itself rather than a safetensors + header. Non-workflow JSON documents (settings, sidecars, ...) are rejected + by format sniffing and never enter the cache. + """ + + def __init__(self): + super().__init__( + model_type="workflow", + model_class=WorkflowMetadata, + file_extensions={".json"}, + hash_index=ModelHashIndex(), + ) + + def _is_indexable_filename(self, filename: str) -> bool: + lowered = filename.lower() + return not lowered.endswith(_SIDECAR_SUFFIXES) + + def get_model_roots(self) -> List[str]: + """Workflow roots (primary + extra), empty while the feature is off.""" + try: + from .settings_manager import get_settings_manager + + if not get_settings_manager().is_workflows_enabled(): + return [] + except Exception: # pragma: no cover - defensive; settings unavailable + return [] + roots: List[str] = [] + roots.extend(config.workflows_roots or []) + roots.extend(config.extra_workflows_roots or []) + seen: set[str] = set() + unique_roots: List[str] = [] + for root in roots: + if root and root not in seen: + seen.add(root) + unique_roots.append(root) + return unique_roots + + async def _create_default_metadata( + self, file_path: str + ) -> Optional[WorkflowMetadata]: + """Create metadata by hashing the file and parsing the workflow graph. + + Returns None for JSON documents that are not ComfyUI workflows, so + they stay out of the library. + """ + try: + real_path = os.path.realpath(file_path) + if not os.path.exists(real_path): + logger.error(f"File not found: {file_path}") + return None + + analysis = analyze_workflow_file(real_path) + if analysis is None: + logger.debug(f"Skipping non-workflow JSON: {file_path}") + return None + + base_name = os.path.splitext(os.path.basename(file_path))[0] + preview_url = find_preview_file(base_name, get_preview_dir(file_path)) + sha256 = await calculate_sha256(real_path) + if not sha256: + logger.warning( + f"Skipping metadata creation for empty workflow file: {file_path}" + ) + return None + + metadata = WorkflowMetadata( + file_name=base_name, + model_name=base_name, + file_path=normalize_path(file_path), + size=os.path.getsize(real_path), + modified=datetime.now().timestamp(), + sha256=sha256, + base_model="Unknown", + preview_url=normalize_path(preview_url), + tags=[], + modelDescription="", + from_civitai=False, + workflow_format=analysis.workflow_format, + node_count=analysis.node_count, + node_classes=analysis.node_classes, + model_refs=analysis.model_refs, + civitai_refs=analysis.civitai_refs, + ) + + logger.info(f"Creating workflow metadata for {file_path}") + await MetadataManager.save_metadata(file_path, metadata) + + return metadata + + except Exception as e: + logger.error( + f"Error creating default workflow metadata for {file_path}: {e}" + ) + return None diff --git a/py/services/workflow_service.py b/py/services/workflow_service.py new file mode 100644 index 00000000..20ad2919 --- /dev/null +++ b/py/services/workflow_service.py @@ -0,0 +1,84 @@ +import os +import logging +from typing import Any, Dict, Optional + +from .base_model_service import BaseModelService +from .auto_tag_service import extract_auto_tags +from ..utils.models import WorkflowMetadata +from ..config import config + +logger = logging.getLogger(__name__) + + +class WorkflowService(BaseModelService): + """Workflow-specific service implementation (ComfyUI workflow JSON).""" + + def __init__(self, scanner, update_service=None): + """Initialize Workflow service + + Args: + scanner: Workflow scanner instance + update_service: Optional service for remote update tracking. + """ + super().__init__( + "workflow", scanner, WorkflowMetadata, update_service=update_service + ) + + async def format_response(self, model_data: Dict[str, Any]) -> Optional[Dict[str, Any]]: + """Format workflow data for API response. + + Returns None when the entry is missing critical fields (corrupted cache + row), so the handler layer can filter it out. See issue #730. + """ + file_path = model_data.get("file_path") + if not file_path or not isinstance(file_path, str): + logger.warning( + "Skipping corrupted workflow entry (missing file_path): %s", + model_data.get("file_name", ""), + ) + return None + + file_name = model_data.get("file_name") or "" + model_name = model_data.get("model_name") or file_name + folder = model_data.get("folder") or "" + + return { + "model_name": model_name, + "file_name": file_name, + "preview_url": config.get_preview_static_url(model_data.get("preview_url", "")), + "preview_nsfw_level": model_data.get("preview_nsfw_level", 0), + "base_model": model_data.get("base_model", ""), + "folder": folder, + "sha256": model_data.get("sha256", ""), + "file_path": file_path.replace(os.sep, "/"), + "file_size": model_data.get("size", 0), + "modified": model_data.get("modified", ""), + "tags": model_data.get("tags", []), + "from_civitai": model_data.get("from_civitai", True), + "notes": model_data.get("notes", ""), + "sub_type": "workflow", + "favorite": model_data.get("favorite", False), + "exclude": bool(model_data.get("exclude", False)), + "update_available": bool(model_data.get("update_available", False)), + "skip_metadata_refresh": bool(model_data.get("skip_metadata_refresh", False)), + "civitai": self.filter_civitai_data(model_data.get("civitai", {}), minimal=True), + "auto_tags": model_data.get("auto_tags") or extract_auto_tags(model_data), + "version_count": model_data.get("version_count"), + "source_platform": model_data.get("source_platform", ""), + "source_url": model_data.get("source_url", ""), + "source_model_id": model_data.get("source_model_id", ""), + "source_version_id": model_data.get("source_version_id", ""), + "workflow_format": model_data.get("workflow_format", ""), + "node_count": model_data.get("node_count", 0), + "node_classes": model_data.get("node_classes", []), + "model_refs": model_data.get("model_refs", []), + "civitai_refs": model_data.get("civitai_refs", []), + } + + def find_duplicate_hashes(self) -> Dict[str, Any]: + """Find workflows with duplicate SHA256 hashes""" + return self.scanner._hash_index.get_duplicate_hashes() + + def find_duplicate_filenames(self) -> Dict[str, Any]: + """Find workflows with conflicting filenames""" + return self.scanner._hash_index.get_duplicate_filenames() diff --git a/py/utils/constants.py b/py/utils/constants.py index dcaaa61d..c07e4752 100644 --- a/py/utils/constants.py +++ b/py/utils/constants.py @@ -152,6 +152,9 @@ def folder_path_schema() -> List[Dict[str, Any]]: {"key": key, "category": "core", "sub_type": None} for key in CORE_FOLDER_PATH_KEYS ] + # Workflow roots are LoRA-Manager-only (no ComfyUI folder category); the + # standalone Model Paths UI gates this editor on ``enable_workflows``. + schema.append({"key": "workflows", "category": "workflow", "sub_type": None}) schema.extend( {"key": folder_key, "category": "other", "sub_type": sub_type} for folder_key, sub_type in OTHER_MODEL_FOLDER_SUBTYPES.items() diff --git a/py/utils/directory_browser.py b/py/utils/directory_browser.py index 4f3b5008..9232fae3 100644 --- a/py/utils/directory_browser.py +++ b/py/utils/directory_browser.py @@ -43,7 +43,11 @@ def browse_directory(directory_path: str) -> Tuple[Dict[str, Any], int]: if not directory_path: path = Path.home() else: - path = Path(directory_path).expanduser().resolve() + # Business-path convention: normalize lexically with abspath but + # never resolve symlinks (no resolve()/realpath). The picker result + # is stored as a configured library path, and stored paths must + # match what the user sees on disk. + path = Path(os.path.abspath(os.path.expanduser(directory_path))) # Access check: browsing intentionally covers the whole server # filesystem (the server operator browses their own machine). On diff --git a/py/utils/models.py b/py/utils/models.py index 84df530b..60b5443c 100644 --- a/py/utils/models.py +++ b/py/utils/models.py @@ -488,3 +488,55 @@ class EmbeddingMetadata(BaseModelMetadata): # Direct read: the downloaded file IS file_info, no SHA256 matching. autov3=normalize_autov3((file_info.get("hashes") or {}).get("AutoV3")), ) + + +@dataclass +class WorkflowMetadata(BaseModelMetadata): + """Represents the metadata structure for a ComfyUI workflow resource. + + Workflows are JSON graph documents (CivitAI model type ``Workflows`` / + retired ``ComfyWorkflows``), managed like any other model: dedicated roots, + sidecar metadata, previews, and version tracking. The workflow-specific + fields are populated by ``py.utils.workflow_analysis`` during scanning. + """ + + sub_type: str = "workflow" + workflow_format: str = "" # "ui" | "api"; empty until analyzed + node_count: int = 0 + node_classes: List[str] = field(default_factory=list) + model_refs: List[str] = field(default_factory=list) + civitai_refs: List[str] = field(default_factory=list) + + @classmethod + def from_civitai_info( + cls, version_info: Dict[str, Any], file_info: Dict[str, Any], save_path: str + ) -> "WorkflowMetadata": + """Create WorkflowMetadata instance from Civitai version info""" + file_name = file_info.get("name", "") + base_name = strip_model_extension(file_name) + base_model = determine_base_model(version_info.get("baseModel", "")) + sha256_value = (file_info.get("hashes") or {}).get("SHA256", "").lower() + + tags = [] + description = "" + model_data = version_info.get("model") or {} + if "tags" in model_data: + tags = model_data["tags"] + if "description" in model_data: + description = model_data["description"] + + return cls( + file_name=base_name, + model_name=model_data.get("name", base_name), + file_path=save_path.replace(os.sep, "/"), + size=file_info.get("sizeKB", 0) * 1024, + modified=datetime.now().timestamp(), + sha256=sha256_value, + base_model=base_model, + preview_url="", # Will be updated after preview download + preview_nsfw_level=0, + from_civitai=True, + civitai=version_info, + tags=tags, + modelDescription=description, + ) diff --git a/py/utils/workflow_analysis.py b/py/utils/workflow_analysis.py new file mode 100644 index 00000000..be8173b7 --- /dev/null +++ b/py/utils/workflow_analysis.py @@ -0,0 +1,178 @@ +"""ComfyUI workflow JSON sniffing and analysis. + +Shared by the workflow scanner (library indexing) and, eventually, the recipe +parsers: both need to recognize ComfyUI workflow documents and extract the +models and node classes they reference. + +Two on-disk shapes exist: + +- UI format (``File > Save`` in ComfyUI): ``{"nodes": [...], "links": [...], ...}`` +- API format (queue prompt payload): ``{"": {"class_type": ..., "inputs": {...}}}`` +""" + +from __future__ import annotations + +import json +import logging +import re +from dataclasses import dataclass, field +from typing import Any, Dict, List, Optional, Set + +from .constants import MODEL_FILE_EXTENSIONS + +logger = logging.getLogger(__name__) + +WORKFLOW_FORMAT_UI = "ui" +WORKFLOW_FORMAT_API = "api" + +# Workflows are small JSON documents; anything larger is almost certainly not +# a graph (or is pathological) and is not worth parsing during a scan. +MAX_WORKFLOW_JSON_BYTES = 64 * 1024 * 1024 + +_CIVITAI_URN_PATTERN = re.compile(r"civitai:(\d+)@(\d+)") + +# Loader input keys whose string values name a model file. Used for the API +# format; the UI format is handled by the generic extension scan below. +_LOADER_INPUT_KEYS = frozenset( + { + "lora_name", + "ckpt_name", + "unet_name", + "vae_name", + "clip_name", + "control_net_name", + "embedding_name", + "model_name", + } +) + + +@dataclass +class WorkflowAnalysis: + """Structured facts extracted from a ComfyUI workflow document.""" + + workflow_format: str + node_count: int = 0 + node_classes: List[str] = field(default_factory=list) + model_refs: List[str] = field(default_factory=list) + civitai_refs: List[str] = field(default_factory=list) + + +def _sniff(data: Any) -> Optional[str]: + """Return the workflow format for a parsed JSON document, or None.""" + if not isinstance(data, dict): + return None + nodes = data.get("nodes") + links = data.get("links") + if isinstance(nodes, list) and nodes and isinstance(links, list): + return WORKFLOW_FORMAT_UI + # API format: a non-empty mapping of node id -> {class_type, inputs}. + if data and all( + isinstance(value, dict) and "class_type" in value for value in data.values() + ): + return WORKFLOW_FORMAT_API + return None + + +def sniff_workflow_text(text: str) -> Optional[str]: + """Sniff raw JSON text; returns the workflow format or None.""" + try: + data = json.loads(text) + except (TypeError, ValueError): + return None + return _sniff(data) + + +def load_workflow_file(file_path: str) -> Optional[Dict[str, Any]]: + """Load and sniff a workflow JSON file. + + Returns the parsed document when it is a recognized ComfyUI workflow, + None otherwise (unreadable, oversized, invalid JSON, or not a workflow). + """ + try: + with open(file_path, "r", encoding="utf-8") as handle: + text = handle.read(MAX_WORKFLOW_JSON_BYTES + 1) + except (OSError, UnicodeDecodeError) as exc: + logger.debug("Workflow file unreadable: %s (%s)", file_path, exc) + return None + if len(text) > MAX_WORKFLOW_JSON_BYTES: + return None + try: + data = json.loads(text) + except ValueError: + return None + if _sniff(data) is None: + return None + return data + + +def _walk_strings(value: Any, out: List[str], depth: int = 0) -> None: + """Collect every string scalar in a JSON structure (bounded depth).""" + if depth > 12 or len(out) > 10000: + return + if isinstance(value, str): + out.append(value) + elif isinstance(value, dict): + for item in value.values(): + _walk_strings(item, out, depth + 1) + elif isinstance(value, (list, tuple)): + for item in value: + _walk_strings(item, out, depth + 1) + + +def analyze_workflow(data: Dict[str, Any]) -> Optional[WorkflowAnalysis]: + """Analyze a parsed workflow document. None when not a workflow.""" + workflow_format = _sniff(data) + if workflow_format is None: + return None + + node_classes: Set[str] = set() + node_count = 0 + + if workflow_format == WORKFLOW_FORMAT_API: + node_count = len(data) + for node in data.values(): + class_type = node.get("class_type") + if isinstance(class_type, str) and class_type: + node_classes.add(class_type) + else: + nodes = data.get("nodes") or [] + node_count = len(nodes) + for node in nodes: + if not isinstance(node, dict): + continue + class_type = node.get("type") + if isinstance(class_type, str) and class_type: + node_classes.add(class_type) + + strings: List[str] = [] + _walk_strings(data, strings) + + model_refs: Set[str] = set() + civitai_refs: Set[str] = set() + for value in strings: + for match in _CIVITAI_URN_PATTERN.finditer(value): + civitai_refs.add(f"civitai:{match.group(1)}@{match.group(2)}") + lowered = value.lower() + if any(lowered.endswith(ext) for ext in MODEL_FILE_EXTENSIONS): + # Widget values are single model filenames; skip strings that + # clearly carry more (URLs, prompts with punctuation-heavy tails + # still end in an extension, so also bound the length). + if len(value) <= 260 and " " not in value.strip(): + model_refs.add(value.strip()) + + return WorkflowAnalysis( + workflow_format=workflow_format, + node_count=node_count, + node_classes=sorted(node_classes), + model_refs=sorted(model_refs), + civitai_refs=sorted(civitai_refs), + ) + + +def analyze_workflow_file(file_path: str) -> Optional[WorkflowAnalysis]: + """Load + analyze a workflow file; None when it is not a workflow.""" + data = load_workflow_file(file_path) + if data is None: + return None + return analyze_workflow(data) diff --git a/static/js/api/apiConfig.js b/static/js/api/apiConfig.js index 5e57a808..583fe635 100644 --- a/static/js/api/apiConfig.js +++ b/static/js/api/apiConfig.js @@ -10,7 +10,8 @@ export const MODEL_TYPES = { LORA: 'loras', CHECKPOINT: 'checkpoints', EMBEDDING: 'embeddings', - OTHER: 'other' + OTHER: 'other', + WORKFLOW: 'workflows' }; // Base API configuration for each model type @@ -54,6 +55,16 @@ export const MODEL_CONFIG = { supportsMove: true, supportsFolderManagement: true, templateName: 'other.html' + }, + [MODEL_TYPES.WORKFLOW]: { + displayName: 'Workflow', + singularName: 'workflow', + defaultPageSize: 100, + supportsLetterFilter: false, + supportsBulkOperations: true, + supportsMove: true, + supportsFolderManagement: true, + templateName: 'workflows.html' } }; @@ -168,6 +179,10 @@ export const MODEL_SPECIFIC_ENDPOINTS = { [MODEL_TYPES.OTHER]: { metadata: `/api/lm/${MODEL_TYPES.OTHER}/metadata`, roots_by_subtype: `/api/lm/${MODEL_TYPES.OTHER}/roots_by_subtype`, + }, + [MODEL_TYPES.WORKFLOW]: { + metadata: `/api/lm/${MODEL_TYPES.WORKFLOW}/metadata`, + sendToComfy: `/api/lm/${MODEL_TYPES.WORKFLOW}/send-to-comfy`, } }; diff --git a/static/js/api/modelApiFactory.js b/static/js/api/modelApiFactory.js index c5ef1469..497aad42 100644 --- a/static/js/api/modelApiFactory.js +++ b/static/js/api/modelApiFactory.js @@ -2,6 +2,7 @@ import { LoraApiClient } from './loraApi.js'; import { CheckpointApiClient } from './checkpointApi.js'; import { EmbeddingApiClient } from './embeddingApi.js'; import { OtherApiClient } from './otherApi.js'; +import { WorkflowApiClient } from './workflowApi.js'; import { MODEL_TYPES, isValidModelType } from './apiConfig.js'; import { state } from '../state/index.js'; @@ -15,6 +16,8 @@ export function createModelApiClient(modelType) { return new EmbeddingApiClient(MODEL_TYPES.EMBEDDING); case MODEL_TYPES.OTHER: return new OtherApiClient(MODEL_TYPES.OTHER); + case MODEL_TYPES.WORKFLOW: + return new WorkflowApiClient(MODEL_TYPES.WORKFLOW); default: throw new Error(`Unsupported model type: ${modelType}`); } diff --git a/static/js/api/workflowApi.js b/static/js/api/workflowApi.js new file mode 100644 index 00000000..f10911e3 --- /dev/null +++ b/static/js/api/workflowApi.js @@ -0,0 +1,23 @@ +import { BaseModelApiClient } from './baseModelApi.js'; + +/** + * Workflow-specific API client (ComfyUI workflow JSON resources) + */ +export class WorkflowApiClient extends BaseModelApiClient { + /** + * Push a library workflow into the running ComfyUI graph. + * POST /api/lm/workflows/send-to-comfy { file_path } + */ + async sendToComfy(filePath) { + const response = await fetch(this.apiConfig.endpoints.specific.sendToComfy, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ file_path: filePath }), + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || data.message || `HTTP ${response.status}`); + } + return data; + } +} diff --git a/static/js/components/ContextMenu/ModelContextMenuMixin.js b/static/js/components/ContextMenu/ModelContextMenuMixin.js index 5f3c5397..2a29f67c 100644 --- a/static/js/components/ContextMenu/ModelContextMenuMixin.js +++ b/static/js/components/ContextMenu/ModelContextMenuMixin.js @@ -115,7 +115,8 @@ export const ModelContextMenuMixin = { lora: 'loras', checkpoint: 'checkpoints', embedding: 'embeddings', - other: 'other' + other: 'other', + workflow: 'workflows' }; return prefixMap[this.modelType] || 'loras'; }, diff --git a/static/js/components/ContextMenu/WorkflowContextMenu.js b/static/js/components/ContextMenu/WorkflowContextMenu.js new file mode 100644 index 00000000..b4ea276e --- /dev/null +++ b/static/js/components/ContextMenu/WorkflowContextMenu.js @@ -0,0 +1,86 @@ +import { BaseContextMenu } from './BaseContextMenu.js'; +import { ModelContextMenuMixin } from './ModelContextMenuMixin.js'; +import { getModelApiClient, resetAndReload } from '../../api/modelApiFactory.js'; +import { moveManager } from '../../managers/MoveManager.js'; +import { showDeleteModal, showExcludeModal } from '../../utils/modalUtils.js'; +import { showToast } from '../../utils/uiHelpers.js'; + +export class WorkflowContextMenu extends BaseContextMenu { + constructor() { + super('workflowContextMenu', '.model-card'); + this.nsfwSelector = document.getElementById('nsfwLevelSelector'); + this.modelType = 'workflows'; + this.resetAndReload = resetAndReload; + + this.initNSFWSelector(); + } + + // Implementation needed by the mixin + async saveModelMetadata(filePath, data) { + return getModelApiClient().saveModelMetadata(filePath, data); + } + + showMenu(x, y, card) { + super.showMenu(x, y, card); + this.updateExcludeMenuItem(); + } + + handleMenuAction(action) { + // First try to handle with common actions + if (ModelContextMenuMixin.handleCommonMenuActions.call(this, action)) { + return; + } + + const apiClient = getModelApiClient(); + + // Otherwise handle workflow-specific actions + switch(action) { + case 'details': + // Show workflow details + this.currentCard.click(); + break; + case 'send-to-comfy': + this.sendToComfy(this.currentCard.dataset.filepath); + break; + case 'replace-preview': + // Add new action for replacing preview images + apiClient.replaceModelPreview(this.currentCard.dataset.filepath); + break; + case 'delete': + showDeleteModal(this.currentCard.dataset.filepath); + break; + case 'copyname': + // Copy workflow name + if (this.currentCard.querySelector('.fa-copy')) { + this.currentCard.querySelector('.fa-copy').click(); + } + break; + case 'refresh-metadata': + // Refresh metadata from CivitAI + apiClient.refreshSingleModelMetadata(this.currentCard.dataset.filepath); + break; + case 'move': + moveManager.showMoveModal(this.currentCard.dataset.filepath); + break; + case 'exclude': + showExcludeModal(this.currentCard.dataset.filepath); + break; + case 'restore': + this.restoreExcludedModel(this.currentCard.dataset.filepath); + break; + } + } + + async sendToComfy(filePath) { + try { + await getModelApiClient().sendToComfy(filePath); + showToast('workflows.sendToComfy.success', {}, 'success'); + } catch (error) { + console.error('Failed to send workflow to ComfyUI:', error); + showToast('workflows.sendToComfy.failed', { message: error.message }, 'error'); + } + } +} + +// Mix in shared methods +Object.assign(WorkflowContextMenu.prototype, ModelContextMenuMixin); diff --git a/static/js/components/ContextMenu/index.js b/static/js/components/ContextMenu/index.js index a629cd4e..474331b5 100644 --- a/static/js/components/ContextMenu/index.js +++ b/static/js/components/ContextMenu/index.js @@ -3,6 +3,7 @@ export { RecipeContextMenu } from './RecipeContextMenu.js'; export { CheckpointContextMenu } from './CheckpointContextMenu.js'; export { EmbeddingContextMenu } from './EmbeddingContextMenu.js'; export { OtherContextMenu } from './OtherContextMenu.js'; +export { WorkflowContextMenu } from './WorkflowContextMenu.js'; export { GlobalContextMenu } from './GlobalContextMenu.js'; export { ModelContextMenuMixin } from './ModelContextMenuMixin.js'; @@ -11,6 +12,7 @@ import { RecipeContextMenu } from './RecipeContextMenu.js'; import { CheckpointContextMenu } from './CheckpointContextMenu.js'; import { EmbeddingContextMenu } from './EmbeddingContextMenu.js'; import { OtherContextMenu } from './OtherContextMenu.js'; +import { WorkflowContextMenu } from './WorkflowContextMenu.js'; import { GlobalContextMenu } from './GlobalContextMenu.js'; // Factory method to create page-specific context menu instances @@ -26,6 +28,8 @@ export function createPageContextMenu(pageType) { return new EmbeddingContextMenu(); case 'other': return new OtherContextMenu(); + case 'workflows': + return new WorkflowContextMenu(); default: return null; } diff --git a/static/js/components/Header.js b/static/js/components/Header.js index af702313..ecd2b691 100644 --- a/static/js/components/Header.js +++ b/static/js/components/Header.js @@ -33,6 +33,7 @@ export class HeaderManager { if (path.includes('/checkpoints')) return 'checkpoints'; if (path.includes('/embeddings')) return 'embeddings'; if (path.includes('/other')) return 'other'; + if (path.includes('/workflows')) return 'workflows'; if (path.includes('/statistics')) return 'statistics'; if (path.includes('/loras')) return 'loras'; return 'unknown'; diff --git a/static/js/components/SidebarManager.js b/static/js/components/SidebarManager.js index 60d58904..c244762a 100644 --- a/static/js/components/SidebarManager.js +++ b/static/js/components/SidebarManager.js @@ -3563,7 +3563,7 @@ export class SidebarManager { _migrateOldSettings() { if (getStorageItem('_sidebar_migration_done')) return; - const PAGES = ['loras', 'recipes', 'checkpoints', 'embeddings', 'other']; + const PAGES = ['loras', 'recipes', 'checkpoints', 'embeddings', 'other', 'workflows']; // 1. Migrate global hide setting to per-page if (state?.global?.settings?.show_folder_sidebar === false) { diff --git a/static/js/components/controls/WorkflowControls.js b/static/js/components/controls/WorkflowControls.js new file mode 100644 index 00000000..6e4515bd --- /dev/null +++ b/static/js/components/controls/WorkflowControls.js @@ -0,0 +1,62 @@ +// WorkflowControls.js - Specific implementation for the Workflows page +import { PageControls } from './PageControls.js'; +import { getModelApiClient, resetAndReload } from '../../api/modelApiFactory.js'; +import { showToast } from '../../utils/uiHelpers.js'; +import { downloadManager } from '../../managers/DownloadManager.js'; + +/** + * WorkflowControls class - Extends PageControls for the Workflows page + * (ComfyUI workflow JSON resources) + */ +export class WorkflowControls extends PageControls { + constructor() { + // Initialize with 'workflows' page type + super('workflows'); + + // Register API methods specific to the Workflows page + this.registerWorkflowAPI(); + } + + /** + * Register workflow-specific API methods + */ + registerWorkflowAPI() { + const workflowAPI = { + // Core API functions + loadMoreModels: async (resetPage = false, updateFolders = false) => { + return await getModelApiClient().loadMoreWithVirtualScroll(resetPage, updateFolders); + }, + + resetAndReload: async (updateFolders = false) => { + return await resetAndReload(updateFolders); + }, + + // Add fetch from Civitai functionality for workflows + fetchFromCivitai: async () => { + return await getModelApiClient().fetchCivitaiMetadata(); + }, + + // Add show download modal functionality + showDownloadModal: () => { + downloadManager.showDownloadModal(); + }, + + toggleBulkMode: () => { + if (window.bulkManager) { + window.bulkManager.toggleBulkMode(); + } else { + console.error('Bulk manager not available'); + } + }, + + // No clearCustomFilter implementation is needed for workflows + // as custom filters are currently only used for LoRAs + clearCustomFilter: async () => { + showToast('toast.filters.noCustomFilterToClear', {}, 'info'); + } + }; + + // Register the API + this.registerAPI(workflowAPI); + } +} diff --git a/static/js/components/controls/index.js b/static/js/components/controls/index.js index 5d1dcaa6..4ff8585e 100644 --- a/static/js/components/controls/index.js +++ b/static/js/components/controls/index.js @@ -4,13 +4,14 @@ import { LorasControls } from './LorasControls.js'; import { CheckpointsControls } from './CheckpointsControls.js'; import { EmbeddingsControls } from './EmbeddingsControls.js'; import { OtherControls } from './OtherControls.js'; +import { WorkflowControls } from './WorkflowControls.js'; // Export the classes -export { PageControls, LorasControls, CheckpointsControls, EmbeddingsControls, OtherControls }; +export { PageControls, LorasControls, CheckpointsControls, EmbeddingsControls, OtherControls, WorkflowControls }; /** * Factory function to create the appropriate controls based on page type - * @param {string} pageType - The type of page ('loras', 'checkpoints', 'embeddings', or 'other') + * @param {string} pageType - The type of page ('loras', 'checkpoints', 'embeddings', 'other', or 'workflows') * @returns {PageControls} - The appropriate controls instance */ export function createPageControls(pageType) { @@ -22,6 +23,8 @@ export function createPageControls(pageType) { return new EmbeddingsControls(); } else if (pageType === 'other') { return new OtherControls(); + } else if (pageType === 'workflows') { + return new WorkflowControls(); } else { console.error(`Unknown page type: ${pageType}`); return null; diff --git a/static/js/components/first_run.js b/static/js/components/first_run.js index 10a296c3..949368cf 100644 --- a/static/js/components/first_run.js +++ b/static/js/components/first_run.js @@ -10,7 +10,7 @@ import { setStorageItem } from '../utils/storageHelpers.js'; import { state } from '../state/index.js'; import { escapeHtml } from './shared/utils.js'; -const LIBRARY_ORDER = ['loras', 'checkpoints', 'embeddings', 'other']; +const LIBRARY_ORDER = ['loras', 'checkpoints', 'embeddings', 'other', 'workflows']; class FirstRunManager { constructor() { diff --git a/static/js/components/initialization.js b/static/js/components/initialization.js index 0f696772..2c9c0803 100644 --- a/static/js/components/initialization.js +++ b/static/js/components/initialization.js @@ -79,6 +79,8 @@ class InitializationManager { this.pageType = 'checkpoints'; } else if (path.includes('/other')) { this.pageType = 'other'; + } else if (path.includes('/workflows')) { + this.pageType = 'workflows'; } else if (path.includes('/loras')) { this.pageType = 'loras'; } else if (path.includes('/embeddings')) { @@ -268,6 +270,7 @@ class InitializationManager { 'checkpoint': 'checkpoints', 'embedding': 'embeddings', 'other': 'other', + 'workflow': 'workflows', 'recipe': 'recipes' }; diff --git a/static/js/core.js b/static/js/core.js index 9a649179..67afd820 100644 --- a/static/js/core.js +++ b/static/js/core.js @@ -118,7 +118,7 @@ export class AppCore { initializePageFeatures() { const pageType = this.getPageType(); - if (['loras', 'recipes', 'checkpoints', 'embeddings', 'other'].includes(pageType)) { + if (['loras', 'recipes', 'checkpoints', 'embeddings', 'other', 'workflows'].includes(pageType)) { this.initializeContextMenus(pageType); initializeInfiniteScroll(pageType); } diff --git a/static/js/managers/BannerService.js b/static/js/managers/BannerService.js index 13b66b55..38ba2cde 100644 --- a/static/js/managers/BannerService.js +++ b/static/js/managers/BannerService.js @@ -541,6 +541,7 @@ class BannerService { if (path.includes('/checkpoints')) return 'checkpoints'; if (path.includes('/embeddings')) return 'embeddings'; if (path.includes('/other')) return 'other'; + if (path.includes('/workflows')) return 'workflows'; if (path.includes('/recipes')) return 'recipes'; return 'loras'; } @@ -555,7 +556,8 @@ class BannerService { 'loras': '/api/lm/loras/reload?rebuild=true', 'checkpoints': '/api/lm/checkpoints/reload?rebuild=true', 'embeddings': '/api/lm/embeddings/reload?rebuild=true', - 'other': '/api/lm/other/reload?rebuild=true' + 'other': '/api/lm/other/reload?rebuild=true', + 'workflows': '/api/lm/workflows/reload?rebuild=true' }; return endpoints[pageType] || endpoints['loras']; } diff --git a/static/js/managers/FilterManager.js b/static/js/managers/FilterManager.js index 19f9a8ae..2b98ccf5 100644 --- a/static/js/managers/FilterManager.js +++ b/static/js/managers/FilterManager.js @@ -877,7 +877,7 @@ export class FilterManager { // Call the appropriate manager's load method based on page type if (this.currentPage === 'recipes' && window.recipeManager) { await window.recipeManager.loadRecipes(true); - } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other' || this.currentPage === 'workflows') { // For models page, reset the page and reload await getModelApiClient().loadMoreWithVirtualScroll(true, false); } @@ -977,7 +977,7 @@ export class FilterManager { // Reload data using the appropriate method for the current page if (this.currentPage === 'recipes' && window.recipeManager) { await window.recipeManager.loadRecipes(true); - } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other' || this.currentPage === 'workflows') { await getModelApiClient().loadMoreWithVirtualScroll(true, true); } diff --git a/static/js/managers/SearchManager.js b/static/js/managers/SearchManager.js index 4929caf8..396f4113 100644 --- a/static/js/managers/SearchManager.js +++ b/static/js/managers/SearchManager.js @@ -298,7 +298,7 @@ export class SearchManager { pageState.searchOptions.loraName = options.loraName || false; pageState.searchOptions.loraModel = options.loraModel || false; pageState.searchOptions.prompt = options.prompt || false; - } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'checkpoints' || this.currentPage === 'embeddings' || this.currentPage === 'other' || this.currentPage === 'workflows') { // Update only the relevant fields in searchOptions instead of replacing the whole object pageState.searchOptions.filename = options.filename || false; pageState.searchOptions.modelname = options.modelname || false; @@ -310,7 +310,7 @@ export class SearchManager { // Call the appropriate manager's load method based on page type if (this.currentPage === 'recipes' && window.recipeManager) { window.recipeManager.loadRecipes(true); - } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other') { + } else if (this.currentPage === 'loras' || this.currentPage === 'embeddings' || this.currentPage === 'checkpoints' || this.currentPage === 'other' || this.currentPage === 'workflows') { // For models page, reset the page and reload getModelApiClient().loadMoreWithVirtualScroll(true, false); } diff --git a/static/js/managers/SettingsManager.js b/static/js/managers/SettingsManager.js index 574c8e30..0743f080 100644 --- a/static/js/managers/SettingsManager.js +++ b/static/js/managers/SettingsManager.js @@ -1412,6 +1412,9 @@ export class SettingsManager { await this.loadOtherRoots(); this.updateOtherModelsControls(); + // Reflect the opt-in Workflow management toggle + this.updateWorkflowsControls(); + // Load extra folder paths this.loadExtraFolderPaths(); @@ -2439,6 +2442,12 @@ export class SettingsManager { schema.forEach((entry) => { if (entry.category === 'core') { this._buildModelPathTypeGroup(coreHost, entry); + } else if (entry.category === 'workflow') { + // Opt-in like Other Models, but gated on its own master toggle + // (no sub-types) and rendered with the core groups. + if (state.global.settings.enable_workflows === true) { + this._buildModelPathTypeGroup(coreHost, entry); + } } else if (otherModelsEnabled && entry.sub_type && enabledSubTypes.has(entry.sub_type)) { otherCount++; this._buildModelPathTypeGroup(otherHost, entry); @@ -2585,7 +2594,11 @@ export class SettingsManager { async updateModelFolderPaths(changedKey, { fromRemoval = false } = {}) { this._clearAllModelFolderPathErrors(); - const folderPaths = {}; + // Start from the stored map so keys whose editor is not rendered + // (disabled other-model sub-types, workflows while the feature is + // off) survive a save instead of being wiped from the library. + const currentPaths = state.global.settings.folder_paths || {}; + const folderPaths = { ...currentPaths }; const section = document.getElementById('section-modelPaths'); if (!section) return; @@ -2624,7 +2637,6 @@ export class SettingsManager { return; } - const currentPaths = state.global.settings.folder_paths || {}; const pathsChanged = JSON.stringify(currentPaths) !== JSON.stringify(folderPaths); if (!pathsChanged) { @@ -3283,6 +3295,11 @@ export class SettingsManager { this.removeOtherModelsAnnouncement(value); } + if (settingKey === 'enable_workflows') { + this.updateWorkflowsControls(); + this.updateWorkflowsNavVisibility(value); + } + showToast('toast.settings.settingsUpdated', { setting: settingKey.replace(/_/g, ' ') }, 'success'); // Apply frontend settings immediately @@ -3399,6 +3416,138 @@ export class SettingsManager { * its default-root select disabled. Never force-enables a select (the * no-roots placeholder owns that state). */ + /** + * Reflect the opt-in Workflow management state in the settings UI: the + * master toggle gates the workflow folder editor, which edits the active + * library's folder_paths.workflows entry (LoRA-Manager-owned in both + * plugin and standalone mode, applied live without a restart). + */ + updateWorkflowsControls() { + const enabled = !!state.global.settings.enable_workflows; + + const toggle = document.getElementById('enableWorkflows'); + if (toggle) { + toggle.checked = enabled; + } + + const group = document.getElementById('workflowFolderPathsSetting'); + if (group) { + group.style.display = enabled ? '' : 'none'; + } + if (enabled) { + this.loadWorkflowFolderPaths(); + } + } + + loadWorkflowFolderPaths() { + const container = document.getElementById('workflowFolderPaths'); + if (!container) return; + + container.innerHTML = ''; + const paths = state.global.settings.workflow_folder_paths || []; + paths.forEach((path) => { + this.addWorkflowFolderPathRow(path, false); + }); + // No trailing empty row on load: an unconfigured library shows just + // its Add button, and removing a row never resurrects an empty one. + } + + addWorkflowFolderPathRow(path = '', shouldFocus = true) { + const container = document.getElementById('workflowFolderPaths'); + if (!container) return; + + const row = document.createElement('div'); + row.className = 'extra-folder-path-row mapping-row'; + + row.innerHTML = ` +
+ + + +
+ `; + + container.appendChild(row); + + if (!path && shouldFocus) { + const input = row.querySelector('.extra-folder-path-input'); + if (input) { + setTimeout(() => input.focus(), 0); + } + } + } + + browseForWorkflowPathRow(btn) { + const row = btn.closest('.extra-folder-path-row'); + const input = row ? row.querySelector('.extra-folder-path-input') : null; + if (!input) return; + + directoryPickerModal.open({ + initialPath: input.value.trim(), + onSelect: (pickedPath) => { + input.value = pickedPath; + this.updateWorkflowFolderPaths(); + }, + }); + } + + removeWorkflowFolderPathRow(btn) { + const row = btn.closest('.extra-folder-path-row'); + if (row) { + row.remove(); + this.updateWorkflowFolderPaths({ fromRemoval: true }); + } + } + + async updateWorkflowFolderPaths({ fromRemoval = false } = {}) { + const container = document.getElementById('workflowFolderPaths'); + if (!container) return; + + const paths = []; + container.querySelectorAll('.extra-folder-path-input').forEach((input) => { + const value = input.value.trim(); + if (value) { + paths.push(value); + } + }); + + const currentPaths = state.global.settings.workflow_folder_paths || []; + if (JSON.stringify(currentPaths) === JSON.stringify(paths)) { + return; + } + + try { + await this.saveSetting('workflow_folder_paths', paths); + state.global.settings.workflow_folder_paths = paths; + showToast('toast.settings.settingsUpdated', { setting: 'workflow folders' }, 'success'); + + // Keep the continuous-add flow: after the user fills the trailing + // empty row, append a fresh one — but never after a removal. + if (!fromRemoval) { + const inputs = container.querySelectorAll('.extra-folder-path-input'); + const hasEmptyRow = Array.from(inputs).some((input) => !input.value.trim()); + if (!hasEmptyRow) { + this.addWorkflowFolderPathRow(''); + } + } + } catch (error) { + console.error('Failed to save workflow folder paths:', error); + showToast('toast.settings.settingSaveFailed', { message: error.message }, 'error'); + this.loadWorkflowFolderPaths(); + } + } + updateOtherModelsControls() { const enableOtherModels = !!state.global.settings.enable_other_models; const enabledSubTypes = new Set( @@ -3410,7 +3559,6 @@ export class SettingsManager { if (masterToggle) { masterToggle.checked = enableOtherModels; } - document.querySelectorAll('[data-other-subtype-toggle]').forEach((input) => { input.checked = enabledSubTypes.has(input.value); input.disabled = !enableOtherModels; @@ -3464,6 +3612,18 @@ export class SettingsManager { } } + /** + * Show or hide the Workflows nav entry. The nav is server-rendered, so + * toggling the class here keeps it in sync when the switch is flipped from + * the settings modal (no reload needed). + */ + updateWorkflowsNavVisibility(enabled) { + const navItem = document.getElementById('workflowsNavItem'); + if (navItem) { + navItem.classList.toggle('nav-item--hidden', !enabled); + } + } + /** * Drop the Other Models announcement banner once the feature is on. */ diff --git a/static/js/state/index.js b/static/js/state/index.js index a21798c4..8d25f12b 100644 --- a/static/js/state/index.js +++ b/static/js/state/index.js @@ -29,6 +29,8 @@ const DEFAULT_SETTINGS_BASE = Object.freeze({ default_embedding_root: '', default_other_roots: {}, enable_other_models: false, + enable_workflows: false, + workflow_folder_paths: [], enabled_other_sub_types: ['vae', 'upscaler', 'text_encoder'], recipes_path: '', base_model_path_mappings: {}, @@ -107,6 +109,7 @@ const loraPreviewVersions = getMapFromStorage('loras_preview_versions'); const checkpointPreviewVersions = getMapFromStorage('checkpoints_preview_versions'); const embeddingPreviewVersions = getMapFromStorage('embeddings_preview_versions'); const otherPreviewVersions = getMapFromStorage('other_preview_versions'); +const workflowPreviewVersions = getMapFromStorage('workflows_preview_versions'); export const state = { // Global state @@ -296,6 +299,43 @@ export const state = { search: '', }, activeViewSnapshot: null, + }, + + [MODEL_TYPES.WORKFLOW]: { + currentPage: 1, + isLoading: false, + hasMore: true, + sortBy: 'name', + activeFolder: getStorageItem(`${MODEL_TYPES.WORKFLOW}_activeFolder`), + previewVersions: workflowPreviewVersions, + searchManager: null, + searchOptions: { + filename: true, + modelname: true, + tags: false, + creator: false, + recursive: getStorageItem(`${MODEL_TYPES.WORKFLOW}_recursiveSearch`, true), + }, + filters: { + baseModel: [], + tags: {}, + license: {}, + modelTypes: [], + search: '', + tagLogic: 'any', + }, + bulkMode: false, + selectedModels: new Set(), + metadataCache: new Map(), + showFavoritesOnly: false, + showUpdateAvailableOnly: false, + duplicatesMode: false, + viewMode: 'active', + excludedViewState: { + sortBy: 'name:asc', + search: '', + }, + activeViewSnapshot: null, } }, diff --git a/static/js/utils/infiniteScroll.js b/static/js/utils/infiniteScroll.js index 138bceb4..32135f6b 100644 --- a/static/js/utils/infiniteScroll.js +++ b/static/js/utils/infiniteScroll.js @@ -66,7 +66,7 @@ async function getCardCreator(pageType) { // Function to get the appropriate data fetcher based on page type async function getDataFetcher(pageType) { - if (pageType === 'loras' || pageType === 'embeddings' || pageType === 'checkpoints' || pageType === 'other') { + if (pageType === 'loras' || pageType === 'embeddings' || pageType === 'checkpoints' || pageType === 'other' || pageType === 'workflows') { return (page = 1, pageSize = 100) => getModelApiClient().fetchModelsPage(page, pageSize); } else if (pageType === 'recipes') { // Import the recipeApi module and use the fetchRecipesPage function diff --git a/static/js/utils/workflowModels.js b/static/js/utils/workflowModels.js new file mode 100644 index 00000000..2fd79d8b --- /dev/null +++ b/static/js/utils/workflowModels.js @@ -0,0 +1,67 @@ +/** + * Shared helpers for the opt-in Workflow management feature. + * + * Used by the disabled page so that enabling the feature goes through the same + * settings API call as the Settings modal toggle. + */ + +/** + * Turn on Workflow management and reload so the server-rendered nav and the + * scanner state pick up the change. + */ +export async function enableWorkflows() { + const response = await fetch('/api/lm/settings', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ enable_workflows: true }), + }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || `HTTP ${response.status}`); + } + window.location.reload(); +} + +/** + * Open the settings modal on the Library section and scroll the Workflows + * toggle into view. + */ +export function openWorkflowsSettings() { + const modalManager = window.modalManager; + if (modalManager && typeof modalManager.showModal === 'function') { + modalManager.showModal('settingsModal'); + } + + window.setTimeout(() => { + document.querySelectorAll('.settings-section').forEach((section) => { + section.classList.remove('active'); + }); + document.getElementById('section-library')?.classList.add('active'); + + document.querySelectorAll('.settings-nav-item').forEach((item) => { + item.classList.remove('active'); + }); + document.querySelector('.settings-nav-item[data-section="library"]')?.classList.add('active'); + + document.getElementById('enableWorkflows')?.scrollIntoView({ + behavior: 'smooth', + block: 'center', + }); + }, 100); +} + +/** + * Open the settings modal on the standalone-only Model Paths section, where + * primary folder_paths are edited. The section only exists in standalone mode, + * so the nav item lookup simply no-ops elsewhere. + */ +export function openModelPathsSettings() { + const modalManager = window.modalManager; + if (modalManager && typeof modalManager.showModal === 'function') { + modalManager.showModal('settingsModal'); + } + + window.setTimeout(() => { + document.querySelector('.settings-nav-item[data-section="modelPaths"]')?.click(); + }, 100); +} diff --git a/static/js/workflows.js b/static/js/workflows.js new file mode 100644 index 00000000..2bd0bd1a --- /dev/null +++ b/static/js/workflows.js @@ -0,0 +1,57 @@ +import { appCore } from './core.js'; +import { confirmDelete, closeDeleteModal, confirmExclude, closeExcludeModal } from './utils/modalUtils.js'; +import { createPageControls } from './components/controls/index.js'; +import { ModelDuplicatesManager } from './components/ModelDuplicatesManager.js'; +import { MODEL_TYPES } from './api/apiConfig.js'; +import { initActiveFiltersSync } from './utils/activeFiltersSync.js'; + +// Initialize the Workflows page +class WorkflowsPageManager { + constructor() { + // Initialize page controls + this.pageControls = createPageControls(MODEL_TYPES.WORKFLOW); + + // Initialize the ModelDuplicatesManager + this.duplicatesManager = new ModelDuplicatesManager(this, MODEL_TYPES.WORKFLOW); + + // Expose only necessary functions to global scope + this._exposeRequiredGlobalFunctions(); + } + + _exposeRequiredGlobalFunctions() { + // Minimal set of functions that need to remain global + window.confirmDelete = confirmDelete; + window.closeDeleteModal = closeDeleteModal; + window.confirmExclude = confirmExclude; + window.closeExcludeModal = closeExcludeModal; + + // Expose duplicates manager + window.modelDuplicatesManager = this.duplicatesManager; + } + + async initialize() { + // Initialize common page features (including context menus) + appCore.initializePageFeatures(); + + // Mirror active filters to the backend for the ComfyUI-side autocomplete + initActiveFiltersSync(MODEL_TYPES.WORKFLOW); + + console.log('Workflows Manager initialized'); + } +} + +async function initializeWorkflowsPage() { + // Initialize core application + await appCore.initialize(); + + // Initialize workflows page + const workflowsPage = new WorkflowsPageManager(); + await workflowsPage.initialize(); + + return workflowsPage; +} + +// Initialize everything when DOM is ready +document.addEventListener('DOMContentLoaded', initializeWorkflowsPage); + +export { WorkflowsPageManager, initializeWorkflowsPage }; diff --git a/static/js/workflows_disabled.js b/static/js/workflows_disabled.js new file mode 100644 index 00000000..2e4d35b4 --- /dev/null +++ b/static/js/workflows_disabled.js @@ -0,0 +1,109 @@ +import { appCore } from './core.js'; +import { showToast } from './utils/uiHelpers.js'; +import { enableWorkflows, openWorkflowsSettings, openModelPathsSettings } from './utils/workflowModels.js'; + +/** + * Workflow management is an opt-in feature. While it is disabled this page + * renders an empty state whose button turns the feature on; the backend then + * rebuilds the workflow roots and starts scanning, so a reload lands on the + * real page. + * + * The same module backs the "enabled but no folders found" state: ComfyUI + * mode points to the Settings page's Library section, while standalone mode + * points to the standalone-only Model Paths section (which edits the primary + * folder_paths) and still offers the settings.json location as a fallback. + */ +async function handleEnableClick() { + const button = document.getElementById('enableWorkflowsBtn'); + if (!button || button.disabled) return; + + button.disabled = true; + try { + await enableWorkflows(); + } catch (error) { + button.disabled = false; + showToast('workflows.disabled.enableFailed', { message: error.message }, 'error'); + } +} + +/** + * Open Settings on the Library section for the "no folders found" state, so a + * misconfigured install can be fixed without hand-editing unknown keys. + */ +function handleOpenSettingsClick(event) { + event.preventDefault(); + openWorkflowsSettings(); +} + +/** + * Open Settings on the Model Paths section for the standalone "no folders + * found" state, so the missing folders can be added directly. + */ +function handleOpenModelPathsSettingsClick(event) { + event.preventDefault(); + openModelPathsSettings(); +} + +/** + * Open the settings.json location from the standalone no-folders state, + * offered as a fallback next to the Model Paths settings button. + */ +async function handleOpenSettingsFolderClick() { + const button = document.getElementById('openSettingsFolderBtn'); + if (!button || button.disabled) return; + + button.disabled = true; + try { + const response = await fetch('/api/lm/settings/open-location', { method: 'POST' }); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || `HTTP ${response.status}`); + } + if (data.mode === 'clipboard' && data.path) { + try { + await navigator.clipboard.writeText(data.path); + showToast('settings.openSettingsFileLocation.copied', { path: data.path }, 'success'); + } catch (clipboardError) { + console.warn('Clipboard API not available:', clipboardError); + showToast('settings.openSettingsFileLocation.clipboardFallback', { path: data.path }, 'info'); + } + } else { + showToast('settings.openSettingsFileLocation.success', {}, 'success'); + } + } catch (error) { + console.error('Failed to open settings location:', error); + showToast('settings.openSettingsFileLocation.failed', {}, 'error'); + } finally { + button.disabled = false; + } +} + +async function initializeWorkflowsDisabledPage() { + // appCore.initialize() wires the shared header (theme, settings modal, + // language) so this page is not a dead end. + await appCore.initialize(); + + const button = document.getElementById('enableWorkflowsBtn'); + if (button) { + button.addEventListener('click', handleEnableClick); + } + + const settingsButton = document.getElementById('openWorkflowsSettingsBtn'); + if (settingsButton) { + settingsButton.addEventListener('click', handleOpenSettingsClick); + } + + const modelPathsButton = document.getElementById('openModelPathsSettingsBtn'); + if (modelPathsButton) { + modelPathsButton.addEventListener('click', handleOpenModelPathsSettingsClick); + } + + const settingsFolderButton = document.getElementById('openSettingsFolderBtn'); + if (settingsFolderButton) { + settingsFolderButton.addEventListener('click', handleOpenSettingsFolderClick); + } +} + +document.addEventListener('DOMContentLoaded', initializeWorkflowsDisabledPage); + +export { handleEnableClick as enableWorkflows, handleOpenSettingsFolderClick, initializeWorkflowsDisabledPage }; diff --git a/templates/components/header.html b/templates/components/header.html index 3c52e543..bb71f7e8 100644 --- a/templates/components/header.html +++ b/templates/components/header.html @@ -17,6 +17,8 @@ {% set current_page = 'embeddings' %} {% elif current_path.startswith('/other') %} {% set current_page = 'other' %} + {% elif current_path.startswith('/workflows') %} + {% set current_page = 'workflows' %} {% elif current_path.startswith('/statistics') %} {% set current_page = 'statistics' %} {% else %} @@ -42,6 +44,10 @@ id="otherNavItem"> {{ t('header.navigation.other') }} + + {{ t('header.navigation.workflows') }} + {{ t('header.navigation.statistics') }} diff --git a/templates/components/modals/settings/library.html b/templates/components/modals/settings/library.html index f3314c77..2d7ed55c 100644 --- a/templates/components/modals/settings/library.html +++ b/templates/components/modals/settings/library.html @@ -90,6 +90,27 @@ {% endfor %} + + {{ sm.setting_toggle('enableWorkflows', 'enable_workflows', 'settings.folderSettings.enableWorkflows', 'settings.folderSettings.enableWorkflowsHelp') }} + +
+
+
+ +
+
+ +
+
+
+
+
diff --git a/templates/workflows.html b/templates/workflows.html new file mode 100644 index 00000000..ad845901 --- /dev/null +++ b/templates/workflows.html @@ -0,0 +1,158 @@ +{% extends "base.html" %} + +{% block title %}{{ t('workflows.title') }}{% endblock %} +{% block page_id %}workflows{% endblock %} + +{% block init_title %}{{ t('initialization.workflows.title') }}{% endblock %} +{% block init_message %}{{ t('initialization.workflows.message') }}{% endblock %} +{% block init_check_url %}/api/lm/workflows/list?page=1&page_size=1{% endblock %} + +{% block page_css %} + +{% endblock %} + +{% block additional_components %} + + +{% endblock %} + +{% block content %} + {% if workflows_disabled %} +
+ +

{{ t('workflows.disabled.title') }}

+

{{ t('workflows.disabled.description') }}

+ +

{{ t('workflows.disabled.hint') }}

+
+ {% elif workflows_no_paths %} +
+ +

{{ t('workflows.noPaths.title') }}

+ {% if standalone_mode %} +

{{ t('workflows.noPaths.descriptionStandalone') }}

+

{{ t('workflows.noPaths.hintStandalone') }}

+ + {% if settings_file %} +

{{ settings_file }}

+ {% endif %} + + {% else %} +

{{ t('workflows.noPaths.descriptionComfyUI') }}

+

{{ t('workflows.noPaths.hintComfyUI') }}

+ + {% endif %} +
+ {% else %} +
+ {% include 'components/controls.html' %} + {% include 'components/breadcrumb.html' %} +
+ {% include 'components/duplicates_banner.html' %} + {% include 'components/folder_sidebar.html' %} + + +
+ +
+ {% endif %} +{% endblock %} + +{% block overlay %} +
+{% endblock %} + +{% block main_script %} +{% if workflows_disabled or workflows_no_paths %} + +{% else %} + +{% endif %} +{% endblock %} diff --git a/tests/config/test_other_paths.py b/tests/config/test_other_paths.py index 67ad23c9..df325928 100644 --- a/tests/config/test_other_paths.py +++ b/tests/config/test_other_paths.py @@ -21,6 +21,8 @@ def _make_config(**overrides) -> config_module.Config: config._cached_fingerprint = None config.base_models_roots = [] config.embeddings_roots = [] + config.workflows_roots = [] + config.extra_workflows_roots = [] for key, value in overrides.items(): setattr(config, key, value) return config diff --git a/tests/routes/__snapshots__/test_api_snapshots.ambr b/tests/routes/__snapshots__/test_api_snapshots.ambr index 3a77ede1..566fe4d3 100644 --- a/tests/routes/__snapshots__/test_api_snapshots.ambr +++ b/tests/routes/__snapshots__/test_api_snapshots.ambr @@ -36,6 +36,8 @@ 'sidecar_storage_root_is_default': True, 'standalone_mode': False, 'theme': 'dark', + 'workflow_folder_paths': list([ + ]), }), 'success': True, }) diff --git a/tests/routes/test_filesystem_paths.py b/tests/routes/test_filesystem_paths.py index 586854e2..fe0e8179 100644 --- a/tests/routes/test_filesystem_paths.py +++ b/tests/routes/test_filesystem_paths.py @@ -60,6 +60,25 @@ async def test_browse_directory_lists_subdirs_sorted_and_filters(tmp_path): assert payload["directory_count"] == 2 +@pytest.mark.asyncio +async def test_browse_directory_preserves_symlinked_path(tmp_path): + # The picker result is stored as a configured library path (a business + # path): browsing through a symlink must keep the link path instead of + # resolving to the target. + real = tmp_path / "real-target" + real.mkdir() + (real / "child").mkdir() + link = tmp_path / "link" + link.symlink_to(real) + + response, payload = await _browse(_make_handler(), str(link)) + + assert response.status == 200 + assert payload["success"] is True + assert payload["current_path"] == str(link) + assert payload["directories"][0]["path"] == str(link / "child") + + @pytest.mark.asyncio async def test_browse_directory_missing_returns_404(tmp_path): response, payload = await _browse(_make_handler(), str(tmp_path / "nope")) @@ -81,9 +100,9 @@ async def test_browse_directory_file_path_returns_400(tmp_path): @pytest.mark.asyncio async def test_browse_directory_relative_path_returns_403(monkeypatch): - # resolve() normally absolutizes relative paths against the cwd; bypass it + # abspath() normally absolutizes relative paths against the cwd; bypass it # to exercise the access-denied branch directly. - monkeypatch.setattr(Path, "resolve", lambda self: self) + monkeypatch.setattr(os.path, "abspath", lambda p: p) response, payload = await _browse(_make_handler(), "relative/path") diff --git a/tests/routes/test_misc_routes.py b/tests/routes/test_misc_routes.py index b6524fe0..216c6690 100644 --- a/tests/routes/test_misc_routes.py +++ b/tests/routes/test_misc_routes.py @@ -80,6 +80,9 @@ class DummySettings: def is_other_models_enabled(self): return bool(self.data.get("enable_other_models", False)) + def is_workflows_enabled(self): + return bool(self.data.get("enable_workflows", False)) + def get_enabled_other_sub_types(self): return list(self.data.get("enabled_other_sub_types") or []) diff --git a/tests/routes/test_settings_handler.py b/tests/routes/test_settings_handler.py index a556464f..ef9d8d40 100644 --- a/tests/routes/test_settings_handler.py +++ b/tests/routes/test_settings_handler.py @@ -291,3 +291,61 @@ async def test_get_settings_standalone_filters_template_placeholders( "loras": ["/real/loras"], "vae": [], } + + +@pytest.mark.asyncio +async def test_get_settings_exposes_workflow_folder_paths_in_plugin_mode( + monkeypatch, patch_other_models_availability +): + """Workflow roots are LoRA-Manager-owned in both modes, so they sync to + the frontend even where the host-owned folder_paths stay hidden.""" + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + handler = make_get_handler({"language": "en"}) + handler._settings.get_workflow_folder_paths = lambda: ["/library/workflows"] + + response = await handler.get_settings(FakeRequest()) + payload = json_payload(response) + + assert response.status == 200 + settings = payload["settings"] + assert settings["standalone_mode"] is False + assert "folder_paths" not in settings + assert settings["workflow_folder_paths"] == ["/library/workflows"] + + +@pytest.mark.asyncio +async def test_get_settings_workflow_folder_paths_fallback_when_stub_lacks_method( + monkeypatch, patch_other_models_availability +): + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + handler = make_get_handler({"language": "en"}) + + response = await handler.get_settings(FakeRequest()) + payload = json_payload(response) + + assert response.status == 200 + assert payload["settings"]["workflow_folder_paths"] == [] + + +@pytest.mark.asyncio +async def test_update_settings_routes_workflow_folder_paths_to_dedicated_merge( + monkeypatch, patch_other_models_availability +): + """The pseudo-key must merge into folder_paths server-side instead of + replacing the whole (partially host-owned) map via a generic set().""" + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + handler = make_get_handler({"language": "en"}) + recorded = [] + handler._settings.set_workflow_folder_paths = lambda value: recorded.append(value) or value + + response = await handler.update_settings( + FakeRequest(json_data={"workflow_folder_paths": ["/library/workflows"]}) + ) + payload = json_payload(response) + + assert response.status == 200 + assert payload["success"] is True + assert recorded == [["/library/workflows"]] + # The pseudo-key never lands in the generic set() path. + assert handler._settings.set_calls == [] + assert "workflow_folder_paths" not in handler._settings._values diff --git a/tests/routes/test_workflow_routes.py b/tests/routes/test_workflow_routes.py new file mode 100644 index 00000000..387b5778 --- /dev/null +++ b/tests/routes/test_workflow_routes.py @@ -0,0 +1,333 @@ +import json +import os + +import pytest +from aiohttp import web + +from py.routes.workflow_routes import WorkflowRoutes +from py.services.workflow_service import WorkflowService + + +class DummyRequest: + def __init__(self, *, match_info=None, method="POST", query=None, body=None): + self.match_info = match_info or {} + self.method = method + self.query = query or {} + self._body = body + + async def json(self): + if isinstance(self._body, Exception): + raise self._body + return self._body + + +class StubScanner: + def __init__(self, roots=None): + self._roots = roots or [] + + def get_model_roots(self): + return list(self._roots) + + +class StubWorkflowService: + def __init__(self, roots=None): + self.info = {} + self.scanner = StubScanner(roots) + + async def get_model_info_by_name(self, name): + value = self.info.get(name) + if isinstance(value, Exception): + raise value + return value + + +@pytest.fixture +def routes(): + handler = WorkflowRoutes() + handler.service = StubWorkflowService() # pyright: ignore[reportAttributeAccessIssue] + return handler + + +@pytest.fixture(autouse=True) +def enable_workflows(): + """Workflow management is opt-in; these tests exercise the enabled state.""" + from py.services.settings_manager import get_settings_manager + + manager = get_settings_manager() + manager.set("enable_workflows", True) + yield + manager.set("enable_workflows", False) + + +@pytest.fixture +def plugin_mode(monkeypatch): + """send_to_comfy refuses to run in standalone mode; default to plugin mode.""" + monkeypatch.delenv("LORA_MANAGER_STANDALONE", raising=False) + + +def test_common_and_specific_routes_registered(): + """Registration smoke test: /api/lm/workflows/* surface plus the page.""" + app = web.Application() + WorkflowRoutes().setup_routes(app) + + registered = {(route.method, route.resource.canonical) for route in app.router.routes()} + + assert ("GET", "/workflows") in registered + assert ("GET", "/api/lm/workflows/list") in registered + assert ("GET", "/api/lm/workflows/model-types") in registered + assert ("GET", "/api/lm/workflows/roots") in registered + assert ("POST", "/api/lm/workflows/fetch-civitai") in registered + assert ("POST", "/api/lm/workflows/delete") in registered + assert ("POST", "/api/lm/workflows/move_model") in registered + assert ("GET", "/api/lm/workflows/info/{name}") in registered + # The companion browser extension is GET-only (see AGENTS.md). + assert ("POST", "/api/lm/workflows/send-to-comfy") in registered + assert ("GET", "/api/lm/workflows/send-to-comfy") in registered + + +def test_template_name_is_workflows_page(): + assert WorkflowRoutes().template_name == "workflows.html" + + +@pytest.mark.parametrize( + "model_type", + ["Workflows", "workflows", "ComfyWorkflows", "comfyworkflows"], +) +def test_validate_civitai_model_type_accepts_workflow_types(model_type): + assert WorkflowRoutes()._validate_civitai_model_type(model_type) is True + + +@pytest.mark.parametrize( + "model_type", ["Lora", "Checkpoint", "TextualInversion", "VAE", "Other"] +) +def test_validate_civitai_model_type_rejects_foreign_types(model_type): + assert WorkflowRoutes()._validate_civitai_model_type(model_type) is False + + +def test_validate_rejects_everything_when_feature_disabled(): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + + handler = WorkflowRoutes() + for model_type in ("Workflows", "ComfyWorkflows"): + assert handler._validate_civitai_model_type(model_type) is False + + +def test_page_context_reports_feature_state(monkeypatch): + from py.config import config + from py.services.settings_manager import get_settings_manager + + manager = get_settings_manager() + handler = WorkflowRoutes() + provider = handler._get_page_context_provider() + + monkeypatch.setattr(config, "workflows_roots", ["/library/workflows"], raising=False) + context = provider(None) + assert context["workflows_disabled"] is False + assert context["workflows_no_paths"] is False + + # Enabled but nothing configured: the page must explain how to fix it. + monkeypatch.setattr(config, "workflows_roots", [], raising=False) + context = provider(None) + assert context["workflows_disabled"] is False + assert context["workflows_no_paths"] is True + + manager.set("enable_workflows", False) + assert provider(None) == {"workflows_disabled": True, "workflows_no_paths": False} + + +def test_page_context_exposes_settings_file_in_standalone(monkeypatch): + """Standalone users must edit settings.json by hand; the empty state + needs the real file path to point them at.""" + from py.config import config + from py.services.settings_manager import get_settings_manager + + manager = get_settings_manager() + handler = WorkflowRoutes() + provider = handler._get_page_context_provider() + + monkeypatch.setattr(config, "workflows_roots", [], raising=False) + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + + context = provider(None) + assert context["workflows_no_paths"] is True + assert context["standalone_mode"] is True + assert context["settings_file"] == manager.settings_file + + +def test_get_expected_model_types_mentions_workflows(): + expected = WorkflowRoutes()._get_expected_model_types() + assert "Workflows" in expected + assert "ComfyWorkflows" in expected + + +def test_find_model_file_prefers_config_json_then_archive_zip(): + handler = WorkflowRoutes() + files = [ + {"id": 3, "type": "Archive", "name": "bundle.zip"}, + {"id": 2, "type": "Config", "name": "workflow.json"}, + {"id": 1, "type": "Model", "name": "weights.safetensors"}, + ] + assert handler._find_model_file(files)["name"] == "workflow.json" + + # Without a Config .json, the Archive .zip is the CivitAI default pick. + assert handler._find_model_file(files[0:1] + files[2:])["name"] == "bundle.zip" + + +async def test_get_workflow_info_success(routes): + routes.service.info["demo"] = {"name": "demo"} + response = await routes.get_workflow_info(DummyRequest(match_info={"name": "demo"})) + payload = json.loads(response.text) + assert payload == {"name": "demo"} + + +async def test_get_workflow_info_missing(routes): + response = await routes.get_workflow_info(DummyRequest(match_info={"name": "missing"})) + payload = json.loads(response.text) + assert response.status == 404 + assert payload == {"error": "Workflow not found"} + + +async def test_get_workflow_info_error(routes): + routes.service.info["demo"] = RuntimeError("boom") + response = await routes.get_workflow_info(DummyRequest(match_info={"name": "demo"})) + payload = json.loads(response.text) + assert response.status == 500 + assert payload == {"error": "boom"} + + +@pytest.mark.asyncio +async def test_initialize_services_builds_workflow_service(monkeypatch): + from py.services.service_registry import ServiceRegistry + + sentinel_scanner = object() + sentinel_update_service = object() + + async def fake_scanner(): + return sentinel_scanner + + async def fake_update_service(): + return sentinel_update_service + + monkeypatch.setattr(ServiceRegistry, "get_workflow_scanner", staticmethod(fake_scanner)) + monkeypatch.setattr( + ServiceRegistry, "get_model_update_service", staticmethod(fake_update_service) + ) + + handler = WorkflowRoutes() + await handler.initialize_services() + + assert isinstance(handler.service, WorkflowService) + assert handler.service.model_type == "workflow" + assert handler.service.scanner is sentinel_scanner + + +async def test_send_to_comfy_rejected_in_standalone(routes, monkeypatch): + monkeypatch.setenv("LORA_MANAGER_STANDALONE", "1") + response = await routes.send_to_comfy( + DummyRequest(body={"file_path": "/library/workflows/flow.json"}) + ) + payload = json.loads(response.text) + assert response.status == 400 + assert payload["success"] is False + + +async def test_send_to_comfy_rejected_when_feature_disabled(routes, plugin_mode): + from py.services.settings_manager import get_settings_manager + + get_settings_manager().set("enable_workflows", False) + response = await routes.send_to_comfy( + DummyRequest(body={"file_path": "/library/workflows/flow.json"}) + ) + payload = json.loads(response.text) + assert response.status == 400 + assert payload["success"] is False + + +async def test_send_to_comfy_requires_file_path(routes, plugin_mode): + response = await routes.send_to_comfy(DummyRequest(body={})) + payload = json.loads(response.text) + assert response.status == 400 + assert payload == {"success": False, "error": "file_path is required"} + + +async def test_send_to_comfy_rejects_path_outside_library(routes, plugin_mode, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy( + DummyRequest(body={"file_path": str(tmp_path / "elsewhere.json")}) + ) + payload = json.loads(response.text) + assert response.status == 400 + assert payload["success"] is False + + +async def test_send_to_comfy_404_for_non_workflow_json(routes, plugin_mode, tmp_path): + root = tmp_path / "workflows" + root.mkdir() + target = root / "config.json" + target.write_text(json.dumps({"some": "config"}), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy(DummyRequest(body={"file_path": str(target)})) + payload = json.loads(response.text) + assert response.status == 404 + assert payload["error"] == "not_a_workflow" + + +async def test_send_to_comfy_broadcasts_workflow(routes, plugin_mode, tmp_path, monkeypatch): + """Pin PromptServer.instance: other suites leak a bare SimpleNamespace onto + the mocked server module, so never rely on the global mock state.""" + import server + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, "instance", SimpleNamespace(send_sync=send_sync) + ) + + root = tmp_path / "workflows" + root.mkdir() + workflow = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + target = root / "flow.json" + target.write_text(json.dumps(workflow), encoding="utf-8") + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy(DummyRequest(body={"file_path": str(target)})) + payload = json.loads(response.text) + + assert payload == {"success": True, "sent": True} + send_sync.assert_called_once_with( + "lm_load_workflow", {"workflow": workflow, "name": "flow"} + ) + + +async def test_send_to_comfy_accepts_get_with_query(routes, plugin_mode, tmp_path, monkeypatch): + import server + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, "instance", SimpleNamespace(send_sync=send_sync) + ) + + root = tmp_path / "workflows" + root.mkdir() + target = root / "flow.json" + target.write_text( + json.dumps({"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}}), + encoding="utf-8", + ) + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy( + DummyRequest(method="GET", query={"file_path": str(target)}) + ) + payload = json.loads(response.text) + assert payload == {"success": True, "sent": True} + send_sync.assert_called_once() diff --git a/tests/services/test_settings_manager.py b/tests/services/test_settings_manager.py index ea0ef783..603746eb 100644 --- a/tests/services/test_settings_manager.py +++ b/tests/services/test_settings_manager.py @@ -1888,3 +1888,44 @@ def test_download_root_rules_accept_remote_only_base_models(manager, monkeypatch "root": "/loras-archive", } ] + + +def test_get_workflow_folder_paths_defaults_to_empty(manager): + assert manager.get_workflow_folder_paths() == [] + + +def test_set_workflow_folder_paths_merges_into_active_library(manager): + _configure_lora_roots(manager, "/loras-main") + + result = manager.set_workflow_folder_paths(["/workflows", " /workflows ", ""]) + + assert result == ["/workflows"] + # Core keys are preserved; workflows rides the same folder_paths map. + assert manager.settings["folder_paths"] == { + "loras": ["/loras-main"], + "workflows": ["/workflows"], + } + assert manager.get_workflow_folder_paths() == ["/workflows"] + active = manager.get_active_library() + assert active.get("folder_paths", {}).get("workflows") == ["/workflows"] + + +def test_set_workflow_folder_paths_empty_removes_key(manager): + manager.set_workflow_folder_paths(["/workflows"]) + + result = manager.set_workflow_folder_paths([]) + + assert result == [] + assert "workflows" not in manager.settings["folder_paths"] + assert manager.get_workflow_folder_paths() == [] + + +def test_set_workflow_folder_paths_rejects_overlap_with_other_library(manager): + manager.settings["libraries"] = { + "default": manager.get_active_library(), + "other": {"folder_paths": {"workflows": ["/shared-workflows"]}}, + } + manager.settings["active_library"] = "default" + + with pytest.raises(ValueError): + manager.set_workflow_folder_paths(["/shared-workflows"]) diff --git a/tests/services/test_workflow_scanner.py b/tests/services/test_workflow_scanner.py new file mode 100644 index 00000000..11e6fea7 --- /dev/null +++ b/tests/services/test_workflow_scanner.py @@ -0,0 +1,112 @@ +"""Tests for WorkflowScanner: opt-in roots, sidecar exclusion, metadata creation.""" + +import json +import os + +import pytest + +from py import config as config_module +from py.services.model_scanner import ModelScanner +from py.services.workflow_scanner import WorkflowScanner +from py.utils.models import WorkflowMetadata + + +def _normalize(path) -> str: + return str(path).replace(os.sep, "/") + + +@pytest.fixture(autouse=True) +def reset_model_scanner_singletons(): + ModelScanner._instances.clear() + ModelScanner._locks.clear() + yield + ModelScanner._instances.clear() + ModelScanner._locks.clear() + + +@pytest.fixture +def workflow_root(tmp_path, monkeypatch): + root = tmp_path / "workflows" + root.mkdir() + monkeypatch.setattr(config_module.config, "workflows_roots", [_normalize(root)]) + monkeypatch.setattr(config_module.config, "extra_workflows_roots", []) + return root + + +@pytest.fixture +def enable_workflows(monkeypatch): + """Enable the feature without set() side effects (root refresh, rescan).""" + from py.services.settings_manager import get_settings_manager + + monkeypatch.setattr( + get_settings_manager(), "is_workflows_enabled", lambda: True + ) + + +def _make_scanner() -> WorkflowScanner: + """Create a scanner without __init__ to avoid async initialization.""" + scanner = object.__new__(WorkflowScanner) + scanner.model_type = "workflow" + scanner.model_class = WorkflowMetadata + scanner.file_extensions = {".json"} + return scanner + + +def test_roots_empty_while_feature_disabled(workflow_root, monkeypatch): + from py.services.settings_manager import get_settings_manager + + monkeypatch.setattr( + get_settings_manager(), "is_workflows_enabled", lambda: False + ) + scanner = _make_scanner() + assert scanner.get_model_roots() == [] + + +def test_roots_listed_while_feature_enabled(workflow_root, enable_workflows): + scanner = _make_scanner() + assert scanner.get_model_roots() == [_normalize(workflow_root)] + + +def test_filename_filter_rejects_sidecars(enable_workflows): + scanner = _make_scanner() + assert scanner._is_indexable_filename("flow.json") is True + assert scanner._is_indexable_filename("flow.metadata.json") is False + assert scanner._is_indexable_filename("FLOW.METADATA.JSON") is False + + +async def test_create_default_metadata_parses_workflow(workflow_root, enable_workflows, tmp_path): + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + "2": {"class_type": "LoraLoader", "inputs": {"lora_name": "civitai:1@2"}}, + } + file_path = workflow_root / "my_flow.json" + file_path.write_text(json.dumps(workflow), encoding="utf-8") + + scanner = _make_scanner() + metadata = await scanner._create_default_metadata(str(file_path)) + + assert metadata is not None + assert metadata.file_name == "my_flow" + assert metadata.sub_type == "workflow" + assert metadata.workflow_format == "api" + assert metadata.node_count == 2 + assert metadata.sha256 + assert metadata.model_refs == ["base.safetensors"] + assert metadata.civitai_refs == ["civitai:1@2"] + assert metadata.from_civitai is False + + +async def test_create_default_metadata_skips_non_workflow_json(workflow_root, enable_workflows): + file_path = workflow_root / "settings.json" + file_path.write_text(json.dumps({"some": "config"}), encoding="utf-8") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + + +async def test_create_default_metadata_skips_sidecar(workflow_root, enable_workflows): + file_path = workflow_root / "my_flow.metadata.json" + file_path.write_text(json.dumps({"file_name": "my_flow"}), encoding="utf-8") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None diff --git a/tests/utils/test_workflow_analysis.py b/tests/utils/test_workflow_analysis.py new file mode 100644 index 00000000..09c937f5 --- /dev/null +++ b/tests/utils/test_workflow_analysis.py @@ -0,0 +1,101 @@ +"""Tests for py.utils.workflow_analysis: sniffing and graph extraction.""" + +import json + +from py.utils.workflow_analysis import ( + WORKFLOW_FORMAT_API, + WORKFLOW_FORMAT_UI, + analyze_workflow, + analyze_workflow_file, + load_workflow_file, + sniff_workflow_text, +) + + +UI_WORKFLOW = { + "nodes": [ + {"id": 1, "type": "CheckpointLoaderSimple", "widgets_values": ["sd_xl_base_1.0.safetensors"]}, + {"id": 2, "type": "LoraLoader", "widgets_values": ["civitai:12345@67890", 1.0, 1.0]}, + {"id": 3, "type": "KSampler", "widgets_values": [42]}, + ], + "links": [], + "groups": [], + "version": 0.4, +} + +API_WORKFLOW = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "v1-5-pruned.safetensors"}}, + "2": {"class_type": "LoraLoader", "inputs": {"lora_name": "civitai:111@222", "strength_model": 1.0}}, + "3": {"class_type": "SaveImage", "inputs": {"filename_prefix": "ComfyUI"}}, +} + + +def test_sniff_ui_format(): + assert sniff_workflow_text(json.dumps(UI_WORKFLOW)) == WORKFLOW_FORMAT_UI + + +def test_sniff_api_format(): + assert sniff_workflow_text(json.dumps(API_WORKFLOW)) == WORKFLOW_FORMAT_API + + +def test_sniff_rejects_non_workflow_json(): + assert sniff_workflow_text(json.dumps({"setting": True, "other": 1})) is None + assert sniff_workflow_text(json.dumps(["a", "b"])) is None + assert sniff_workflow_text("not json at all") is None + # A sidecar-shaped document (flat metadata fields) is not a workflow. + assert sniff_workflow_text(json.dumps({"file_name": "x", "sha256": "abc"})) is None + + +def test_analyze_ui_format_extracts_classes_and_refs(): + analysis = analyze_workflow(UI_WORKFLOW) + assert analysis is not None + assert analysis.workflow_format == WORKFLOW_FORMAT_UI + assert analysis.node_count == 3 + assert analysis.node_classes == ["CheckpointLoaderSimple", "KSampler", "LoraLoader"] + assert analysis.model_refs == ["sd_xl_base_1.0.safetensors"] + assert analysis.civitai_refs == ["civitai:12345@67890"] + + +def test_analyze_api_format_extracts_classes_and_refs(): + analysis = analyze_workflow(API_WORKFLOW) + assert analysis is not None + assert analysis.workflow_format == WORKFLOW_FORMAT_API + assert analysis.node_count == 3 + assert "SaveImage" in analysis.node_classes + assert analysis.model_refs == ["v1-5-pruned.safetensors"] + assert analysis.civitai_refs == ["civitai:111@222"] + + +def test_analyze_rejects_non_workflow(): + assert analyze_workflow({"foo": "bar"}) is None + + +def test_analyze_skips_prompt_text_with_extension_like_suffix(tmp_path): + # Prompt strings contain spaces and must not become model refs. + workflow = { + "1": { + "class_type": "CLIPTextEncode", + "inputs": {"text": "a beautiful landscape, best quality.safetensors style"}, + } + } + analysis = analyze_workflow(workflow) + assert analysis is not None + assert analysis.model_refs == [] + + +def test_analyze_workflow_file_roundtrip(tmp_path): + path = tmp_path / "flow.json" + path.write_text(json.dumps(API_WORKFLOW), encoding="utf-8") + analysis = analyze_workflow_file(str(path)) + assert analysis is not None + assert analysis.workflow_format == WORKFLOW_FORMAT_API + + +def test_load_workflow_file_rejects_sidecar(tmp_path): + sidecar = tmp_path / "flow.metadata.json" + sidecar.write_text(json.dumps({"file_name": "flow", "sha256": "x"}), encoding="utf-8") + assert load_workflow_file(str(sidecar)) is None + + +def test_load_workflow_file_handles_missing(tmp_path): + assert load_workflow_file(str(tmp_path / "nope.json")) is None diff --git a/web/comfyui/vue-widgets/lora-manager-widgets.js b/web/comfyui/vue-widgets/lora-manager-widgets.js index 1d950a37..facd846a 100644 --- a/web/comfyui/vue-widgets/lora-manager-widgets.js +++ b/web/comfyui/vue-widgets/lora-manager-widgets.js @@ -15904,6 +15904,34 @@ function findModeAccessor(node) { return null; } function interceptModeChange(node, onModeChange) { + if (!node || typeof onModeChange !== "function") { + return; + } + if (!Array.isArray(node._lmModeChangeListeners)) { + Object.defineProperty(node, "_lmModeChangeListeners", { + configurable: true, + writable: true, + value: [] + }); + } + node._lmModeChangeListeners.push(onModeChange); + if (node._lmModeChangeIntercepted) { + return; + } + Object.defineProperty(node, "_lmModeChangeIntercepted", { + configurable: true, + writable: true, + value: true + }); + const notify = (newMode, oldMode) => { + for (const listener of node._lmModeChangeListeners ?? []) { + try { + listener(newMode, oldMode); + } catch (listenerError) { + console.error("LoRA Manager: mode change listener failed", listenerError); + } + } + }; const delegate = findModeAccessor(node); if (delegate && typeof delegate.get === "function" && typeof delegate.set === "function") { Object.defineProperty(node, "mode", { @@ -15915,7 +15943,7 @@ function interceptModeChange(node, onModeChange) { const oldValue = delegate.get.call(this); delegate.set.call(this, value); if (oldValue !== value) { - onModeChange(value, oldValue); + notify(value, oldValue); } } }); @@ -15931,7 +15959,7 @@ function interceptModeChange(node, onModeChange) { const oldValue = currentMode; currentMode = value; if (oldValue !== value) { - onModeChange(value, oldValue); + notify(value, oldValue); } } }); diff --git a/web/comfyui/vue-widgets/lora-manager-widgets.js.map b/web/comfyui/vue-widgets/lora-manager-widgets.js.map index 6e549758..7f44545e 100644 --- a/web/comfyui/vue-widgets/lora-manager-widgets.js.map +++ b/web/comfyui/vue-widgets/lora-manager-widgets.js.map @@ -1 +1 @@ -{"version":3,"file":"lora-manager-widgets.js","sources":["../../../vue-widgets/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../vue-widgets/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../../vue-widgets/node_modules/@primeuix/utils/dist/object/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/eventbus/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/dom/index.mjs","../../../vue-widgets/node_modules/@primeuix/styled/dist/index.mjs","../../../vue-widgets/node_modules/@primevue/core/api/index.mjs","../../../vue-widgets/node_modules/@primeuix/styles/dist/base/index.mjs","../../../vue-widgets/node_modules/@primevue/core/usestyle/index.mjs","../../../vue-widgets/node_modules/@primevue/core/base/style/index.mjs","../../../vue-widgets/node_modules/@primevue/core/service/index.mjs","../../../vue-widgets/node_modules/@primevue/core/config/index.mjs","../../../vue-widgets/src/components/lora-pool/shared/FilterChip.vue","../../../vue-widgets/src/components/lora-pool/shared/EditButton.vue","../../../vue-widgets/src/components/lora-pool/sections/BaseModelSection.vue","../../../vue-widgets/src/components/lora-pool/sections/TagsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/FoldersSection.vue","../../../vue-widgets/src/components/lora-pool/sections/NamePatternsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/LicenseSection.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolPreview.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolSummaryView.vue","../../../vue-widgets/src/components/lora-pool/modals/ModalWrapper.vue","../../../vue-widgets/src/components/lora-pool/modals/BaseModelModal.vue","../../../vue-widgets/src/components/lora-pool/modals/TagsModal.vue","../../../vue-widgets/src/components/lora-pool/modals/FolderTreeNode.vue","../../../vue-widgets/src/components/lora-pool/modals/FoldersModal.vue","../../../vue-widgets/src/utils/basePath.ts","../../../vue-widgets/src/composables/useLoraPoolApi.ts","../../../vue-widgets/src/composables/useLoraPoolState.ts","../../../vue-widgets/src/composables/useModalState.ts","../../../vue-widgets/src/components/LoraPoolWidget.vue","../../../vue-widgets/src/components/lora-randomizer/LastUsedPreview.vue","../../../vue-widgets/src/components/shared/SingleSlider.vue","../../../vue-widgets/src/components/shared/DualRangeSlider.vue","../../../vue-widgets/src/components/lora-randomizer/LoraRandomizerSettingsView.vue","../../../vue-widgets/src/composables/useLoraRandomizerState.ts","../../../vue-widgets/src/components/LoraRandomizerWidget.vue","../../../vue-widgets/src/components/lora-cycler/LoraCyclerSettingsView.vue","../../../vue-widgets/src/components/lora-cycler/LoraListModal.vue","../../../vue-widgets/src/composables/useLoraCyclerState.ts","../../../vue-widgets/src/components/LoraCyclerWidget.vue","../../../vue-widgets/src/components/JsonDisplayWidget.vue","../../../vue-widgets/src/composables/useAutocomplete.ts","../../../vue-widgets/src/components/AutocompleteTextWidget.vue","../../../vue-widgets/src/components/LoraInfoWidget.vue","../../../vue-widgets/src/vue-widget-cleanup.ts","../autocomplete.js","../base_path.js","../utils.js","../../../vue-widgets/src/mode-change-handler.ts","../../../vue-widgets/src/main.ts"],"sourcesContent":["/**\n* @vue/shared v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n activeEffectScope = this.prevScope;\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || !isIntegerKey(String(_key))) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, watch as watch$1, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, customRef, shallowReactive, trigger, ReactiveEffect, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, hyphenate, hasChanged, looseToNumber, isModelListener, EMPTY_ARR, makeMap, toRawType, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= -2;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= -2;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= -2;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n if (!(instance.job.flags & 8)) {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n }\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nfunction provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (!currentInstance || currentInstance.isMounted) {\n warn$1(`provide() can only be used inside setup().`);\n }\n }\n if (currentInstance) {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = getCurrentInstance();\n if (instance || currentApp) {\n let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(getCurrentInstance() || currentApp);\n}\n\nconst ssrContextKey = /* @__PURE__ */ Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, flush, once } = options;\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const baseWatchOptions = extend({}, options);\n if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n let ssrCleanup;\n if (isInSSRComponentSetup) {\n if (flush === \"sync\") {\n const ctx = useSSRContext();\n ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n } else if (!runsImmediately) {\n const watchStopHandle = () => {\n };\n watchStopHandle.stop = NOOP;\n watchStopHandle.resume = NOOP;\n watchStopHandle.pause = NOOP;\n return watchStopHandle;\n }\n }\n const instance = currentInstance;\n baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n let isPre = false;\n if (flush === \"post\") {\n baseWatchOptions.scheduler = (job) => {\n queuePostRenderEffect(job, instance && instance.suspense);\n };\n } else if (flush !== \"sync\") {\n isPre = true;\n baseWatchOptions.scheduler = (job, isFirstRun) => {\n if (isFirstRun) {\n job();\n } else {\n queueJob(job);\n }\n };\n }\n baseWatchOptions.augmentJob = (job) => {\n if (cb) {\n job.flags |= 4;\n }\n if (isPre) {\n job.flags |= 2;\n if (instance) {\n job.id = instance.uid;\n job.i = instance;\n }\n }\n };\n const watchHandle = watch$1(source, cb, baseWatchOptions);\n if (isInSSRComponentSetup) {\n if (ssrCleanup) {\n ssrCleanup.push(watchHandle);\n } else if (runsImmediately) {\n watchHandle();\n }\n }\n return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\n\nconst TeleportEndKey = /* @__PURE__ */ Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (parentComponent && parentComponent.isCE) {\n (parentComponent.ce._teleportTargets || (parentComponent.ce._teleportTargets = /* @__PURE__ */ new Set())).add(target);\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n n2.el.__isMounted = false;\n queuePostRenderEffect(() => {\n mountToTarget();\n delete n2.el.__isMounted;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n function hydrateDisabledTeleport(node2, vnode2, targetStart, targetAnchor) {\n vnode2.anchor = hydrateChildren(\n nextSibling(node2),\n vnode2,\n parentNode(node2),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode2.targetStart = targetStart;\n vnode2.targetAnchor = targetAnchor;\n }\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n const disabled = isTeleportDisabled(vnode.props);\n if (target) {\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n hydrateDisabledTeleport(\n node,\n vnode,\n targetNode,\n targetNode && nextSibling(targetNode)\n );\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n } else if (disabled) {\n if (vnode.shapeFlag & 16) {\n hydrateDisabledTeleport(node, vnode, node, nextSibling(node));\n }\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = /* @__PURE__ */ Symbol(\"_leaveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nconst pendingSetRefMap = /* @__PURE__ */ new WeakMap();\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n const canSetRef = (ref2) => {\n return !!!(process.env.NODE_ENV !== \"production\") || !knownTemplateRefs.has(ref2);\n };\n if (oldRef != null && oldRef !== ref) {\n invalidatePendingSetRef(oldRawRef);\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n if (canSetRef(oldRef)) {\n oldRef.value = null;\n }\n const oldRawRefAtom = oldRawRef;\n if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n const newVal = [refValue];\n if (canSetRef(ref)) {\n ref.value = newVal;\n }\n if (rawRef.k) refs[rawRef.k] = newVal;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n if (canSetRef(ref)) {\n ref.value = value;\n }\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n const job = () => {\n doSet();\n pendingSetRefMap.delete(rawRef);\n };\n job.id = -1;\n pendingSetRefMap.set(rawRef, job);\n queuePostRenderEffect(job, parentSuspense);\n } else {\n invalidatePendingSetRef(rawRef);\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\nfunction invalidatePendingSetRef(rawRef) {\n const pendingSetRef = pendingSetRefMap.get(rawRef);\n if (pendingSetRef) {\n pendingSetRef.flags |= 8;\n pendingSetRefMap.delete(rawRef);\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n const cls = content.getAttribute(\"class\");\n if (cls) content.$cls = cls;\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n const { textContent } = el;\n if (textContent !== clientText && // innerHTML normalize \\r\\n or \\r into a single \\n in the DOM\n textContent !== clientText.replace(/\\r\\n|\\r/g, \"\\n\")) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${textContent}\n - expected on client: ${clientText}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n if (el.$cls) {\n actual = el.$cls;\n delete el.$cls;\n } else {\n actual = el.getAttribute(\"class\");\n }\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n const value = normalizeCssVarValue(cssVars[key]);\n expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return list.includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n let patched = false;\n (instance.bu || (instance.bu = [])).push(() => patched = true);\n const performHydrate = () => {\n if (patched) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n );\n }\n return;\n }\n hydrate();\n };\n const doHydrate = hydrateStrategy ? () => {\n const teardown = hydrateStrategy(\n performHydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n } : performHydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createInnerComp(\n loadingComponent,\n instance\n );\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n instance2.__keepAliveStorageContainer = storageContainer;\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : vnode.type\n );\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= -257;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= -257;\n vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = /* @__PURE__ */ Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n let isReadonlySource = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n isReadonlySource = isReadonly(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n const hasProps = Object.keys(props).length > 0;\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n hasProps ? -2 : 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (hasOwn(props, key)) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","export function getLmBasePath(): string {\n const { pathname } = window.location;\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmApiUrl(path: string): string {\n return `${getLmBasePath()}${path}`;\n}\n","import { ref } from 'vue'\nimport type { BaseModelOption, TagOption, FolderTreeNode, LoraItem } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraPoolApi() {\n const isLoading = ref(false)\n\n const fetchBaseModels = async (limit = 50): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/base-models?limit=${limit}`))\n const data = await response.json()\n return data.base_models || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch base models:', error)\n return []\n }\n }\n\n const fetchTags = async (limit = 0): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/top-tags?limit=${limit}`))\n const data = await response.json()\n return data.tags || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch tags:', error)\n return []\n }\n }\n\n const fetchFolderTree = async (): Promise => {\n try {\n const response = await fetch(lmApiUrl('/api/lm/loras/unified-folder-tree'))\n const data = await response.json()\n return transformFolderTree(data.tree || {})\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch folder tree:', error)\n return []\n }\n }\n\n const transformFolderTree = (tree: Record, parentPath = ''): FolderTreeNode[] => {\n if (!tree || typeof tree !== 'object') {\n return []\n }\n\n return Object.entries(tree).map(([name, children]) => {\n const path = parentPath ? `${parentPath}/${name}` : name\n const childNodes = transformFolderTree(children as Record, path)\n\n return {\n key: path,\n label: name,\n children: childNodes.length > 0 ? childNodes : undefined\n }\n })\n }\n\n interface FetchLorasParams {\n baseModels?: string[]\n tagsInclude?: string[]\n tagsExclude?: string[]\n foldersInclude?: string[]\n foldersExclude?: string[]\n noCreditRequired?: boolean\n allowSelling?: boolean\n namePatternsInclude?: string[]\n namePatternsExclude?: string[]\n namePatternsUseRegex?: boolean\n page?: number\n pageSize?: number\n }\n\n const fetchLoras = async (params: FetchLorasParams): Promise<{ items: LoraItem[]; total: number }> => {\n isLoading.value = true\n try {\n const urlParams = new URLSearchParams()\n urlParams.set('page', String(params.page || 1))\n urlParams.set('page_size', String(params.pageSize || 6))\n\n params.baseModels?.forEach(bm => urlParams.append('base_model', bm))\n params.tagsInclude?.forEach(tag => urlParams.append('tag_include', tag))\n params.tagsExclude?.forEach(tag => urlParams.append('tag_exclude', tag))\n\n // Folder filters\n if (params.foldersInclude && params.foldersInclude.length > 0) {\n params.foldersInclude.forEach(folder => urlParams.append('folder_include', folder))\n urlParams.set('recursive', 'true')\n }\n params.foldersExclude?.forEach(folder => urlParams.append('folder_exclude', folder))\n\n if (params.noCreditRequired !== undefined) {\n urlParams.set('credit_required', String(!params.noCreditRequired))\n }\n\n if (params.allowSelling !== undefined) {\n urlParams.set('allow_selling_generated_content', String(params.allowSelling))\n }\n\n // Name pattern filters\n params.namePatternsInclude?.forEach(pattern => urlParams.append('name_pattern_include', pattern))\n params.namePatternsExclude?.forEach(pattern => urlParams.append('name_pattern_exclude', pattern))\n if (params.namePatternsUseRegex !== undefined) {\n urlParams.set('name_pattern_use_regex', String(params.namePatternsUseRegex))\n }\n\n const response = await fetch(lmApiUrl(`/api/lm/loras/list?${urlParams}`))\n const data = await response.json()\n\n return {\n items: data.items || [],\n total: data.total || 0\n }\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch loras:', error)\n return { items: [], total: 0 }\n } finally {\n isLoading.value = false\n }\n }\n\n return {\n isLoading,\n fetchBaseModels,\n fetchTags,\n fetchFolderTree,\n fetchLoras\n }\n}\n","import { ref, computed, watch } from 'vue'\nimport type {\n LoraPoolConfig,\n BaseModelOption,\n TagOption,\n FolderTreeNode,\n LoraItem,\n ComponentWidget\n} from './types'\nimport { useLoraPoolApi } from './useLoraPoolApi'\n\nexport function useLoraPoolState(widget: ComponentWidget) {\n const api = useLoraPoolApi()\n\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n let isRestoring = false\n\n // Filter state\n const selectedBaseModels = ref([])\n const includeTags = ref([])\n const excludeTags = ref([])\n const includeFolders = ref([])\n const excludeFolders = ref([])\n const noCreditRequired = ref(false)\n const allowSelling = ref(false)\n const includePatterns = ref([])\n const excludePatterns = ref([])\n const useRegex = ref(false)\n\n // Available options from API\n const availableBaseModels = ref([])\n const availableTags = ref([])\n const folderTree = ref([])\n\n // Preview state\n const previewItems = ref([])\n const matchCount = ref(0)\n const isLoading = computed(() => api.isLoading.value)\n\n // Build config from current state\n const buildConfig = (): LoraPoolConfig => {\n const config: LoraPoolConfig = {\n version: 2,\n filters: {\n baseModels: selectedBaseModels.value,\n tags: {\n include: includeTags.value,\n exclude: excludeTags.value\n },\n folders: {\n include: includeFolders.value,\n exclude: excludeFolders.value\n },\n license: {\n noCreditRequired: noCreditRequired.value,\n allowSelling: allowSelling.value\n },\n namePatterns: {\n include: includePatterns.value,\n exclude: excludePatterns.value,\n useRegex: useRegex.value\n }\n },\n preview: {\n matchCount: matchCount.value,\n lastUpdated: Date.now()\n }\n }\n\n // Update widget value (this triggers callback for UI sync)\n // Skip during restoration to prevent infinite loops:\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n if (!isRestoring) {\n widget.value = config\n }\n return config\n }\n\n // Restore state from config\n const restoreFromConfig = (config: LoraPoolConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n // This breaks the infinite loop: callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback\n isRestoring = true\n\n try {\n if (!config?.filters) return\n\n const { filters, preview } = config\n\n // Helper to update ref only if value changed\n const updateIfChanged = (refValue: { value: T }, newValue: T) => {\n if (JSON.stringify(refValue.value) !== JSON.stringify(newValue)) {\n refValue.value = newValue\n }\n }\n\n updateIfChanged(selectedBaseModels, filters.baseModels || [])\n updateIfChanged(includeTags, filters.tags?.include || [])\n updateIfChanged(excludeTags, filters.tags?.exclude || [])\n updateIfChanged(includeFolders, filters.folders?.include || [])\n updateIfChanged(excludeFolders, filters.folders?.exclude || [])\n updateIfChanged(noCreditRequired, filters.license?.noCreditRequired ?? false)\n updateIfChanged(allowSelling, filters.license?.allowSelling ?? false)\n updateIfChanged(includePatterns, filters.namePatterns?.include || [])\n updateIfChanged(excludePatterns, filters.namePatterns?.exclude || [])\n updateIfChanged(useRegex, filters.namePatterns?.useRegex ?? false)\n\n // matchCount doesn't trigger watchers, so direct assignment is fine\n matchCount.value = preview?.matchCount || 0\n } finally {\n isRestoring = false\n }\n }\n\n // Fetch filter options from API\n const fetchFilterOptions = async () => {\n const [baseModels, tags, folders] = await Promise.all([\n api.fetchBaseModels(),\n api.fetchTags(),\n api.fetchFolderTree()\n ])\n\n availableBaseModels.value = baseModels\n availableTags.value = tags\n folderTree.value = folders\n }\n\n // Refresh preview with current filters\n const refreshPreview = async () => {\n const result = await api.fetchLoras({\n baseModels: selectedBaseModels.value,\n tagsInclude: includeTags.value,\n tagsExclude: excludeTags.value,\n foldersInclude: includeFolders.value,\n foldersExclude: excludeFolders.value,\n noCreditRequired: noCreditRequired.value || undefined,\n allowSelling: allowSelling.value || undefined,\n namePatternsInclude: includePatterns.value,\n namePatternsExclude: excludePatterns.value,\n namePatternsUseRegex: useRegex.value,\n pageSize: 6\n })\n\n previewItems.value = result.items\n matchCount.value = result.total\n buildConfig()\n }\n\n // Debounced filter change handler\n let filterTimeout: ReturnType | null = null\n const onFilterChange = () => {\n if (filterTimeout) clearTimeout(filterTimeout)\n filterTimeout = setTimeout(() => {\n refreshPreview()\n }, 300)\n }\n\n // Watch all filter changes\n watch([\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex\n ], onFilterChange, { deep: true })\n\n return {\n // Filter state\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex,\n\n // Available options\n availableBaseModels,\n availableTags,\n folderTree,\n\n // Preview state\n previewItems,\n matchCount,\n isLoading,\n\n // Actions\n buildConfig,\n restoreFromConfig,\n fetchFilterOptions,\n refreshPreview\n }\n}\n\nexport type LoraPoolStateReturn = ReturnType\n","import { ref, computed } from 'vue'\n\nexport type ModalType = 'baseModels' | 'includeTags' | 'excludeTags' | 'includeFolders' | 'excludeFolders' | null\n\nexport function useModalState() {\n const activeModal = ref(null)\n\n const isOpen = computed(() => activeModal.value !== null)\n\n const openModal = (modal: ModalType) => {\n activeModal.value = modal\n }\n\n const closeModal = () => {\n activeModal.value = null\n }\n\n const isModalOpen = (modal: ModalType) => {\n return activeModal.value === modal\n }\n\n return {\n activeModal,\n isOpen,\n openModal,\n closeModal,\n isModalOpen\n }\n}\n\nexport type ModalStateReturn = ReturnType\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, computed, watch } from 'vue'\nimport type { ComponentWidget, RandomizerConfig, LoraEntry } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraRandomizerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const countMode = ref<'fixed' | 'range'>('range')\n const countFixed = ref(3)\n const countMin = ref(2)\n const countMax = ref(5)\n const modelStrengthMin = ref(0.0)\n const modelStrengthMax = ref(1.0)\n const useCustomClipRange = ref(false)\n const clipStrengthMin = ref(0.0)\n const clipStrengthMax = ref(1.0)\n const rollMode = ref<'fixed' | 'always'>('fixed')\n const isRolling = ref(false)\n const useRecommendedStrength = ref(false)\n const recommendedStrengthScaleMin = ref(0.5)\n const recommendedStrengthScaleMax = ref(1.0)\n\n // Track last used combination (for backend roll mode)\n const lastUsed = ref(null)\n\n // Dual seed mechanism for batch queue synchronization\n // execution_seed: seed for generating execution_stack (= previous next_seed)\n // next_seed: seed for generating ui_loras (= what will be displayed after execution)\n const executionSeed = ref(null)\n const nextSeed = ref(null)\n\n // Build config object from current state\n const buildConfig = (): RandomizerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n\n // Shift seeds for batch queue synchronization\n // Previous next_seed becomes current execution_seed, and generate a new next_seed\n const generateNewSeed = () => {\n executionSeed.value = nextSeed.value // Previous next becomes current execution\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n\n // Initialize next_seed for first execution (execution_seed stays null)\n const initializeNextSeed = () => {\n if (nextSeed.value === null) {\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: RandomizerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n countMode.value = config.count_mode || 'range'\n countFixed.value = config.count_fixed || 3\n countMin.value = config.count_min || 2\n countMax.value = config.count_max || 5\n modelStrengthMin.value = config.model_strength_min ?? 0.0\n modelStrengthMax.value = config.model_strength_max ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n clipStrengthMin.value = config.clip_strength_min ?? 0.0\n clipStrengthMax.value = config.clip_strength_max ?? 1.0\n // Migrate old roll_mode values to new ones\n const rawRollMode = (config as any).roll_mode as string\n if (rawRollMode === 'frontend') {\n rollMode.value = 'fixed'\n } else if (rawRollMode === 'backend') {\n rollMode.value = 'always'\n } else if (rawRollMode === 'fixed' || rawRollMode === 'always') {\n rollMode.value = rawRollMode as 'fixed' | 'always'\n } else {\n rollMode.value = 'fixed'\n }\n lastUsed.value = config.last_used || null\n useRecommendedStrength.value = config.use_recommended_strength ?? false\n recommendedStrengthScaleMin.value = config.recommended_strength_scale_min ?? 0.5\n recommendedStrengthScaleMax.value = config.recommended_strength_scale_max ?? 1.0\n } finally {\n isRestoring = false\n }\n }\n\n // Roll loras - call API to get random selection\n const rollLoras = async (\n poolConfig: any | null,\n lockedLoras: LoraEntry[]\n ): Promise => {\n try {\n isRolling.value = true\n\n const config = buildConfig()\n\n // Build request body\n const requestBody: any = {\n model_strength_min: config.model_strength_min,\n model_strength_max: config.model_strength_max,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: config.clip_strength_min,\n clip_strength_max: config.clip_strength_max,\n locked_loras: lockedLoras,\n use_recommended_strength: config.use_recommended_strength,\n recommended_strength_scale_min: config.recommended_strength_scale_min,\n recommended_strength_scale_max: config.recommended_strength_scale_max,\n }\n\n // Add count parameters\n if (config.count_mode === 'fixed') {\n requestBody.count = config.count_fixed\n } else {\n requestBody.count_min = config.count_min\n requestBody.count_max = config.count_max\n }\n\n // Add pool config if provided\n if (poolConfig) {\n requestBody.pool_config = poolConfig.filters || {}\n }\n\n // Call API endpoint\n const response = await fetch(lmApiUrl('/api/lm/loras/random-sample'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch random LoRAs')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get random LoRAs')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraRandomizerState] Error rolling LoRAs:', error)\n throw error\n } finally {\n isRolling.value = false\n }\n }\n\n // Restore last used and return it\n const useLastUsed = () => {\n if (lastUsed.value && lastUsed.value.length > 0) {\n return lastUsed.value\n }\n return null\n }\n\n // Computed properties\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n const isRecommendedStrengthEnabled = computed(() => useRecommendedStrength.value)\n\n // Watch all state changes and update widget value\n watch([\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n isRolling,\n lastUsed,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n executionSeed,\n nextSeed,\n\n // Computed\n isClipStrengthDisabled,\n isRecommendedStrengthEnabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n rollLoras,\n useLastUsed,\n generateNewSeed,\n initializeNextSeed,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, watch, computed } from 'vue'\nimport type { ComponentWidget, CyclerConfig, LoraPoolConfig } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport interface CyclerLoraItem {\n file_name: string\n model_name: string\n file_path: string\n}\n\nexport function useLoraCyclerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const currentIndex = ref(1) // 1-based\n const totalCount = ref(0)\n const poolConfigHash = ref('')\n const modelStrength = ref(1.0)\n const clipStrength = ref(1.0)\n const useCustomClipRange = ref(false)\n const usePresetStrength = ref(false)\n const presetStrengthScale = ref(1.0)\n const sortBy = ref<'filename' | 'model_name'>('filename')\n const currentLoraName = ref('')\n const currentLoraFilename = ref('')\n const isLoading = ref(false)\n\n // Dual-index mechanism for batch queue synchronization\n // execution_index: index for generating execution_stack (= previous next_index)\n // next_index: index for UI display (= what will be shown after execution)\n const executionIndex = ref(null)\n const nextIndex = ref(null)\n\n // Advanced index control features\n const repeatCount = ref(1) // How many times each LoRA should repeat\n const repeatUsed = ref(0) // How many times current index has been used (internal tracking)\n const displayRepeatUsed = ref(0) // For UI display, deferred updates like currentIndex\n const isPaused = ref(false) // Whether iteration is paused\n const includeNoLora = ref(false) // Whether to include empty LoRA option in cycle\n\n // Execution progress tracking (visual feedback)\n const isWorkflowExecuting = ref(false) // Workflow is currently running\n const executingRepeatStep = ref(0) // Which repeat step (1-based, 0 = not executing)\n\n // Build config object from current state\n const buildConfig = (): CyclerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: CyclerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n currentIndex.value = config.current_index || 1\n totalCount.value = config.total_count || 0\n poolConfigHash.value = config.pool_config_hash || ''\n modelStrength.value = config.model_strength ?? 1.0\n clipStrength.value = config.clip_strength ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n usePresetStrength.value = config.use_preset_strength ?? false\n presetStrengthScale.value = config.preset_strength_scale ?? 1.0\n sortBy.value = config.sort_by || 'filename'\n currentLoraName.value = config.current_lora_name || ''\n currentLoraFilename.value = config.current_lora_filename || ''\n // Advanced index control features\n repeatCount.value = config.repeat_count ?? 1\n repeatUsed.value = config.repeat_used ?? 0\n isPaused.value = config.is_paused ?? false\n includeNoLora.value = config.include_no_lora ?? false\n // Note: execution_index and next_index are not restored from config\n // as they are transient values used only during batch execution\n } finally {\n isRestoring = false\n }\n }\n\n // Shift indices for batch queue synchronization\n // Previous next_index becomes current execution_index, and generate a new next_index\n const generateNextIndex = () => {\n executionIndex.value = nextIndex.value // Previous next becomes current execution\n // Calculate the next index (wrap to 1 if at end)\n const current = executionIndex.value ?? currentIndex.value\n let next = current + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n\n // Initialize next_index for first execution (execution_index stays null)\n const initializeNextIndex = () => {\n if (nextIndex.value === null) {\n // First execution uses current_index, so next is current + 1\n let next = currentIndex.value + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n }\n\n // Generate hash from pool config for change detection\n const hashPoolConfig = (poolConfig: LoraPoolConfig | null): string => {\n if (!poolConfig || !poolConfig.filters) {\n return ''\n }\n try {\n return btoa(JSON.stringify(poolConfig.filters))\n } catch {\n return ''\n }\n }\n\n // Fetch cycler list from API\n const fetchCyclerList = async (\n poolConfig: LoraPoolConfig | null\n ): Promise => {\n try {\n isLoading.value = true\n\n const requestBody: Record = {\n sort_by: sortBy.value,\n }\n\n if (poolConfig?.filters) {\n requestBody.pool_config = poolConfig.filters\n }\n\n const response = await fetch(lmApiUrl('/api/lm/loras/cycler-list'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch cycler list')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get cycler list')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraCyclerState] Error fetching cycler list:', error)\n throw error\n } finally {\n isLoading.value = false\n }\n }\n\n // Refresh list and update state\n const refreshList = async (poolConfig: LoraPoolConfig | null) => {\n try {\n const newHash = hashPoolConfig(poolConfig)\n const hashChanged = newHash !== poolConfigHash.value\n\n // Fetch the list\n const loraList = await fetchCyclerList(poolConfig)\n\n // Update total count\n totalCount.value = loraList.length\n\n // If pool config changed, reset index to 1\n if (hashChanged) {\n currentIndex.value = 1\n poolConfigHash.value = newHash\n }\n\n // Clamp index to valid range\n if (currentIndex.value > totalCount.value) {\n currentIndex.value = Math.max(1, totalCount.value)\n }\n\n // Update current LoRA info\n if (loraList.length > 0 && currentIndex.value > 0) {\n const currentLora = loraList[currentIndex.value - 1]\n if (currentLora) {\n currentLoraName.value = sortBy.value === 'filename' \n ? currentLora.file_name \n : (currentLora.model_name || currentLora.file_name)\n currentLoraFilename.value = currentLora.file_name\n }\n } else {\n currentLoraName.value = ''\n currentLoraFilename.value = ''\n }\n\n return loraList\n } catch (error) {\n console.error('[LoraCyclerState] Error refreshing list:', error)\n throw error\n }\n }\n\n // Set index manually\n const setIndex = (index: number) => {\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (index >= 1 && index <= effectiveTotalCount) {\n currentIndex.value = index\n }\n }\n\n // Reset index to 1 and clear repeat state\n const resetIndex = () => {\n currentIndex.value = 1\n repeatUsed.value = 0\n displayRepeatUsed.value = 0\n // Note: isPaused is intentionally not reset - user may want to stay paused after reset\n }\n\n // Toggle pause state\n const togglePause = () => {\n isPaused.value = !isPaused.value\n }\n\n // Computed property to check if clip strength is disabled\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n\n // Watch model strength changes to sync with clip strength when not using custom range\n watch(modelStrength, (newValue) => {\n if (!useCustomClipRange.value) {\n clipStrength.value = newValue\n }\n })\n\n // Watch all state changes and update widget value\n watch([\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n repeatCount,\n repeatUsed,\n isPaused,\n includeNoLora,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n isLoading,\n executionIndex,\n nextIndex,\n repeatCount,\n repeatUsed,\n displayRepeatUsed,\n isPaused,\n includeNoLora,\n isWorkflowExecuting,\n executingRepeatStep,\n\n // Computed\n isClipStrengthDisabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n hashPoolConfig,\n fetchCyclerList,\n refreshList,\n setIndex,\n generateNextIndex,\n initializeNextIndex,\n resetIndex,\n togglePause,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, onMounted, onUnmounted, type Ref } from 'vue'\n\n// Dynamic import type for AutoComplete class\ntype AutoCompleteClass = new (\n inputElement: HTMLTextAreaElement,\n modelType: 'loras' | 'prompt',\n options?: AutocompleteOptions\n) => AutoCompleteInstance\n\ninterface AutocompleteOptions {\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n showPreview?: boolean\n}\n\ninterface AutoCompleteInstance {\n destroy: () => void\n isValid: () => boolean\n refreshCaretHelper: () => void\n}\n\nexport interface UseAutocompleteOptions {\n showPreview?: boolean\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n}\n\nexport function useAutocomplete(\n textareaRef: Ref,\n modelType: 'loras' | 'prompt' = 'loras',\n options: UseAutocompleteOptions = {}\n) {\n const autocompleteInstance = ref(null)\n const isInitialized = ref(false)\n\n const defaultOptions: AutocompleteOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n showPreview: true,\n ...options\n }\n\n const initAutocomplete = async () => {\n if (!textareaRef.value) {\n console.warn('[useAutocomplete] Textarea ref is null, cannot initialize')\n return\n }\n\n if (autocompleteInstance.value) {\n console.log('[useAutocomplete] Already initialized, skipping')\n return\n }\n\n try {\n // Dynamically import the AutoComplete class\n const module = await import(/* @vite-ignore */ `${'../autocomplete.js'}`)\n const AutoComplete: AutoCompleteClass = module.AutoComplete\n\n autocompleteInstance.value = new AutoComplete(\n textareaRef.value,\n modelType,\n defaultOptions\n )\n isInitialized.value = true\n console.log(`[useAutocomplete] Initialized for ${modelType}`)\n } catch (error) {\n console.error('[useAutocomplete] Failed to initialize:', error)\n }\n }\n\n const destroyAutocomplete = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.destroy()\n autocompleteInstance.value = null\n isInitialized.value = false\n console.log('[useAutocomplete] Destroyed')\n }\n }\n\n const refreshCaretHelper = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.refreshCaretHelper()\n }\n }\n\n onMounted(() => {\n // Initialize autocomplete after component is mounted\n // Use nextTick-like delay to ensure DOM is fully ready\n setTimeout(() => {\n initAutocomplete()\n }, 0)\n })\n\n onUnmounted(() => {\n destroyAutocomplete()\n })\n\n return {\n autocompleteInstance,\n isInitialized,\n initAutocomplete,\n destroyAutocomplete,\n refreshCaretHelper\n }\n}\n\nexport type UseAutocompleteReturn = ReturnType\n","\n\n\n\n\n\n\n\n","\n\n\n\n","import type { App as VueApp } from 'vue'\n\nexport function createVueWidgetCleanup(vueApp: VueApp, onCleanup?: () => void) {\n let didUnmount = false\n\n return () => {\n if (didUnmount) {\n return\n }\n\n vueApp.unmount()\n didUnmount = true\n onCleanup?.()\n }\n}\n","import { api } from \"../../scripts/api.js\";\nimport { app } from \"../../scripts/app.js\";\nimport { TextAreaCaretHelper } from \"./textarea_caret_helper.js\";\nimport {\n WILDCARD_COMMANDS,\n createWildcardEmptyStateItem,\n createWildcardNoMatchesItem,\n getWildcardInsertText,\n getWildcardSearchEndpoint,\n isWildcardCommand,\n isWildcardInfoItem,\n} from \"./autocomplete_wildcards.js\";\nimport {\n getAutocompleteAppendCommaPreference,\n getAutocompleteAutoFormatPreference,\n getAutocompleteAcceptKeyPreference,\n getLoraActiveFiltersAutocompletePreference,\n getPromptTagAutocompletePreference,\n getTagSpaceReplacementPreference,\n setLoraManagerSettingValue,\n} from \"./settings.js\";\nimport { showToast } from \"./utils.js\";\n\n// localStorage key for the one-time \"how to disable\" hint in the dropdown\nconst FIRST_RUN_HINT_DISMISSED_KEY = 'lm:autocomplete-disable-tip-dismissed';\n// localStorage key for the one-time \"try active filters search\" hint (loras nodes)\nconst ACTIVE_FILTERS_HINT_DISMISSED_KEY = 'lm:activefilters-tip-dismissed';\n\n// Command definitions for category filtering\nconst TAG_COMMANDS = {\n '/character': { categories: [4, 11], label: 'Character' },\n '/artist': { categories: [1, 8], label: 'Artist' },\n '/general': { categories: [0, 7], label: 'General' },\n '/copyright': { categories: [3, 10], label: 'Copyright' },\n '/meta': { categories: [5, 14], label: 'Meta' },\n '/species': { categories: [12], label: 'Species' },\n '/lore': { categories: [15], label: 'Lore' },\n '/emb': { type: 'embedding', label: 'Embeddings' },\n '/embedding': { type: 'embedding', label: 'Embeddings' },\n ...WILDCARD_COMMANDS,\n // Autocomplete toggle commands - only show one based on current state\n '/autocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: true,\n label: 'Turn autocomplete ON',\n condition: () => !getPromptTagAutocompletePreference()\n },\n '/noautocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: false,\n label: 'Turn autocomplete OFF',\n condition: () => getPromptTagAutocompletePreference()\n },\n};\n\n// Command definitions for LoRA active-filters search\nconst LORAS_COMMANDS = {\n '/activefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: true,\n label: 'Turn active filters search ON',\n feedbackSummary: 'Active Filters Search: ON',\n feedbackDetail: 'LoRA autocomplete now searches within the active filters of the LoRA Manager page.',\n condition: () => !getLoraActiveFiltersAutocompletePreference()\n },\n '/noactivefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: false,\n label: 'Turn active filters search OFF',\n feedbackSummary: 'Active Filters Search: OFF',\n feedbackDetail: 'LoRA autocomplete searches the full library again.',\n condition: () => getLoraActiveFiltersAutocompletePreference()\n },\n};\n\n// Category display information\nconst CATEGORY_INFO = { 0: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 1: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 3: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 4: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 5: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 7: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 8: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 10: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 11: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 12: { bg: 'rgba(237, 137, 54, 0.2)', text: '#f6ad55', label: 'Species' },\n 14: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 15: { bg: 'rgba(72, 187, 120, 0.2)', text: '#68d391', label: 'Lore' },\n};\n\n// Format post count with K/M suffix\nfunction formatPostCount(count) {\n if (count >= 1000000) {\n return (count / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n } else if (count >= 1000) {\n return (count / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n }\n return count.toString();\n}\n\nfunction parseUsageTipNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction splitRelativePath(relativePath = '') {\n const parts = relativePath.split(/[/\\\\]+/).filter(Boolean);\n const fileName = parts.pop() ?? '';\n return {\n directories: parts,\n fileName,\n };\n}\n\nfunction removeGeneralExtension(fileName = '') {\n return fileName.replace(/\\.[^.]+$/, '');\n}\n\nfunction removeLoraExtension(fileName = '') {\n return fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n}\n\nlet _loraSyntaxFormatCache = null;\nlet _loraSyntaxFormatRefreshPromise = null;\n\nfunction _getLoraSyntaxFormat() {\n if (_loraSyntaxFormatCache !== null) {\n return _loraSyntaxFormatCache;\n }\n return 'legacy';\n}\n\nasync function _fetchLoraSyntaxFormat() {\n try {\n const response = await api.fetchApi('/lm/settings');\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.settings) {\n _loraSyntaxFormatCache = data.settings.lora_syntax_format || 'legacy';\n return;\n }\n }\n } catch (e) {\n }\n if (_loraSyntaxFormatCache === null) {\n _loraSyntaxFormatCache = 'legacy';\n }\n}\n\nfunction _triggerBackgroundRefresh() {\n if (_loraSyntaxFormatRefreshPromise) {\n return;\n }\n _loraSyntaxFormatRefreshPromise = _fetchLoraSyntaxFormat().finally(() => {\n _loraSyntaxFormatRefreshPromise = null;\n });\n}\n\nasync function refreshLoraSyntaxFormat() {\n await _fetchLoraSyntaxFormat();\n}\n\nfunction _initLoraSyntaxFormat() {\n _triggerBackgroundRefresh();\n}\n_initLoraSyntaxFormat();\n\nfunction _initLoraSyntaxFormatReactive() {\n window.addEventListener('storage', (e) => {\n if (e.key === 'lm:lora-syntax-format-changed') {\n _triggerBackgroundRefresh();\n }\n });\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n _triggerBackgroundRefresh();\n }\n });\n}\n_initLoraSyntaxFormatReactive();\n\nfunction parseSearchTokens(term = '') {\n const include = [];\n const exclude = [];\n\n term.split(/\\s+/).forEach((rawTerm) => {\n const token = rawTerm.trim();\n if (!token) {\n return;\n }\n if (token.startsWith('-') && token.length > 1) {\n exclude.push(token.slice(1).toLowerCase());\n } else {\n include.push(token.toLowerCase());\n }\n });\n\n return { include, exclude };\n}\n\nfunction escapePromptParentheses(text) {\n // In ComfyUI's CLIP text encoder, bare parentheses are weight adjustment syntax.\n // Tags containing literal parentheses must be escaped with backslash to prevent\n // them from being interpreted as weight modifiers. e.g. \"foo (bar)\" → \"foo \\(bar\\)\"\n return text.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n}\n\nfunction formatAutocompleteInsertion(text = '') {\n const trimmed = typeof text === 'string' ? text.trim() : '';\n if (!trimmed) {\n return '';\n }\n\n return getAutocompleteAppendCommaPreference() ? `${trimmed},` : `${trimmed} `;\n}\n\n// Matches a complete tag. Kept\n// permissive on the strength fields (mirrors the backend parser) so tags\n// are still protected while the user is mid-edit.\nconst LORA_TAG_PATTERN = /(]+:[^:>]+(?::[^:>]+)?>)/gi;\n\nfunction normalizeAutocompleteSegment(segment = '') {\n // Collapse whitespace only outside tags: names inside the tags\n // may legitimately contain repeated spaces (e.g. \"test - 0021\"), and\n // collapsing them breaks file resolution at runtime.\n return segment\n .split(LORA_TAG_PATTERN)\n .map((part, index) => (index % 2 === 1 ? part : part.replace(/\\s+/g, ' ')))\n .join('')\n .trim();\n}\n\nexport function formatAutocompleteTextOnBlur(text = '') {\n if (typeof text !== 'string') {\n return '';\n }\n\n return text\n .split('\\n')\n .map((line) => {\n if (!line.trim()) {\n return '';\n }\n\n const cleanedSegments = line\n .split(',')\n .map(normalizeAutocompleteSegment)\n .filter(Boolean);\n\n return cleanedSegments.join(', ');\n })\n .join('\\n');\n}\n\nfunction shouldAcceptAutocompleteKey(key) {\n const mode = getAutocompleteAcceptKeyPreference();\n\n if (mode === 'tab_only') {\n return key === 'Tab';\n }\n\n if (mode === 'enter_only') {\n return key === 'Enter';\n }\n\n return key === 'Tab' || key === 'Enter';\n}\n\nfunction normalizeAutocompleteMatchText(text = '') {\n return text.toLowerCase().replace(/[-_\\s']/g, '');\n}\n\nconst AUTOCOMPLETE_METADATA_VERSION = 1;\n\nfunction createAutocompleteMetadataBase(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName,\n };\n}\n\nconst AUTOCOMPLETE_METADATA_WIDGET_PREFIX = '__lm_autocomplete_meta_';\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'; // Must match vue-widgets/src/main.ts\n\n/**\n * Return a copy of an autocomplete metadata value without the lastAccepted\n * boundary. lastAccepted carries insertedText/textSnapshot (old prompt text)\n * and is session-only state; it must not leak into exported workflow JSON.\n * Values without lastAccepted are returned as-is.\n *\n * @param {*} value - Widget metadata value (or any other widget value)\n * @returns {*} The stripped copy, or the original value when untouched\n */\nexport function stripAutocompleteLastAccepted(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n if (!('lastAccepted' in value)) {\n return value;\n }\n const stripped = { ...value };\n delete stripped.lastAccepted;\n return stripped;\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets on a serialized\n * node's widgets_values / widgets_values_named. Array entries are aligned\n * via properties.__lm_widget_ids (written by the extension's onSerialize).\n * Operates on graph.serialize() output, which is already a deep copy.\n *\n * @param {Array} nodes - Serialized node array\n */\nfunction stripAutocompleteMetadataFromNodes(nodes) {\n if (!Array.isArray(nodes)) {\n return;\n }\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n\n const widgetIds = node.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY];\n if (Array.isArray(node.widgets_values) && Array.isArray(widgetIds)) {\n for (let i = 0; i < node.widgets_values.length && i < widgetIds.length; i++) {\n if (typeof widgetIds[i] === 'string'\n && widgetIds[i].startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n node.widgets_values[i] = stripAutocompleteLastAccepted(node.widgets_values[i]);\n }\n }\n }\n\n const named = node.widgets_values_named;\n if (named && typeof named === 'object') {\n for (const [key, value] of Object.entries(named)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n named[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets in a graphToPrompt()\n * result (both the workflow document and the API prompt). Used by the widget\n * bundle to keep exported workflows free of old prompt text while leaving\n * live node state untouched.\n *\n * @param {*} result - graphToPrompt() result: { workflow, output }\n * @returns {*} The same result object, with metadata entries replaced in place\n */\nexport function stripAutocompleteMetadataFromPromptResult(result) {\n if (!result || typeof result !== 'object') {\n return result;\n }\n\n const workflow = result.workflow;\n if (workflow && typeof workflow === 'object') {\n stripAutocompleteMetadataFromNodes(workflow.nodes);\n const subgraphs = workflow.definitions?.subgraphs;\n if (Array.isArray(subgraphs)) {\n for (const subgraph of subgraphs) {\n stripAutocompleteMetadataFromNodes(subgraph?.nodes);\n }\n }\n }\n\n const output = result.output;\n if (output && typeof output === 'object') {\n for (const nodeOutput of Object.values(output)) {\n const inputs = nodeOutput?.inputs;\n if (!inputs || typeof inputs !== 'object') {\n continue;\n }\n for (const [key, value] of Object.entries(inputs)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n inputs[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n\n return result;\n}\n\nfunction createDefaultBehavior(modelType) {\n return {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n const trimmed = relativePath?.trim() ?? '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(escapePromptParentheses(trimmed));\n },\n };\n}\n\nconst MODEL_BEHAVIORS = {\n loras: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const baseName = removeLoraExtension(fileName);\n const folder = directories.length ? directories.join('/') + '/' : '';\n const loraName = folder + baseName;\n\n const resultName = _getLoraSyntaxFormat() === 'legacy'\n ? baseName\n : loraName;\n\n let strength = 1.0;\n let hasStrength = false;\n let clipStrength = null;\n\n try {\n const response = await api.fetchApi(`/lm/loras/usage-tips-by-path?relative_path=${encodeURIComponent(relativePath)}`);\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.usage_tips) {\n try {\n const usageTips = JSON.parse(data.usage_tips);\n const parsedStrength = parseUsageTipNumber(usageTips.strength);\n if (parsedStrength !== null) {\n strength = parsedStrength;\n hasStrength = true;\n }\n const clipSource = usageTips.clip_strength ?? usageTips.clipStrength;\n const parsedClipStrength = parseUsageTipNumber(clipSource);\n if (parsedClipStrength !== null) {\n clipStrength = parsedClipStrength;\n if (!hasStrength) {\n strength = 1.0;\n }\n }\n } catch (parseError) {\n console.warn('Failed to parse usage tips JSON:', parseError);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch usage tips:', error);\n }\n\n if (clipStrength !== null) {\n return formatAutocompleteInsertion(``);\n }\n return formatAutocompleteInsertion(``);\n }\n },\n embeddings: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n },\n },\n custom_words: {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n return formatAutocompleteInsertion(escapePromptParentheses(relativePath));\n },\n },\n prompt: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: 'embeddings' });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip || instance.searchType !== 'embeddings') {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(instance, relativePath) {\n const rawSearchTerm = instance.getSearchTerm(instance.inputElement.value);\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n\n if (match || instance.searchType === 'embeddings') {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n } else if (instance.searchType === 'wildcards' || isWildcardCommand(instance.activeCommand)) {\n return formatAutocompleteInsertion(getWildcardInsertText(relativePath));\n } else {\n let tagText = relativePath;\n\n if (getTagSpaceReplacementPreference()) {\n tagText = tagText.replace(/_/g, ' ');\n }\n\n tagText = escapePromptParentheses(tagText);\n\n return formatAutocompleteInsertion(tagText);\n }\n },\n },\n};\n\nfunction getModelBehavior(modelType) {\n return MODEL_BEHAVIORS[modelType] ?? createDefaultBehavior(modelType);\n}\n\nclass AutoComplete {\n constructor(inputElement, modelType = 'loras', options = {}) {\n this.inputElement = inputElement;\n this.modelType = modelType;\n this.behavior = getModelBehavior(modelType);\n this.options = {\n maxItems: 100,\n pageSize: 20,\n visibleItems: 15, // Fixed at 15 items for balanced UX\n itemHeight: 40,\n minChars: 1,\n debounceDelay: 200,\n showPreview: this.behavior.enablePreview ?? false,\n enableVirtualScroll: true,\n ...options\n };\n\n this.dropdown = null;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.items = [];\n this.debounceTimer = null;\n this.isVisible = false;\n this.currentSearchTerm = '';\n this.wildcardMeta = null;\n this.previewTooltip = null;\n this.previewTooltipPromise = null;\n this.searchType = null;\n this.suppressAutocompleteOnce = false;\n\n // Discoverability hints state\n this.commandListFooter = null; // State hint shown below the slash command list\n this.firstRunHint = null; // One-time \"how to disable\" bar inside the dropdown\n\n // Virtual scrolling state\n this.virtualScrollOffset = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.currentPage = 0;\n this.scrollContainer = null;\n this.contentContainer = null;\n this.totalHeight = 0;\n\n // Command mode state\n this.activeCommand = null; // Current active command (e.g., { categories: [4, 11], label: 'Character' })\n this.showingCommands = false; // Whether showing command list dropdown\n\n // Initialize TextAreaCaretHelper\n this.helper = new TextAreaCaretHelper(inputElement, () => app.canvas.ds.scale);\n\n this.onInput = null;\n this.onKeyDown = null;\n this.onBlur = null;\n this.onDocumentClick = null;\n this.onScroll = null;\n\n this.init();\n }\n \n init() {\n this.createDropdown();\n this.bindEvents();\n }\n \n createDropdown() {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'comfy-autocomplete-dropdown';\n\n // Apply new color scheme\n this.dropdown.style.cssText = `\n position: absolute;\n z-index: 10000;\n overflow: hidden;\n background-color: rgba(40, 44, 52, 0.95);\n border: 1px solid rgba(226, 232, 240, 0.2);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n min-width: 200px;\n width: auto;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n `;\n\n if (this.options.enableVirtualScroll) {\n // Create scroll container for virtual scrolling\n this.scrollContainer = document.createElement('div');\n this.scrollContainer.className = 'comfy-autocomplete-scroll-container';\n this.scrollContainer.style.cssText = `\n overflow-y: auto;\n max-height: ${this.options.visibleItems * this.options.itemHeight}px;\n position: relative;\n `;\n\n // Create content container for virtual items\n this.contentContainer = document.createElement('div');\n this.contentContainer.className = 'comfy-autocomplete-content';\n this.contentContainer.style.cssText = `\n position: relative;\n width: 100%;\n `;\n\n this.scrollContainer.appendChild(this.contentContainer);\n this.dropdown.appendChild(this.scrollContainer);\n }\n\n // Custom scrollbar styles with new color scheme\n const style = document.createElement('style');\n style.textContent = `\n .comfy-autocomplete-dropdown::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-loading {\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n }\n `;\n document.head.appendChild(style);\n\n // Append to body to avoid overflow issues\n document.body.appendChild(this.dropdown);\n\n if (typeof this.behavior.init === 'function') {\n this.behavior.init(this);\n }\n }\n \n initPreviewTooltip(options = {}) {\n if (this.previewTooltip || this.previewTooltipPromise) {\n return;\n }\n // Dynamically import and create preview tooltip\n this.previewTooltipPromise = import('./preview_tooltip.js').then(module => {\n const config = { modelType: this.modelType, ...options };\n this.previewTooltip = new module.PreviewTooltip(config);\n }).catch(err => {\n console.warn('Failed to load preview tooltip:', err);\n }).finally(() => {\n this.previewTooltipPromise = null;\n });\n }\n \n bindEvents() {\n // Handle input changes\n this.onInput = (e) => {\n if (this.suppressAutocompleteOnce) {\n this.suppressAutocompleteOnce = false;\n this.hide();\n return;\n }\n this.handleInput(e.target.value);\n };\n this.inputElement.addEventListener('input', this.onInput);\n\n // Handle keyboard navigation\n this.onKeyDown = (e) => {\n this.handleKeyDown(e);\n };\n this.inputElement.addEventListener('keydown', this.onKeyDown);\n\n // Handle focus out to hide dropdown\n this.onBlur = () => {\n if (getAutocompleteAutoFormatPreference()) {\n const formattedValue = formatAutocompleteTextOnBlur(this.inputElement.value);\n if (formattedValue !== this.inputElement.value) {\n this.inputElement.value = formattedValue;\n this.suppressAutocompleteOnce = true;\n this.inputElement.dispatchEvent(new Event('input', { bubbles: true }));\n }\n }\n\n // Delay hiding to allow for clicks on dropdown items\n setTimeout(() => {\n this.hide();\n }, 150);\n };\n this.inputElement.addEventListener('blur', this.onBlur);\n\n // Handle clicks outside to hide dropdown\n this.onDocumentClick = (e) => {\n if (!this.dropdown) {\n return;\n }\n\n const target = e.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (!this.dropdown.contains(target) && target !== this.inputElement) {\n this.hide();\n }\n };\n document.addEventListener('click', this.onDocumentClick);\n\n // Mark this element as having autocomplete events bound\n this.inputElement._autocompleteEventsBound = true;\n\n // Bind scroll event for virtual scrolling\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n this.onScroll = () => {\n this.handleScroll();\n };\n this.scrollContainer.addEventListener('scroll', this.onScroll);\n }\n }\n\n /**\n * Check if the autocomplete is valid (input element is in DOM and events are bound)\n */\n isValid() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound === true;\n }\n\n /**\n * Check if events need to be rebound (element exists but events not bound)\n */\n needsRebind() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound !== true;\n }\n\n /**\n * Rebind events to the input element (useful after Vue moves the element)\n */\n rebindEvents() {\n // Remove old listeners if they exist\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n }\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n }\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n }\n\n // Rebind all events\n this.bindEvents();\n\n console.log('[Lora Manager] Autocomplete events rebound');\n }\n\n /**\n * Refresh the TextAreaCaretHelper (useful after element properties change)\n */\n refreshHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n \n handleInput(value = '') {\n // Clear previous debounce timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n // Get the search term (text after last comma / '>')\n const rawSearchTerm = this.getSearchTerm(value);\n let searchTerm = rawSearchTerm;\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n\n // For embeddings, only trigger autocomplete when the current token\n // starts with the explicit \"emb:\" prefix. This avoids interrupting\n // normal prompt typing while still allowing quick manual triggering.\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (!match) {\n this.hide();\n return;\n }\n searchTerm = (match[1] || '').trim();\n }\n\n // For loras model type, check if we're in command mode (/activefilters, /noactivefilters)\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/activefilters, /noactivefilters)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = commandResult.searchTerm || rawSearchTerm;\n } else {\n // No command - regular lora search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = rawSearchTerm;\n }\n }\n\n // For prompt model type, check if we're searching embeddings, commands, or tags\n if (this.modelType === 'prompt') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (match) {\n // User typed \"emb:\" prefix - always allow embeddings search\n endpoint = '/lm/embeddings/relative-paths';\n searchTerm = (match[1] || '').trim();\n this.searchType = 'embeddings';\n this.activeCommand = null;\n this.showingCommands = false;\n } else {\n // Check for command mode FIRST (always runs, regardless of setting)\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/autocomplete, /noautocomplete)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = commandResult.command;\n searchTerm = commandResult.searchTerm;\n\n if (commandResult.command.type === 'embedding') {\n // /emb or /embedding command\n endpoint = '/lm/embeddings/relative-paths';\n this.searchType = 'embeddings';\n } else if (isWildcardCommand(commandResult.command)) {\n endpoint = getWildcardSearchEndpoint();\n this.searchType = 'wildcards';\n } else {\n // Category filter command\n const categories = commandResult.command.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n this.searchType = 'custom_words';\n }\n } else if (getPromptTagAutocompletePreference()) {\n // No command and setting enabled - regular tag search with enriched results\n this.showingCommands = false;\n this.activeCommand = null;\n endpoint = '/lm/custom-words/search?enriched=true';\n // Use full search term for query variation generation\n // The search() method will generate multiple query variations including:\n // - Original query (for natural language matching)\n // - Underscore version (e.g., \"looking_to_the_side\" for \"looking to the side\")\n // - Last token (for backward compatibility with continuous typing)\n searchTerm = rawSearchTerm;\n this.searchType = 'custom_words';\n } else {\n // No command and setting disabled - no autocomplete for direct typing.\n // Re-enable discovery is covered by the command-list footer,\n // the node context menu and the settings tooltip.\n this.hide();\n return;\n }\n }\n }\n\n const allowEmptyWildcardSearch =\n this.modelType === 'prompt' &&\n this.searchType === 'wildcards' &&\n searchTerm.length === 0;\n\n if (!allowEmptyWildcardSearch && searchTerm.length < this.options.minChars) {\n this.hide();\n return;\n }\n\n // Debounce the search\n this.debounceTimer = setTimeout(() => {\n this.search(searchTerm, endpoint);\n }, this.options.debounceDelay);\n }\n \n getSearchTerm(value) {\n return this.getActiveSearchRange(value).text;\n }\n\n getActiveSearchRange(value = null) {\n const currentValue = typeof value === 'string' ? value : this.inputElement.value;\n const caretPos = this.getCaretPosition();\n const beforeCursor = this.helper.getBeforeCursor() ?? currentValue.substring(0, caretPos);\n let start = this._getHardBoundaryStart(beforeCursor);\n\n if (!getAutocompleteAppendCommaPreference()) {\n const persistedBoundaryEnd = this._getPersistedBoundaryEnd(currentValue, caretPos);\n if (persistedBoundaryEnd !== null && persistedBoundaryEnd > start) {\n start = persistedBoundaryEnd;\n }\n }\n\n const rawText = beforeCursor.substring(start);\n const leadingWhitespaceLength = rawText.length - rawText.trimStart().length;\n const trimmedStart = start + leadingWhitespaceLength;\n const text = rawText.trim();\n\n if (this.modelType === 'prompt') {\n const tokenRange = this._getPromptTokenRange(rawText, trimmedStart, caretPos);\n if (tokenRange) {\n return {\n start: tokenRange.start,\n trimmedStart: tokenRange.trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText: tokenRange.rawText,\n text: tokenRange.text,\n tokenType: tokenRange.tokenType,\n };\n }\n }\n\n return {\n start,\n trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText,\n text,\n };\n }\n\n _getPromptTokenRange(rawText = '', trimmedStart = 0, caretPos = 0) {\n const trimmedText = rawText.trim();\n if (!trimmedText) {\n return {\n start: trimmedStart,\n trimmedStart,\n rawText: '',\n text: '',\n tokenType: 'empty',\n };\n }\n\n const commandOffset = trimmedText.startsWith('/')\n ? 0\n : trimmedText.lastIndexOf(' /');\n if (commandOffset !== -1) {\n const normalizedCommandOffset = commandOffset === 0 ? 0 : commandOffset + 1;\n const commandText = trimmedText.slice(normalizedCommandOffset);\n const commandStart = trimmedStart + normalizedCommandOffset;\n return {\n start: commandStart,\n trimmedStart: commandStart,\n rawText: commandText,\n text: commandText,\n tokenType: commandText === '/' ? 'empty_command_trigger' : 'command',\n };\n }\n\n const wildcardMatch = trimmedText.match(/(?:^|\\s)(__[\\w\\s.\\-+/*\\\\]+?__)$/);\n if (wildcardMatch) {\n const wildcardText = wildcardMatch[1];\n const wildcardOffset = trimmedText.lastIndexOf(wildcardText);\n const wildcardStart = trimmedStart + wildcardOffset;\n return {\n start: wildcardStart,\n trimmedStart: wildcardStart,\n rawText: wildcardText,\n text: '',\n tokenType: 'wildcard_literal',\n };\n }\n\n const embeddingOffset = trimmedText.search(/(?:^|\\s)emb:[^\\s]*$/i);\n if (embeddingOffset !== -1) {\n const normalizedEmbeddingOffset = trimmedText.slice(embeddingOffset).startsWith(' ')\n ? embeddingOffset + 1\n : embeddingOffset;\n const embeddingText = trimmedText.slice(normalizedEmbeddingOffset);\n const embeddingStart = trimmedStart + normalizedEmbeddingOffset;\n return {\n start: embeddingStart,\n trimmedStart: embeddingStart,\n rawText: embeddingText,\n text: embeddingText,\n tokenType: 'embedding_literal',\n };\n }\n\n return {\n start: trimmedStart,\n trimmedStart,\n rawText,\n text: trimmedText,\n tokenType: 'tag_text',\n };\n }\n\n _getHardBoundaryStart(beforeCursor = '') {\n const lastComma = beforeCursor.lastIndexOf(',');\n const lastAngle = beforeCursor.lastIndexOf('>');\n const lastNewline = Math.max(beforeCursor.lastIndexOf('\\n'), beforeCursor.lastIndexOf('\\r'));\n return Math.max(lastComma, lastAngle, lastNewline) + 1;\n }\n\n _getMetadataWidget() {\n return this.inputElement?._autocompleteMetadataWidget\n ?? this.inputElement?._autocompleteHostWidget?.metadataWidget\n ?? null;\n }\n\n _getMetadataBase() {\n return createAutocompleteMetadataBase(this.inputElement?._autocompleteTextWidgetName ?? 'text');\n }\n\n _getAutocompleteMetadata() {\n const metadataWidget = this._getMetadataWidget();\n const value = metadataWidget?.value;\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return this._getMetadataBase();\n }\n\n return {\n ...this._getMetadataBase(),\n ...value,\n };\n }\n\n _setAutocompleteMetadata(metadata = {}) {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n metadataWidget.value = {\n ...this._getMetadataBase(),\n ...metadata,\n };\n }\n\n _clearLastAcceptedBoundary() {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n const metadata = this._getAutocompleteMetadata();\n delete metadata.lastAccepted;\n metadataWidget.value = metadata;\n }\n\n _storeLastAcceptedBoundary(boundary) {\n this._setAutocompleteMetadata({ lastAccepted: boundary });\n }\n\n _getPersistedBoundaryEnd(currentValue, caretPos) {\n const metadata = this._getAutocompleteMetadata();\n const boundary = metadata?.lastAccepted;\n\n if (!boundary || typeof boundary !== 'object') {\n return null;\n }\n\n const { start, end, insertedText, textSnapshot } = boundary;\n\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < start) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (end > currentValue.length || end > caretPos) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof insertedText !== 'string' || insertedText.length === 0) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (currentValue.slice(start, end) !== insertedText) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof textSnapshot !== 'string' || currentValue.slice(0, end) !== textSnapshot) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n return end;\n }\n\n /**\n * Extract the last space-separated token from a search term\n * Tag names don't contain spaces, so for tag autocomplete we only need the last token\n * @param {string} term - The full search term (e.g., \"hello 1gi\")\n * @returns {string} - The last token (e.g., \"1gi\"), or the original term if no spaces\n */\n _getLastSpaceToken(term) {\n const tokens = term.trim().split(/\\s+/);\n return tokens[tokens.length - 1] || term;\n }\n\n /**\n * Generate query variations for better autocomplete matching\n * Includes original query and normalized versions (spaces to underscores, etc.)\n * @param {string} term - Original search term\n * @returns {string[]} - Array of query variations\n */\n _generateQueryVariations(term) {\n if (!term || term.length < this.options.minChars) {\n return [];\n }\n\n const variations = new Set();\n const trimmed = term.trim();\n\n // Always include original query\n variations.add(trimmed);\n variations.add(trimmed.toLowerCase());\n\n // Add underscore version (Danbooru convention: spaces become underscores)\n // e.g., \"looking to the side\" -> \"looking_to_the_side\"\n if (trimmed.includes(' ')) {\n const underscoreVersion = trimmed.replace(/ /g, '_');\n variations.add(underscoreVersion);\n variations.add(underscoreVersion.toLowerCase());\n }\n\n // Add no-space version for flexible matching\n // e.g., \"blue hair\" -> \"bluehair\"\n if (trimmed.includes(' ') || trimmed.includes('_')) {\n const noSpaceVersion = trimmed.replace(/[ _]/g, '');\n variations.add(noSpaceVersion);\n variations.add(noSpaceVersion.toLowerCase());\n }\n\n // Add last token only (legacy behavior for continuous typing)\n const lastToken = this._getLastSpaceToken(trimmed);\n if (lastToken !== trimmed) {\n variations.add(lastToken);\n variations.add(lastToken.toLowerCase());\n }\n\n return Array.from(variations).filter(v => v.length >= this.options.minChars);\n }\n\n _normalizeQueryForRequest(term = '') {\n return term.trim().toLowerCase();\n }\n\n _getQueriesToExecute(term = '') {\n const queryVariations = this._generateQueryVariations(term);\n const uniqueQueries = [];\n const seen = new Set();\n\n for (const query of queryVariations) {\n const normalized = this._normalizeQueryForRequest(query);\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n\n seen.add(normalized);\n uniqueQueries.push(query);\n\n if (uniqueQueries.length >= 4) {\n break;\n }\n }\n\n return uniqueQueries;\n }\n\n _containsInformationalItems() {\n return this.items.some((item) => isWildcardInfoItem(item));\n }\n\n _isSelectableInfoItem(item) {\n if (isWildcardInfoItem(item)) {\n return true;\n }\n // Command items are not model paths — never show preview for them\n return item && typeof item === 'object' && 'command' in item;\n }\n\n /**\n * Get display text for an item (without extension for models)\n * @param {string|Object} item - Item to get display text from\n * @returns {string} - Display text without extension\n */\n _getDisplayText(item) {\n if (isWildcardInfoItem(item)) {\n return item.title || item.description || 'Wildcards';\n }\n\n const itemText = typeof item === 'object' && item.tag_name ? item.tag_name : String(item);\n // Remove extension for models to avoid matching/displaying .safetensors etc.\n if (this.modelType === 'loras' || this.searchType === 'embeddings') {\n return removeLoraExtension(itemText);\n } else if (this.modelType === 'embeddings') {\n return removeGeneralExtension(itemText);\n }\n return itemText;\n }\n\n /**\n * Check if an item matches a search term\n * Supports both string items and enriched items with tag_name property\n * @param {string|Object} item - Item to check\n * @param {string} searchTerm - Search term to match against\n * @returns {Object} - { matched: boolean, isExactMatch: boolean }\n */\n _matchItem(item, searchTerm) {\n const itemText = this._getDisplayText(item);\n const itemTextLower = itemText.toLowerCase();\n const searchTermLower = searchTerm.toLowerCase();\n\n // Exact match (case-insensitive)\n if (itemTextLower === searchTermLower) {\n return { matched: true, isExactMatch: true };\n }\n\n // Partial match (contains)\n if (itemTextLower.includes(searchTermLower)) {\n return { matched: true, isExactMatch: false };\n }\n\n // Symbol-insensitive match: remove common separators and retry\n // e.g., \"blue hair\" can match \"blue_hair\" or \"bluehair\"\n const normalizedItem = itemTextLower.replace(/[-_\\s']/g, '');\n const normalizedSearch = searchTermLower.replace(/[-_\\s']/g, '');\n if (normalizedItem.includes(normalizedSearch)) {\n return { matched: true, isExactMatch: false };\n }\n\n return { matched: false, isExactMatch: false };\n }\n\n _getLiveSearchTermForAcceptance() {\n const rawSearchTerm = this.getSearchTerm(this.inputElement.value);\n\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n return (match?.[1] || '').trim();\n }\n\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n if (this.modelType === 'prompt') {\n const embeddingMatch = rawSearchTerm.match(/^emb:(.*)$/i);\n if (embeddingMatch) {\n return (embeddingMatch[1] || '').trim();\n }\n\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n return rawSearchTerm;\n }\n\n _getPreferredSelectedIndex(searchTerm = '') {\n if (!this.items?.length) {\n return -1;\n }\n\n if (this.showingCommands) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const searchLower = trimmedSearchTerm.toLowerCase();\n const normalizedSearch = normalizeAutocompleteMatchText(trimmedSearchTerm);\n let bestIndex = -1;\n let bestScore = -Infinity;\n\n this.items.forEach((item, index) => {\n const displayText = this._getDisplayText(item);\n const textLower = displayText.toLowerCase();\n const normalizedText = normalizeAutocompleteMatchText(displayText);\n let score = -1;\n\n if (textLower === searchLower) {\n score = 5000;\n } else if (normalizedText === normalizedSearch) {\n score = 4500;\n } else if (textLower.startsWith(searchLower)) {\n score = 4000;\n } else if (normalizedText.startsWith(normalizedSearch)) {\n score = 3500;\n } else if (textLower.includes(searchLower)) {\n score = 3000;\n } else if (normalizedText.includes(normalizedSearch)) {\n score = 2500;\n }\n\n if (score > -1) {\n score -= index;\n if (score > bestScore) {\n bestScore = score;\n bestIndex = index;\n }\n }\n });\n\n if (bestIndex !== -1) {\n return bestIndex;\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return 0;\n }\n\n _getAcceptSelectionIndex(searchTerm = '') {\n if (this.hasManualSelection && this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return this._getPreferredSelectedIndex(searchTerm);\n }\n\n /**\n * Return the query flag that tells the backend to inject the LoRA Manager\n * page's active filters (stored server-side) into the search, or null when\n * not applicable. The filters themselves are synced to the backend by the\n * manager page, so this works across browsers/origins where localStorage\n * is not shared.\n */\n _getActiveLoraFilters() {\n if (this.modelType !== 'loras' || !getLoraActiveFiltersAutocompletePreference()) {\n return null;\n }\n return 'use_active_filters=true';\n }\n\n async search(term = '', endpoint = null) {\n try {\n this.currentSearchTerm = term;\n\n // Save current search type to detect mode changes during async search\n const searchTypeAtStart = this.searchType;\n\n // Clear items before starting new search to avoid stale data\n // This is critical for preventing command suggestions from persisting\n // when switching from command mode to regular tag search\n this.items = [];\n this.wildcardMeta = null;\n\n if (!endpoint) {\n endpoint = `/lm/${this.modelType}/relative-paths`;\n }\n\n // Active-filter query params for loras (null when setting off or\n // model type is not loras, so appending is safe for all types)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Generate multiple query variations for better matching, but avoid\n // sending duplicate-equivalent requests that normalize to the same\n // backend search term.\n const queriesToExecute =\n this.searchType === 'wildcards' && term.length === 0\n ? ['']\n : this._getQueriesToExecute(term);\n\n if (queriesToExecute.length === 0) {\n this.items = [];\n this.hide();\n return;\n }\n\n // Execute all queries in parallel\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return {\n items: data.success ? (data.relative_paths || data.words || []) : [],\n meta: data?.meta || null,\n };\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return {\n items: [],\n meta: null,\n };\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Check if search type changed during async operation\n // If so, skip updating items to prevent stale data from showing\n if (this.searchType !== searchTypeAtStart) {\n console.log('[Lora Manager] Search type changed during search, skipping update');\n return;\n }\n\n // Merge and deduplicate results while preserving order from backend\n // Backend returns results grouped by folder and sorted by relevance\n // within each group, so we maintain that order\n const seen = new Set();\n const mergedItems = [];\n\n for (const result of resultsArrays) {\n if (!this.wildcardMeta && result?.meta) {\n this.wildcardMeta = result.meta;\n }\n\n const resultArray = result?.items || [];\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n mergedItems.push(item);\n }\n }\n }\n\n if (this.searchType === 'wildcards' && mergedItems.length === 0) {\n const meta = this.wildcardMeta || {};\n this.items = meta.has_wildcards\n ? [createWildcardNoMatchesItem(term, meta)]\n : [createWildcardEmptyStateItem(meta)];\n this.hasMoreItems = false;\n this.render();\n this.show();\n return;\n }\n\n // Use backend-sorted results directly without re-scoring\n // Backend already ranks by: FTS5 bm25 score + post count + exact prefix boost\n if (mergedItems.length > 0) {\n this.items = mergedItems;\n this.render();\n this.show();\n } else {\n this.items = [];\n this.hide();\n }\n } catch (error) {\n console.error('Autocomplete search error:', error);\n this.items = [];\n this.hide();\n }\n }\n\n /**\n * Return the command map for the current model type.\n * Lora model types get the active-filters toggle commands, all others\n * keep the prompt tag commands.\n */\n _getCommands() {\n return this.modelType === 'loras' ? LORAS_COMMANDS : TAG_COMMANDS;\n }\n\n /**\n * Parse command input to detect command mode\n * @param {string} rawInput - Raw input text\n * @returns {Object} - { showCommands, commandFilter, command, searchTerm }\n */\n _parseCommandInput(rawInput) {\n const trimmed = rawInput.trim();\n\n // Check if input starts with \"/\"\n if (!trimmed.startsWith('/')) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n // Split into potential command and search term\n const spaceIndex = trimmed.indexOf(' ');\n\n if (spaceIndex === -1) {\n // Still typing command (e.g., \"/cha\")\n const partialCommand = trimmed.toLowerCase();\n\n // Check for exact command match\n if (this._getCommands()[partialCommand]) {\n const cmd = this._getCommands()[partialCommand];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: '' };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: '',\n };\n }\n\n // Show command suggestions\n return {\n showCommands: true,\n commandFilter: partialCommand.slice(1), // Remove leading \"/\"\n command: null,\n searchTerm: '',\n };\n }\n\n // Command with search term (e.g., \"/character miku\")\n const commandPart = trimmed.slice(0, spaceIndex).toLowerCase();\n const searchPart = trimmed.slice(spaceIndex + 1).trim();\n\n if (this._getCommands()[commandPart]) {\n const cmd = this._getCommands()[commandPart];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: searchPart,\n };\n }\n\n // Unknown command, treat as regular search\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n /**\n * Show the command list dropdown\n * @param {string} filter - Optional filter for commands\n */\n _showCommandList(filter = '') {\n // Only show command list if we're in command mode\n // This prevents stale command suggestions from appearing after switching to tag search\n if (this.searchType !== 'commands' && this.showingCommands !== true) {\n return;\n }\n \n const filterLower = filter.toLowerCase();\n\n const commands = [];\n\n for (const [cmd, info] of Object.entries(this._getCommands())) {\n // Filter out toggle commands that don't meet their condition\n if (info.type === 'toggle_setting' && info.condition) {\n if (!info.condition()) continue;\n }\n\n if (!filter || cmd.slice(1).startsWith(filterLower)) {\n commands.push({ command: cmd, ...info });\n }\n }\n\n if (commands.length === 0) {\n this.hide();\n return;\n }\n\n this.items = commands;\n this._renderCommandList();\n this.show();\n }\n\n /**\n * Render the command list dropdown\n */\n _renderCommandList() {\n // Clear command list items properly based on rendering mode\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n this.items.forEach((item, index) => {\n const itemEl = document.createElement('div');\n itemEl.className = 'comfy-autocomplete-item comfy-autocomplete-command';\n itemEl.dataset.index = index.toString();\n\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = item.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = item.label;\n\n itemEl.appendChild(cmdSpan);\n itemEl.appendChild(labelSpan);\n\n itemEl.style.cssText = `\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n height: ${this.options.itemHeight}px;\n box-sizing: border-box;\n `;\n\n // Prevent textarea from losing focus - same fix as createItemElement\n itemEl.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n itemEl.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n itemEl.addEventListener('click', () => {\n this._insertCommand(item.command);\n });\n\n // Append to correct container based on rendering mode\n if (this.contentContainer) {\n this.contentContainer.appendChild(itemEl);\n } else {\n this.dropdown.appendChild(itemEl);\n }\n });\n\n // Remove border from last item\n const lastChild = this.contentContainer ? this.contentContainer.lastChild : this.dropdown.lastChild;\n if (lastChild) {\n lastChild.style.borderBottom = 'none';\n }\n\n // Auto-select immediately so accept keys remain stable.\n // In virtual-scroll mode, calling selectItem() before the dropdown is\n // visible can see a zero-height container and incorrectly replace the\n // full command list with a partially virtualized slice.\n if (this.items.length > 0) {\n this.selectedIndex = 0;\n this.hasManualSelection = false;\n if (this.contentContainer) {\n this._applyItemSelection(0);\n } else {\n this.selectItem(0);\n }\n }\n\n // State hint below the command list (e.g. how to toggle autocomplete)\n this._renderCommandListFooter();\n\n // Update virtual scroll height for virtual scrolling mode\n if (this.contentContainer) {\n this.updateVirtualScrollHeight();\n }\n }\n\n /**\n * Render a state hint below the slash command list so the toggle commands\n * explain themselves. Prompt nodes advertise /autocomplete, loras nodes\n * advertise /activefilters.\n */\n _renderCommandListFooter() {\n this._removeCommandListFooter();\n\n let text = null;\n if (this.modelType === 'prompt') {\n const enabled = getPromptTagAutocompletePreference();\n text = enabled\n ? 'Tag autocomplete is ON — /noautocomplete to disable'\n : 'Tag autocomplete is OFF — /autocomplete to enable';\n } else if (this.modelType === 'loras') {\n const enabled = getLoraActiveFiltersAutocompletePreference();\n text = enabled\n ? 'Active Filters Search: ON — /noactivefilters to disable'\n : 'Active Filters Search: OFF — /activefilters to enable';\n } else {\n return;\n }\n\n const footer = document.createElement('div');\n footer.className = 'lm-autocomplete-command-footer';\n footer.textContent = text;\n footer.style.cssText = `\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n border-top: 1px solid rgba(226, 232, 240, 0.1);\n white-space: nowrap;\n `;\n // Keep focus in the textarea when the hint is clicked\n footer.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.appendChild(footer);\n this.commandListFooter = footer;\n }\n\n _removeCommandListFooter() {\n if (this.commandListFooter) {\n this.commandListFooter.remove();\n this.commandListFooter = null;\n }\n }\n\n /**\n * Show a one-time, dismissible hint inside the dropdown surfacing the\n * toggle commands: prompt nodes advertise /noautocomplete, loras nodes\n * advertise /activefilters. Dismissal is persisted in localStorage.\n */\n _maybeShowFirstRunHint() {\n if (this.firstRunHint) {\n return;\n }\n\n let hintText = null;\n let storageKey = null;\n\n if (this.modelType === 'prompt') {\n // Only hint during plain tag searches, not command/embedding modes\n if (this.showingCommands\n || this.searchType !== 'custom_words'\n || this.activeCommand) {\n return;\n }\n hintText = 'Tip: type /noautocomplete to turn off these suggestions';\n storageKey = FIRST_RUN_HINT_DISMISSED_KEY;\n } else if (this.modelType === 'loras') {\n // Only advertise active-filters search while it is disabled\n if (this.showingCommands || this.activeCommand) {\n return;\n }\n if (getLoraActiveFiltersAutocompletePreference()) {\n return;\n }\n hintText = 'Tip: type /activefilters to search within the LoRA Manager page filters';\n storageKey = ACTIVE_FILTERS_HINT_DISMISSED_KEY;\n } else {\n return;\n }\n\n let dismissed = false;\n try {\n dismissed = localStorage.getItem(storageKey) === '1';\n } catch (e) {\n // localStorage unavailable - fall through and show the hint\n }\n if (dismissed) {\n return;\n }\n\n const hint = document.createElement('div');\n hint.className = 'lm-autocomplete-first-run-hint';\n hint.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.6);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n `;\n\n const text = document.createElement('span');\n text.textContent = hintText;\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.textContent = '×';\n closeBtn.title = 'Dismiss';\n closeBtn.style.cssText = `\n background: none;\n border: none;\n color: rgba(226, 232, 240, 0.5);\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n `;\n closeBtn.addEventListener('click', () => {\n try {\n localStorage.setItem(storageKey, '1');\n } catch (e) {\n }\n this._removeFirstRunHint();\n });\n\n hint.appendChild(text);\n hint.appendChild(closeBtn);\n // Keep focus in the textarea when interacting with the hint\n hint.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.insertBefore(hint, this.dropdown.firstChild);\n this.firstRunHint = hint;\n }\n\n _removeFirstRunHint() {\n if (this.firstRunHint) {\n this.firstRunHint.remove();\n this.firstRunHint = null;\n }\n }\n\n /**\n * Insert a command into the input\n * @param {string} command - The command to insert (e.g., \"/character\")\n */\n _insertCommand(command) {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const commandStartPos = activeRange.trimmedStart;\n\n // Insert command with trailing space\n const insertText = command + ' ';\n const newValue = currentValue.substring(0, commandStartPos) + insertText + currentValue.substring(activeRange.end);\n const newCaretPos = commandStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n\n // Trigger input event\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n render() {\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n // Command-list state hints do not belong to regular search results\n this._removeCommandListFooter();\n\n // Reset virtual scroll state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n\n // Early return if no items to prevent empty dropdown\n if (!this.items || this.items.length === 0) {\n if (this.contentContainer) {\n this.contentContainer.innerHTML = '';\n } else {\n this.dropdown.innerHTML = '';\n }\n return;\n }\n\n if (this.options.enableVirtualScroll && this.contentContainer) {\n // Use virtual scrolling - always update visible items to ensure content is fresh\n // The dropdown visibility is controlled by show()/hide()\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n // Traditional rendering (fallback)\n this.dropdown.innerHTML = '';\n\n // Check if items are enriched (have tag_name, category, post_count) or command objects\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n this.items.forEach((itemData, index) => {\n const item = this.createItemElement(itemData, index, isEnriched, isCommand);\n this.dropdown.appendChild(item);\n });\n\n // Remove border from last item\n if (this.dropdown.lastChild) {\n this.dropdown.lastChild.style.borderBottom = 'none';\n }\n }\n\n // Auto-select immediately so accept keys do not fall through\n // to native focus traversal while the dropdown is visible.\n if (this.items.length > 0) {\n this.selectItem(0);\n }\n }\n\n /**\n * Render an enriched autocomplete item with category badge and post count\n * @param {HTMLElement} itemEl - The item element to populate\n * @param {Object} itemData - The enriched item data { tag_name, category, post_count, matched_alias? }\n * @param {string} searchTerm - The current search term for highlighting\n */\n _renderEnrichedItem(itemEl, itemData, searchTerm) {\n // Create name span with highlighted match\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n\n // If matched via alias, show: \"tag_name ← alias\" with alias highlighted\n if (itemData.matched_alias) {\n const tagText = document.createTextNode(itemData.tag_name + ' ');\n nameSpan.appendChild(tagText);\n\n const aliasSpan = document.createElement('span');\n aliasSpan.className = 'lm-matched-alias';\n aliasSpan.innerHTML = '← ' + this.highlightMatch(itemData.matched_alias, searchTerm);\n aliasSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n nameSpan.appendChild(aliasSpan);\n } else {\n nameSpan.innerHTML = this.highlightMatch(itemData.tag_name, searchTerm);\n }\n\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n\n // Create meta container for count and badge\n const metaSpan = document.createElement('span');\n metaSpan.className = 'lm-autocomplete-meta';\n metaSpan.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n `;\n\n // Add post count\n if (itemData.post_count > 0) {\n const countSpan = document.createElement('span');\n countSpan.className = 'lm-autocomplete-count';\n countSpan.textContent = formatPostCount(itemData.post_count);\n countSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n metaSpan.appendChild(countSpan);\n }\n\n // Add category badge\n const categoryInfo = CATEGORY_INFO[itemData.category];\n if (categoryInfo) {\n const badgeSpan = document.createElement('span');\n badgeSpan.className = 'lm-autocomplete-category';\n badgeSpan.textContent = categoryInfo.label;\n badgeSpan.style.cssText = `\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n background: ${categoryInfo.bg};\n color: ${categoryInfo.text};\n white-space: nowrap;\n `;\n metaSpan.appendChild(badgeSpan);\n }\n\n itemEl.appendChild(nameSpan);\n itemEl.appendChild(metaSpan);\n }\n\n _renderInformationalItem(itemEl, itemData) {\n itemEl.classList.add('comfy-autocomplete-info-item');\n itemEl.style.cssText = `\n padding: 12px;\n color: rgba(226, 232, 240, 0.88);\n border-bottom: none;\n cursor: default;\n display: block;\n white-space: normal;\n height: auto;\n `;\n\n const title = document.createElement('div');\n title.className = 'lm-autocomplete-info-title';\n title.textContent = itemData.title || 'Wildcards';\n title.style.cssText = `\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 6px;\n `;\n itemEl.appendChild(title);\n\n const description = document.createElement('div');\n description.className = 'lm-autocomplete-info-description';\n description.textContent = itemData.description || '';\n description.style.cssText = `\n font-size: 12px;\n line-height: 1.45;\n color: rgba(226, 232, 240, 0.72);\n `;\n itemEl.appendChild(description);\n\n if (itemData.type === 'wildcard_no_matches') {\n return;\n }\n\n const pathBlock = document.createElement('div');\n pathBlock.style.cssText = `\n margin-top: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n background: rgba(15, 23, 42, 0.6);\n font-size: 11px;\n line-height: 1.5;\n `;\n pathBlock.innerHTML = [\n '
Wildcards folder
',\n `${itemData.wildcardsDir || '(unavailable)'}`,\n `
Supported formats: ${(itemData.supportedFormats || []).join(', ')}
`,\n ].join('');\n itemEl.appendChild(pathBlock);\n\n const examples = document.createElement('div');\n examples.style.cssText = `\n margin-top: 10px;\n font-size: 11px;\n line-height: 1.55;\n color: rgba(226, 232, 240, 0.72);\n `;\n examples.innerHTML = [\n '
Examples
',\n '
animals/cat.txt -> use __animals/cat__
',\n '
colors.yaml with palette: { warm: [red, orange] } -> use __palette/warm__
',\n '
Text files use one option per line. YAML/JSON use nested keys ending in string arrays.
',\n ].join('');\n itemEl.appendChild(examples);\n\n const actions = document.createElement('div');\n actions.style.cssText = `\n display: flex;\n gap: 8px;\n margin-top: 12px;\n flex-wrap: wrap;\n `;\n\n const openButton = document.createElement('button');\n openButton.type = 'button';\n openButton.dataset.action = 'open-wildcards-folder';\n openButton.textContent = 'Open wildcards folder';\n openButton.style.cssText = `\n border: 1px solid rgba(96, 165, 250, 0.45);\n background: rgba(37, 99, 235, 0.18);\n color: #dbeafe;\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n openButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._openWildcardsFolder();\n });\n actions.appendChild(openButton);\n\n const copyButton = document.createElement('button');\n copyButton.type = 'button';\n copyButton.dataset.action = 'copy-wildcards-path';\n copyButton.textContent = 'Copy path';\n copyButton.style.cssText = `\n border: 1px solid rgba(226, 232, 240, 0.2);\n background: rgba(148, 163, 184, 0.12);\n color: rgba(226, 232, 240, 0.88);\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n copyButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._copyWildcardPath(itemData.wildcardsDir || '');\n });\n actions.appendChild(copyButton);\n\n itemEl.appendChild(actions);\n }\n \n highlightMatch(text, searchTerm) {\n const { include } = parseSearchTokens(searchTerm);\n const sanitizedTokens = include\n .filter(Boolean)\n .map((token) => token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n\n if (!sanitizedTokens.length) {\n return text;\n }\n\n const regex = new RegExp(`(${sanitizedTokens.join('|')})`, 'gi');\n return text.replace(\n regex,\n '$1',\n );\n }\n\n async _openWildcardsFolder() {\n try {\n const response = await api.fetchApi('/lm/wildcards/open-location', { method: 'POST' });\n const data = await response.json();\n if (!response.ok || data?.success === false) {\n throw new Error(data?.error || 'Failed to open wildcards folder');\n }\n\n if (data?.mode === 'clipboard' && data?.path) {\n await this._copyWildcardPath(data.path);\n return;\n }\n\n showToast({\n severity: 'success',\n summary: 'Wildcards folder',\n detail: 'Opened wildcards folder.',\n life: 2500,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to open wildcards folder:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to open wildcards folder',\n life: 3000,\n });\n }\n }\n\n async _copyWildcardPath(path) {\n if (!path) {\n return;\n }\n\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(path);\n }\n showToast({\n severity: 'info',\n summary: 'Wildcards path',\n detail: path,\n life: 3000,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to copy wildcards path:', error);\n showToast({\n severity: 'warn',\n summary: 'Wildcards path',\n detail: path,\n life: 4000,\n });\n }\n }\n \n showPreviewForItem(relativePath, itemElement) {\n if (!this.options.showPreview || !this.previewTooltip) return;\n if (typeof relativePath !== 'string' || !relativePath) return;\n\n // Extract filename without extension for preview\n const fileName = relativePath.split(/[/\\\\]/).pop();\n const loraName = fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n \n // Get item position for tooltip positioning\n const rect = itemElement.getBoundingClientRect();\n const x = rect.right + 10;\n const y = rect.top;\n \n this.previewTooltip.show(loraName, x, y, true); // Pass true for fromAutocomplete flag\n }\n \n hidePreview() {\n if (!this.options.showPreview) {\n return;\n }\n if (typeof this.behavior.hidePreview === 'function') {\n this.behavior.hidePreview(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.hide();\n }\n }\n \n /**\n * Handle scroll event for virtual scrolling and loading more items\n */\n handleScroll() {\n if (!this.scrollContainer || this.isLoadingMore) {\n return;\n }\n\n const { scrollTop, scrollHeight, clientHeight } = this.scrollContainer;\n const scrollBottom = scrollTop + clientHeight;\n const threshold = this.options.itemHeight * 2; // Load more when within 2 items of bottom\n\n // Check if we need to load more items\n if (scrollBottom >= scrollHeight - threshold && this.hasMoreItems) {\n this.loadMoreItems();\n }\n\n // Update visible items for virtual scrolling\n if (this.options.enableVirtualScroll) {\n this.updateVisibleItems();\n }\n }\n\n /**\n * Load more items (pagination)\n */\n async loadMoreItems() {\n if (this.isLoadingMore || !this.hasMoreItems || this.showingCommands) {\n return;\n }\n\n this.isLoadingMore = true;\n this.currentPage++;\n\n try {\n // Show loading indicator\n this.showLoadingIndicator();\n\n // Get the current endpoint\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n if (this.modelType === 'prompt') {\n if (this.searchType === 'embeddings') {\n endpoint = '/lm/embeddings/relative-paths';\n } else if (this.searchType === 'wildcards') {\n endpoint = getWildcardSearchEndpoint();\n } else if (this.searchType === 'custom_words') {\n if (this.activeCommand?.categories) {\n const categories = this.activeCommand.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n } else {\n endpoint = '/lm/custom-words/search?enriched=true';\n }\n }\n }\n\n const queriesToExecute = this._getQueriesToExecute(this.currentSearchTerm);\n const offset = this.items.length;\n\n // Active-filter query params for loras (null when setting off)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Execute all queries in parallel with offset\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return data.success ? (data.relative_paths || data.words || []) : [];\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return [];\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Merge and deduplicate results with existing items\n const seen = new Set(this.items.map(item => {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n return itemKey;\n }));\n const newItems = [];\n\n for (const resultArray of resultsArrays) {\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n newItems.push(item);\n }\n }\n }\n\n // If we got fewer items than requested, we've reached the end\n if (newItems.length < this.options.pageSize) {\n this.hasMoreItems = false;\n }\n\n // If we got new items, append them and re-render\n // IMPORTANT: Do NOT re-sort! Backend already returns results sorted by relevance\n if (newItems.length > 0) {\n this.items.push(...newItems);\n\n // Update render\n if (this.options.enableVirtualScroll) {\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n this.render();\n }\n } else {\n this.hasMoreItems = false;\n }\n } catch (error) {\n console.error('Error loading more items:', error);\n this.hasMoreItems = false;\n } finally {\n this.isLoadingMore = false;\n this.hideLoadingIndicator();\n }\n }\n\n /**\n * Show loading indicator at the bottom of the list\n */\n showLoadingIndicator() {\n if (!this.contentContainer) return;\n\n let loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (!loadingEl) {\n loadingEl = document.createElement('div');\n loadingEl.className = 'comfy-autocomplete-loading';\n loadingEl.textContent = 'Loading more...';\n loadingEl.style.cssText = `\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n `;\n this.contentContainer.appendChild(loadingEl);\n }\n }\n\n /**\n * Hide loading indicator\n */\n hideLoadingIndicator() {\n if (!this.contentContainer) return;\n\n const loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (loadingEl) {\n loadingEl.remove();\n }\n }\n\n /**\n * Update the total height of the virtual scroll container\n */\n updateVirtualScrollHeight() {\n if (!this.contentContainer || !this.scrollContainer) return;\n\n if (this._containsInformationalItems()) {\n this.totalHeight = 0;\n this.contentContainer.style.height = 'auto';\n this.scrollContainer.style.maxHeight = `${this.options.visibleItems * this.options.itemHeight}px`;\n this.scrollContainer.style.overflowY = 'hidden';\n return;\n }\n\n this.totalHeight = this.items.length * this.options.itemHeight;\n this.contentContainer.style.height = `${this.totalHeight}px`;\n \n // Adjust scroll container max-height based on actual content\n // Only show scrollbar when content exceeds visibleItems limit\n const maxHeight = this.options.visibleItems * this.options.itemHeight;\n const shouldShowScrollbar = this.totalHeight > maxHeight;\n \n this.scrollContainer.style.maxHeight = shouldShowScrollbar ? `${maxHeight}px` : `${this.totalHeight}px`;\n this.scrollContainer.style.overflowY = shouldShowScrollbar ? 'auto' : 'hidden';\n }\n\n /**\n * Update which items are visible based on scroll position\n */\n updateVisibleItems() {\n if (!this.scrollContainer || !this.contentContainer) return;\n\n if (this._containsInformationalItems()) {\n this.contentContainer.innerHTML = '';\n if (this.items[0]) {\n this.contentContainer.appendChild(\n this.createItemElement(this.items[0], 0, false, false)\n );\n }\n return;\n }\n\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n\n // Calculate which items should be visible with a larger buffer for smoother rendering\n // Use a fixed buffer of 5 items to ensure selected item is always rendered\n const startIndex = Math.max(0, Math.floor(scrollTop / this.options.itemHeight) - 5);\n const endIndex = Math.min(\n this.items.length - 1,\n Math.ceil((scrollTop + containerHeight) / this.options.itemHeight) + 5\n );\n\n // Clear current content\n this.contentContainer.innerHTML = '';\n\n // Create spacer for items before visible range\n if (startIndex > 0) {\n const topSpacer = document.createElement('div');\n topSpacer.style.height = `${startIndex * this.options.itemHeight}px`;\n this.contentContainer.appendChild(topSpacer);\n }\n\n // Render visible items\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n for (let i = startIndex; i <= endIndex; i++) {\n const itemData = this.items[i];\n const itemEl = this.createItemElement(itemData, i, isEnriched, isCommand);\n this.contentContainer.appendChild(itemEl);\n }\n\n // Create spacer for items after visible range\n if (endIndex < this.items.length - 1) {\n const bottomSpacer = document.createElement('div');\n bottomSpacer.style.height = `${(this.items.length - 1 - endIndex) * this.options.itemHeight}px`;\n this.contentContainer.appendChild(bottomSpacer);\n }\n \n // Re-apply selection styling after re-rendering\n // This ensures the selected item remains highlighted even after DOM updates\n if (this.selectedIndex >= startIndex && this.selectedIndex <= endIndex) {\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${this.selectedIndex}\"]`);\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n }\n }\n }\n\n /**\n * Create a single item element\n */\n createItemElement(itemData, index, isEnriched, isCommand = false) {\n const item = document.createElement('div');\n item.className = 'comfy-autocomplete-item';\n item.dataset.index = index.toString();\n item.style.cssText = `\n height: ${this.options.itemHeight}px;\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n `;\n\n // Check if this is a command object (override parameter if needed)\n if (!isCommand && itemData && typeof itemData === 'object' && 'command' in itemData) {\n isCommand = true;\n }\n\n if (isWildcardInfoItem(itemData)) {\n this._renderInformationalItem(item, itemData);\n } else if (isCommand) {\n // Render command item\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = itemData.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = itemData.label;\n\n item.appendChild(cmdSpan);\n item.appendChild(labelSpan);\n item.style.gap = '12px';\n } else if (isEnriched) {\n this._renderEnrichedItem(item, itemData, this.currentSearchTerm);\n } else {\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n // Use display text without extension for cleaner UI\n const displayTextWithoutExt = this._getDisplayText(itemData);\n nameSpan.innerHTML = this.highlightMatch(displayTextWithoutExt, this.currentSearchTerm);\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n item.appendChild(nameSpan);\n }\n\n // Prevent textarea from losing focus when clicking dropdown items.\n // Without this, the blur event fires before click, and the blur handler's\n // formatAutocompleteTextOnBlur() modifies the text and triggers hide()\n // via suppressAutocompleteOnce, removing this item from the DOM before\n // the click handler can execute. This specifically breaks the case where\n // the text has a comma not followed by a space (e.g. \",search\").\n item.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n // Hover and selection handlers\n item.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n item.addEventListener('mouseleave', () => {\n this.hidePreview();\n });\n\n // Click handler\n item.addEventListener('click', () => {\n if (isWildcardInfoItem(itemData)) {\n return;\n }\n\n if (isCommand) {\n this._insertCommand(itemData.command);\n } else {\n const insertPath = isEnriched ? itemData.tag_name : itemData;\n this.insertSelection(insertPath);\n }\n });\n\n return item;\n }\n\n show() {\n if (!this.items || this.items.length === 0) {\n this.hide();\n return;\n }\n\n this._maybeShowFirstRunHint();\n // For virtual scrolling, render items first so positionAtCursor can measure width correctly\n if (this.options.enableVirtualScroll && this.contentContainer) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n // Skip updateVisibleItems if showing commands (already rendered by _renderCommandList)\n if (!this.showingCommands) {\n this.updateVisibleItems();\n }\n this.positionAtCursor();\n } else {\n // Position dropdown at cursor position using TextAreaCaretHelper\n this.positionAtCursor();\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n }\n }\n \n positionAtCursor() {\n const position = this.helper.getCursorOffset();\n this.dropdown.style.left = (position.left ?? 0) + \"px\";\n this.dropdown.style.top = (position.top ?? 0) + \"px\";\n this.dropdown.style.maxHeight = (window.innerHeight - position.top) + \"px\";\n\n // Adjust width to fit content\n // Temporarily show the dropdown to measure content width\n const originalDisplay = this.dropdown.style.display;\n this.dropdown.style.display = 'block';\n this.dropdown.style.visibility = 'hidden';\n\n // Temporarily remove width constraints to allow content to expand naturally\n // This prevents items.scrollWidth from being limited by a narrow container\n const originalWidth = this.dropdown.style.width;\n this.dropdown.style.width = 'auto';\n this.dropdown.style.minWidth = '200px';\n\n // Measure the content width\n let maxWidth = 200; // minimum width\n // For virtual scrolling, query items from contentContainer; otherwise from dropdown\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const items = container.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n const itemWidth = item.scrollWidth + 24; // Add padding\n maxWidth = Math.max(maxWidth, itemWidth);\n });\n\n // Set the width and restore visibility\n this.dropdown.style.width = Math.min(maxWidth, 400) + 'px'; // Cap at 400px\n this.dropdown.style.minWidth = '';\n this.dropdown.style.visibility = 'visible';\n this.dropdown.style.display = originalDisplay;\n }\n \n getCaretPosition() {\n return this.inputElement.selectionStart || 0;\n }\n \n hide() {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.showingCommands = false;\n\n // Remove discoverability hints attached to the dropdown\n this._removeCommandListFooter();\n this._removeFirstRunHint();\n \n // Clear items to prevent stale data from being displayed\n // when autocomplete is shown again\n this.items = [];\n this.wildcardMeta = null;\n \n // Clear content container to prevent stale items from showing\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n\n // Reset virtual scrolling state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.totalHeight = 0;\n\n // Reset scroll position\n if (this.scrollContainer) {\n this.scrollContainer.scrollTop = 0;\n }\n\n // Hide preview tooltip\n this.hidePreview();\n\n // Clear selection styles from all items\n const items = this.dropdown.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n item.classList.remove('comfy-autocomplete-item-selected');\n item.style.backgroundColor = '';\n });\n }\n \n selectItem(index, { manual = false } = {}) {\n // Remove previous selection\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const prevSelected = container.querySelector('.comfy-autocomplete-item-selected');\n if (prevSelected) {\n prevSelected.classList.remove('comfy-autocomplete-item-selected');\n prevSelected.style.backgroundColor = '';\n }\n\n // Add new selection\n if (index >= 0 && index < this.items.length) {\n this.selectedIndex = index;\n this.hasManualSelection = manual;\n\n // For virtual scrolling, we need to ensure the item is rendered\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // Calculate if the item is currently visible\n const itemTop = index * this.options.itemHeight;\n const itemBottom = itemTop + this.options.itemHeight;\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n const scrollBottom = scrollTop + containerHeight;\n\n // If item is not visible, scroll to make it visible\n if (itemTop < scrollTop || itemBottom > scrollBottom) {\n // Scroll to position the item in the visible area\n // Position item at 1/3 from top for better visibility\n const targetScrollTop = Math.max(0, itemTop - containerHeight / 3);\n this.scrollContainer.scrollTop = targetScrollTop;\n \n // Re-render visible items after scroll\n this.updateVisibleItems();\n \n // Apply selection after DOM is updated\n // Use setTimeout to ensure DOM has been re-rendered\n setTimeout(() => {\n this._applyItemSelection(index);\n }, 0);\n } else {\n // Item is already visible, apply selection immediately\n this._applyItemSelection(index);\n }\n } else {\n // Traditional rendering\n const item = container.children[index];\n if (item) {\n item.classList.add('comfy-autocomplete-item-selected');\n item.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Scroll into view if needed\n item.scrollIntoView({ block: 'nearest' });\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], item);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], item);\n }\n }\n }\n }\n }\n }\n\n /**\n * Apply selection styling to an item (used after virtual scroll re-render)\n * @param {number} index - Index of item to select\n */\n _applyItemSelection(index) {\n if (!this.contentContainer) return;\n\n // Find the item element using data-index attribute\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${index}\"]`);\n\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], selectedEl);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], selectedEl);\n }\n }\n }\n }\n \n handleKeyDown(e) {\n if (!this.isVisible) {\n return;\n }\n \n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle boundary cases\n if (this.selectedIndex >= this.items.length - 1) {\n // Already at last item, try to load more\n if (this.hasMoreItems && !this.isLoadingMore) {\n this.loadMoreItems().then(() => {\n // After loading more, select the next item\n if (this.selectedIndex < this.items.length - 1) {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n });\n }\n } else {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n } else {\n this.selectItem(Math.min(this.selectedIndex + 1, this.items.length - 1), { manual: true });\n }\n break;\n \n case 'ArrowUp':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle top boundary\n if (this.selectedIndex <= 0) {\n // Already at first item, ensure it's selected\n this.selectItem(0, { manual: true });\n } else {\n this.selectItem(this.selectedIndex - 1, { manual: true });\n }\n } else {\n this.selectItem(Math.max(this.selectedIndex - 1, 0), { manual: true });\n }\n break;\n \n case 'Enter':\n case 'Tab':\n if (!shouldAcceptAutocompleteKey(e.key)) {\n break;\n }\n\n {\n const liveSearchTerm = this._getLiveSearchTermForAcceptance();\n const acceptIndex = this._getAcceptSelectionIndex(liveSearchTerm);\n if (acceptIndex !== -1 && acceptIndex !== this.selectedIndex) {\n this.selectItem(acceptIndex);\n }\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n e.preventDefault();\n if (this.showingCommands) {\n // Insert command\n this._insertCommand(this.items[this.selectedIndex].command);\n } else {\n const selectedItem = this.items[this.selectedIndex];\n if (isWildcardInfoItem(selectedItem)) {\n if (selectedItem.type === 'wildcard_empty_state') {\n this._openWildcardsFolder();\n }\n break;\n }\n\n // Insert selection (handle enriched items)\n const insertPath = typeof selectedItem === 'object' && 'tag_name' in selectedItem\n ? selectedItem.tag_name\n : selectedItem;\n this.insertSelection(insertPath);\n }\n }\n break;\n \n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n }\n }\n \n async insertSelection(relativePath) {\n const insertText = await this.getInsertText(relativePath);\n if (!insertText) {\n this.hide();\n return;\n }\n\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const fullSearchTerm = activeRange.text;\n let replaceStartPos = activeRange.trimmedStart;\n\n // For regular tag autocomplete (no command), only replace the last space-separated token\n // This allows \"hello 1gi\" + selecting \"1girl\" to become \"hello 1girl, \"\n // However, if the user typed a multi-word phrase that matches a tag (e.g., \"looking to the side\"\n // matching \"looking_to_the_side\"), replace the entire phrase instead of just the last word.\n // Command mode (e.g., \"/character miku\") should replace the entire command+search\n let searchTerm = fullSearchTerm;\n if (this.modelType === 'prompt' && this.searchType === 'custom_words' && !this.activeCommand) {\n // Check if the selectedItem exists and its tag_name matches the full search term\n // when converted to underscore format (Danbooru convention)\n const selectedItem = this.selectedIndex >= 0 ? this.items[this.selectedIndex] : null;\n const selectedTagName = selectedItem && typeof selectedItem === 'object' && 'tag_name' \n ? selectedItem.tag_name \n : null;\n \n // Convert full search term to underscore format and check if it matches selected tag\n // Normalize multiple spaces to single underscore for matching (e.g., \"looking to the side\" -> \"looking_to_the_side\")\n const underscoreVersion = fullSearchTerm.replace(/ +/g, '_').toLowerCase();\n const selectedTagLower = selectedTagName?.toLowerCase() ?? '';\n \n // If multi-word search term is a prefix or suffix of the selected tag,\n // replace the entire phrase. This handles cases where user types partial tag name.\n // Examples:\n // - \"looking to the\" -> \"looking_to_the_side\" (prefix match)\n // - \"to the side\" -> \"looking_to_the_side\" (suffix match)\n // - \"looking to the side\" -> \"looking_to_the_side\" (exact match)\n if (fullSearchTerm.includes(' ') && (\n selectedTagLower.startsWith(underscoreVersion) ||\n selectedTagLower.endsWith(underscoreVersion) ||\n underscoreVersion === selectedTagLower\n )) {\n searchTerm = fullSearchTerm;\n replaceStartPos = activeRange.trimmedStart;\n } else {\n searchTerm = this._getLastSpaceToken(fullSearchTerm);\n replaceStartPos = searchTerm === fullSearchTerm\n ? activeRange.trimmedStart\n : caretPos - searchTerm.length;\n }\n }\n\n // Only replace the search term, not everything after the last comma\n const newValue = currentValue.substring(0, replaceStartPos) + insertText + currentValue.substring(caretPos);\n const newCaretPos = replaceStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n this._storeLastAcceptedBoundary({\n start: replaceStartPos,\n end: newCaretPos,\n insertedText: insertText,\n textSnapshot: newValue.substring(0, newCaretPos),\n });\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n async getInsertText(relativePath) {\n if (typeof this.behavior.getInsertText === 'function') {\n try {\n const result = await this.behavior.getInsertText(this, relativePath);\n if (typeof result === 'string' && result.length > 0) {\n return result;\n }\n } catch (error) {\n console.warn('Failed to format autocomplete insertion:', error);\n }\n }\n\n const trimmed = typeof relativePath === 'string' ? relativePath.trim() : '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(trimmed);\n }\n\n /**\n * Check if the autocomplete instance is still valid\n * (input element exists and is in the DOM)\n * @returns {boolean}\n */\n isValid() {\n return this.inputElement && document.body.contains(this.inputElement);\n }\n\n /**\n * Refresh the TextAreaCaretHelper to update cached measurements\n * Useful after element is moved in DOM (e.g., Vue mode switch)\n */\n refreshCaretHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n\n /**\n * Handle toggle setting command (e.g., /autocomplete, /activefilters)\n * @param {Object} command - The toggle command with settingId and value\n */\n async _handleToggleSettingCommand(command) {\n const { settingId, value } = command;\n\n try {\n const success = await setLoraManagerSettingValue(settingId, value);\n if (success) {\n this._showToggleFeedback(command, value);\n this._clearCurrentToken();\n } else {\n throw new Error('settings API unavailable');\n }\n } catch (error) {\n console.error('[Lora Manager] Failed to toggle setting:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to toggle autocomplete setting',\n life: 3000\n });\n }\n\n this.hide();\n }\n\n /**\n * Show visual feedback for toggle action using toast\n * @param {Object} command - The toggle command that was executed\n * @param {boolean} enabled - New autocomplete state\n */\n _showToggleFeedback(command, enabled) {\n showToast({\n severity: enabled ? 'success' : 'secondary',\n summary: command.feedbackSummary || (enabled ? 'Autocomplete Enabled' : 'Autocomplete Disabled'),\n detail: command.feedbackDetail || (enabled\n ? 'Tag autocomplete is now ON. Type to see suggestions.'\n : 'Tag autocomplete is now OFF. Use /autocomplete or the node right-click menu to re-enable.'),\n life: 3000\n });\n }\n\n /**\n * Clear the current command token from input\n * Preserves leading spaces after delimiters (e.g., \"1girl, /emb\" -> \"1girl, \")\n */\n _clearCurrentToken() {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const lastSegment = activeRange.rawText;\n \n // Find the command start position, preserving leading spaces\n // lastSegment includes leading spaces (e.g., \" /emb\"), find where command actually starts\n const commandMatch = lastSegment.match(/^(\\s*)(\\/\\w+)/);\n if (commandMatch) {\n // commandMatch[1] is leading spaces, commandMatch[2] is the command\n const leadingSpaces = commandMatch[1].length;\n // Keep the spaces by starting after them\n const commandStartPos = activeRange.start + leadingSpaces;\n \n // Skip trailing spaces when deleting\n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n } else {\n // Fallback: delete the whole last segment (original behavior)\n const commandStartPos = activeRange.start;\n \n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n }\n\n destroy() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n this.onInput = null;\n }\n\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n this.onKeyDown = null;\n }\n\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n this.onBlur = null;\n }\n\n if (this.onDocumentClick) {\n document.removeEventListener('click', this.onDocumentClick);\n this.onDocumentClick = null;\n }\n\n if (this.onScroll && this.scrollContainer) {\n this.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.onScroll = null;\n }\n\n if (typeof this.behavior.destroy === 'function') {\n this.behavior.destroy(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.cleanup();\n this.previewTooltip = null;\n }\n this.previewTooltipPromise = null;\n \n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n this.dropdown = null;\n }\n \n }\n}\n\nexport { AutoComplete, refreshLoraSyntaxFormat };\n","/**\n * Base-path helpers for code running inside the ComfyUI page.\n *\n * When ComfyUI is served under a URL subpath by a reverse proxy (e.g.\n * llama-swap serves it at \"/comfyui/\", SwarmUI at \"/ComfyBackendDirect/\"),\n * the ComfyUI SPA always sits at the root of that prefix, so the prefix is\n * the current pathname without the trailing slash — the same convention the\n * ComfyUI frontend uses for its own api_base. Proxies strip the prefix and\n * forward no headers, so the page URL is the only place to learn it.\n */\n\nexport function getComfyUIBasePath() {\n const { pathname } = window.location;\n return pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmUrl(path) {\n return `${getComfyUIBasePath()}${path}`;\n}\n","export const CONVERTED_TYPE = 'converted-widget';\nimport { app } from \"../../scripts/app.js\";\nimport { AutoComplete } from \"./autocomplete.js\";\nimport { lmUrl } from \"./base_path.js\";\n\nconst ROOT_GRAPH_ID = \"root\";\n\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n];\n\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n];\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n];\n\nexport function isLoraProviderNode(comfyClass) {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraStackAggregatorNode(comfyClass) {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraChainNode(comfyClass) {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass);\n}\n\nfunction isMapLike(collection) {\n return collection && typeof collection.entries === \"function\" && typeof collection.values === \"function\";\n}\n\n/**\n * Return the subgraph LGraph instances nested under `graph`, across both\n * Map-like and plain-object `_subgraphs` containers.\n */\nexport function getChildGraphs(graph) {\n if (!graph || !graph._subgraphs) {\n return [];\n }\n\n const rawSubgraphs = isMapLike(graph._subgraphs)\n ? Array.from(graph._subgraphs.values())\n : Object.values(graph._subgraphs);\n\n return rawSubgraphs\n .map((subgraph) => subgraph?.graph || subgraph?._graph || subgraph)\n .filter((subgraph) => subgraph && subgraph !== graph);\n}\n\nfunction traverseGraphs(rootGraph, visitor, visited = new Set()) {\n const graph = rootGraph || app.graph;\n if (!graph) {\n return;\n }\n\n const graphId = getGraphId(graph);\n if (visited.has(graphId)) {\n return;\n }\n visited.add(graphId);\n visitor(graph);\n\n for (const subgraph of getChildGraphs(graph)) {\n traverseGraphs(subgraph, visitor, visited);\n }\n}\n\nexport function getGraphId(graph) {\n return graph?.id ?? ROOT_GRAPH_ID;\n}\n\nexport function getNodeGraphId(node) {\n if (!node) {\n return ROOT_GRAPH_ID;\n }\n return getGraphId(node.graph || app.graph);\n}\n\nexport function getGraphById(graphId, rootGraph = app.graph) {\n if (!graphId) {\n return rootGraph;\n }\n\n let foundGraph = null;\n traverseGraphs(rootGraph, (graph) => {\n if (!foundGraph && getGraphId(graph) === graphId) {\n foundGraph = graph;\n }\n });\n return foundGraph;\n}\n\nexport function getNodeFromGraph(graphId, nodeId) {\n const graph = getGraphById(graphId) || app.graph;\n if (!graph || typeof graph.getNodeById !== \"function\") {\n return null;\n }\n\n const numericId = typeof nodeId === \"string\" ? Number(nodeId) : nodeId;\n return graph.getNodeById(Number.isNaN(numericId) ? nodeId : numericId) || null;\n}\n\nexport function getAllGraphNodes(rootGraph = app.graph) {\n const nodes = [];\n traverseGraphs(rootGraph, (graph) => {\n if (Array.isArray(graph._nodes)) {\n for (const node of graph._nodes) {\n nodes.push({ graph, node });\n }\n }\n });\n return nodes;\n}\n\nexport function getNodeReference(node) {\n if (!node) {\n return null;\n }\n return {\n node_id: node.id,\n graph_id: getNodeGraphId(node),\n };\n}\n\nexport function getNodeKey(node) {\n if (!node) {\n return null;\n }\n return `${getNodeGraphId(node)}:${node.id}`;\n}\n\nexport function getWidgetByName(node, widgetName) {\n if (!node || !Array.isArray(node.widgets)) {\n return null;\n }\n\n return node.widgets.find((widget) => widget?.name === widgetName) || null;\n}\n\nexport function getWidgetSerializedValue(node, widgetName) {\n if (!node || !Array.isArray(node.widgets) || !Array.isArray(node.widgets_values)) {\n return undefined;\n }\n\n const widgetIndex = node.widgets.findIndex((widget) => widget?.name === widgetName);\n if (widgetIndex === -1) {\n return undefined;\n }\n\n return node.widgets_values[widgetIndex];\n}\n\nexport function getLinkFromGraph(graph, linkId) {\n if (!graph || graph.links == null) {\n return null;\n }\n\n if (isMapLike(graph.links)) {\n return graph.links.get(linkId) || null;\n }\n\n return graph.links[linkId] || null;\n}\n\nexport function chainCallback(object, property, callback) {\n if (object == undefined) {\n //This should not happen.\n console.error(\"Tried to add callback to non-existant object\")\n return;\n }\n if (property in object) {\n const callback_orig = object[property]\n object[property] = function () {\n const r = callback_orig.apply(this, arguments);\n callback.apply(this, arguments);\n return r\n };\n } else {\n object[property] = callback;\n }\n}\n\n/**\n * Find a `mode` accessor (getter/setter) on the node's prototype chain.\n * Since ComfyUI frontend 1.53, `LGraphNode.mode` is a prototype accessor\n * backed by the node's shell state (`node._state.mode`); on legacy frontends\n * `mode` is a plain data property on the instance and no accessor exists.\n */\nfunction findModeAccessor(node) {\n let proto = Object.getPrototypeOf(node);\n while (proto && proto !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"mode\");\n if (descriptor && (descriptor.get || descriptor.set)) {\n return descriptor;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return null;\n}\n\n/**\n * Observe node mode changes (Always/Never/On Trigger/Bypass) without\n * breaking the frontend's own `mode` property.\n *\n * Since ComfyUI frontend 1.53, `mode` is a prototype accessor backed by\n * shell state and serialization reads that state directly. Redefining `mode`\n * on the instance would shadow the prototype setter, so bypass/mute never\n * reaches the serialized workflow and silently reverts to Always on reload.\n * When a prototype accessor exists we delegate to it and only observe the\n * change; on legacy frontends we keep the value in a closure as before.\n *\n * @param {Object} node - The litegraph node instance\n * @param {(newMode: number, oldMode: number) => void} onModeChange - Called when the mode actually changes\n */\nexport function interceptModeChange(node, onModeChange) {\n const delegate = findModeAccessor(node);\n\n if (delegate && typeof delegate.get === \"function\" && typeof delegate.set === \"function\") {\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return delegate.get.call(this);\n },\n set(value) {\n const oldValue = delegate.get.call(this);\n delegate.set.call(this, value);\n if (oldValue !== value) {\n onModeChange(value, oldValue);\n }\n },\n });\n return;\n }\n\n let currentMode = node.mode;\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return currentMode;\n },\n set(value) {\n const oldValue = currentMode;\n currentMode = value;\n if (oldValue !== value) {\n onModeChange(value, oldValue);\n }\n },\n });\n}\n\n/**\n * Show a toast notification\n * @param {Object|string} options - Toast options object or message string for backward compatibility\n * @param {string} [options.severity] - Message severity level (success, info, warn, error, secondary, contrast)\n * @param {string} [options.summary] - Short title for the toast\n * @param {any} [options.detail] - Detailed message content\n * @param {boolean} [options.closable] - Whether user can close the toast (default: true)\n * @param {number} [options.life] - Duration in milliseconds before auto-closing\n * @param {string} [options.group] - Group identifier for managing related toasts\n * @param {any} [options.styleClass] - Style class of the message\n * @param {any} [options.contentStyleClass] - Style class of the content\n * @param {string} [type] - Deprecated: severity type for backward compatibility\n */\nexport function showToast(options, type = 'info') {\n // Handle backward compatibility: showToast(message, type)\n if (typeof options === 'string') {\n options = {\n detail: options,\n severity: type\n };\n }\n \n // Set defaults\n const toastOptions = {\n severity: options.severity || 'info',\n summary: options.summary,\n detail: options.detail,\n closable: options.closable !== false, // default to true\n life: options.life,\n group: options.group,\n styleClass: options.styleClass,\n contentStyleClass: options.contentStyleClass\n };\n \n // Remove undefined properties\n Object.keys(toastOptions).forEach(key => {\n if (toastOptions[key] === undefined) {\n delete toastOptions[key];\n }\n });\n \n if (app && app.extensionManager && app.extensionManager.toast) {\n app.extensionManager.toast.add(toastOptions);\n } else {\n const message = toastOptions.detail || toastOptions.summary || 'No message';\n const severity = toastOptions.severity.toUpperCase();\n console.log(`${severity}: ${message}`);\n // Fallback alert for critical errors only\n if (toastOptions.severity === 'error') {\n alert(message);\n }\n }\n}\n\nexport function hideWidgetForGood(node, widget, suffix = \"\") {\n widget.origType = widget.type;\n widget.origComputeSize = widget.computeSize;\n widget.origSerializeValue = widget.serializeValue;\n widget.computeSize = () => [0, -4]; // -4 is due to the gap litegraph adds between widgets automatically\n widget.type = CONVERTED_TYPE + suffix;\n // widget.serializeValue = () => {\n // // Prevent serializing the widget if we have no input linked\n // const w = node.inputs?.find((i) => i.widget?.name === widget.name);\n // if (w?.link == null) {\n // return undefined;\n // }\n // return widget.origSerializeValue ? widget.origSerializeValue() : widget.value;\n // };\n\n // Hide any linked widgets, e.g. seed+seedControl\n if (widget.linkedWidgets) {\n for (const w of widget.linkedWidgets) {\n hideWidgetForGood(node, w, `:${widget.name}`);\n }\n }\n}\n\n// Update pattern to match both formats: or \nexport const LORA_PATTERN = //g;\n\nfunction isLoraStackInput(input) {\n return input?.type === \"LORA_STACK\";\n}\n\n// Get connected LORA_STACK chain nodes that feed into the current node\nexport function getConnectedInputLoraChainNodes(node) {\n const connectedNodes = [];\n\n if (!node?.inputs) {\n return connectedNodes;\n }\n\n for (const input of node.inputs) {\n if (!isLoraStackInput(input) || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && isLoraChainNode(sourceNode.comfyClass)) {\n connectedNodes.push(sourceNode);\n }\n }\n\n return connectedNodes;\n}\n\n// Get connected TriggerWord Toggle nodes that receive output from the current node\nexport function getConnectedTriggerToggleNodes(node) {\n const connectedNodes = [];\n\n if (!node?.outputs) {\n return connectedNodes;\n }\n\n for (const output of node.outputs) {\n if (!output?.links?.length) {\n continue;\n }\n\n for (const linkId of output.links) {\n const link = getLinkFromGraph(node.graph, linkId);\n if (!link) {\n continue;\n }\n\n const targetNode = node.graph?.getNodeById?.(link.target_id);\n if (targetNode && targetNode.comfyClass === \"TriggerWord Toggle (LoraManager)\") {\n connectedNodes.push(targetNode);\n }\n }\n }\n\n return connectedNodes;\n}\n\n// Extract active lora names from a node's widgets\nexport function getActiveLorasFromNode(node) {\n const activeLoraNames = new Set();\n\n // Handle Lora Cycler (single LoRA from cycler_config widget)\n if (node.comfyClass === \"Lora Cycler (LoraManager)\") {\n const cyclerWidget = node.widgets?.find(w => w.name === 'cycler_config');\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n return activeLoraNames;\n }\n\n // Aggregator nodes do not own LoRA state directly; they only forward upstream stacks.\n if (isLoraStackAggregatorNode(node.comfyClass)) {\n return activeLoraNames;\n }\n\n // Handle Lora Stacker and Lora Randomizer (lorasWidget)\n let lorasWidget = node.lorasWidget;\n if (!lorasWidget && node.widgets) {\n lorasWidget = node.widgets.find(w => w.name === 'loras');\n }\n\n if (lorasWidget && lorasWidget.value) {\n lorasWidget.value.forEach(lora => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n// Recursively collect all active loras from a node and its input chain\n// A node is considered active only if its mode is 0 (Always) or 3 (On Trigger)\nexport function collectActiveLorasFromChain(node, visited = new Set()) {\n // Prevent infinite loops from circular references\n const nodeKey = getNodeKey(node);\n if (!nodeKey) {\n return new Set();\n }\n if (visited.has(nodeKey)) {\n return new Set();\n }\n visited.add(nodeKey);\n\n // Check if node is active (mode 0 for Always, mode 3 for On Trigger)\n // Mode 2 is Never, Mode 4 is Bypass\n const isNodeActive = node.mode === undefined || node.mode === 0 || node.mode === 3;\n \n if (!isNodeActive) {\n return new Set();\n }\n\n // Get active loras from current node only if node is active\n const allActiveLoraNames = getActiveLorasFromNode(node);\n \n // Get connected input LORA_STACK chain nodes and collect their active loras\n const inputChainNodes = getConnectedInputLoraChainNodes(node);\n for (const chainNode of inputChainNodes) {\n const upstreamLoras = collectActiveLorasFromChain(chainNode, visited);\n upstreamLoras.forEach(name => allActiveLoraNames.add(name));\n }\n \n return allActiveLoraNames;\n}\n\n// Update trigger words for connected toggle nodes\nexport function updateConnectedTriggerWords(node, loraNames) {\n const connectedNodes = getConnectedTriggerToggleNodes(node);\n if (connectedNodes.length > 0) {\n const nodeIds = connectedNodes\n .map((connectedNode) => getNodeReference(connectedNode))\n .filter((reference) => reference !== null);\n\n if (nodeIds.length === 0) {\n return;\n }\n\n fetch(lmUrl(\"/api/lm/loras/get_trigger_words\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n lora_names: Array.from(loraNames),\n node_ids: nodeIds\n })\n }).catch(err => console.error(\"Error fetching trigger words:\", err));\n }\n}\n\nexport function mergeLoras(lorasText, lorasArr) {\n // Parse lorasText into a map: name -> {strength, clipStrength}\n const parsedLoras = {};\n let match;\n LORA_PATTERN.lastIndex = 0;\n while ((match = LORA_PATTERN.exec(lorasText)) !== null) {\n const name = match[1];\n const modelStrength = Number(match[2]);\n const clipStrength = match[3] ? Number(match[3]) : modelStrength;\n parsedLoras[name] = { strength: modelStrength, clipStrength };\n }\n\n // Build result array in the order of lorasArr\n const result = [];\n const usedNames = new Set();\n\n for (const lora of lorasArr) {\n if (parsedLoras[lora.name]) {\n result.push({\n name: lora.name,\n strength: lora.strength !== undefined ? lora.strength : parsedLoras[lora.name].strength,\n active: lora.active !== undefined ? lora.active : true,\n expanded: lora.expanded !== undefined ? lora.expanded : false,\n clipStrength: lora.clipStrength !== undefined ? lora.clipStrength : parsedLoras[lora.name].clipStrength,\n selected: !!lora.selected,\n });\n usedNames.add(lora.name);\n }\n }\n\n // Add any new loras from lorasText that are not in lorasArr, in their text order\n for (const name in parsedLoras) {\n if (!usedNames.has(name)) {\n result.push({\n name,\n strength: parsedLoras[name].strength,\n active: true,\n clipStrength: parsedLoras[name].clipStrength,\n selected: false,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Find the actual input element for a widget\n * @param {Object} node - The node instance\n * @param {Object} widget - The widget to find input element for\n * @returns {Promise} The input element or null\n */\nasync function findWidgetInputElement(node, widget) {\n if (widget.inputEl && document.body.contains(widget.inputEl)) {\n return widget.inputEl;\n }\n\n const nodeId = node.id;\n const widgetName = widget.name;\n const maxAttempts = 20;\n const searchInterval = 50;\n\n const searchForInput = (attempt = 0) => {\n return new Promise((resolve) => {\n const doSearch = () => {\n let inputElement = null;\n\n // PRIORITY 1: Use data-node-id attribute (most reliable)\n // Always try this first, regardless of mode - Vue elements may still exist after mode switch\n const nodeContainer = document.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (nodeContainer) {\n // For text widgets, specifically look for textarea (not checkbox/toggle inputs)\n if (widgetName === 'text') {\n const textarea = nodeContainer.querySelector('textarea');\n if (textarea) {\n inputElement = textarea;\n console.log(`[Lora Manager] Found textarea for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n }\n } else {\n // For other widgets, find input within widget containers\n const widgetContainers = nodeContainer.querySelectorAll('.lg-node-widget');\n for (const container of widgetContainers) {\n const input = container.querySelector('input:not([type=\"checkbox\"]), textarea');\n if (input) {\n inputElement = input;\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n break;\n }\n }\n }\n }\n\n // PRIORITY 2: Fallback - heuristic search using widget containers\n if (!inputElement) {\n const allWidgetContainers = document.querySelectorAll('.lg-node-widget, .dom-widget');\n\n for (const container of allWidgetContainers) {\n const hasInput = !!container.querySelector('input, textarea');\n if (!hasInput) continue;\n\n const textContent = container.textContent.toLowerCase();\n const containsWidgetName = textContent.includes(widgetName.toLowerCase());\n const containsNodeTitle = textContent.includes(node.title?.toLowerCase() || '');\n\n // For text widgets, check if it's a textarea\n const isTextareaWidget = widgetName === 'text' && container.querySelector('textarea');\n\n if (containsWidgetName || containsNodeTitle || isTextareaWidget) {\n inputElement = container.querySelector('input, textarea');\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via heuristic`);\n break;\n }\n }\n }\n\n if (inputElement) {\n resolve(inputElement);\n } else if (attempt < maxAttempts) {\n setTimeout(() => searchForInput(attempt + 1).then(resolve), searchInterval);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${widgetName}\" on node ${nodeId} after ${maxAttempts} attempts`);\n resolve(null);\n }\n };\n doSearch();\n });\n };\n\n return searchForInput();\n}\n\n/**\n * Initialize autocomplete for an input widget and setup cleanup\n * @param {Object} node - The node instance\n * @param {Object} inputWidget - The input widget to add autocomplete to\n * @param {Function} originalCallback - The original callback function\n * @param {string} [modelType='loras'] - The model type used by the autocomplete API\n * @param {Object} [autocompleteOptions] - Additional options for the autocomplete instance\n * @returns {Function} Enhanced callback function with autocomplete\n */\nexport function setupInputWidgetWithAutocomplete(node, inputWidget, originalCallback, modelType = 'loras', autocompleteOptions = {}) {\n const defaultOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n };\n const mergedOptions = { ...defaultOptions, ...autocompleteOptions };\n\n setupAutocompleteCleanup(node);\n\n // Track rendering mode changes per node\n let lastVueNodesMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n\n const initializeAutocomplete = async () => {\n if (node.autocomplete) {\n console.log(`[Lora Manager] Autocomplete already initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n return;\n }\n\n try {\n let inputElement = null;\n\n // PRIORITY 1: Always prefer widget.inputEl if it exists (even if not yet in DOM)\n // This is the authoritative element created by ComfyUI\n if (inputWidget.inputEl) {\n inputElement = inputWidget.inputEl;\n // If not yet in DOM, wait for it to be added\n if (!document.body.contains(inputElement)) {\n console.log(`[Lora Manager] widget.inputEl exists but not in DOM yet, waiting for node ${node.id}`);\n const maxWait = 1000; // 1 second max\n const checkInterval = 50;\n let waited = 0;\n while (!document.body.contains(inputElement) && waited < maxWait) {\n await new Promise(r => setTimeout(r, checkInterval));\n waited += checkInterval;\n }\n if (!document.body.contains(inputElement)) {\n console.warn(`[Lora Manager] widget.inputEl still not in DOM after ${maxWait}ms for node ${node.id}`);\n inputElement = null; // Fall through to DOM search\n }\n }\n if (inputElement) {\n console.log(`[Lora Manager] Using widget.inputEl for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n }\n\n // PRIORITY 2: DOM search only if widget.inputEl doesn't exist\n if (!inputElement) {\n console.log(`[Lora Manager] Searching DOM for input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n inputElement = await findWidgetInputElement(node, inputWidget);\n }\n\n if (inputElement) {\n const autocomplete = new AutoComplete(inputElement, modelType, mergedOptions);\n node.autocomplete = autocomplete;\n console.log(`[Lora Manager] Autocomplete initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n } catch (error) {\n console.error('[Lora Manager] Error initializing autocomplete:', error);\n }\n };\n\n const checkAndInvalidateAutocomplete = () => {\n // Check for rendering mode change\n const currentMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n if (currentMode !== lastVueNodesMode) {\n lastVueNodesMode = currentMode;\n if (node.autocomplete) {\n console.log(`[Lora Manager] Rendering mode changed, reinitializing autocomplete for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n }\n return true;\n }\n\n // Check if existing autocomplete's input element is still valid\n if (node.autocomplete) {\n const currentInputEl = node.autocomplete.inputElement;\n if (!currentInputEl || !document.body.contains(currentInputEl)) {\n console.log(`[Lora Manager] Autocomplete element detached, reinitializing for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if autocomplete is bound to wrong element (different from widget.inputEl)\n // Only do this check if widget.inputEl is actually in the DOM - it may be stale\n if (inputWidget.inputEl && document.body.contains(inputWidget.inputEl) && currentInputEl !== inputWidget.inputEl) {\n console.log(`[Lora Manager] Autocomplete bound to wrong element, rebinding for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if events need rebinding (element exists but events not bound)\n // This can happen when Vue moves the element in the DOM\n if (node.autocomplete.needsRebind()) {\n console.log(`[Lora Manager] Autocomplete events need rebinding for node ${node.id}`);\n node.autocomplete.rebindEvents();\n }\n }\n\n return false;\n };\n\n const enhancedCallback = (value) => {\n // Check validity and invalidate if needed\n checkAndInvalidateAutocomplete();\n\n if (!node.autocomplete) {\n initializeAutocomplete();\n }\n\n if (typeof originalCallback === \"function\") {\n originalCallback.call(node, value);\n }\n };\n\n return enhancedCallback;\n}\n\n/**\n * Setup autocomplete cleanup when node is removed\n * @param {Object} node - The node instance\n */\nexport function setupAutocompleteCleanup(node) {\n // Override onRemoved to cleanup autocomplete\n const originalOnRemoved = node.onRemoved;\n node.onRemoved = function() {\n if (this.autocomplete) {\n this.autocomplete.destroy();\n this.autocomplete = null;\n }\n \n if (originalOnRemoved) {\n originalOnRemoved.call(this);\n }\n };\n}\n\n/**\n * Forward middle mouse (button 1) pointer events from a container to the ComfyUI canvas,\n * so that workflow panning works even when the pointer is over a DOM widget.\n * @param {HTMLElement} container - The root DOM element of the widget\n */\nexport function forwardMiddleMouseToCanvas(container) {\n if (!container) return;\n // Forward pointerdown\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseDown(event);\n }\n });\n // Forward pointermove\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n app.canvas.processMouseMove(event);\n }\n });\n // Forward pointerup\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseUp(event);\n }\n });\n}\n\n/**\n * Forward wheel events from a container to the ComfyUI canvas for zooming,\n * unless the container has scrollable content.\n * This allows canvas zoom to work when hovering over DOM widgets.\n * @param {HTMLElement} container - The root DOM element of the widget\n * @param {Object} options - Configuration options\n * @param {boolean} options.captureWheel - If true, always capture wheel events (default: false)\n */\nexport function forwardWheelToCanvas(container, options = {}) {\n if (!container) return;\n\n const { captureWheel = false } = options;\n\n container.addEventListener('wheel', (event) => {\n // If explicitly capturing wheel (for internal scrolling), stop here\n if (captureWheel) {\n event.stopPropagation();\n return;\n }\n\n // Access ComfyUI app from global window\n const comfyApp = window.app;\n if (!comfyApp || !comfyApp.canvas || typeof comfyApp.canvas.processMouseWheel !== 'function') {\n return;\n }\n\n const deltaX = event.deltaX;\n const deltaY = event.deltaY;\n const isHorizontal = Math.abs(deltaX) > Math.abs(deltaY);\n\n // 1. Handle pinch-to-zoom (ctrlKey is true for pinch-to-zoom on most browsers)\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 2. Horizontal scroll: pass to canvas (widgets usually don't scroll horizontally)\n if (isHorizontal) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 3. Vertical scrolling: check if container is scrollable\n const canScrollY = container.scrollHeight > container.clientHeight;\n\n if (canScrollY) {\n // Container is scrollable, let it handle the wheel event but stop propagation\n // to prevent the canvas from zooming while the user is trying to scroll\n event.stopPropagation();\n } else {\n // Container is NOT scrollable, forward the wheel event to the canvas\n // so it can trigger zoom in/out\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n }\n }, { passive: false });\n}\n\n// Marks scrollable containers whose wheel scrolling must win over canvas zoom.\nconst LM_WHEEL_CLASS = 'lm-wheel-scrollable';\nlet lmWheelHookInstalled = false;\n\n/**\n * Keep vertical wheel scrolling inside a scrollable widget container, even in\n * Nodes 2.0 / Vue mode where ComfyUI's wheel→zoom handler runs on the document\n * in the capture phase (outer than any container-level listener).\n * Installs a single capture-phase hook on `window` (the outermost dispatch\n * point). When the wheel is over a marked, scrollable element, we manually\n * scroll it and fully consume the event so canvas zoom never sees it.\n */\nexport function enableListWheelScroll(container) {\n if (!container) return;\n container.classList.add(LM_WHEEL_CLASS);\n\n if (lmWheelHookInstalled) return;\n lmWheelHookInstalled = true;\n\n window.addEventListener('wheel', (event) => {\n // Let pinch/zoom and horizontal gestures pass through.\n if (event.ctrlKey) return;\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n\n const target = event.target;\n if (!target || typeof target.closest !== 'function') return;\n const el = target.closest(`.${LM_WHEEL_CLASS}`);\n if (!el) return;\n\n const canScrollY = el.scrollHeight > el.clientHeight + 1;\n if (!canScrollY) return;\n\n // Translate deltaMode to approximate pixels.\n const unit = event.deltaMode === 1 ? 16\n : event.deltaMode === 2 ? el.clientHeight\n : 1;\n\n el.scrollTop += event.deltaY * unit;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }, { capture: true, passive: false });\n}\n\n// Get connected Lora Pool node from pool_config input\nexport function getConnectedPoolConfigNode(node) {\n if (!node?.inputs) {\n return null;\n }\n\n for (const input of node.inputs) {\n if (input.name !== \"pool_config\" || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && sourceNode.comfyClass === \"Lora Pool (LoraManager)\") {\n return sourceNode;\n }\n }\n\n return null;\n}\n\n// Get pool config widget value from connected Lora Pool node\nexport function getPoolConfigFromConnectedNode(node) {\n const poolNode = getConnectedPoolConfigNode(node);\n if (!poolNode) {\n return null;\n }\n\n const isNodeActive = poolNode.mode === undefined || poolNode.mode === 0 || poolNode.mode === 3;\n if (!isNodeActive) {\n return null;\n }\n\n const poolWidget = poolNode.widgets?.find(w => w.name === \"pool_config\");\n return poolWidget?.value || null;\n}\n\n// Helper function to find and update downstream Lora Loader nodes\nexport function updateDownstreamLoaders(startNode, visited = new Set()) {\n const nodeKey = getNodeKey(startNode);\n if (!nodeKey || visited.has(nodeKey)) return;\n visited.add(nodeKey);\n\n // Check each output link\n if (startNode.outputs) {\n for (const output of startNode.outputs) {\n if (output.links) {\n for (const linkId of output.links) {\n const link = getLinkFromGraph(startNode.graph, linkId);\n if (link) {\n const targetNode = startNode.graph?.getNodeById?.(link.target_id);\n\n // If target is a Lora Loader, collect all active loras in the chain and update\n if (\n targetNode &&\n targetNode.comfyClass === \"Lora Loader (LoraManager)\"\n ) {\n const allActiveLoraNames =\n collectActiveLorasFromChain(targetNode);\n updateConnectedTriggerWords(targetNode, allActiveLoraNames);\n }\n // If target is another LORA_STACK chain node, recursively check its outputs\n else if (targetNode && isLoraChainNode(targetNode.comfyClass)) {\n updateDownstreamLoaders(targetNode, visited);\n }\n }\n }\n }\n }\n }\n}\n","/**\n * Mode change handler for LoRA provider nodes.\n *\n * Provides common mode change logic for nodes that provide LoRA configurations:\n * - Lora Stacker (LoraManager)\n * - Lora Randomizer (LoraManager)\n * - Lora Cycler (LoraManager)\n */\n\n// @ts-ignore\nimport { interceptModeChange } from '../../web/comfyui/utils.js'\n\n/**\n * List of node types that act as LoRA providers in the workflow chain.\n * These nodes can be traversed when collecting active LoRAs and can trigger\n * downstream loader updates when their mode or active LoRAs change.\n */\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n] as const;\n\n/**\n * Nodes that do not own LoRA state themselves, but merge or forward LORA_STACK\n * inputs so downstream trigger-word updates must traverse through them.\n */\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n] as const;\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n] as const;\n\nexport type LoraProviderNodeType = typeof LORA_PROVIDER_NODE_TYPES[number];\nexport type LoraStackAggregatorNodeType = typeof LORA_STACK_AGGREGATOR_NODE_TYPES[number];\nexport type LoraChainNodeType = typeof LORA_CHAIN_NODE_TYPES[number];\n\n/**\n * Check if a node class is a LoRA provider node.\n */\nexport function isLoraProviderNode(comfyClass: string): comfyClass is LoraProviderNodeType {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass as LoraProviderNodeType);\n}\n\nexport function isLoraStackAggregatorNode(\n comfyClass: string\n): comfyClass is LoraStackAggregatorNodeType {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass as LoraStackAggregatorNodeType);\n}\n\nexport function isLoraChainNode(comfyClass: string): comfyClass is LoraChainNodeType {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass as LoraChainNodeType);\n}\n\n/**\n * Extract active LoRA filenames from a node based on its type.\n *\n * For Lora Stacker and Lora Randomizer: extracts from lorasWidget (array of loras, filtered by active)\n * For Lora Cycler: extracts from cycler_config widget (single current_lora_filename)\n */\nexport function getActiveLorasFromNodeByType(node: any): Set {\n const comfyClass = node?.comfyClass;\n\n if (comfyClass === \"Lora Cycler (LoraManager)\") {\n return extractFromCyclerConfig(node);\n }\n\n if (isLoraStackAggregatorNode(comfyClass)) {\n return new Set();\n }\n\n // Default: use lorasWidget (works for Stacker and Randomizer)\n return extractFromLorasWidget(node);\n}\n\n/**\n * Extract active LoRAs from a node's lorasWidget.\n * Used by Lora Stacker and Lora Randomizer.\n */\nfunction extractFromLorasWidget(node: any): Set {\n const activeLoraNames = new Set();\n const lorasWidget = node.lorasWidget || node.widgets?.find((w: any) => w.name === 'loras');\n\n if (lorasWidget?.value) {\n lorasWidget.value.forEach((lora: any) => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n/**\n * Extract the active LoRA from a Lora Cycler node.\n * The Cycler has only one active LoRA at a time, stored in cycler_config.current_lora_filename.\n */\nfunction extractFromCyclerConfig(node: any): Set {\n const activeLoraNames = new Set();\n const cyclerWidget = node.widgets?.find((w: any) => w.name === 'cycler_config');\n\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n\n return activeLoraNames;\n}\n\n/**\n * Check if a mode value represents an active node.\n * Active modes: 0 (Always), 3 (On Trigger)\n * Inactive modes: 2 (Never), 4 (Bypass)\n */\nexport function isNodeActive(mode: number | undefined): boolean {\n return mode === undefined || mode === 0 || mode === 3;\n}\n\n/**\n * Setup a mode change handler for a node.\n *\n * Delegates to `interceptModeChange`, which observes the mode property\n * without shadowing the frontend's own `mode` accessor. Since ComfyUI\n * frontend 1.53, `mode` is backed by shell state (`node._state.mode`) that\n * serialization reads directly — redefining the property on the instance\n * would silently revert bypass/mute on save/reload.\n *\n * @param node - The node to set up the handler for\n * @param onModeChange - Callback function called when mode changes (receives newMode and oldMode)\n */\nexport function setupModeChangeHandler(\n node: any,\n onModeChange: (newMode: number, oldMode: number) => void\n): void {\n interceptModeChange(node, onModeChange);\n}\n\n/**\n * Create a mode change callback that updates downstream loaders.\n *\n * This is the standard callback used by all LoRA provider nodes.\n * When mode changes:\n * 1. Determine if the node is active (mode 0 or 3)\n * 2. Get active LoRAs (empty set if inactive)\n * 3. Call the optional node-specific callback (e.g., updateConnectedTriggerWords for Stacker)\n * 4. Update downstream loaders\n *\n * @param node - The node instance\n * @param updateDownstreamLoaders - Function to update downstream loaders (from utils.js)\n * @param nodeSpecificCallback - Optional callback for node-specific behavior\n */\nexport function createModeChangeCallback(\n node: any,\n updateDownstreamLoaders: (node: any) => void,\n nodeSpecificCallback?: (activeLoraNames: Set) => void\n): (newMode: number, oldMode: number) => void {\n return (newMode: number, _oldMode: number) => {\n const isNodeCurrentlyActive = isNodeActive(newMode);\n const activeLoraNames = isNodeCurrentlyActive\n ? getActiveLorasFromNodeByType(node)\n : new Set();\n\n // Node-specific handling (e.g., Lora Stacker's direct trigger toggle updates)\n if (nodeSpecificCallback) {\n nodeSpecificCallback(activeLoraNames);\n }\n\n // Always update downstream loaders\n updateDownstreamLoaders(node);\n };\n}\n","import { createApp, type App as VueApp } from 'vue'\nimport PrimeVue from 'primevue/config'\nimport LoraPoolWidget from '@/components/LoraPoolWidget.vue'\nimport LoraRandomizerWidget from '@/components/LoraRandomizerWidget.vue'\nimport LoraCyclerWidget from '@/components/LoraCyclerWidget.vue'\nimport JsonDisplayWidget from '@/components/JsonDisplayWidget.vue'\nimport AutocompleteTextWidget from '@/components/AutocompleteTextWidget.vue'\nimport LoraInfoWidget from '@/components/LoraInfoWidget.vue'\nimport { createVueWidgetCleanup } from './vue-widget-cleanup'\nimport type { LoraPoolConfig, RandomizerConfig, CyclerConfig } from './composables/types'\nimport {\n setupModeChangeHandler,\n createModeChangeCallback,\n LORA_CHAIN_NODE_TYPES\n} from './mode-change-handler'\n\nconst LORA_POOL_WIDGET_MIN_WIDTH = 500\nconst LORA_POOL_WIDGET_MIN_HEIGHT = 520\nconst LORA_RANDOMIZER_WIDGET_MIN_WIDTH = 500\nconst LORA_RANDOMIZER_WIDGET_MIN_HEIGHT = 448\nconst LORA_RANDOMIZER_WIDGET_MAX_HEIGHT = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\nconst LORA_CYCLER_WIDGET_MIN_WIDTH = 380\nconst LORA_CYCLER_WIDGET_MIN_HEIGHT = 408\nconst LORA_CYCLER_WIDGET_MAX_HEIGHT = LORA_CYCLER_WIDGET_MIN_HEIGHT\nconst JSON_DISPLAY_WIDGET_MIN_WIDTH = 300\nconst JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200\nconst LORA_INFO_WIDGET_MIN_WIDTH = 300\nconst LORA_INFO_WIDGET_MIN_HEIGHT = 200\nconst AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60\nconst AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100\n// Per-modelType min size hints for node initial sizing.\n// These are returned from the factory so ComfyUI's _initialMinSize mechanism\n// gives the node a sensible default width (and height for prompt/embeddings).\nconst AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT = 400\nconst AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT = 300\nconst AUTOCOMPLETE_METADATA_VERSION = 1\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'\n\n// Access LiteGraph global for Vue DOM mode detection (matches AutocompleteTextWidget.vue)\ndeclare const LiteGraph: { vueNodesMode?: boolean } | undefined\n\n// @ts-ignore - ComfyUI external module\nimport { app } from '../../../scripts/app.js'\n// @ts-ignore - ComfyUI external module\nimport { api } from '../../../scripts/api.js'\n// @ts-ignore\nimport { getPoolConfigFromConnectedNode, getActiveLorasFromNode, updateConnectedTriggerWords, updateDownstreamLoaders } from '../../web/comfyui/utils.js'\n// @ts-ignore\nimport { stripAutocompleteMetadataFromPromptResult } from '../../web/comfyui/autocomplete.js'\n\n// Strip the autocomplete lastAccepted boundary from exported workflows.\n// lastAccepted carries old prompt text (insertedText/textSnapshot) and is\n// session-only state; it must not leak into exported JSON (#1093).\n// graphToPrompt is shared by workflow export, Export API and queueing.\n// Local saves go through the change-tracker snapshot (no graphToPrompt) and\n// are intentionally left untouched so cross-session caret continuity is kept.\n// Post-processing the resolved result avoids any window/race with\n// change-tracker or copy/paste serialization of live state.\nconst originalGraphToPrompt = app.graphToPrompt.bind(app)\napp.graphToPrompt = async (...args: unknown[]) => {\n const result = await originalGraphToPrompt(...args)\n stripAutocompleteMetadataFromPromptResult(result)\n return result\n}\n\nfunction forwardMiddleMouseToCanvas(container: HTMLElement) {\n if (!container) return\n\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseDown === 'function') {\n canvas.processMouseDown(event)\n }\n }\n })\n\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseMove === 'function') {\n canvas.processMouseMove(event)\n }\n }\n })\n\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseUp === 'function') {\n canvas.processMouseUp(event)\n }\n }\n })\n}\n\nconst vueApps = new Map()\nlet autocompleteTextWidgetInstanceId = 0\n\nexport function createAutocompleteTextWidgetInstanceId() {\n autocompleteTextWidgetInstanceId += 1\n return autocompleteTextWidgetInstanceId\n}\n\n// @ts-ignore\nfunction createLoraPoolWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-pool-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: LoraPoolConfig | undefined\n\n const widget = node.addDOMWidget(\n 'pool_config',\n 'LORA_POOL_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: LoraPoolConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n // Keep LM DOM widgets out of the right-side Properties Panel: the panel\n // falls back to WidgetLegacy for unknown widget types and writes\n // widget.width onto the real widget, squashing the canvas overlay\n // (ComfyUI_frontend #11574).\n hideInPanel: true,\n // Per dev guide: providing getMinHeight via options allows the system to\n // skip expensive DOM measurements during rendering loop, improving performance\n getMinHeight() {\n return LORA_POOL_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraPoolWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id, vueApp)\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_POOL_WIDGET_MIN_WIDTH\n const minHeight = LORA_POOL_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraRandomizerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-randomizer-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n // Initialize with default config to avoid sending undefined/empty string to backend\n const defaultConfig: RandomizerConfig = {\n count_mode: 'range',\n count_fixed: 3,\n count_min: 2,\n count_max: 5,\n model_strength_min: 0.0,\n model_strength_max: 1.0,\n use_same_clip_strength: true,\n clip_strength_min: 0.0,\n clip_strength_max: 1.0,\n roll_mode: 'fixed',\n use_recommended_strength: false,\n recommended_strength_scale_min: 0.5,\n recommended_strength_scale_max: 1.0,\n }\n let internalValue: RandomizerConfig = defaultConfig\n\n const widget = node.addDOMWidget(\n 'randomizer_config',\n 'RANDOMIZER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: RandomizerConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n // Handle roll event from Vue component\n widget.onRoll = (randomLoras: any[]) => {\n // Find the loras widget on this node and update it\n const lorasWidget = node.widgets.find((w: any) => w.name === 'loras')\n if (lorasWidget) {\n lorasWidget.value = randomLoras\n }\n }\n\n const vueApp = createApp(LoraRandomizerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 10000, vueApp) // Offset to avoid collision with pool widget\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_RANDOMIZER_WIDGET_MIN_WIDTH\n const minHeight = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_RANDOMIZER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 10000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 10000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraCyclerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-cycler-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n const defaultConfig: CyclerConfig = {\n current_index: 1,\n total_count: 0,\n pool_config_hash: '',\n model_strength: 1.0,\n clip_strength: 1.0,\n use_same_clip_strength: true,\n use_preset_strength: false,\n preset_strength_scale: 1.0,\n sort_by: 'filename',\n current_lora_name: '',\n current_lora_filename: '',\n repeat_count: 1,\n repeat_used: 0,\n is_paused: false,\n include_no_lora: false,\n }\n let internalValue: CyclerConfig | undefined = defaultConfig\n\n const widget = node.addDOMWidget(\n 'cycler_config',\n 'CYCLER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: CyclerConfig) {\n const oldFilename = internalValue?.current_lora_filename\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n // Update downstream loaders when the active LoRA filename changes\n if (oldFilename !== v?.current_lora_filename) {\n updateDownstreamLoaders(node)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_CYCLER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n const vueApp = createApp(LoraCyclerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 30000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_CYCLER_WIDGET_MIN_WIDTH\n const minHeight = LORA_CYCLER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_CYCLER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 30000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 30000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createJsonDisplayWidget(node) {\n const container = document.createElement('div')\n container.id = `json-display-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: Record | undefined\n\n const widget = node.addDOMWidget(\n 'metadata',\n 'JSON_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: Record) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: false, // Display-only widget - don't save metadata in workflows\n hideInPanel: true,\n getMinHeight() {\n return JSON_DISPLAY_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(JsonDisplayWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 20000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = JSON_DISPLAY_WIDGET_MIN_WIDTH\n const minHeight = JSON_DISPLAY_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 20000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 20000)\n }\n }\n\n return { widget }\n}\n\nconst widgetInputOptions: Map = new Map()\n\nfunction getSerializableWidgetNames(node: any): string[] {\n return (node.widgets || [])\n .filter((widget: any) => widget && widget.serialize !== false)\n .map((widget: any) => widget.name)\n}\n\nfunction createAutocompleteMetadataValue(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName\n }\n}\n\nfunction shouldBypassAutocompleteWidgetMigration(\n node: any,\n widgetValues: unknown[]\n): boolean {\n const inputDefs = node?.constructor?.nodeData?.inputs\n if (!inputDefs || !Array.isArray(widgetValues)) {\n return false\n }\n\n const widgetNames = new Set((node.widgets || []).map((widget: any) => widget?.name))\n const hasAutocompleteMetadataWidget = Array.from(widgetNames).some((name) =>\n typeof name === 'string' && name.startsWith('__lm_autocomplete_meta_')\n )\n\n if (!hasAutocompleteMetadataWidget) {\n return false\n }\n\n const originalWidgetsInputs = Object.values(inputDefs).filter((input: any) =>\n widgetNames.has(input.name) || input.forceInput\n )\n\n const widgetIndexHasForceInput = originalWidgetsInputs.flatMap((input: any) =>\n input.control_after_generate\n ? [!!input.forceInput, false]\n : [!!input.forceInput]\n )\n\n const result = (\n widgetIndexHasForceInput.some(Boolean) &&\n widgetIndexHasForceInput.length === widgetValues.length\n )\n\n return result\n}\n\nfunction remapWidgetValuesByName(\n widgetValues: unknown[],\n savedWidgetNames: string[],\n currentWidgetNames: string[]\n): unknown[] {\n const valueByName = new Map()\n savedWidgetNames.forEach((name, index) => {\n if (index < widgetValues.length) {\n valueByName.set(name, widgetValues[index])\n }\n })\n\n const currentWidgetNameSet = new Set(currentWidgetNames)\n const remappedValues: unknown[] = []\n for (const name of currentWidgetNames) {\n if (valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n // Append values for saved widget names that are NOT in the current widget\n // list (e.g. forceInput widgets like \"seed\" that haven't been converted\n // back to DOM widgets yet at configure time). Without these, the\n // resulting array may accidentally match the length of ComfyUI's\n // widgetIndexHasForceInput array, causing migrateWidgetsValues to\n // incorrectly filter out the wrong values and drop real widget content.\n for (const name of savedWidgetNames) {\n if (!currentWidgetNameSet.has(name) && valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n return remappedValues\n}\n\nfunction injectDefaultAutocompleteMetadataValues(\n widgetValues: unknown[],\n currentWidgetNames: string[]\n): unknown[] {\n const repairedValues: unknown[] = []\n let legacyValueIndex = 0\n\n for (const widgetName of currentWidgetNames) {\n if (widgetName.startsWith('__lm_autocomplete_meta_')) {\n const textWidgetName = widgetName.replace('__lm_autocomplete_meta_', '') || 'text'\n repairedValues.push(createAutocompleteMetadataValue(textWidgetName))\n continue\n }\n\n if (legacyValueIndex < widgetValues.length) {\n repairedValues.push(widgetValues[legacyValueIndex])\n legacyValueIndex++\n }\n }\n\n return repairedValues\n}\n\nfunction normalizeAutocompleteWidgetValues(node: any, info: any) {\n if (!info || !Array.isArray(info.widgets_values)) {\n return\n }\n\n const currentWidgetNames = getSerializableWidgetNames(node)\n\n if (currentWidgetNames.length === 0) {\n return\n }\n\n const savedWidgetNames = info.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY]\n\n if (Array.isArray(savedWidgetNames) && savedWidgetNames.length > 0) {\n const remappedValues = remapWidgetValuesByName(\n info.widgets_values,\n savedWidgetNames,\n currentWidgetNames\n )\n info.widgets_values = remappedValues\n return\n }\n\n const metadataWidgetCount = currentWidgetNames.filter((name) =>\n name.startsWith('__lm_autocomplete_meta_')\n ).length\n\n if (\n metadataWidgetCount > 0 &&\n info.widgets_values.length === currentWidgetNames.length - metadataWidgetCount\n ) {\n const repairedValues = injectDefaultAutocompleteMetadataValues(\n info.widgets_values,\n currentWidgetNames\n )\n info.widgets_values = repairedValues\n }\n}\n\nfunction applyAutocompleteTextLayoutFix(\n widget: any,\n _container: HTMLElement | undefined,\n isVueMode: boolean\n): void {\n // In Vue rendering mode the WidgetDOM wrapper handles sizing, so we\n // only provide a computeSize hint and leave the container unconstrained.\n // In canvas mode we clear all custom sizing so LiteGraph's default\n // widget-area layout takes over. Neither path sets a hard max-height;\n // the textarea can grow freely (e.g. in app mode where\n // [&_textarea]:resize-y applies).\n if (isVueMode) {\n ;(widget as any).computeLayoutSize = undefined\n widget.computeSize = (width?: number) =>\n [width ?? 200, AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT - 4]\n } else {\n delete (widget as any).computeLayoutSize\n delete (widget as any).computeSize\n }\n}\n\n// Listen for Vue DOM mode setting changes and dispatch custom event\nconst initVueDomModeListener = () => {\n if (app.ui?.settings?.addEventListener) {\n app.ui.settings.addEventListener('Comfy.VueNodes.Enabled.change', () => {\n // Use requestAnimationFrame to ensure the setting value has been updated\n // before we read it (the event may fire before internal state updates)\n requestAnimationFrame(() => {\n const isVueDomMode = app.ui?.settings?.getSettingValue?.('Comfy.VueNodes.Enabled') ?? false\n\n if (app.graph?.nodes) {\n for (const node of app.graph.nodes) {\n const textWidget = node.widgets?.find(\n (w: any) => w.type === 'AUTOCOMPLETE_TEXT_LORAS'\n )\n if (!textWidget) continue\n const container = (textWidget as any).element as HTMLElement | undefined\n applyAutocompleteTextLayoutFix(textWidget, container, isVueDomMode)\n }\n }\n\n requestAnimationFrame(() => {\n for (const nodeEl of document.querySelectorAll('[data-node-id]')) {\n const grid = nodeEl.querySelector('[data-testid=\"node-widgets\"]') as HTMLElement | null\n if (!grid) continue\n const nodeId = nodeEl.getAttribute('data-node-id')\n const node = app.graph?.getNodeById(nodeId as any)\n if (!node) continue\n const rows: string[] = []\n let needsFix = false\n for (const w of node.widgets ?? []) {\n if (w.type === 'LORA_MANAGER_AUTOCOMPLETE_METADATA') {\n rows.push('min-content')\n } else if (w.name === 'loras') {\n rows.push('auto')\n } else if (w.name === 'text' && w.type === 'AUTOCOMPLETE_TEXT_LORAS') {\n rows.push(isVueDomMode ? 'min-content' : 'auto')\n needsFix = true\n } else {\n rows.push('auto')\n }\n }\n if (needsFix) {\n grid.style.gridTemplateRows = rows.join(' ')\n }\n }\n })\n\n app.canvas?.setDirty(true, true)\n\n document.dispatchEvent(new CustomEvent('lora-manager:vue-mode-change', {\n detail: { isVueDomMode }\n }))\n })\n })\n }\n}\n\n// Initialize listener when app is ready\nif (app.ui?.settings) {\n initVueDomModeListener()\n} else {\n // Defer until app is ready\n const checkAppReady = setInterval(() => {\n if (app.ui?.settings) {\n initVueDomModeListener()\n clearInterval(checkAppReady)\n }\n }, 100)\n}\n\n// @ts-ignore\nfunction createLoraInfoWidget(node: any) {\n const container = document.createElement('div')\n container.id = `lora-info-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: { name?: string; notes?: string; filePath?: string; activeTab?: string } | undefined\n\n const widget = node.addDOMWidget(\n 'lora_info_display',\n 'LORA_INFO_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: { name?: string; notes?: string; filePath?: string; activeTab?: string }) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_INFO_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraInfoWidget, {\n widget,\n node,\n api,\n app,\n isVueMode: typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode,\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 40000, vueApp) // Offset to avoid collision\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_INFO_WIDGET_MIN_WIDTH\n const minHeight = LORA_INFO_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 40000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 40000)\n }\n }\n\n return { widget }\n}\n\n// Factory function for creating autocomplete text widgets\n// @ts-ignore\nfunction createAutocompleteTextWidgetFactory(\n node: any,\n widgetName: string,\n modelType: 'loras' | 'prompt',\n inputOptions: { placeholder?: string } = {}\n) {\n const metadataWidgetName = `__lm_autocomplete_meta_${widgetName}`\n\n let container: HTMLElement | null = null\n\n const existingContainers = document.querySelectorAll(\n '[id^=\"autocomplete-text-widget-\"]'\n )\n for (const el of existingContainers) {\n if (el.children.length === 0) {\n container = el\n break\n }\n }\n\n if (!container) {\n const instanceId = String(createAutocompleteTextWidgetInstanceId())\n container = document.createElement('div')\n container.id = `autocomplete-text-widget-${instanceId}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n forwardMiddleMouseToCanvas(container)\n }\n\n // Store textarea reference on the container element so cloned widgets can access it\n // This is necessary because when widgets are promoted to subgraph nodes,\n // the cloned widget shares the same element but needs access to inputEl\n const widgetElementRef = { inputEl: undefined as HTMLTextAreaElement | undefined }\n ;(container as any).__widgetInputEl = widgetElementRef\n\n const metadataWidget = node.addWidget('text', metadataWidgetName, {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName: widgetName\n })\n metadataWidget.value = createAutocompleteMetadataValue(widgetName)\n metadataWidget.type = 'LORA_MANAGER_AUTOCOMPLETE_METADATA'\n metadataWidget.hidden = true\n metadataWidget.computeSize = () => [0, -4]\n metadataWidget.serializeValue = () => metadataWidget.value\n\n const widget = node.addDOMWidget(\n widgetName,\n `AUTOCOMPLETE_TEXT_${modelType.toUpperCase()}`,\n container,\n {\n getValue() {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n return inputEl?.value ?? ''\n },\n setValue(v: string) {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n if (inputEl) {\n inputEl.value = v ?? ''\n // Notify Vue component of value change via custom event\n inputEl.dispatchEvent(new CustomEvent('lora-manager:autocomplete-value-changed', {\n detail: { value: v ?? '' }\n }))\n } else {\n ;(widget as any)._pendingValue = v ?? ''\n }\n // Also call onSetValue if defined (for Vue component integration)\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v ?? '')\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT\n },\n ...(modelType === 'loras' && {\n getMaxHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT\n }\n })\n }\n )\n widget.metadataWidget = metadataWidget\n\n // Get spellcheck setting from ComfyUI settings (default: false)\n const spellcheck = app.ui?.settings?.getSettingValue?.('Comfy.TextareaWidget.Spellcheck') ?? false\n\n const maxHeight = modelType === 'loras' ? AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT : undefined\n\n const vueApp = createApp(AutocompleteTextWidget, {\n widget,\n node,\n modelType,\n placeholder: inputOptions.placeholder || widgetName,\n showPreview: true,\n spellcheck,\n maxHeight\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n const appKey = container.id\n vueApps.set(appKey, vueApp)\n\n if (maxHeight) {\n container.style.minHeight = `${AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT}px`\n }\n\n if (modelType === 'loras') {\n applyAutocompleteTextLayoutFix(\n widget,\n container,\n typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode === true\n )\n }\n\n const vueCleanup = createVueWidgetCleanup(vueApp, () => {\n vueApps.delete(appKey)\n })\n\n widget.onRemove = () => {\n vueCleanup()\n }\n\n // Return minWidth/minHeight hints so ComfyUI's _initialMinSize mechanism\n // sets a sensible initial node width (and height for prompt/embeddings).\n // loras modelType retains its existing height constraints (getMaxHeight: 100).\n const minWidth = AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT\n const minHeight = modelType === 'loras' ? undefined : AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT\n\n return { widget, minWidth, minHeight }\n}\n\napp.registerExtension({\n name: 'LoraManager.VueWidgets',\n\n getCustomWidgets() {\n return {\n // @ts-ignore\n LORA_POOL_CONFIG(node) {\n return createLoraPoolWidget(node)\n },\n // @ts-ignore\n RANDOMIZER_CONFIG(node) {\n return createLoraRandomizerWidget(node)\n },\n // @ts-ignore\n CYCLER_CONFIG(node) {\n return createLoraCyclerWidget(node)\n },\n // Autocomplete text widget for LoRAs (used by Lora Loader, Lora Stacker, WanVideo Lora Select)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_LORAS(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'loras', options)\n },\n // Autocomplete text widget for prompt (used by Prompt and Text nodes)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_PROMPT(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'prompt', options)\n },\n }\n },\n\n // Add display-only widget to Debug Metadata node\n // Register mode change handlers for LoRA provider nodes\n // Extract and store input options for autocomplete widgets\n // @ts-ignore\n async beforeRegisterNodeDef(nodeType, nodeData) {\n const comfyClass = nodeType.comfyClass\n const inputs = { ...nodeData.input?.required, ...nodeData.input?.optional }\n let hasAutocompleteWidget = false\n\n // Extract and store input options for autocomplete widgets\n for (const [inputName, inputDef] of Object.entries(inputs)) {\n // @ts-ignore\n if (Array.isArray(inputDef) && typeof inputDef[0] === 'string' && inputDef[0].startsWith('AUTOCOMPLETE_TEXT_')) {\n // @ts-ignore\n const options = inputDef[1] || {}\n widgetInputOptions.set(`${nodeData.name}:${inputName}`, options)\n hasAutocompleteWidget = true\n }\n }\n\n if (hasAutocompleteWidget) {\n const originalOnSerialize = nodeType.prototype.onSerialize\n const originalConfigure = nodeType.prototype.configure\n\n nodeType.prototype.onSerialize = function (serialized: any) {\n originalOnSerialize?.apply(this, arguments)\n\n serialized.properties = serialized.properties || {}\n const widgetIds = getSerializableWidgetNames(this)\n serialized.properties[LORA_MANAGER_WIDGET_IDS_PROPERTY] = widgetIds\n }\n\n nodeType.prototype.configure = function (info: any) {\n normalizeAutocompleteWidgetValues(this, info)\n\n const bypassResult = shouldBypassAutocompleteWidgetMigration(this, info?.widgets_values ?? [])\n\n if (bypassResult) {\n info.widgets_values = [...(info.widgets_values ?? []), null]\n }\n\n return originalConfigure?.apply(this, arguments)\n }\n }\n\n // Register mode change handlers for LORA_STACK chain nodes\n if (LORA_CHAIN_NODE_TYPES.includes(comfyClass)) {\n const originalOnNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n originalOnNodeCreated?.apply(this, arguments)\n\n // Create node-specific callback for Lora Stacker (updates direct trigger toggles)\n const nodeSpecificCallback = comfyClass === \"Lora Stacker (LoraManager)\"\n ? (activeLoraNames: Set) => updateConnectedTriggerWords(this, activeLoraNames)\n : undefined\n\n // Create and set up the mode change handler\n const onModeChange = createModeChangeCallback(this, updateDownstreamLoaders, nodeSpecificCallback)\n setupModeChangeHandler(this, onModeChange)\n }\n }\n\n // Add the JSON display widget to Debug Metadata node\n if (nodeData.name === 'Debug Metadata (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Add the JSON display widget\n createJsonDisplayWidget(this)\n }\n }\n\n // Add the Lora Info display widget\n if (nodeData.name === 'Lora Info (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Create the lora info display widget\n createLoraInfoWidget(this)\n }\n }\n }\n})\n"],"names":["i","hasOwnProperty","c","s","a","b","isRef","v","_a","l","computed","self","readonly","watch","effect","p","callHook","remove","ref","h","m","createApp","app","isModelListener","emit","remove2","style","setup","tt","resolve","d","camelize$1","k","ie","ae","N","$","Y","ot","P","$e","J","ut","mt","se","St","yt","Ee","xt","bt","_t","y","T","z","_","re","K","A","G","H","ee","he","Oe","kt","we","_typeof","o","ownKeys","r","_objectSpread","_defineProperty","_toPropertyKey","_toPrimitive","css","isClient","document","stop","load","_id","setAttributes","setAttribute","unload","isExist","dt","css$1","isNotEmpty","minifyCSS","Theme","extend","EventBus","PrimeVue","ThemeService","loadCommonTheme","global","mergeKeys","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_toDisplayString","_openBlock","_hoisted_2","$emit","_createVNode","_hoisted_3","_hoisted_4","_hoisted_5","_Fragment","_renderList","_createBlock","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_14","_hoisted_15","_Transition","_Teleport","$slots","_renderSlot","_withModifiers","_e","api","_unref","percent","_normalizeStyle","_hoisted_13","_hoisted_16","_hoisted_17","_hoisted_18","w","lorasWidget","_createTextVNode","defaultOptions","_withDirectives","LORA_MANAGER_WIDGET_IDS_PROPERTY","LORA_PROVIDER_NODE_TYPES","LORA_STACK_AGGREGATOR_NODE_TYPES","LORA_CHAIN_NODE_TYPES","isLoraStackAggregatorNode","isNodeActive","updateDownstreamLoaders","vueApp","_b"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]} \ No newline at end of file +{"version":3,"file":"lora-manager-widgets.js","sources":["../../../vue-widgets/node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../vue-widgets/node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../vue-widgets/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../../vue-widgets/node_modules/@primeuix/utils/dist/object/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/eventbus/index.mjs","../../../vue-widgets/node_modules/@primeuix/utils/dist/dom/index.mjs","../../../vue-widgets/node_modules/@primeuix/styled/dist/index.mjs","../../../vue-widgets/node_modules/@primevue/core/api/index.mjs","../../../vue-widgets/node_modules/@primeuix/styles/dist/base/index.mjs","../../../vue-widgets/node_modules/@primevue/core/usestyle/index.mjs","../../../vue-widgets/node_modules/@primevue/core/base/style/index.mjs","../../../vue-widgets/node_modules/@primevue/core/service/index.mjs","../../../vue-widgets/node_modules/@primevue/core/config/index.mjs","../../../vue-widgets/src/components/lora-pool/shared/FilterChip.vue","../../../vue-widgets/src/components/lora-pool/shared/EditButton.vue","../../../vue-widgets/src/components/lora-pool/sections/BaseModelSection.vue","../../../vue-widgets/src/components/lora-pool/sections/TagsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/FoldersSection.vue","../../../vue-widgets/src/components/lora-pool/sections/NamePatternsSection.vue","../../../vue-widgets/src/components/lora-pool/sections/LicenseSection.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolPreview.vue","../../../vue-widgets/src/components/lora-pool/LoraPoolSummaryView.vue","../../../vue-widgets/src/components/lora-pool/modals/ModalWrapper.vue","../../../vue-widgets/src/components/lora-pool/modals/BaseModelModal.vue","../../../vue-widgets/src/components/lora-pool/modals/TagsModal.vue","../../../vue-widgets/src/components/lora-pool/modals/FolderTreeNode.vue","../../../vue-widgets/src/components/lora-pool/modals/FoldersModal.vue","../../../vue-widgets/src/utils/basePath.ts","../../../vue-widgets/src/composables/useLoraPoolApi.ts","../../../vue-widgets/src/composables/useLoraPoolState.ts","../../../vue-widgets/src/composables/useModalState.ts","../../../vue-widgets/src/components/LoraPoolWidget.vue","../../../vue-widgets/src/components/lora-randomizer/LastUsedPreview.vue","../../../vue-widgets/src/components/shared/SingleSlider.vue","../../../vue-widgets/src/components/shared/DualRangeSlider.vue","../../../vue-widgets/src/components/lora-randomizer/LoraRandomizerSettingsView.vue","../../../vue-widgets/src/composables/useLoraRandomizerState.ts","../../../vue-widgets/src/components/LoraRandomizerWidget.vue","../../../vue-widgets/src/components/lora-cycler/LoraCyclerSettingsView.vue","../../../vue-widgets/src/components/lora-cycler/LoraListModal.vue","../../../vue-widgets/src/composables/useLoraCyclerState.ts","../../../vue-widgets/src/components/LoraCyclerWidget.vue","../../../vue-widgets/src/components/JsonDisplayWidget.vue","../../../vue-widgets/src/composables/useAutocomplete.ts","../../../vue-widgets/src/components/AutocompleteTextWidget.vue","../../../vue-widgets/src/components/LoraInfoWidget.vue","../../../vue-widgets/src/vue-widget-cleanup.ts","../autocomplete.js","../base_path.js","../utils.js","../../../vue-widgets/src/mode-change-handler.ts","../../../vue-widgets/src/main.ts"],"sourcesContent":["/**\n* @vue/shared v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n activeEffectScope = this.prevScope;\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || !isIntegerKey(String(_key))) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, watch as watch$1, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, customRef, shallowReactive, trigger, ReactiveEffect, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, hyphenate, hasChanged, looseToNumber, isModelListener, EMPTY_ARR, makeMap, toRawType, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= -2;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= -2;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= -2;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n if (!(instance.job.flags & 8)) {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n }\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nfunction provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (!currentInstance || currentInstance.isMounted) {\n warn$1(`provide() can only be used inside setup().`);\n }\n }\n if (currentInstance) {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = getCurrentInstance();\n if (instance || currentApp) {\n let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(getCurrentInstance() || currentApp);\n}\n\nconst ssrContextKey = /* @__PURE__ */ Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, flush, once } = options;\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const baseWatchOptions = extend({}, options);\n if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n let ssrCleanup;\n if (isInSSRComponentSetup) {\n if (flush === \"sync\") {\n const ctx = useSSRContext();\n ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n } else if (!runsImmediately) {\n const watchStopHandle = () => {\n };\n watchStopHandle.stop = NOOP;\n watchStopHandle.resume = NOOP;\n watchStopHandle.pause = NOOP;\n return watchStopHandle;\n }\n }\n const instance = currentInstance;\n baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n let isPre = false;\n if (flush === \"post\") {\n baseWatchOptions.scheduler = (job) => {\n queuePostRenderEffect(job, instance && instance.suspense);\n };\n } else if (flush !== \"sync\") {\n isPre = true;\n baseWatchOptions.scheduler = (job, isFirstRun) => {\n if (isFirstRun) {\n job();\n } else {\n queueJob(job);\n }\n };\n }\n baseWatchOptions.augmentJob = (job) => {\n if (cb) {\n job.flags |= 4;\n }\n if (isPre) {\n job.flags |= 2;\n if (instance) {\n job.id = instance.uid;\n job.i = instance;\n }\n }\n };\n const watchHandle = watch$1(source, cb, baseWatchOptions);\n if (isInSSRComponentSetup) {\n if (ssrCleanup) {\n ssrCleanup.push(watchHandle);\n } else if (runsImmediately) {\n watchHandle();\n }\n }\n return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\n\nconst TeleportEndKey = /* @__PURE__ */ Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (parentComponent && parentComponent.isCE) {\n (parentComponent.ce._teleportTargets || (parentComponent.ce._teleportTargets = /* @__PURE__ */ new Set())).add(target);\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n n2.el.__isMounted = false;\n queuePostRenderEffect(() => {\n mountToTarget();\n delete n2.el.__isMounted;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n function hydrateDisabledTeleport(node2, vnode2, targetStart, targetAnchor) {\n vnode2.anchor = hydrateChildren(\n nextSibling(node2),\n vnode2,\n parentNode(node2),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode2.targetStart = targetStart;\n vnode2.targetAnchor = targetAnchor;\n }\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n const disabled = isTeleportDisabled(vnode.props);\n if (target) {\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n hydrateDisabledTeleport(\n node,\n vnode,\n targetNode,\n targetNode && nextSibling(targetNode)\n );\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n } else if (disabled) {\n if (vnode.shapeFlag & 16) {\n hydrateDisabledTeleport(node, vnode, node, nextSibling(node));\n }\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = /* @__PURE__ */ Symbol(\"_leaveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nconst pendingSetRefMap = /* @__PURE__ */ new WeakMap();\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n const canSetRef = (ref2) => {\n return !!!(process.env.NODE_ENV !== \"production\") || !knownTemplateRefs.has(ref2);\n };\n if (oldRef != null && oldRef !== ref) {\n invalidatePendingSetRef(oldRawRef);\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n if (canSetRef(oldRef)) {\n oldRef.value = null;\n }\n const oldRawRefAtom = oldRawRef;\n if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n const newVal = [refValue];\n if (canSetRef(ref)) {\n ref.value = newVal;\n }\n if (rawRef.k) refs[rawRef.k] = newVal;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n if (canSetRef(ref)) {\n ref.value = value;\n }\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n const job = () => {\n doSet();\n pendingSetRefMap.delete(rawRef);\n };\n job.id = -1;\n pendingSetRefMap.set(rawRef, job);\n queuePostRenderEffect(job, parentSuspense);\n } else {\n invalidatePendingSetRef(rawRef);\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\nfunction invalidatePendingSetRef(rawRef) {\n const pendingSetRef = pendingSetRefMap.get(rawRef);\n if (pendingSetRef) {\n pendingSetRef.flags |= 8;\n pendingSetRefMap.delete(rawRef);\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n const cls = content.getAttribute(\"class\");\n if (cls) content.$cls = cls;\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n const { textContent } = el;\n if (textContent !== clientText && // innerHTML normalize \\r\\n or \\r into a single \\n in the DOM\n textContent !== clientText.replace(/\\r\\n|\\r/g, \"\\n\")) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${textContent}\n - expected on client: ${clientText}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n if (el.$cls) {\n actual = el.$cls;\n delete el.$cls;\n } else {\n actual = el.getAttribute(\"class\");\n }\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n const value = normalizeCssVarValue(cssVars[key]);\n expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return list.includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n let patched = false;\n (instance.bu || (instance.bu = [])).push(() => patched = true);\n const performHydrate = () => {\n if (patched) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n );\n }\n return;\n }\n hydrate();\n };\n const doHydrate = hydrateStrategy ? () => {\n const teardown = hydrateStrategy(\n performHydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n } : performHydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createInnerComp(\n loadingComponent,\n instance\n );\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n instance2.__keepAliveStorageContainer = storageContainer;\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : vnode.type\n );\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= -257;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= -257;\n vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = /* @__PURE__ */ Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n let isReadonlySource = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n isReadonlySource = isReadonly(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n const hasProps = Object.keys(props).length > 0;\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n hasProps ? -2 : 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (hasOwn(props, key)) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate \n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","export function getLmBasePath(): string {\n const { pathname } = window.location;\n return pathname.endsWith('/') ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmApiUrl(path: string): string {\n return `${getLmBasePath()}${path}`;\n}\n","import { ref } from 'vue'\nimport type { BaseModelOption, TagOption, FolderTreeNode, LoraItem } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraPoolApi() {\n const isLoading = ref(false)\n\n const fetchBaseModels = async (limit = 50): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/base-models?limit=${limit}`))\n const data = await response.json()\n return data.base_models || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch base models:', error)\n return []\n }\n }\n\n const fetchTags = async (limit = 0): Promise => {\n try {\n const response = await fetch(lmApiUrl(`/api/lm/loras/top-tags?limit=${limit}`))\n const data = await response.json()\n return data.tags || []\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch tags:', error)\n return []\n }\n }\n\n const fetchFolderTree = async (): Promise => {\n try {\n const response = await fetch(lmApiUrl('/api/lm/loras/unified-folder-tree'))\n const data = await response.json()\n return transformFolderTree(data.tree || {})\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch folder tree:', error)\n return []\n }\n }\n\n const transformFolderTree = (tree: Record, parentPath = ''): FolderTreeNode[] => {\n if (!tree || typeof tree !== 'object') {\n return []\n }\n\n return Object.entries(tree).map(([name, children]) => {\n const path = parentPath ? `${parentPath}/${name}` : name\n const childNodes = transformFolderTree(children as Record, path)\n\n return {\n key: path,\n label: name,\n children: childNodes.length > 0 ? childNodes : undefined\n }\n })\n }\n\n interface FetchLorasParams {\n baseModels?: string[]\n tagsInclude?: string[]\n tagsExclude?: string[]\n foldersInclude?: string[]\n foldersExclude?: string[]\n noCreditRequired?: boolean\n allowSelling?: boolean\n namePatternsInclude?: string[]\n namePatternsExclude?: string[]\n namePatternsUseRegex?: boolean\n page?: number\n pageSize?: number\n }\n\n const fetchLoras = async (params: FetchLorasParams): Promise<{ items: LoraItem[]; total: number }> => {\n isLoading.value = true\n try {\n const urlParams = new URLSearchParams()\n urlParams.set('page', String(params.page || 1))\n urlParams.set('page_size', String(params.pageSize || 6))\n\n params.baseModels?.forEach(bm => urlParams.append('base_model', bm))\n params.tagsInclude?.forEach(tag => urlParams.append('tag_include', tag))\n params.tagsExclude?.forEach(tag => urlParams.append('tag_exclude', tag))\n\n // Folder filters\n if (params.foldersInclude && params.foldersInclude.length > 0) {\n params.foldersInclude.forEach(folder => urlParams.append('folder_include', folder))\n urlParams.set('recursive', 'true')\n }\n params.foldersExclude?.forEach(folder => urlParams.append('folder_exclude', folder))\n\n if (params.noCreditRequired !== undefined) {\n urlParams.set('credit_required', String(!params.noCreditRequired))\n }\n\n if (params.allowSelling !== undefined) {\n urlParams.set('allow_selling_generated_content', String(params.allowSelling))\n }\n\n // Name pattern filters\n params.namePatternsInclude?.forEach(pattern => urlParams.append('name_pattern_include', pattern))\n params.namePatternsExclude?.forEach(pattern => urlParams.append('name_pattern_exclude', pattern))\n if (params.namePatternsUseRegex !== undefined) {\n urlParams.set('name_pattern_use_regex', String(params.namePatternsUseRegex))\n }\n\n const response = await fetch(lmApiUrl(`/api/lm/loras/list?${urlParams}`))\n const data = await response.json()\n\n return {\n items: data.items || [],\n total: data.total || 0\n }\n } catch (error) {\n console.error('[LoraPoolApi] Failed to fetch loras:', error)\n return { items: [], total: 0 }\n } finally {\n isLoading.value = false\n }\n }\n\n return {\n isLoading,\n fetchBaseModels,\n fetchTags,\n fetchFolderTree,\n fetchLoras\n }\n}\n","import { ref, computed, watch } from 'vue'\nimport type {\n LoraPoolConfig,\n BaseModelOption,\n TagOption,\n FolderTreeNode,\n LoraItem,\n ComponentWidget\n} from './types'\nimport { useLoraPoolApi } from './useLoraPoolApi'\n\nexport function useLoraPoolState(widget: ComponentWidget) {\n const api = useLoraPoolApi()\n\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n let isRestoring = false\n\n // Filter state\n const selectedBaseModels = ref([])\n const includeTags = ref([])\n const excludeTags = ref([])\n const includeFolders = ref([])\n const excludeFolders = ref([])\n const noCreditRequired = ref(false)\n const allowSelling = ref(false)\n const includePatterns = ref([])\n const excludePatterns = ref([])\n const useRegex = ref(false)\n\n // Available options from API\n const availableBaseModels = ref([])\n const availableTags = ref([])\n const folderTree = ref([])\n\n // Preview state\n const previewItems = ref([])\n const matchCount = ref(0)\n const isLoading = computed(() => api.isLoading.value)\n\n // Build config from current state\n const buildConfig = (): LoraPoolConfig => {\n const config: LoraPoolConfig = {\n version: 2,\n filters: {\n baseModels: selectedBaseModels.value,\n tags: {\n include: includeTags.value,\n exclude: excludeTags.value\n },\n folders: {\n include: includeFolders.value,\n exclude: excludeFolders.value\n },\n license: {\n noCreditRequired: noCreditRequired.value,\n allowSelling: allowSelling.value\n },\n namePatterns: {\n include: includePatterns.value,\n exclude: excludePatterns.value,\n useRegex: useRegex.value\n }\n },\n preview: {\n matchCount: matchCount.value,\n lastUpdated: Date.now()\n }\n }\n\n // Update widget value (this triggers callback for UI sync)\n // Skip during restoration to prevent infinite loops:\n // callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback → ...\n if (!isRestoring) {\n widget.value = config\n }\n return config\n }\n\n // Restore state from config\n const restoreFromConfig = (config: LoraPoolConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n // This breaks the infinite loop: callback → restoreFromConfig → watch → refreshPreview → buildConfig → widget.value = config → callback\n isRestoring = true\n\n try {\n if (!config?.filters) return\n\n const { filters, preview } = config\n\n // Helper to update ref only if value changed\n const updateIfChanged = (refValue: { value: T }, newValue: T) => {\n if (JSON.stringify(refValue.value) !== JSON.stringify(newValue)) {\n refValue.value = newValue\n }\n }\n\n updateIfChanged(selectedBaseModels, filters.baseModels || [])\n updateIfChanged(includeTags, filters.tags?.include || [])\n updateIfChanged(excludeTags, filters.tags?.exclude || [])\n updateIfChanged(includeFolders, filters.folders?.include || [])\n updateIfChanged(excludeFolders, filters.folders?.exclude || [])\n updateIfChanged(noCreditRequired, filters.license?.noCreditRequired ?? false)\n updateIfChanged(allowSelling, filters.license?.allowSelling ?? false)\n updateIfChanged(includePatterns, filters.namePatterns?.include || [])\n updateIfChanged(excludePatterns, filters.namePatterns?.exclude || [])\n updateIfChanged(useRegex, filters.namePatterns?.useRegex ?? false)\n\n // matchCount doesn't trigger watchers, so direct assignment is fine\n matchCount.value = preview?.matchCount || 0\n } finally {\n isRestoring = false\n }\n }\n\n // Fetch filter options from API\n const fetchFilterOptions = async () => {\n const [baseModels, tags, folders] = await Promise.all([\n api.fetchBaseModels(),\n api.fetchTags(),\n api.fetchFolderTree()\n ])\n\n availableBaseModels.value = baseModels\n availableTags.value = tags\n folderTree.value = folders\n }\n\n // Refresh preview with current filters\n const refreshPreview = async () => {\n const result = await api.fetchLoras({\n baseModels: selectedBaseModels.value,\n tagsInclude: includeTags.value,\n tagsExclude: excludeTags.value,\n foldersInclude: includeFolders.value,\n foldersExclude: excludeFolders.value,\n noCreditRequired: noCreditRequired.value || undefined,\n allowSelling: allowSelling.value || undefined,\n namePatternsInclude: includePatterns.value,\n namePatternsExclude: excludePatterns.value,\n namePatternsUseRegex: useRegex.value,\n pageSize: 6\n })\n\n previewItems.value = result.items\n matchCount.value = result.total\n buildConfig()\n }\n\n // Debounced filter change handler\n let filterTimeout: ReturnType | null = null\n const onFilterChange = () => {\n if (filterTimeout) clearTimeout(filterTimeout)\n filterTimeout = setTimeout(() => {\n refreshPreview()\n }, 300)\n }\n\n // Watch all filter changes\n watch([\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex\n ], onFilterChange, { deep: true })\n\n return {\n // Filter state\n selectedBaseModels,\n includeTags,\n excludeTags,\n includeFolders,\n excludeFolders,\n noCreditRequired,\n allowSelling,\n includePatterns,\n excludePatterns,\n useRegex,\n\n // Available options\n availableBaseModels,\n availableTags,\n folderTree,\n\n // Preview state\n previewItems,\n matchCount,\n isLoading,\n\n // Actions\n buildConfig,\n restoreFromConfig,\n fetchFilterOptions,\n refreshPreview\n }\n}\n\nexport type LoraPoolStateReturn = ReturnType\n","import { ref, computed } from 'vue'\n\nexport type ModalType = 'baseModels' | 'includeTags' | 'excludeTags' | 'includeFolders' | 'excludeFolders' | null\n\nexport function useModalState() {\n const activeModal = ref(null)\n\n const isOpen = computed(() => activeModal.value !== null)\n\n const openModal = (modal: ModalType) => {\n activeModal.value = modal\n }\n\n const closeModal = () => {\n activeModal.value = null\n }\n\n const isModalOpen = (modal: ModalType) => {\n return activeModal.value === modal\n }\n\n return {\n activeModal,\n isOpen,\n openModal,\n closeModal,\n isModalOpen\n }\n}\n\nexport type ModalStateReturn = ReturnType\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, computed, watch } from 'vue'\nimport type { ComponentWidget, RandomizerConfig, LoraEntry } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport function useLoraRandomizerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const countMode = ref<'fixed' | 'range'>('range')\n const countFixed = ref(3)\n const countMin = ref(2)\n const countMax = ref(5)\n const modelStrengthMin = ref(0.0)\n const modelStrengthMax = ref(1.0)\n const useCustomClipRange = ref(false)\n const clipStrengthMin = ref(0.0)\n const clipStrengthMax = ref(1.0)\n const rollMode = ref<'fixed' | 'always'>('fixed')\n const isRolling = ref(false)\n const useRecommendedStrength = ref(false)\n const recommendedStrengthScaleMin = ref(0.5)\n const recommendedStrengthScaleMax = ref(1.0)\n\n // Track last used combination (for backend roll mode)\n const lastUsed = ref(null)\n\n // Dual seed mechanism for batch queue synchronization\n // execution_seed: seed for generating execution_stack (= previous next_seed)\n // next_seed: seed for generating ui_loras (= what will be displayed after execution)\n const executionSeed = ref(null)\n const nextSeed = ref(null)\n\n // Build config object from current state\n const buildConfig = (): RandomizerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n return {\n count_mode: countMode.value,\n count_fixed: countFixed.value,\n count_min: countMin.value,\n count_max: countMax.value,\n model_strength_min: modelStrengthMin.value,\n model_strength_max: modelStrengthMax.value,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: clipStrengthMin.value,\n clip_strength_max: clipStrengthMax.value,\n roll_mode: rollMode.value,\n last_used: lastUsed.value,\n use_recommended_strength: useRecommendedStrength.value,\n recommended_strength_scale_min: recommendedStrengthScaleMin.value,\n recommended_strength_scale_max: recommendedStrengthScaleMax.value,\n execution_seed: executionSeed.value,\n next_seed: nextSeed.value,\n }\n }\n\n // Shift seeds for batch queue synchronization\n // Previous next_seed becomes current execution_seed, and generate a new next_seed\n const generateNewSeed = () => {\n executionSeed.value = nextSeed.value // Previous next becomes current execution\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n\n // Initialize next_seed for first execution (execution_seed stays null)\n const initializeNextSeed = () => {\n if (nextSeed.value === null) {\n nextSeed.value = Math.floor(Math.random() * 2147483647)\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: RandomizerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n countMode.value = config.count_mode || 'range'\n countFixed.value = config.count_fixed || 3\n countMin.value = config.count_min || 2\n countMax.value = config.count_max || 5\n modelStrengthMin.value = config.model_strength_min ?? 0.0\n modelStrengthMax.value = config.model_strength_max ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n clipStrengthMin.value = config.clip_strength_min ?? 0.0\n clipStrengthMax.value = config.clip_strength_max ?? 1.0\n // Migrate old roll_mode values to new ones\n const rawRollMode = (config as any).roll_mode as string\n if (rawRollMode === 'frontend') {\n rollMode.value = 'fixed'\n } else if (rawRollMode === 'backend') {\n rollMode.value = 'always'\n } else if (rawRollMode === 'fixed' || rawRollMode === 'always') {\n rollMode.value = rawRollMode as 'fixed' | 'always'\n } else {\n rollMode.value = 'fixed'\n }\n lastUsed.value = config.last_used || null\n useRecommendedStrength.value = config.use_recommended_strength ?? false\n recommendedStrengthScaleMin.value = config.recommended_strength_scale_min ?? 0.5\n recommendedStrengthScaleMax.value = config.recommended_strength_scale_max ?? 1.0\n } finally {\n isRestoring = false\n }\n }\n\n // Roll loras - call API to get random selection\n const rollLoras = async (\n poolConfig: any | null,\n lockedLoras: LoraEntry[]\n ): Promise => {\n try {\n isRolling.value = true\n\n const config = buildConfig()\n\n // Build request body\n const requestBody: any = {\n model_strength_min: config.model_strength_min,\n model_strength_max: config.model_strength_max,\n use_same_clip_strength: !useCustomClipRange.value,\n clip_strength_min: config.clip_strength_min,\n clip_strength_max: config.clip_strength_max,\n locked_loras: lockedLoras,\n use_recommended_strength: config.use_recommended_strength,\n recommended_strength_scale_min: config.recommended_strength_scale_min,\n recommended_strength_scale_max: config.recommended_strength_scale_max,\n }\n\n // Add count parameters\n if (config.count_mode === 'fixed') {\n requestBody.count = config.count_fixed\n } else {\n requestBody.count_min = config.count_min\n requestBody.count_max = config.count_max\n }\n\n // Add pool config if provided\n if (poolConfig) {\n requestBody.pool_config = poolConfig.filters || {}\n }\n\n // Call API endpoint\n const response = await fetch(lmApiUrl('/api/lm/loras/random-sample'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch random LoRAs')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get random LoRAs')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraRandomizerState] Error rolling LoRAs:', error)\n throw error\n } finally {\n isRolling.value = false\n }\n }\n\n // Restore last used and return it\n const useLastUsed = () => {\n if (lastUsed.value && lastUsed.value.length > 0) {\n return lastUsed.value\n }\n return null\n }\n\n // Computed properties\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n const isRecommendedStrengthEnabled = computed(() => useRecommendedStrength.value)\n\n // Watch all state changes and update widget value\n watch([\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n countMode,\n countFixed,\n countMin,\n countMax,\n modelStrengthMin,\n modelStrengthMax,\n useCustomClipRange,\n clipStrengthMin,\n clipStrengthMax,\n rollMode,\n isRolling,\n lastUsed,\n useRecommendedStrength,\n recommendedStrengthScaleMin,\n recommendedStrengthScaleMax,\n executionSeed,\n nextSeed,\n\n // Computed\n isClipStrengthDisabled,\n isRecommendedStrengthEnabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n rollLoras,\n useLastUsed,\n generateNewSeed,\n initializeNextSeed,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, watch, computed } from 'vue'\nimport type { ComponentWidget, CyclerConfig, LoraPoolConfig } from './types'\nimport { lmApiUrl } from '@/utils/basePath'\n\nexport interface CyclerLoraItem {\n file_name: string\n model_name: string\n file_path: string\n}\n\nexport function useLoraCyclerState(widget: ComponentWidget) {\n // Flag to prevent infinite loops during config restoration\n // callback → restoreFromConfig → watch → widget.value = config → callback → ...\n let isRestoring = false\n\n // State refs\n const currentIndex = ref(1) // 1-based\n const totalCount = ref(0)\n const poolConfigHash = ref('')\n const modelStrength = ref(1.0)\n const clipStrength = ref(1.0)\n const useCustomClipRange = ref(false)\n const usePresetStrength = ref(false)\n const presetStrengthScale = ref(1.0)\n const sortBy = ref<'filename' | 'model_name'>('filename')\n const currentLoraName = ref('')\n const currentLoraFilename = ref('')\n const isLoading = ref(false)\n\n // Dual-index mechanism for batch queue synchronization\n // execution_index: index for generating execution_stack (= previous next_index)\n // next_index: index for UI display (= what will be shown after execution)\n const executionIndex = ref(null)\n const nextIndex = ref(null)\n\n // Advanced index control features\n const repeatCount = ref(1) // How many times each LoRA should repeat\n const repeatUsed = ref(0) // How many times current index has been used (internal tracking)\n const displayRepeatUsed = ref(0) // For UI display, deferred updates like currentIndex\n const isPaused = ref(false) // Whether iteration is paused\n const includeNoLora = ref(false) // Whether to include empty LoRA option in cycle\n\n // Execution progress tracking (visual feedback)\n const isWorkflowExecuting = ref(false) // Workflow is currently running\n const executingRepeatStep = ref(0) // Which repeat step (1-based, 0 = not executing)\n\n // Build config object from current state\n const buildConfig = (): CyclerConfig => {\n // Skip updating widget.value during restoration to prevent infinite loops\n if (isRestoring) {\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n return {\n current_index: currentIndex.value,\n total_count: totalCount.value,\n pool_config_hash: poolConfigHash.value,\n model_strength: modelStrength.value,\n clip_strength: clipStrength.value,\n use_same_clip_strength: !useCustomClipRange.value,\n use_preset_strength: usePresetStrength.value,\n preset_strength_scale: presetStrengthScale.value,\n sort_by: sortBy.value,\n current_lora_name: currentLoraName.value,\n current_lora_filename: currentLoraFilename.value,\n execution_index: executionIndex.value,\n next_index: nextIndex.value,\n repeat_count: repeatCount.value,\n repeat_used: repeatUsed.value,\n is_paused: isPaused.value,\n include_no_lora: includeNoLora.value,\n }\n }\n\n // Restore state from config object\n const restoreFromConfig = (config: CyclerConfig) => {\n // Set flag to prevent buildConfig from triggering widget.value updates during restoration\n isRestoring = true\n\n try {\n currentIndex.value = config.current_index || 1\n totalCount.value = config.total_count || 0\n poolConfigHash.value = config.pool_config_hash || ''\n modelStrength.value = config.model_strength ?? 1.0\n clipStrength.value = config.clip_strength ?? 1.0\n useCustomClipRange.value = !(config.use_same_clip_strength ?? true)\n usePresetStrength.value = config.use_preset_strength ?? false\n presetStrengthScale.value = config.preset_strength_scale ?? 1.0\n sortBy.value = config.sort_by || 'filename'\n currentLoraName.value = config.current_lora_name || ''\n currentLoraFilename.value = config.current_lora_filename || ''\n // Advanced index control features\n repeatCount.value = config.repeat_count ?? 1\n repeatUsed.value = config.repeat_used ?? 0\n isPaused.value = config.is_paused ?? false\n includeNoLora.value = config.include_no_lora ?? false\n // Note: execution_index and next_index are not restored from config\n // as they are transient values used only during batch execution\n } finally {\n isRestoring = false\n }\n }\n\n // Shift indices for batch queue synchronization\n // Previous next_index becomes current execution_index, and generate a new next_index\n const generateNextIndex = () => {\n executionIndex.value = nextIndex.value // Previous next becomes current execution\n // Calculate the next index (wrap to 1 if at end)\n const current = executionIndex.value ?? currentIndex.value\n let next = current + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n\n // Initialize next_index for first execution (execution_index stays null)\n const initializeNextIndex = () => {\n if (nextIndex.value === null) {\n // First execution uses current_index, so next is current + 1\n let next = currentIndex.value + 1\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (effectiveTotalCount > 0 && next > effectiveTotalCount) {\n next = 1\n }\n nextIndex.value = next\n }\n }\n\n // Generate hash from pool config for change detection\n const hashPoolConfig = (poolConfig: LoraPoolConfig | null): string => {\n if (!poolConfig || !poolConfig.filters) {\n return ''\n }\n try {\n return btoa(JSON.stringify(poolConfig.filters))\n } catch {\n return ''\n }\n }\n\n // Fetch cycler list from API\n const fetchCyclerList = async (\n poolConfig: LoraPoolConfig | null\n ): Promise => {\n try {\n isLoading.value = true\n\n const requestBody: Record = {\n sort_by: sortBy.value,\n }\n\n if (poolConfig?.filters) {\n requestBody.pool_config = poolConfig.filters\n }\n\n const response = await fetch(lmApiUrl('/api/lm/loras/cycler-list'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorData = await response.json()\n throw new Error(errorData.error || 'Failed to fetch cycler list')\n }\n\n const data = await response.json()\n\n if (!data.success) {\n throw new Error(data.error || 'Failed to get cycler list')\n }\n\n return data.loras || []\n } catch (error) {\n console.error('[LoraCyclerState] Error fetching cycler list:', error)\n throw error\n } finally {\n isLoading.value = false\n }\n }\n\n // Refresh list and update state\n const refreshList = async (poolConfig: LoraPoolConfig | null) => {\n try {\n const newHash = hashPoolConfig(poolConfig)\n const hashChanged = newHash !== poolConfigHash.value\n\n // Fetch the list\n const loraList = await fetchCyclerList(poolConfig)\n\n // Update total count\n totalCount.value = loraList.length\n\n // If pool config changed, reset index to 1\n if (hashChanged) {\n currentIndex.value = 1\n poolConfigHash.value = newHash\n }\n\n // Clamp index to valid range\n if (currentIndex.value > totalCount.value) {\n currentIndex.value = Math.max(1, totalCount.value)\n }\n\n // Update current LoRA info\n if (loraList.length > 0 && currentIndex.value > 0) {\n const currentLora = loraList[currentIndex.value - 1]\n if (currentLora) {\n currentLoraName.value = sortBy.value === 'filename' \n ? currentLora.file_name \n : (currentLora.model_name || currentLora.file_name)\n currentLoraFilename.value = currentLora.file_name\n }\n } else {\n currentLoraName.value = ''\n currentLoraFilename.value = ''\n }\n\n return loraList\n } catch (error) {\n console.error('[LoraCyclerState] Error refreshing list:', error)\n throw error\n }\n }\n\n // Set index manually\n const setIndex = (index: number) => {\n // Total count includes no lora option if enabled\n const effectiveTotalCount = includeNoLora.value ? totalCount.value + 1 : totalCount.value\n if (index >= 1 && index <= effectiveTotalCount) {\n currentIndex.value = index\n }\n }\n\n // Reset index to 1 and clear repeat state\n const resetIndex = () => {\n currentIndex.value = 1\n repeatUsed.value = 0\n displayRepeatUsed.value = 0\n // Note: isPaused is intentionally not reset - user may want to stay paused after reset\n }\n\n // Toggle pause state\n const togglePause = () => {\n isPaused.value = !isPaused.value\n }\n\n // Computed property to check if clip strength is disabled\n const isClipStrengthDisabled = computed(() => !useCustomClipRange.value)\n\n // Watch model strength changes to sync with clip strength when not using custom range\n watch(modelStrength, (newValue) => {\n if (!useCustomClipRange.value) {\n clipStrength.value = newValue\n }\n })\n\n // Watch all state changes and update widget value\n watch([\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n repeatCount,\n repeatUsed,\n isPaused,\n includeNoLora,\n ], () => {\n widget.value = buildConfig()\n }, { deep: true })\n\n return {\n // State refs\n currentIndex,\n totalCount,\n poolConfigHash,\n modelStrength,\n clipStrength,\n useCustomClipRange,\n usePresetStrength,\n presetStrengthScale,\n sortBy,\n currentLoraName,\n currentLoraFilename,\n isLoading,\n executionIndex,\n nextIndex,\n repeatCount,\n repeatUsed,\n displayRepeatUsed,\n isPaused,\n includeNoLora,\n isWorkflowExecuting,\n executingRepeatStep,\n\n // Computed\n isClipStrengthDisabled,\n\n // Methods\n buildConfig,\n restoreFromConfig,\n hashPoolConfig,\n fetchCyclerList,\n refreshList,\n setIndex,\n generateNextIndex,\n initializeNextIndex,\n resetIndex,\n togglePause,\n }\n}\n","\n\n\n\n\n","\n\n\n\n\n","import { ref, onMounted, onUnmounted, type Ref } from 'vue'\n\n// Dynamic import type for AutoComplete class\ntype AutoCompleteClass = new (\n inputElement: HTMLTextAreaElement,\n modelType: 'loras' | 'prompt',\n options?: AutocompleteOptions\n) => AutoCompleteInstance\n\ninterface AutocompleteOptions {\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n showPreview?: boolean\n}\n\ninterface AutoCompleteInstance {\n destroy: () => void\n isValid: () => boolean\n refreshCaretHelper: () => void\n}\n\nexport interface UseAutocompleteOptions {\n showPreview?: boolean\n maxItems?: number\n minChars?: number\n debounceDelay?: number\n}\n\nexport function useAutocomplete(\n textareaRef: Ref,\n modelType: 'loras' | 'prompt' = 'loras',\n options: UseAutocompleteOptions = {}\n) {\n const autocompleteInstance = ref(null)\n const isInitialized = ref(false)\n\n const defaultOptions: AutocompleteOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n showPreview: true,\n ...options\n }\n\n const initAutocomplete = async () => {\n if (!textareaRef.value) {\n console.warn('[useAutocomplete] Textarea ref is null, cannot initialize')\n return\n }\n\n if (autocompleteInstance.value) {\n console.log('[useAutocomplete] Already initialized, skipping')\n return\n }\n\n try {\n // Dynamically import the AutoComplete class\n const module = await import(/* @vite-ignore */ `${'../autocomplete.js'}`)\n const AutoComplete: AutoCompleteClass = module.AutoComplete\n\n autocompleteInstance.value = new AutoComplete(\n textareaRef.value,\n modelType,\n defaultOptions\n )\n isInitialized.value = true\n console.log(`[useAutocomplete] Initialized for ${modelType}`)\n } catch (error) {\n console.error('[useAutocomplete] Failed to initialize:', error)\n }\n }\n\n const destroyAutocomplete = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.destroy()\n autocompleteInstance.value = null\n isInitialized.value = false\n console.log('[useAutocomplete] Destroyed')\n }\n }\n\n const refreshCaretHelper = () => {\n if (autocompleteInstance.value) {\n autocompleteInstance.value.refreshCaretHelper()\n }\n }\n\n onMounted(() => {\n // Initialize autocomplete after component is mounted\n // Use nextTick-like delay to ensure DOM is fully ready\n setTimeout(() => {\n initAutocomplete()\n }, 0)\n })\n\n onUnmounted(() => {\n destroyAutocomplete()\n })\n\n return {\n autocompleteInstance,\n isInitialized,\n initAutocomplete,\n destroyAutocomplete,\n refreshCaretHelper\n }\n}\n\nexport type UseAutocompleteReturn = ReturnType\n","\n\n\n\n\n\n\n\n","\n\n\n\n","import type { App as VueApp } from 'vue'\n\nexport function createVueWidgetCleanup(vueApp: VueApp, onCleanup?: () => void) {\n let didUnmount = false\n\n return () => {\n if (didUnmount) {\n return\n }\n\n vueApp.unmount()\n didUnmount = true\n onCleanup?.()\n }\n}\n","import { api } from \"../../scripts/api.js\";\nimport { app } from \"../../scripts/app.js\";\nimport { TextAreaCaretHelper } from \"./textarea_caret_helper.js\";\nimport {\n WILDCARD_COMMANDS,\n createWildcardEmptyStateItem,\n createWildcardNoMatchesItem,\n getWildcardInsertText,\n getWildcardSearchEndpoint,\n isWildcardCommand,\n isWildcardInfoItem,\n} from \"./autocomplete_wildcards.js\";\nimport {\n getAutocompleteAppendCommaPreference,\n getAutocompleteAutoFormatPreference,\n getAutocompleteAcceptKeyPreference,\n getLoraActiveFiltersAutocompletePreference,\n getPromptTagAutocompletePreference,\n getTagSpaceReplacementPreference,\n setLoraManagerSettingValue,\n} from \"./settings.js\";\nimport { showToast } from \"./utils.js\";\n\n// localStorage key for the one-time \"how to disable\" hint in the dropdown\nconst FIRST_RUN_HINT_DISMISSED_KEY = 'lm:autocomplete-disable-tip-dismissed';\n// localStorage key for the one-time \"try active filters search\" hint (loras nodes)\nconst ACTIVE_FILTERS_HINT_DISMISSED_KEY = 'lm:activefilters-tip-dismissed';\n\n// Command definitions for category filtering\nconst TAG_COMMANDS = {\n '/character': { categories: [4, 11], label: 'Character' },\n '/artist': { categories: [1, 8], label: 'Artist' },\n '/general': { categories: [0, 7], label: 'General' },\n '/copyright': { categories: [3, 10], label: 'Copyright' },\n '/meta': { categories: [5, 14], label: 'Meta' },\n '/species': { categories: [12], label: 'Species' },\n '/lore': { categories: [15], label: 'Lore' },\n '/emb': { type: 'embedding', label: 'Embeddings' },\n '/embedding': { type: 'embedding', label: 'Embeddings' },\n ...WILDCARD_COMMANDS,\n // Autocomplete toggle commands - only show one based on current state\n '/autocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: true,\n label: 'Turn autocomplete ON',\n condition: () => !getPromptTagAutocompletePreference()\n },\n '/noautocomplete': {\n type: 'toggle_setting',\n settingId: 'loramanager.prompt_tag_autocomplete',\n value: false,\n label: 'Turn autocomplete OFF',\n condition: () => getPromptTagAutocompletePreference()\n },\n};\n\n// Command definitions for LoRA active-filters search\nconst LORAS_COMMANDS = {\n '/activefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: true,\n label: 'Turn active filters search ON',\n feedbackSummary: 'Active Filters Search: ON',\n feedbackDetail: 'LoRA autocomplete now searches within the active filters of the LoRA Manager page.',\n condition: () => !getLoraActiveFiltersAutocompletePreference()\n },\n '/noactivefilters': {\n type: 'toggle_setting',\n settingId: 'loramanager.lora_active_filters_autocomplete',\n value: false,\n label: 'Turn active filters search OFF',\n feedbackSummary: 'Active Filters Search: OFF',\n feedbackDetail: 'LoRA autocomplete searches the full library again.',\n condition: () => getLoraActiveFiltersAutocompletePreference()\n },\n};\n\n// Category display information\nconst CATEGORY_INFO = { 0: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 1: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 3: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 4: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 5: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 7: { bg: 'rgba(0, 155, 230, 0.2)', text: '#4bb4ff', label: 'General' },\n 8: { bg: 'rgba(255, 138, 139, 0.2)', text: '#ffc3c3', label: 'Artist' },\n 10: { bg: 'rgba(199, 151, 255, 0.2)', text: '#ddc9fb', label: 'Copyright' },\n 11: { bg: 'rgba(53, 198, 74, 0.2)', text: '#93e49a', label: 'Character' },\n 12: { bg: 'rgba(237, 137, 54, 0.2)', text: '#f6ad55', label: 'Species' },\n 14: { bg: 'rgba(234, 208, 132, 0.2)', text: '#f7e7c3', label: 'Meta' },\n 15: { bg: 'rgba(72, 187, 120, 0.2)', text: '#68d391', label: 'Lore' },\n};\n\n// Format post count with K/M suffix\nfunction formatPostCount(count) {\n if (count >= 1000000) {\n return (count / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M';\n } else if (count >= 1000) {\n return (count / 1000).toFixed(1).replace(/\\.0$/, '') + 'K';\n }\n return count.toString();\n}\n\nfunction parseUsageTipNumber(value) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nfunction splitRelativePath(relativePath = '') {\n const parts = relativePath.split(/[/\\\\]+/).filter(Boolean);\n const fileName = parts.pop() ?? '';\n return {\n directories: parts,\n fileName,\n };\n}\n\nfunction removeGeneralExtension(fileName = '') {\n return fileName.replace(/\\.[^.]+$/, '');\n}\n\nfunction removeLoraExtension(fileName = '') {\n return fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n}\n\nlet _loraSyntaxFormatCache = null;\nlet _loraSyntaxFormatRefreshPromise = null;\n\nfunction _getLoraSyntaxFormat() {\n if (_loraSyntaxFormatCache !== null) {\n return _loraSyntaxFormatCache;\n }\n return 'legacy';\n}\n\nasync function _fetchLoraSyntaxFormat() {\n try {\n const response = await api.fetchApi('/lm/settings');\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.settings) {\n _loraSyntaxFormatCache = data.settings.lora_syntax_format || 'legacy';\n return;\n }\n }\n } catch (e) {\n }\n if (_loraSyntaxFormatCache === null) {\n _loraSyntaxFormatCache = 'legacy';\n }\n}\n\nfunction _triggerBackgroundRefresh() {\n if (_loraSyntaxFormatRefreshPromise) {\n return;\n }\n _loraSyntaxFormatRefreshPromise = _fetchLoraSyntaxFormat().finally(() => {\n _loraSyntaxFormatRefreshPromise = null;\n });\n}\n\nasync function refreshLoraSyntaxFormat() {\n await _fetchLoraSyntaxFormat();\n}\n\nfunction _initLoraSyntaxFormat() {\n _triggerBackgroundRefresh();\n}\n_initLoraSyntaxFormat();\n\nfunction _initLoraSyntaxFormatReactive() {\n window.addEventListener('storage', (e) => {\n if (e.key === 'lm:lora-syntax-format-changed') {\n _triggerBackgroundRefresh();\n }\n });\n\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n _triggerBackgroundRefresh();\n }\n });\n}\n_initLoraSyntaxFormatReactive();\n\nfunction parseSearchTokens(term = '') {\n const include = [];\n const exclude = [];\n\n term.split(/\\s+/).forEach((rawTerm) => {\n const token = rawTerm.trim();\n if (!token) {\n return;\n }\n if (token.startsWith('-') && token.length > 1) {\n exclude.push(token.slice(1).toLowerCase());\n } else {\n include.push(token.toLowerCase());\n }\n });\n\n return { include, exclude };\n}\n\nfunction escapePromptParentheses(text) {\n // In ComfyUI's CLIP text encoder, bare parentheses are weight adjustment syntax.\n // Tags containing literal parentheses must be escaped with backslash to prevent\n // them from being interpreted as weight modifiers. e.g. \"foo (bar)\" → \"foo \\(bar\\)\"\n return text.replace(/\\(/g, '\\\\(').replace(/\\)/g, '\\\\)');\n}\n\nfunction formatAutocompleteInsertion(text = '') {\n const trimmed = typeof text === 'string' ? text.trim() : '';\n if (!trimmed) {\n return '';\n }\n\n return getAutocompleteAppendCommaPreference() ? `${trimmed},` : `${trimmed} `;\n}\n\n// Matches a complete tag. Kept\n// permissive on the strength fields (mirrors the backend parser) so tags\n// are still protected while the user is mid-edit.\nconst LORA_TAG_PATTERN = /(]+:[^:>]+(?::[^:>]+)?>)/gi;\n\nfunction normalizeAutocompleteSegment(segment = '') {\n // Collapse whitespace only outside tags: names inside the tags\n // may legitimately contain repeated spaces (e.g. \"test - 0021\"), and\n // collapsing them breaks file resolution at runtime.\n return segment\n .split(LORA_TAG_PATTERN)\n .map((part, index) => (index % 2 === 1 ? part : part.replace(/\\s+/g, ' ')))\n .join('')\n .trim();\n}\n\nexport function formatAutocompleteTextOnBlur(text = '') {\n if (typeof text !== 'string') {\n return '';\n }\n\n return text\n .split('\\n')\n .map((line) => {\n if (!line.trim()) {\n return '';\n }\n\n const cleanedSegments = line\n .split(',')\n .map(normalizeAutocompleteSegment)\n .filter(Boolean);\n\n return cleanedSegments.join(', ');\n })\n .join('\\n');\n}\n\nfunction shouldAcceptAutocompleteKey(key) {\n const mode = getAutocompleteAcceptKeyPreference();\n\n if (mode === 'tab_only') {\n return key === 'Tab';\n }\n\n if (mode === 'enter_only') {\n return key === 'Enter';\n }\n\n return key === 'Tab' || key === 'Enter';\n}\n\nfunction normalizeAutocompleteMatchText(text = '') {\n return text.toLowerCase().replace(/[-_\\s']/g, '');\n}\n\nconst AUTOCOMPLETE_METADATA_VERSION = 1;\n\nfunction createAutocompleteMetadataBase(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName,\n };\n}\n\nconst AUTOCOMPLETE_METADATA_WIDGET_PREFIX = '__lm_autocomplete_meta_';\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'; // Must match vue-widgets/src/main.ts\n\n/**\n * Return a copy of an autocomplete metadata value without the lastAccepted\n * boundary. lastAccepted carries insertedText/textSnapshot (old prompt text)\n * and is session-only state; it must not leak into exported workflow JSON.\n * Values without lastAccepted are returned as-is.\n *\n * @param {*} value - Widget metadata value (or any other widget value)\n * @returns {*} The stripped copy, or the original value when untouched\n */\nexport function stripAutocompleteLastAccepted(value) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n if (!('lastAccepted' in value)) {\n return value;\n }\n const stripped = { ...value };\n delete stripped.lastAccepted;\n return stripped;\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets on a serialized\n * node's widgets_values / widgets_values_named. Array entries are aligned\n * via properties.__lm_widget_ids (written by the extension's onSerialize).\n * Operates on graph.serialize() output, which is already a deep copy.\n *\n * @param {Array} nodes - Serialized node array\n */\nfunction stripAutocompleteMetadataFromNodes(nodes) {\n if (!Array.isArray(nodes)) {\n return;\n }\n\n for (const node of nodes) {\n if (!node || typeof node !== 'object') {\n continue;\n }\n\n const widgetIds = node.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY];\n if (Array.isArray(node.widgets_values) && Array.isArray(widgetIds)) {\n for (let i = 0; i < node.widgets_values.length && i < widgetIds.length; i++) {\n if (typeof widgetIds[i] === 'string'\n && widgetIds[i].startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n node.widgets_values[i] = stripAutocompleteLastAccepted(node.widgets_values[i]);\n }\n }\n }\n\n const named = node.widgets_values_named;\n if (named && typeof named === 'object') {\n for (const [key, value] of Object.entries(named)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n named[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n}\n\n/**\n * Strip lastAccepted from autocomplete metadata widgets in a graphToPrompt()\n * result (both the workflow document and the API prompt). Used by the widget\n * bundle to keep exported workflows free of old prompt text while leaving\n * live node state untouched.\n *\n * @param {*} result - graphToPrompt() result: { workflow, output }\n * @returns {*} The same result object, with metadata entries replaced in place\n */\nexport function stripAutocompleteMetadataFromPromptResult(result) {\n if (!result || typeof result !== 'object') {\n return result;\n }\n\n const workflow = result.workflow;\n if (workflow && typeof workflow === 'object') {\n stripAutocompleteMetadataFromNodes(workflow.nodes);\n const subgraphs = workflow.definitions?.subgraphs;\n if (Array.isArray(subgraphs)) {\n for (const subgraph of subgraphs) {\n stripAutocompleteMetadataFromNodes(subgraph?.nodes);\n }\n }\n }\n\n const output = result.output;\n if (output && typeof output === 'object') {\n for (const nodeOutput of Object.values(output)) {\n const inputs = nodeOutput?.inputs;\n if (!inputs || typeof inputs !== 'object') {\n continue;\n }\n for (const [key, value] of Object.entries(inputs)) {\n if (key.startsWith(AUTOCOMPLETE_METADATA_WIDGET_PREFIX)) {\n inputs[key] = stripAutocompleteLastAccepted(value);\n }\n }\n }\n }\n\n return result;\n}\n\nfunction createDefaultBehavior(modelType) {\n return {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n const trimmed = relativePath?.trim() ?? '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(escapePromptParentheses(trimmed));\n },\n };\n}\n\nconst MODEL_BEHAVIORS = {\n loras: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const baseName = removeLoraExtension(fileName);\n const folder = directories.length ? directories.join('/') + '/' : '';\n const loraName = folder + baseName;\n\n const resultName = _getLoraSyntaxFormat() === 'legacy'\n ? baseName\n : loraName;\n\n let strength = 1.0;\n let hasStrength = false;\n let clipStrength = null;\n\n try {\n const response = await api.fetchApi(`/lm/loras/usage-tips-by-path?relative_path=${encodeURIComponent(relativePath)}`);\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.usage_tips) {\n try {\n const usageTips = JSON.parse(data.usage_tips);\n const parsedStrength = parseUsageTipNumber(usageTips.strength);\n if (parsedStrength !== null) {\n strength = parsedStrength;\n hasStrength = true;\n }\n const clipSource = usageTips.clip_strength ?? usageTips.clipStrength;\n const parsedClipStrength = parseUsageTipNumber(clipSource);\n if (parsedClipStrength !== null) {\n clipStrength = parsedClipStrength;\n if (!hasStrength) {\n strength = 1.0;\n }\n }\n } catch (parseError) {\n console.warn('Failed to parse usage tips JSON:', parseError);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to fetch usage tips:', error);\n }\n\n if (clipStrength !== null) {\n return formatAutocompleteInsertion(``);\n }\n return formatAutocompleteInsertion(``);\n }\n },\n embeddings: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: instance.modelType });\n },\n async getInsertText(_instance, relativePath) {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n },\n },\n custom_words: {\n enablePreview: false,\n async getInsertText(_instance, relativePath) {\n return formatAutocompleteInsertion(escapePromptParentheses(relativePath));\n },\n },\n prompt: {\n enablePreview: true,\n init(instance) {\n if (!instance.options.showPreview) {\n return;\n }\n instance.initPreviewTooltip({ modelType: 'embeddings' });\n },\n showPreview(instance, relativePath, itemElement) {\n if (!instance.previewTooltip || instance.searchType !== 'embeddings') {\n return;\n }\n instance.showPreviewForItem(relativePath, itemElement);\n },\n hidePreview(instance) {\n if (!instance.previewTooltip) {\n return;\n }\n instance.previewTooltip.hide();\n },\n destroy(instance) {\n if (instance.previewTooltip) {\n instance.previewTooltip.cleanup();\n instance.previewTooltip = null;\n }\n },\n async getInsertText(instance, relativePath) {\n const rawSearchTerm = instance.getSearchTerm(instance.inputElement.value);\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n\n if (match || instance.searchType === 'embeddings') {\n const { directories, fileName } = splitRelativePath(relativePath);\n const trimmedName = removeGeneralExtension(fileName);\n const folder = directories.length ? `${directories.join('/')}/` : '';\n return formatAutocompleteInsertion(`embedding:${folder}${trimmedName}`);\n } else if (instance.searchType === 'wildcards' || isWildcardCommand(instance.activeCommand)) {\n return formatAutocompleteInsertion(getWildcardInsertText(relativePath));\n } else {\n let tagText = relativePath;\n\n if (getTagSpaceReplacementPreference()) {\n tagText = tagText.replace(/_/g, ' ');\n }\n\n tagText = escapePromptParentheses(tagText);\n\n return formatAutocompleteInsertion(tagText);\n }\n },\n },\n};\n\nfunction getModelBehavior(modelType) {\n return MODEL_BEHAVIORS[modelType] ?? createDefaultBehavior(modelType);\n}\n\nclass AutoComplete {\n constructor(inputElement, modelType = 'loras', options = {}) {\n this.inputElement = inputElement;\n this.modelType = modelType;\n this.behavior = getModelBehavior(modelType);\n this.options = {\n maxItems: 100,\n pageSize: 20,\n visibleItems: 15, // Fixed at 15 items for balanced UX\n itemHeight: 40,\n minChars: 1,\n debounceDelay: 200,\n showPreview: this.behavior.enablePreview ?? false,\n enableVirtualScroll: true,\n ...options\n };\n\n this.dropdown = null;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.items = [];\n this.debounceTimer = null;\n this.isVisible = false;\n this.currentSearchTerm = '';\n this.wildcardMeta = null;\n this.previewTooltip = null;\n this.previewTooltipPromise = null;\n this.searchType = null;\n this.suppressAutocompleteOnce = false;\n\n // Discoverability hints state\n this.commandListFooter = null; // State hint shown below the slash command list\n this.firstRunHint = null; // One-time \"how to disable\" bar inside the dropdown\n\n // Virtual scrolling state\n this.virtualScrollOffset = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.currentPage = 0;\n this.scrollContainer = null;\n this.contentContainer = null;\n this.totalHeight = 0;\n\n // Command mode state\n this.activeCommand = null; // Current active command (e.g., { categories: [4, 11], label: 'Character' })\n this.showingCommands = false; // Whether showing command list dropdown\n\n // Initialize TextAreaCaretHelper\n this.helper = new TextAreaCaretHelper(inputElement, () => app.canvas.ds.scale);\n\n this.onInput = null;\n this.onKeyDown = null;\n this.onBlur = null;\n this.onDocumentClick = null;\n this.onScroll = null;\n\n this.init();\n }\n \n init() {\n this.createDropdown();\n this.bindEvents();\n }\n \n createDropdown() {\n this.dropdown = document.createElement('div');\n this.dropdown.className = 'comfy-autocomplete-dropdown';\n\n // Apply new color scheme\n this.dropdown.style.cssText = `\n position: absolute;\n z-index: 10000;\n overflow: hidden;\n background-color: rgba(40, 44, 52, 0.95);\n border: 1px solid rgba(226, 232, 240, 0.2);\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n display: none;\n min-width: 200px;\n width: auto;\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n `;\n\n if (this.options.enableVirtualScroll) {\n // Create scroll container for virtual scrolling\n this.scrollContainer = document.createElement('div');\n this.scrollContainer.className = 'comfy-autocomplete-scroll-container';\n this.scrollContainer.style.cssText = `\n overflow-y: auto;\n max-height: ${this.options.visibleItems * this.options.itemHeight}px;\n position: relative;\n `;\n\n // Create content container for virtual items\n this.contentContainer = document.createElement('div');\n this.contentContainer.className = 'comfy-autocomplete-content';\n this.contentContainer.style.cssText = `\n position: relative;\n width: 100%;\n `;\n\n this.scrollContainer.appendChild(this.contentContainer);\n this.dropdown.appendChild(this.scrollContainer);\n }\n\n // Custom scrollbar styles with new color scheme\n const style = document.createElement('style');\n style.textContent = `\n .comfy-autocomplete-dropdown::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-dropdown::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar {\n width: 8px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-track {\n background: rgba(40, 44, 52, 0.3);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb {\n background: rgba(226, 232, 240, 0.2);\n border-radius: 4px;\n }\n .comfy-autocomplete-scroll-container::-webkit-scrollbar-thumb:hover {\n background: rgba(226, 232, 240, 0.4);\n }\n .comfy-autocomplete-loading {\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n }\n `;\n document.head.appendChild(style);\n\n // Append to body to avoid overflow issues\n document.body.appendChild(this.dropdown);\n\n if (typeof this.behavior.init === 'function') {\n this.behavior.init(this);\n }\n }\n \n initPreviewTooltip(options = {}) {\n if (this.previewTooltip || this.previewTooltipPromise) {\n return;\n }\n // Dynamically import and create preview tooltip\n this.previewTooltipPromise = import('./preview_tooltip.js').then(module => {\n const config = { modelType: this.modelType, ...options };\n this.previewTooltip = new module.PreviewTooltip(config);\n }).catch(err => {\n console.warn('Failed to load preview tooltip:', err);\n }).finally(() => {\n this.previewTooltipPromise = null;\n });\n }\n \n bindEvents() {\n // Handle input changes\n this.onInput = (e) => {\n if (this.suppressAutocompleteOnce) {\n this.suppressAutocompleteOnce = false;\n this.hide();\n return;\n }\n this.handleInput(e.target.value);\n };\n this.inputElement.addEventListener('input', this.onInput);\n\n // Handle keyboard navigation\n this.onKeyDown = (e) => {\n this.handleKeyDown(e);\n };\n this.inputElement.addEventListener('keydown', this.onKeyDown);\n\n // Handle focus out to hide dropdown\n this.onBlur = () => {\n if (getAutocompleteAutoFormatPreference()) {\n const formattedValue = formatAutocompleteTextOnBlur(this.inputElement.value);\n if (formattedValue !== this.inputElement.value) {\n this.inputElement.value = formattedValue;\n this.suppressAutocompleteOnce = true;\n this.inputElement.dispatchEvent(new Event('input', { bubbles: true }));\n }\n }\n\n // Delay hiding to allow for clicks on dropdown items\n setTimeout(() => {\n this.hide();\n }, 150);\n };\n this.inputElement.addEventListener('blur', this.onBlur);\n\n // Handle clicks outside to hide dropdown\n this.onDocumentClick = (e) => {\n if (!this.dropdown) {\n return;\n }\n\n const target = e.target;\n if (!(target instanceof Node)) {\n return;\n }\n\n if (!this.dropdown.contains(target) && target !== this.inputElement) {\n this.hide();\n }\n };\n document.addEventListener('click', this.onDocumentClick);\n\n // Mark this element as having autocomplete events bound\n this.inputElement._autocompleteEventsBound = true;\n\n // Bind scroll event for virtual scrolling\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n this.onScroll = () => {\n this.handleScroll();\n };\n this.scrollContainer.addEventListener('scroll', this.onScroll);\n }\n }\n\n /**\n * Check if the autocomplete is valid (input element is in DOM and events are bound)\n */\n isValid() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound === true;\n }\n\n /**\n * Check if events need to be rebound (element exists but events not bound)\n */\n needsRebind() {\n return this.inputElement &&\n document.body.contains(this.inputElement) &&\n this.inputElement._autocompleteEventsBound !== true;\n }\n\n /**\n * Rebind events to the input element (useful after Vue moves the element)\n */\n rebindEvents() {\n // Remove old listeners if they exist\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n }\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n }\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n }\n\n // Rebind all events\n this.bindEvents();\n\n console.log('[Lora Manager] Autocomplete events rebound');\n }\n\n /**\n * Refresh the TextAreaCaretHelper (useful after element properties change)\n */\n refreshHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n \n handleInput(value = '') {\n // Clear previous debounce timer\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n // Get the search term (text after last comma / '>')\n const rawSearchTerm = this.getSearchTerm(value);\n let searchTerm = rawSearchTerm;\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n\n // For embeddings, only trigger autocomplete when the current token\n // starts with the explicit \"emb:\" prefix. This avoids interrupting\n // normal prompt typing while still allowing quick manual triggering.\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (!match) {\n this.hide();\n return;\n }\n searchTerm = (match[1] || '').trim();\n }\n\n // For loras model type, check if we're in command mode (/activefilters, /noactivefilters)\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/activefilters, /noactivefilters)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = commandResult.searchTerm || rawSearchTerm;\n } else {\n // No command - regular lora search\n this.showingCommands = false;\n this.activeCommand = null;\n this.searchType = null;\n searchTerm = rawSearchTerm;\n }\n }\n\n // For prompt model type, check if we're searching embeddings, commands, or tags\n if (this.modelType === 'prompt') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n if (match) {\n // User typed \"emb:\" prefix - always allow embeddings search\n endpoint = '/lm/embeddings/relative-paths';\n searchTerm = (match[1] || '').trim();\n this.searchType = 'embeddings';\n this.activeCommand = null;\n this.showingCommands = false;\n } else {\n // Check for command mode FIRST (always runs, regardless of setting)\n const commandResult = this._parseCommandInput(rawSearchTerm);\n\n if (commandResult.showCommands) {\n // Show command list dropdown\n this.showingCommands = true;\n this.activeCommand = null;\n this.searchType = 'commands';\n this._showCommandList(commandResult.commandFilter);\n return;\n } else if (commandResult.command?.type === 'toggle_setting') {\n // Handle toggle setting command (/autocomplete, /noautocomplete)\n this._handleToggleSettingCommand(commandResult.command);\n return;\n } else if (commandResult.command) {\n // Command is active, use filtered search\n this.showingCommands = false;\n this.activeCommand = commandResult.command;\n searchTerm = commandResult.searchTerm;\n\n if (commandResult.command.type === 'embedding') {\n // /emb or /embedding command\n endpoint = '/lm/embeddings/relative-paths';\n this.searchType = 'embeddings';\n } else if (isWildcardCommand(commandResult.command)) {\n endpoint = getWildcardSearchEndpoint();\n this.searchType = 'wildcards';\n } else {\n // Category filter command\n const categories = commandResult.command.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n this.searchType = 'custom_words';\n }\n } else if (getPromptTagAutocompletePreference()) {\n // No command and setting enabled - regular tag search with enriched results\n this.showingCommands = false;\n this.activeCommand = null;\n endpoint = '/lm/custom-words/search?enriched=true';\n // Use full search term for query variation generation\n // The search() method will generate multiple query variations including:\n // - Original query (for natural language matching)\n // - Underscore version (e.g., \"looking_to_the_side\" for \"looking to the side\")\n // - Last token (for backward compatibility with continuous typing)\n searchTerm = rawSearchTerm;\n this.searchType = 'custom_words';\n } else {\n // No command and setting disabled - no autocomplete for direct typing.\n // Re-enable discovery is covered by the command-list footer,\n // the node context menu and the settings tooltip.\n this.hide();\n return;\n }\n }\n }\n\n const allowEmptyWildcardSearch =\n this.modelType === 'prompt' &&\n this.searchType === 'wildcards' &&\n searchTerm.length === 0;\n\n if (!allowEmptyWildcardSearch && searchTerm.length < this.options.minChars) {\n this.hide();\n return;\n }\n\n // Debounce the search\n this.debounceTimer = setTimeout(() => {\n this.search(searchTerm, endpoint);\n }, this.options.debounceDelay);\n }\n \n getSearchTerm(value) {\n return this.getActiveSearchRange(value).text;\n }\n\n getActiveSearchRange(value = null) {\n const currentValue = typeof value === 'string' ? value : this.inputElement.value;\n const caretPos = this.getCaretPosition();\n const beforeCursor = this.helper.getBeforeCursor() ?? currentValue.substring(0, caretPos);\n let start = this._getHardBoundaryStart(beforeCursor);\n\n if (!getAutocompleteAppendCommaPreference()) {\n const persistedBoundaryEnd = this._getPersistedBoundaryEnd(currentValue, caretPos);\n if (persistedBoundaryEnd !== null && persistedBoundaryEnd > start) {\n start = persistedBoundaryEnd;\n }\n }\n\n const rawText = beforeCursor.substring(start);\n const leadingWhitespaceLength = rawText.length - rawText.trimStart().length;\n const trimmedStart = start + leadingWhitespaceLength;\n const text = rawText.trim();\n\n if (this.modelType === 'prompt') {\n const tokenRange = this._getPromptTokenRange(rawText, trimmedStart, caretPos);\n if (tokenRange) {\n return {\n start: tokenRange.start,\n trimmedStart: tokenRange.trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText: tokenRange.rawText,\n text: tokenRange.text,\n tokenType: tokenRange.tokenType,\n };\n }\n }\n\n return {\n start,\n trimmedStart,\n end: caretPos,\n beforeCursor,\n rawText,\n text,\n };\n }\n\n _getPromptTokenRange(rawText = '', trimmedStart = 0, caretPos = 0) {\n const trimmedText = rawText.trim();\n if (!trimmedText) {\n return {\n start: trimmedStart,\n trimmedStart,\n rawText: '',\n text: '',\n tokenType: 'empty',\n };\n }\n\n const commandOffset = trimmedText.startsWith('/')\n ? 0\n : trimmedText.lastIndexOf(' /');\n if (commandOffset !== -1) {\n const normalizedCommandOffset = commandOffset === 0 ? 0 : commandOffset + 1;\n const commandText = trimmedText.slice(normalizedCommandOffset);\n const commandStart = trimmedStart + normalizedCommandOffset;\n return {\n start: commandStart,\n trimmedStart: commandStart,\n rawText: commandText,\n text: commandText,\n tokenType: commandText === '/' ? 'empty_command_trigger' : 'command',\n };\n }\n\n const wildcardMatch = trimmedText.match(/(?:^|\\s)(__[\\w\\s.\\-+/*\\\\]+?__)$/);\n if (wildcardMatch) {\n const wildcardText = wildcardMatch[1];\n const wildcardOffset = trimmedText.lastIndexOf(wildcardText);\n const wildcardStart = trimmedStart + wildcardOffset;\n return {\n start: wildcardStart,\n trimmedStart: wildcardStart,\n rawText: wildcardText,\n text: '',\n tokenType: 'wildcard_literal',\n };\n }\n\n const embeddingOffset = trimmedText.search(/(?:^|\\s)emb:[^\\s]*$/i);\n if (embeddingOffset !== -1) {\n const normalizedEmbeddingOffset = trimmedText.slice(embeddingOffset).startsWith(' ')\n ? embeddingOffset + 1\n : embeddingOffset;\n const embeddingText = trimmedText.slice(normalizedEmbeddingOffset);\n const embeddingStart = trimmedStart + normalizedEmbeddingOffset;\n return {\n start: embeddingStart,\n trimmedStart: embeddingStart,\n rawText: embeddingText,\n text: embeddingText,\n tokenType: 'embedding_literal',\n };\n }\n\n return {\n start: trimmedStart,\n trimmedStart,\n rawText,\n text: trimmedText,\n tokenType: 'tag_text',\n };\n }\n\n _getHardBoundaryStart(beforeCursor = '') {\n const lastComma = beforeCursor.lastIndexOf(',');\n const lastAngle = beforeCursor.lastIndexOf('>');\n const lastNewline = Math.max(beforeCursor.lastIndexOf('\\n'), beforeCursor.lastIndexOf('\\r'));\n return Math.max(lastComma, lastAngle, lastNewline) + 1;\n }\n\n _getMetadataWidget() {\n return this.inputElement?._autocompleteMetadataWidget\n ?? this.inputElement?._autocompleteHostWidget?.metadataWidget\n ?? null;\n }\n\n _getMetadataBase() {\n return createAutocompleteMetadataBase(this.inputElement?._autocompleteTextWidgetName ?? 'text');\n }\n\n _getAutocompleteMetadata() {\n const metadataWidget = this._getMetadataWidget();\n const value = metadataWidget?.value;\n\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return this._getMetadataBase();\n }\n\n return {\n ...this._getMetadataBase(),\n ...value,\n };\n }\n\n _setAutocompleteMetadata(metadata = {}) {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n metadataWidget.value = {\n ...this._getMetadataBase(),\n ...metadata,\n };\n }\n\n _clearLastAcceptedBoundary() {\n const metadataWidget = this._getMetadataWidget();\n if (!metadataWidget) {\n return;\n }\n\n const metadata = this._getAutocompleteMetadata();\n delete metadata.lastAccepted;\n metadataWidget.value = metadata;\n }\n\n _storeLastAcceptedBoundary(boundary) {\n this._setAutocompleteMetadata({ lastAccepted: boundary });\n }\n\n _getPersistedBoundaryEnd(currentValue, caretPos) {\n const metadata = this._getAutocompleteMetadata();\n const boundary = metadata?.lastAccepted;\n\n if (!boundary || typeof boundary !== 'object') {\n return null;\n }\n\n const { start, end, insertedText, textSnapshot } = boundary;\n\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end < start) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (end > currentValue.length || end > caretPos) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof insertedText !== 'string' || insertedText.length === 0) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (currentValue.slice(start, end) !== insertedText) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n if (typeof textSnapshot !== 'string' || currentValue.slice(0, end) !== textSnapshot) {\n this._clearLastAcceptedBoundary();\n return null;\n }\n\n return end;\n }\n\n /**\n * Extract the last space-separated token from a search term\n * Tag names don't contain spaces, so for tag autocomplete we only need the last token\n * @param {string} term - The full search term (e.g., \"hello 1gi\")\n * @returns {string} - The last token (e.g., \"1gi\"), or the original term if no spaces\n */\n _getLastSpaceToken(term) {\n const tokens = term.trim().split(/\\s+/);\n return tokens[tokens.length - 1] || term;\n }\n\n /**\n * Generate query variations for better autocomplete matching\n * Includes original query and normalized versions (spaces to underscores, etc.)\n * @param {string} term - Original search term\n * @returns {string[]} - Array of query variations\n */\n _generateQueryVariations(term) {\n if (!term || term.length < this.options.minChars) {\n return [];\n }\n\n const variations = new Set();\n const trimmed = term.trim();\n\n // Always include original query\n variations.add(trimmed);\n variations.add(trimmed.toLowerCase());\n\n // Add underscore version (Danbooru convention: spaces become underscores)\n // e.g., \"looking to the side\" -> \"looking_to_the_side\"\n if (trimmed.includes(' ')) {\n const underscoreVersion = trimmed.replace(/ /g, '_');\n variations.add(underscoreVersion);\n variations.add(underscoreVersion.toLowerCase());\n }\n\n // Add no-space version for flexible matching\n // e.g., \"blue hair\" -> \"bluehair\"\n if (trimmed.includes(' ') || trimmed.includes('_')) {\n const noSpaceVersion = trimmed.replace(/[ _]/g, '');\n variations.add(noSpaceVersion);\n variations.add(noSpaceVersion.toLowerCase());\n }\n\n // Add last token only (legacy behavior for continuous typing)\n const lastToken = this._getLastSpaceToken(trimmed);\n if (lastToken !== trimmed) {\n variations.add(lastToken);\n variations.add(lastToken.toLowerCase());\n }\n\n return Array.from(variations).filter(v => v.length >= this.options.minChars);\n }\n\n _normalizeQueryForRequest(term = '') {\n return term.trim().toLowerCase();\n }\n\n _getQueriesToExecute(term = '') {\n const queryVariations = this._generateQueryVariations(term);\n const uniqueQueries = [];\n const seen = new Set();\n\n for (const query of queryVariations) {\n const normalized = this._normalizeQueryForRequest(query);\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n\n seen.add(normalized);\n uniqueQueries.push(query);\n\n if (uniqueQueries.length >= 4) {\n break;\n }\n }\n\n return uniqueQueries;\n }\n\n _containsInformationalItems() {\n return this.items.some((item) => isWildcardInfoItem(item));\n }\n\n _isSelectableInfoItem(item) {\n if (isWildcardInfoItem(item)) {\n return true;\n }\n // Command items are not model paths — never show preview for them\n return item && typeof item === 'object' && 'command' in item;\n }\n\n /**\n * Get display text for an item (without extension for models)\n * @param {string|Object} item - Item to get display text from\n * @returns {string} - Display text without extension\n */\n _getDisplayText(item) {\n if (isWildcardInfoItem(item)) {\n return item.title || item.description || 'Wildcards';\n }\n\n const itemText = typeof item === 'object' && item.tag_name ? item.tag_name : String(item);\n // Remove extension for models to avoid matching/displaying .safetensors etc.\n if (this.modelType === 'loras' || this.searchType === 'embeddings') {\n return removeLoraExtension(itemText);\n } else if (this.modelType === 'embeddings') {\n return removeGeneralExtension(itemText);\n }\n return itemText;\n }\n\n /**\n * Check if an item matches a search term\n * Supports both string items and enriched items with tag_name property\n * @param {string|Object} item - Item to check\n * @param {string} searchTerm - Search term to match against\n * @returns {Object} - { matched: boolean, isExactMatch: boolean }\n */\n _matchItem(item, searchTerm) {\n const itemText = this._getDisplayText(item);\n const itemTextLower = itemText.toLowerCase();\n const searchTermLower = searchTerm.toLowerCase();\n\n // Exact match (case-insensitive)\n if (itemTextLower === searchTermLower) {\n return { matched: true, isExactMatch: true };\n }\n\n // Partial match (contains)\n if (itemTextLower.includes(searchTermLower)) {\n return { matched: true, isExactMatch: false };\n }\n\n // Symbol-insensitive match: remove common separators and retry\n // e.g., \"blue hair\" can match \"blue_hair\" or \"bluehair\"\n const normalizedItem = itemTextLower.replace(/[-_\\s']/g, '');\n const normalizedSearch = searchTermLower.replace(/[-_\\s']/g, '');\n if (normalizedItem.includes(normalizedSearch)) {\n return { matched: true, isExactMatch: false };\n }\n\n return { matched: false, isExactMatch: false };\n }\n\n _getLiveSearchTermForAcceptance() {\n const rawSearchTerm = this.getSearchTerm(this.inputElement.value);\n\n if (this.modelType === 'embeddings') {\n const match = rawSearchTerm.match(/^emb:(.*)$/i);\n return (match?.[1] || '').trim();\n }\n\n if (this.modelType === 'loras') {\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n if (this.modelType === 'prompt') {\n const embeddingMatch = rawSearchTerm.match(/^emb:(.*)$/i);\n if (embeddingMatch) {\n return (embeddingMatch[1] || '').trim();\n }\n\n const commandResult = this._parseCommandInput(rawSearchTerm);\n return commandResult.searchTerm ?? rawSearchTerm;\n }\n\n return rawSearchTerm;\n }\n\n _getPreferredSelectedIndex(searchTerm = '') {\n if (!this.items?.length) {\n return -1;\n }\n\n if (this.showingCommands) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm) {\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n return 0;\n }\n\n const searchLower = trimmedSearchTerm.toLowerCase();\n const normalizedSearch = normalizeAutocompleteMatchText(trimmedSearchTerm);\n let bestIndex = -1;\n let bestScore = -Infinity;\n\n this.items.forEach((item, index) => {\n const displayText = this._getDisplayText(item);\n const textLower = displayText.toLowerCase();\n const normalizedText = normalizeAutocompleteMatchText(displayText);\n let score = -1;\n\n if (textLower === searchLower) {\n score = 5000;\n } else if (normalizedText === normalizedSearch) {\n score = 4500;\n } else if (textLower.startsWith(searchLower)) {\n score = 4000;\n } else if (normalizedText.startsWith(normalizedSearch)) {\n score = 3500;\n } else if (textLower.includes(searchLower)) {\n score = 3000;\n } else if (normalizedText.includes(normalizedSearch)) {\n score = 2500;\n }\n\n if (score > -1) {\n score -= index;\n if (score > bestScore) {\n bestScore = score;\n bestIndex = index;\n }\n }\n });\n\n if (bestIndex !== -1) {\n return bestIndex;\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return 0;\n }\n\n _getAcceptSelectionIndex(searchTerm = '') {\n if (this.hasManualSelection && this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n return this.selectedIndex;\n }\n\n return this._getPreferredSelectedIndex(searchTerm);\n }\n\n /**\n * Return the query flag that tells the backend to inject the LoRA Manager\n * page's active filters (stored server-side) into the search, or null when\n * not applicable. The filters themselves are synced to the backend by the\n * manager page, so this works across browsers/origins where localStorage\n * is not shared.\n */\n _getActiveLoraFilters() {\n if (this.modelType !== 'loras' || !getLoraActiveFiltersAutocompletePreference()) {\n return null;\n }\n return 'use_active_filters=true';\n }\n\n async search(term = '', endpoint = null) {\n try {\n this.currentSearchTerm = term;\n\n // Save current search type to detect mode changes during async search\n const searchTypeAtStart = this.searchType;\n\n // Clear items before starting new search to avoid stale data\n // This is critical for preventing command suggestions from persisting\n // when switching from command mode to regular tag search\n this.items = [];\n this.wildcardMeta = null;\n\n if (!endpoint) {\n endpoint = `/lm/${this.modelType}/relative-paths`;\n }\n\n // Active-filter query params for loras (null when setting off or\n // model type is not loras, so appending is safe for all types)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Generate multiple query variations for better matching, but avoid\n // sending duplicate-equivalent requests that normalize to the same\n // backend search term.\n const queriesToExecute =\n this.searchType === 'wildcards' && term.length === 0\n ? ['']\n : this._getQueriesToExecute(term);\n\n if (queriesToExecute.length === 0) {\n this.items = [];\n this.hide();\n return;\n }\n\n // Execute all queries in parallel\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.maxItems}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return {\n items: data.success ? (data.relative_paths || data.words || []) : [],\n meta: data?.meta || null,\n };\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return {\n items: [],\n meta: null,\n };\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Check if search type changed during async operation\n // If so, skip updating items to prevent stale data from showing\n if (this.searchType !== searchTypeAtStart) {\n console.log('[Lora Manager] Search type changed during search, skipping update');\n return;\n }\n\n // Merge and deduplicate results while preserving order from backend\n // Backend returns results grouped by folder and sorted by relevance\n // within each group, so we maintain that order\n const seen = new Set();\n const mergedItems = [];\n\n for (const result of resultsArrays) {\n if (!this.wildcardMeta && result?.meta) {\n this.wildcardMeta = result.meta;\n }\n\n const resultArray = result?.items || [];\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n mergedItems.push(item);\n }\n }\n }\n\n if (this.searchType === 'wildcards' && mergedItems.length === 0) {\n const meta = this.wildcardMeta || {};\n this.items = meta.has_wildcards\n ? [createWildcardNoMatchesItem(term, meta)]\n : [createWildcardEmptyStateItem(meta)];\n this.hasMoreItems = false;\n this.render();\n this.show();\n return;\n }\n\n // Use backend-sorted results directly without re-scoring\n // Backend already ranks by: FTS5 bm25 score + post count + exact prefix boost\n if (mergedItems.length > 0) {\n this.items = mergedItems;\n this.render();\n this.show();\n } else {\n this.items = [];\n this.hide();\n }\n } catch (error) {\n console.error('Autocomplete search error:', error);\n this.items = [];\n this.hide();\n }\n }\n\n /**\n * Return the command map for the current model type.\n * Lora model types get the active-filters toggle commands, all others\n * keep the prompt tag commands.\n */\n _getCommands() {\n return this.modelType === 'loras' ? LORAS_COMMANDS : TAG_COMMANDS;\n }\n\n /**\n * Parse command input to detect command mode\n * @param {string} rawInput - Raw input text\n * @returns {Object} - { showCommands, commandFilter, command, searchTerm }\n */\n _parseCommandInput(rawInput) {\n const trimmed = rawInput.trim();\n\n // Check if input starts with \"/\"\n if (!trimmed.startsWith('/')) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n // Split into potential command and search term\n const spaceIndex = trimmed.indexOf(' ');\n\n if (spaceIndex === -1) {\n // Still typing command (e.g., \"/cha\")\n const partialCommand = trimmed.toLowerCase();\n\n // Check for exact command match\n if (this._getCommands()[partialCommand]) {\n const cmd = this._getCommands()[partialCommand];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: '' };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: '',\n };\n }\n\n // Show command suggestions\n return {\n showCommands: true,\n commandFilter: partialCommand.slice(1), // Remove leading \"/\"\n command: null,\n searchTerm: '',\n };\n }\n\n // Command with search term (e.g., \"/character miku\")\n const commandPart = trimmed.slice(0, spaceIndex).toLowerCase();\n const searchPart = trimmed.slice(spaceIndex + 1).trim();\n\n if (this._getCommands()[commandPart]) {\n const cmd = this._getCommands()[commandPart];\n // Filter out toggle commands that don't meet their condition\n if (cmd.type === 'toggle_setting' && cmd.condition && !cmd.condition()) {\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n return {\n showCommands: false,\n command: cmd,\n searchTerm: searchPart,\n };\n }\n\n // Unknown command, treat as regular search\n return { showCommands: false, command: null, searchTerm: trimmed };\n }\n\n /**\n * Show the command list dropdown\n * @param {string} filter - Optional filter for commands\n */\n _showCommandList(filter = '') {\n // Only show command list if we're in command mode\n // This prevents stale command suggestions from appearing after switching to tag search\n if (this.searchType !== 'commands' && this.showingCommands !== true) {\n return;\n }\n \n const filterLower = filter.toLowerCase();\n\n const commands = [];\n\n for (const [cmd, info] of Object.entries(this._getCommands())) {\n // Filter out toggle commands that don't meet their condition\n if (info.type === 'toggle_setting' && info.condition) {\n if (!info.condition()) continue;\n }\n\n if (!filter || cmd.slice(1).startsWith(filterLower)) {\n commands.push({ command: cmd, ...info });\n }\n }\n\n if (commands.length === 0) {\n this.hide();\n return;\n }\n\n this.items = commands;\n this._renderCommandList();\n this.show();\n }\n\n /**\n * Render the command list dropdown\n */\n _renderCommandList() {\n // Clear command list items properly based on rendering mode\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n this.items.forEach((item, index) => {\n const itemEl = document.createElement('div');\n itemEl.className = 'comfy-autocomplete-item comfy-autocomplete-command';\n itemEl.dataset.index = index.toString();\n\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = item.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = item.label;\n\n itemEl.appendChild(cmdSpan);\n itemEl.appendChild(labelSpan);\n\n itemEl.style.cssText = `\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 12px;\n height: ${this.options.itemHeight}px;\n box-sizing: border-box;\n `;\n\n // Prevent textarea from losing focus - same fix as createItemElement\n itemEl.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n itemEl.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n itemEl.addEventListener('click', () => {\n this._insertCommand(item.command);\n });\n\n // Append to correct container based on rendering mode\n if (this.contentContainer) {\n this.contentContainer.appendChild(itemEl);\n } else {\n this.dropdown.appendChild(itemEl);\n }\n });\n\n // Remove border from last item\n const lastChild = this.contentContainer ? this.contentContainer.lastChild : this.dropdown.lastChild;\n if (lastChild) {\n lastChild.style.borderBottom = 'none';\n }\n\n // Auto-select immediately so accept keys remain stable.\n // In virtual-scroll mode, calling selectItem() before the dropdown is\n // visible can see a zero-height container and incorrectly replace the\n // full command list with a partially virtualized slice.\n if (this.items.length > 0) {\n this.selectedIndex = 0;\n this.hasManualSelection = false;\n if (this.contentContainer) {\n this._applyItemSelection(0);\n } else {\n this.selectItem(0);\n }\n }\n\n // State hint below the command list (e.g. how to toggle autocomplete)\n this._renderCommandListFooter();\n\n // Update virtual scroll height for virtual scrolling mode\n if (this.contentContainer) {\n this.updateVirtualScrollHeight();\n }\n }\n\n /**\n * Render a state hint below the slash command list so the toggle commands\n * explain themselves. Prompt nodes advertise /autocomplete, loras nodes\n * advertise /activefilters.\n */\n _renderCommandListFooter() {\n this._removeCommandListFooter();\n\n let text = null;\n if (this.modelType === 'prompt') {\n const enabled = getPromptTagAutocompletePreference();\n text = enabled\n ? 'Tag autocomplete is ON — /noautocomplete to disable'\n : 'Tag autocomplete is OFF — /autocomplete to enable';\n } else if (this.modelType === 'loras') {\n const enabled = getLoraActiveFiltersAutocompletePreference();\n text = enabled\n ? 'Active Filters Search: ON — /noactivefilters to disable'\n : 'Active Filters Search: OFF — /activefilters to enable';\n } else {\n return;\n }\n\n const footer = document.createElement('div');\n footer.className = 'lm-autocomplete-command-footer';\n footer.textContent = text;\n footer.style.cssText = `\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n border-top: 1px solid rgba(226, 232, 240, 0.1);\n white-space: nowrap;\n `;\n // Keep focus in the textarea when the hint is clicked\n footer.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.appendChild(footer);\n this.commandListFooter = footer;\n }\n\n _removeCommandListFooter() {\n if (this.commandListFooter) {\n this.commandListFooter.remove();\n this.commandListFooter = null;\n }\n }\n\n /**\n * Show a one-time, dismissible hint inside the dropdown surfacing the\n * toggle commands: prompt nodes advertise /noautocomplete, loras nodes\n * advertise /activefilters. Dismissal is persisted in localStorage.\n */\n _maybeShowFirstRunHint() {\n if (this.firstRunHint) {\n return;\n }\n\n let hintText = null;\n let storageKey = null;\n\n if (this.modelType === 'prompt') {\n // Only hint during plain tag searches, not command/embedding modes\n if (this.showingCommands\n || this.searchType !== 'custom_words'\n || this.activeCommand) {\n return;\n }\n hintText = 'Tip: type /noautocomplete to turn off these suggestions';\n storageKey = FIRST_RUN_HINT_DISMISSED_KEY;\n } else if (this.modelType === 'loras') {\n // Only advertise active-filters search while it is disabled\n if (this.showingCommands || this.activeCommand) {\n return;\n }\n if (getLoraActiveFiltersAutocompletePreference()) {\n return;\n }\n hintText = 'Tip: type /activefilters to search within the LoRA Manager page filters';\n storageKey = ACTIVE_FILTERS_HINT_DISMISSED_KEY;\n } else {\n return;\n }\n\n let dismissed = false;\n try {\n dismissed = localStorage.getItem(storageKey) === '1';\n } catch (e) {\n // localStorage unavailable - fall through and show the hint\n }\n if (dismissed) {\n return;\n }\n\n const hint = document.createElement('div');\n hint.className = 'lm-autocomplete-first-run-hint';\n hint.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 6px 12px;\n font-size: 11px;\n color: rgba(226, 232, 240, 0.6);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n `;\n\n const text = document.createElement('span');\n text.textContent = hintText;\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.textContent = '×';\n closeBtn.title = 'Dismiss';\n closeBtn.style.cssText = `\n background: none;\n border: none;\n color: rgba(226, 232, 240, 0.5);\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n padding: 0 2px;\n `;\n closeBtn.addEventListener('click', () => {\n try {\n localStorage.setItem(storageKey, '1');\n } catch (e) {\n }\n this._removeFirstRunHint();\n });\n\n hint.appendChild(text);\n hint.appendChild(closeBtn);\n // Keep focus in the textarea when interacting with the hint\n hint.addEventListener('mousedown', (e) => e.preventDefault());\n\n this.dropdown.insertBefore(hint, this.dropdown.firstChild);\n this.firstRunHint = hint;\n }\n\n _removeFirstRunHint() {\n if (this.firstRunHint) {\n this.firstRunHint.remove();\n this.firstRunHint = null;\n }\n }\n\n /**\n * Insert a command into the input\n * @param {string} command - The command to insert (e.g., \"/character\")\n */\n _insertCommand(command) {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const commandStartPos = activeRange.trimmedStart;\n\n // Insert command with trailing space\n const insertText = command + ' ';\n const newValue = currentValue.substring(0, commandStartPos) + insertText + currentValue.substring(activeRange.end);\n const newCaretPos = commandStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n\n // Trigger input event\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n render() {\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n\n // Command-list state hints do not belong to regular search results\n this._removeCommandListFooter();\n\n // Reset virtual scroll state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n\n // Early return if no items to prevent empty dropdown\n if (!this.items || this.items.length === 0) {\n if (this.contentContainer) {\n this.contentContainer.innerHTML = '';\n } else {\n this.dropdown.innerHTML = '';\n }\n return;\n }\n\n if (this.options.enableVirtualScroll && this.contentContainer) {\n // Use virtual scrolling - always update visible items to ensure content is fresh\n // The dropdown visibility is controlled by show()/hide()\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n // Traditional rendering (fallback)\n this.dropdown.innerHTML = '';\n\n // Check if items are enriched (have tag_name, category, post_count) or command objects\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n this.items.forEach((itemData, index) => {\n const item = this.createItemElement(itemData, index, isEnriched, isCommand);\n this.dropdown.appendChild(item);\n });\n\n // Remove border from last item\n if (this.dropdown.lastChild) {\n this.dropdown.lastChild.style.borderBottom = 'none';\n }\n }\n\n // Auto-select immediately so accept keys do not fall through\n // to native focus traversal while the dropdown is visible.\n if (this.items.length > 0) {\n this.selectItem(0);\n }\n }\n\n /**\n * Render an enriched autocomplete item with category badge and post count\n * @param {HTMLElement} itemEl - The item element to populate\n * @param {Object} itemData - The enriched item data { tag_name, category, post_count, matched_alias? }\n * @param {string} searchTerm - The current search term for highlighting\n */\n _renderEnrichedItem(itemEl, itemData, searchTerm) {\n // Create name span with highlighted match\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n\n // If matched via alias, show: \"tag_name ← alias\" with alias highlighted\n if (itemData.matched_alias) {\n const tagText = document.createTextNode(itemData.tag_name + ' ');\n nameSpan.appendChild(tagText);\n\n const aliasSpan = document.createElement('span');\n aliasSpan.className = 'lm-matched-alias';\n aliasSpan.innerHTML = '← ' + this.highlightMatch(itemData.matched_alias, searchTerm);\n aliasSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n nameSpan.appendChild(aliasSpan);\n } else {\n nameSpan.innerHTML = this.highlightMatch(itemData.tag_name, searchTerm);\n }\n\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n\n // Create meta container for count and badge\n const metaSpan = document.createElement('span');\n metaSpan.className = 'lm-autocomplete-meta';\n metaSpan.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n `;\n\n // Add post count\n if (itemData.post_count > 0) {\n const countSpan = document.createElement('span');\n countSpan.className = 'lm-autocomplete-count';\n countSpan.textContent = formatPostCount(itemData.post_count);\n countSpan.style.cssText = `\n font-size: 11px;\n color: rgba(226, 232, 240, 0.5);\n `;\n metaSpan.appendChild(countSpan);\n }\n\n // Add category badge\n const categoryInfo = CATEGORY_INFO[itemData.category];\n if (categoryInfo) {\n const badgeSpan = document.createElement('span');\n badgeSpan.className = 'lm-autocomplete-category';\n badgeSpan.textContent = categoryInfo.label;\n badgeSpan.style.cssText = `\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n background: ${categoryInfo.bg};\n color: ${categoryInfo.text};\n white-space: nowrap;\n `;\n metaSpan.appendChild(badgeSpan);\n }\n\n itemEl.appendChild(nameSpan);\n itemEl.appendChild(metaSpan);\n }\n\n _renderInformationalItem(itemEl, itemData) {\n itemEl.classList.add('comfy-autocomplete-info-item');\n itemEl.style.cssText = `\n padding: 12px;\n color: rgba(226, 232, 240, 0.88);\n border-bottom: none;\n cursor: default;\n display: block;\n white-space: normal;\n height: auto;\n `;\n\n const title = document.createElement('div');\n title.className = 'lm-autocomplete-info-title';\n title.textContent = itemData.title || 'Wildcards';\n title.style.cssText = `\n font-size: 13px;\n font-weight: 600;\n margin-bottom: 6px;\n `;\n itemEl.appendChild(title);\n\n const description = document.createElement('div');\n description.className = 'lm-autocomplete-info-description';\n description.textContent = itemData.description || '';\n description.style.cssText = `\n font-size: 12px;\n line-height: 1.45;\n color: rgba(226, 232, 240, 0.72);\n `;\n itemEl.appendChild(description);\n\n if (itemData.type === 'wildcard_no_matches') {\n return;\n }\n\n const pathBlock = document.createElement('div');\n pathBlock.style.cssText = `\n margin-top: 10px;\n padding: 8px 10px;\n border-radius: 6px;\n background: rgba(15, 23, 42, 0.6);\n font-size: 11px;\n line-height: 1.5;\n `;\n pathBlock.innerHTML = [\n '
Wildcards folder
',\n `${itemData.wildcardsDir || '(unavailable)'}`,\n `
Supported formats: ${(itemData.supportedFormats || []).join(', ')}
`,\n ].join('');\n itemEl.appendChild(pathBlock);\n\n const examples = document.createElement('div');\n examples.style.cssText = `\n margin-top: 10px;\n font-size: 11px;\n line-height: 1.55;\n color: rgba(226, 232, 240, 0.72);\n `;\n examples.innerHTML = [\n '
Examples
',\n '
animals/cat.txt -> use __animals/cat__
',\n '
colors.yaml with palette: { warm: [red, orange] } -> use __palette/warm__
',\n '
Text files use one option per line. YAML/JSON use nested keys ending in string arrays.
',\n ].join('');\n itemEl.appendChild(examples);\n\n const actions = document.createElement('div');\n actions.style.cssText = `\n display: flex;\n gap: 8px;\n margin-top: 12px;\n flex-wrap: wrap;\n `;\n\n const openButton = document.createElement('button');\n openButton.type = 'button';\n openButton.dataset.action = 'open-wildcards-folder';\n openButton.textContent = 'Open wildcards folder';\n openButton.style.cssText = `\n border: 1px solid rgba(96, 165, 250, 0.45);\n background: rgba(37, 99, 235, 0.18);\n color: #dbeafe;\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n openButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._openWildcardsFolder();\n });\n actions.appendChild(openButton);\n\n const copyButton = document.createElement('button');\n copyButton.type = 'button';\n copyButton.dataset.action = 'copy-wildcards-path';\n copyButton.textContent = 'Copy path';\n copyButton.style.cssText = `\n border: 1px solid rgba(226, 232, 240, 0.2);\n background: rgba(148, 163, 184, 0.12);\n color: rgba(226, 232, 240, 0.88);\n border-radius: 6px;\n padding: 6px 10px;\n font-size: 11px;\n cursor: pointer;\n `;\n copyButton.addEventListener('click', async (event) => {\n event.preventDefault();\n event.stopPropagation();\n await this._copyWildcardPath(itemData.wildcardsDir || '');\n });\n actions.appendChild(copyButton);\n\n itemEl.appendChild(actions);\n }\n \n highlightMatch(text, searchTerm) {\n const { include } = parseSearchTokens(searchTerm);\n const sanitizedTokens = include\n .filter(Boolean)\n .map((token) => token.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n\n if (!sanitizedTokens.length) {\n return text;\n }\n\n const regex = new RegExp(`(${sanitizedTokens.join('|')})`, 'gi');\n return text.replace(\n regex,\n '$1',\n );\n }\n\n async _openWildcardsFolder() {\n try {\n const response = await api.fetchApi('/lm/wildcards/open-location', { method: 'POST' });\n const data = await response.json();\n if (!response.ok || data?.success === false) {\n throw new Error(data?.error || 'Failed to open wildcards folder');\n }\n\n if (data?.mode === 'clipboard' && data?.path) {\n await this._copyWildcardPath(data.path);\n return;\n }\n\n showToast({\n severity: 'success',\n summary: 'Wildcards folder',\n detail: 'Opened wildcards folder.',\n life: 2500,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to open wildcards folder:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: error?.message || 'Failed to open wildcards folder',\n life: 3000,\n });\n }\n }\n\n async _copyWildcardPath(path) {\n if (!path) {\n return;\n }\n\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(path);\n }\n showToast({\n severity: 'info',\n summary: 'Wildcards path',\n detail: path,\n life: 3000,\n });\n } catch (error) {\n console.error('[Lora Manager] Failed to copy wildcards path:', error);\n showToast({\n severity: 'warn',\n summary: 'Wildcards path',\n detail: path,\n life: 4000,\n });\n }\n }\n \n showPreviewForItem(relativePath, itemElement) {\n if (!this.options.showPreview || !this.previewTooltip) return;\n if (typeof relativePath !== 'string' || !relativePath) return;\n\n // Extract filename without extension for preview\n const fileName = relativePath.split(/[/\\\\]/).pop();\n const loraName = fileName.replace(/\\.(safetensors|ckpt|pt|bin)$/i, '');\n \n // Get item position for tooltip positioning\n const rect = itemElement.getBoundingClientRect();\n const x = rect.right + 10;\n const y = rect.top;\n \n this.previewTooltip.show(loraName, x, y, true); // Pass true for fromAutocomplete flag\n }\n \n hidePreview() {\n if (!this.options.showPreview) {\n return;\n }\n if (typeof this.behavior.hidePreview === 'function') {\n this.behavior.hidePreview(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.hide();\n }\n }\n \n /**\n * Handle scroll event for virtual scrolling and loading more items\n */\n handleScroll() {\n if (!this.scrollContainer || this.isLoadingMore) {\n return;\n }\n\n const { scrollTop, scrollHeight, clientHeight } = this.scrollContainer;\n const scrollBottom = scrollTop + clientHeight;\n const threshold = this.options.itemHeight * 2; // Load more when within 2 items of bottom\n\n // Check if we need to load more items\n if (scrollBottom >= scrollHeight - threshold && this.hasMoreItems) {\n this.loadMoreItems();\n }\n\n // Update visible items for virtual scrolling\n if (this.options.enableVirtualScroll) {\n this.updateVisibleItems();\n }\n }\n\n /**\n * Load more items (pagination)\n */\n async loadMoreItems() {\n if (this.isLoadingMore || !this.hasMoreItems || this.showingCommands) {\n return;\n }\n\n this.isLoadingMore = true;\n this.currentPage++;\n\n try {\n // Show loading indicator\n this.showLoadingIndicator();\n\n // Get the current endpoint\n let endpoint = `/lm/${this.modelType}/relative-paths`;\n if (this.modelType === 'prompt') {\n if (this.searchType === 'embeddings') {\n endpoint = '/lm/embeddings/relative-paths';\n } else if (this.searchType === 'wildcards') {\n endpoint = getWildcardSearchEndpoint();\n } else if (this.searchType === 'custom_words') {\n if (this.activeCommand?.categories) {\n const categories = this.activeCommand.categories.join(',');\n endpoint = `/lm/custom-words/search?category=${categories}`;\n } else {\n endpoint = '/lm/custom-words/search?enriched=true';\n }\n }\n }\n\n const queriesToExecute = this._getQueriesToExecute(this.currentSearchTerm);\n const offset = this.items.length;\n\n // Active-filter query params for loras (null when setting off)\n const activeFiltersQuery = this._getActiveLoraFilters();\n\n // Execute all queries in parallel with offset\n const searchPromises = queriesToExecute.map(async (query) => {\n const url = endpoint.includes('?')\n ? `${endpoint}&search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`\n : `${endpoint}?search=${encodeURIComponent(query)}&limit=${this.options.pageSize}&offset=${offset}`;\n const finalUrl = activeFiltersQuery ? `${url}&${activeFiltersQuery}` : url;\n\n try {\n const response = await api.fetchApi(finalUrl);\n const data = await response.json();\n return data.success ? (data.relative_paths || data.words || []) : [];\n } catch (error) {\n console.warn(`Search query failed for \"${query}\":`, error);\n return [];\n }\n });\n\n const resultsArrays = await Promise.all(searchPromises);\n\n // Merge and deduplicate results with existing items\n const seen = new Set(this.items.map(item => {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n return itemKey;\n }));\n const newItems = [];\n\n for (const resultArray of resultsArrays) {\n for (const item of resultArray) {\n const itemKey = typeof item === 'object' && item.tag_name\n ? item.tag_name.toLowerCase()\n : String(item).toLowerCase();\n\n if (!seen.has(itemKey)) {\n seen.add(itemKey);\n newItems.push(item);\n }\n }\n }\n\n // If we got fewer items than requested, we've reached the end\n if (newItems.length < this.options.pageSize) {\n this.hasMoreItems = false;\n }\n\n // If we got new items, append them and re-render\n // IMPORTANT: Do NOT re-sort! Backend already returns results sorted by relevance\n if (newItems.length > 0) {\n this.items.push(...newItems);\n\n // Update render\n if (this.options.enableVirtualScroll) {\n this.updateVirtualScrollHeight();\n this.updateVisibleItems();\n } else {\n this.render();\n }\n } else {\n this.hasMoreItems = false;\n }\n } catch (error) {\n console.error('Error loading more items:', error);\n this.hasMoreItems = false;\n } finally {\n this.isLoadingMore = false;\n this.hideLoadingIndicator();\n }\n }\n\n /**\n * Show loading indicator at the bottom of the list\n */\n showLoadingIndicator() {\n if (!this.contentContainer) return;\n\n let loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (!loadingEl) {\n loadingEl = document.createElement('div');\n loadingEl.className = 'comfy-autocomplete-loading';\n loadingEl.textContent = 'Loading more...';\n loadingEl.style.cssText = `\n padding: 12px;\n text-align: center;\n color: rgba(226, 232, 240, 0.5);\n font-size: 12px;\n `;\n this.contentContainer.appendChild(loadingEl);\n }\n }\n\n /**\n * Hide loading indicator\n */\n hideLoadingIndicator() {\n if (!this.contentContainer) return;\n\n const loadingEl = this.contentContainer.querySelector('.comfy-autocomplete-loading');\n if (loadingEl) {\n loadingEl.remove();\n }\n }\n\n /**\n * Update the total height of the virtual scroll container\n */\n updateVirtualScrollHeight() {\n if (!this.contentContainer || !this.scrollContainer) return;\n\n if (this._containsInformationalItems()) {\n this.totalHeight = 0;\n this.contentContainer.style.height = 'auto';\n this.scrollContainer.style.maxHeight = `${this.options.visibleItems * this.options.itemHeight}px`;\n this.scrollContainer.style.overflowY = 'hidden';\n return;\n }\n\n this.totalHeight = this.items.length * this.options.itemHeight;\n this.contentContainer.style.height = `${this.totalHeight}px`;\n \n // Adjust scroll container max-height based on actual content\n // Only show scrollbar when content exceeds visibleItems limit\n const maxHeight = this.options.visibleItems * this.options.itemHeight;\n const shouldShowScrollbar = this.totalHeight > maxHeight;\n \n this.scrollContainer.style.maxHeight = shouldShowScrollbar ? `${maxHeight}px` : `${this.totalHeight}px`;\n this.scrollContainer.style.overflowY = shouldShowScrollbar ? 'auto' : 'hidden';\n }\n\n /**\n * Update which items are visible based on scroll position\n */\n updateVisibleItems() {\n if (!this.scrollContainer || !this.contentContainer) return;\n\n if (this._containsInformationalItems()) {\n this.contentContainer.innerHTML = '';\n if (this.items[0]) {\n this.contentContainer.appendChild(\n this.createItemElement(this.items[0], 0, false, false)\n );\n }\n return;\n }\n\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n\n // Calculate which items should be visible with a larger buffer for smoother rendering\n // Use a fixed buffer of 5 items to ensure selected item is always rendered\n const startIndex = Math.max(0, Math.floor(scrollTop / this.options.itemHeight) - 5);\n const endIndex = Math.min(\n this.items.length - 1,\n Math.ceil((scrollTop + containerHeight) / this.options.itemHeight) + 5\n );\n\n // Clear current content\n this.contentContainer.innerHTML = '';\n\n // Create spacer for items before visible range\n if (startIndex > 0) {\n const topSpacer = document.createElement('div');\n topSpacer.style.height = `${startIndex * this.options.itemHeight}px`;\n this.contentContainer.appendChild(topSpacer);\n }\n\n // Render visible items\n const isEnriched = this.items[0] && typeof this.items[0] === 'object' && 'tag_name' in this.items[0];\n const isCommand = this.items[0] && typeof this.items[0] === 'object' && 'command' in this.items[0];\n\n for (let i = startIndex; i <= endIndex; i++) {\n const itemData = this.items[i];\n const itemEl = this.createItemElement(itemData, i, isEnriched, isCommand);\n this.contentContainer.appendChild(itemEl);\n }\n\n // Create spacer for items after visible range\n if (endIndex < this.items.length - 1) {\n const bottomSpacer = document.createElement('div');\n bottomSpacer.style.height = `${(this.items.length - 1 - endIndex) * this.options.itemHeight}px`;\n this.contentContainer.appendChild(bottomSpacer);\n }\n \n // Re-apply selection styling after re-rendering\n // This ensures the selected item remains highlighted even after DOM updates\n if (this.selectedIndex >= startIndex && this.selectedIndex <= endIndex) {\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${this.selectedIndex}\"]`);\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n }\n }\n }\n\n /**\n * Create a single item element\n */\n createItemElement(itemData, index, isEnriched, isCommand = false) {\n const item = document.createElement('div');\n item.className = 'comfy-autocomplete-item';\n item.dataset.index = index.toString();\n item.style.cssText = `\n height: ${this.options.itemHeight}px;\n padding: 8px 12px;\n cursor: pointer;\n color: rgba(226, 232, 240, 0.8);\n border-bottom: 1px solid rgba(226, 232, 240, 0.1);\n transition: all 0.2s ease;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n `;\n\n // Check if this is a command object (override parameter if needed)\n if (!isCommand && itemData && typeof itemData === 'object' && 'command' in itemData) {\n isCommand = true;\n }\n\n if (isWildcardInfoItem(itemData)) {\n this._renderInformationalItem(item, itemData);\n } else if (isCommand) {\n // Render command item\n const cmdSpan = document.createElement('span');\n cmdSpan.className = 'lm-autocomplete-command-name';\n cmdSpan.textContent = itemData.command;\n\n const labelSpan = document.createElement('span');\n labelSpan.className = 'lm-autocomplete-command-label';\n labelSpan.textContent = itemData.label;\n\n item.appendChild(cmdSpan);\n item.appendChild(labelSpan);\n item.style.gap = '12px';\n } else if (isEnriched) {\n this._renderEnrichedItem(item, itemData, this.currentSearchTerm);\n } else {\n const nameSpan = document.createElement('span');\n nameSpan.className = 'lm-autocomplete-name';\n // Use display text without extension for cleaner UI\n const displayTextWithoutExt = this._getDisplayText(itemData);\n nameSpan.innerHTML = this.highlightMatch(displayTextWithoutExt, this.currentSearchTerm);\n nameSpan.style.cssText = `\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n `;\n item.appendChild(nameSpan);\n }\n\n // Prevent textarea from losing focus when clicking dropdown items.\n // Without this, the blur event fires before click, and the blur handler's\n // formatAutocompleteTextOnBlur() modifies the text and triggers hide()\n // via suppressAutocompleteOnce, removing this item from the DOM before\n // the click handler can execute. This specifically breaks the case where\n // the text has a comma not followed by a space (e.g. \",search\").\n item.addEventListener('mousedown', (e) => {\n e.preventDefault();\n });\n\n // Hover and selection handlers\n item.addEventListener('mouseenter', () => {\n this.selectItem(index, { manual: true });\n });\n\n item.addEventListener('mouseleave', () => {\n this.hidePreview();\n });\n\n // Click handler\n item.addEventListener('click', () => {\n if (isWildcardInfoItem(itemData)) {\n return;\n }\n\n if (isCommand) {\n this._insertCommand(itemData.command);\n } else {\n const insertPath = isEnriched ? itemData.tag_name : itemData;\n this.insertSelection(insertPath);\n }\n });\n\n return item;\n }\n\n show() {\n if (!this.items || this.items.length === 0) {\n this.hide();\n return;\n }\n\n this._maybeShowFirstRunHint();\n // For virtual scrolling, render items first so positionAtCursor can measure width correctly\n if (this.options.enableVirtualScroll && this.contentContainer) {\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n // Skip updateVisibleItems if showing commands (already rendered by _renderCommandList)\n if (!this.showingCommands) {\n this.updateVisibleItems();\n }\n this.positionAtCursor();\n } else {\n // Position dropdown at cursor position using TextAreaCaretHelper\n this.positionAtCursor();\n this.dropdown.style.display = 'block';\n this.isVisible = true;\n }\n }\n \n positionAtCursor() {\n const position = this.helper.getCursorOffset();\n this.dropdown.style.left = (position.left ?? 0) + \"px\";\n this.dropdown.style.top = (position.top ?? 0) + \"px\";\n this.dropdown.style.maxHeight = (window.innerHeight - position.top) + \"px\";\n\n // Adjust width to fit content\n // Temporarily show the dropdown to measure content width\n const originalDisplay = this.dropdown.style.display;\n this.dropdown.style.display = 'block';\n this.dropdown.style.visibility = 'hidden';\n\n // Temporarily remove width constraints to allow content to expand naturally\n // This prevents items.scrollWidth from being limited by a narrow container\n const originalWidth = this.dropdown.style.width;\n this.dropdown.style.width = 'auto';\n this.dropdown.style.minWidth = '200px';\n\n // Measure the content width\n let maxWidth = 200; // minimum width\n // For virtual scrolling, query items from contentContainer; otherwise from dropdown\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const items = container.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n const itemWidth = item.scrollWidth + 24; // Add padding\n maxWidth = Math.max(maxWidth, itemWidth);\n });\n\n // Set the width and restore visibility\n this.dropdown.style.width = Math.min(maxWidth, 400) + 'px'; // Cap at 400px\n this.dropdown.style.minWidth = '';\n this.dropdown.style.visibility = 'visible';\n this.dropdown.style.display = originalDisplay;\n }\n \n getCaretPosition() {\n return this.inputElement.selectionStart || 0;\n }\n \n hide() {\n if (!this.dropdown) {\n return;\n }\n\n this.dropdown.style.display = 'none';\n this.isVisible = false;\n this.selectedIndex = -1;\n this.hasManualSelection = false;\n this.showingCommands = false;\n\n // Remove discoverability hints attached to the dropdown\n this._removeCommandListFooter();\n this._removeFirstRunHint();\n \n // Clear items to prevent stale data from being displayed\n // when autocomplete is shown again\n this.items = [];\n this.wildcardMeta = null;\n \n // Clear content container to prevent stale items from showing\n if (this.contentContainer) {\n // Virtual scrolling mode - clear content container\n this.contentContainer.innerHTML = '';\n } else {\n // Non-virtual scrolling mode - clear dropdown direct children\n this.dropdown.innerHTML = '';\n }\n\n // Reset virtual scrolling state\n this.virtualScrollOffset = 0;\n this.currentPage = 0;\n this.hasMoreItems = true;\n this.isLoadingMore = false;\n this.totalHeight = 0;\n\n // Reset scroll position\n if (this.scrollContainer) {\n this.scrollContainer.scrollTop = 0;\n }\n\n // Hide preview tooltip\n this.hidePreview();\n\n // Clear selection styles from all items\n const items = this.dropdown.querySelectorAll('.comfy-autocomplete-item');\n items.forEach(item => {\n item.classList.remove('comfy-autocomplete-item-selected');\n item.style.backgroundColor = '';\n });\n }\n \n selectItem(index, { manual = false } = {}) {\n // Remove previous selection\n const container = this.options.enableVirtualScroll && this.contentContainer\n ? this.contentContainer\n : this.dropdown;\n const prevSelected = container.querySelector('.comfy-autocomplete-item-selected');\n if (prevSelected) {\n prevSelected.classList.remove('comfy-autocomplete-item-selected');\n prevSelected.style.backgroundColor = '';\n }\n\n // Add new selection\n if (index >= 0 && index < this.items.length) {\n this.selectedIndex = index;\n this.hasManualSelection = manual;\n\n // For virtual scrolling, we need to ensure the item is rendered\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // Calculate if the item is currently visible\n const itemTop = index * this.options.itemHeight;\n const itemBottom = itemTop + this.options.itemHeight;\n const scrollTop = this.scrollContainer.scrollTop;\n const containerHeight = this.scrollContainer.clientHeight;\n const scrollBottom = scrollTop + containerHeight;\n\n // If item is not visible, scroll to make it visible\n if (itemTop < scrollTop || itemBottom > scrollBottom) {\n // Scroll to position the item in the visible area\n // Position item at 1/3 from top for better visibility\n const targetScrollTop = Math.max(0, itemTop - containerHeight / 3);\n this.scrollContainer.scrollTop = targetScrollTop;\n \n // Re-render visible items after scroll\n this.updateVisibleItems();\n \n // Apply selection after DOM is updated\n // Use setTimeout to ensure DOM has been re-rendered\n setTimeout(() => {\n this._applyItemSelection(index);\n }, 0);\n } else {\n // Item is already visible, apply selection immediately\n this._applyItemSelection(index);\n }\n } else {\n // Traditional rendering\n const item = container.children[index];\n if (item) {\n item.classList.add('comfy-autocomplete-item-selected');\n item.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Scroll into view if needed\n item.scrollIntoView({ block: 'nearest' });\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], item);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], item);\n }\n }\n }\n }\n }\n }\n\n /**\n * Apply selection styling to an item (used after virtual scroll re-render)\n * @param {number} index - Index of item to select\n */\n _applyItemSelection(index) {\n if (!this.contentContainer) return;\n\n // Find the item element using data-index attribute\n const selectedEl = this.contentContainer.querySelector(`.comfy-autocomplete-item[data-index=\"${index}\"]`);\n\n if (selectedEl) {\n selectedEl.classList.add('comfy-autocomplete-item-selected');\n selectedEl.style.backgroundColor = 'rgba(66, 153, 225, 0.2)';\n\n // Show preview for selected item\n if (this.options.showPreview && !this._isSelectableInfoItem(this.items[index])) {\n if (typeof this.behavior.showPreview === 'function') {\n this.behavior.showPreview(this, this.items[index], selectedEl);\n } else if (this.previewTooltip) {\n this.showPreviewForItem(this.items[index], selectedEl);\n }\n }\n }\n }\n \n handleKeyDown(e) {\n if (!this.isVisible) {\n return;\n }\n \n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle boundary cases\n if (this.selectedIndex >= this.items.length - 1) {\n // Already at last item, try to load more\n if (this.hasMoreItems && !this.isLoadingMore) {\n this.loadMoreItems().then(() => {\n // After loading more, select the next item\n if (this.selectedIndex < this.items.length - 1) {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n });\n }\n } else {\n this.selectItem(this.selectedIndex + 1, { manual: true });\n }\n } else {\n this.selectItem(Math.min(this.selectedIndex + 1, this.items.length - 1), { manual: true });\n }\n break;\n \n case 'ArrowUp':\n e.preventDefault();\n if (this.options.enableVirtualScroll && this.scrollContainer) {\n // For virtual scrolling, handle top boundary\n if (this.selectedIndex <= 0) {\n // Already at first item, ensure it's selected\n this.selectItem(0, { manual: true });\n } else {\n this.selectItem(this.selectedIndex - 1, { manual: true });\n }\n } else {\n this.selectItem(Math.max(this.selectedIndex - 1, 0), { manual: true });\n }\n break;\n \n case 'Enter':\n case 'Tab':\n if (!shouldAcceptAutocompleteKey(e.key)) {\n break;\n }\n\n {\n const liveSearchTerm = this._getLiveSearchTermForAcceptance();\n const acceptIndex = this._getAcceptSelectionIndex(liveSearchTerm);\n if (acceptIndex !== -1 && acceptIndex !== this.selectedIndex) {\n this.selectItem(acceptIndex);\n }\n }\n\n if (this.selectedIndex >= 0 && this.selectedIndex < this.items.length) {\n e.preventDefault();\n if (this.showingCommands) {\n // Insert command\n this._insertCommand(this.items[this.selectedIndex].command);\n } else {\n const selectedItem = this.items[this.selectedIndex];\n if (isWildcardInfoItem(selectedItem)) {\n if (selectedItem.type === 'wildcard_empty_state') {\n this._openWildcardsFolder();\n }\n break;\n }\n\n // Insert selection (handle enriched items)\n const insertPath = typeof selectedItem === 'object' && 'tag_name' in selectedItem\n ? selectedItem.tag_name\n : selectedItem;\n this.insertSelection(insertPath);\n }\n }\n break;\n \n case 'Escape':\n e.preventDefault();\n this.hide();\n break;\n }\n }\n \n async insertSelection(relativePath) {\n const insertText = await this.getInsertText(relativePath);\n if (!insertText) {\n this.hide();\n return;\n }\n\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const fullSearchTerm = activeRange.text;\n let replaceStartPos = activeRange.trimmedStart;\n\n // For regular tag autocomplete (no command), only replace the last space-separated token\n // This allows \"hello 1gi\" + selecting \"1girl\" to become \"hello 1girl, \"\n // However, if the user typed a multi-word phrase that matches a tag (e.g., \"looking to the side\"\n // matching \"looking_to_the_side\"), replace the entire phrase instead of just the last word.\n // Command mode (e.g., \"/character miku\") should replace the entire command+search\n let searchTerm = fullSearchTerm;\n if (this.modelType === 'prompt' && this.searchType === 'custom_words' && !this.activeCommand) {\n // Check if the selectedItem exists and its tag_name matches the full search term\n // when converted to underscore format (Danbooru convention)\n const selectedItem = this.selectedIndex >= 0 ? this.items[this.selectedIndex] : null;\n const selectedTagName = selectedItem && typeof selectedItem === 'object' && 'tag_name' \n ? selectedItem.tag_name \n : null;\n \n // Convert full search term to underscore format and check if it matches selected tag\n // Normalize multiple spaces to single underscore for matching (e.g., \"looking to the side\" -> \"looking_to_the_side\")\n const underscoreVersion = fullSearchTerm.replace(/ +/g, '_').toLowerCase();\n const selectedTagLower = selectedTagName?.toLowerCase() ?? '';\n \n // If multi-word search term is a prefix or suffix of the selected tag,\n // replace the entire phrase. This handles cases where user types partial tag name.\n // Examples:\n // - \"looking to the\" -> \"looking_to_the_side\" (prefix match)\n // - \"to the side\" -> \"looking_to_the_side\" (suffix match)\n // - \"looking to the side\" -> \"looking_to_the_side\" (exact match)\n if (fullSearchTerm.includes(' ') && (\n selectedTagLower.startsWith(underscoreVersion) ||\n selectedTagLower.endsWith(underscoreVersion) ||\n underscoreVersion === selectedTagLower\n )) {\n searchTerm = fullSearchTerm;\n replaceStartPos = activeRange.trimmedStart;\n } else {\n searchTerm = this._getLastSpaceToken(fullSearchTerm);\n replaceStartPos = searchTerm === fullSearchTerm\n ? activeRange.trimmedStart\n : caretPos - searchTerm.length;\n }\n }\n\n // Only replace the search term, not everything after the last comma\n const newValue = currentValue.substring(0, replaceStartPos) + insertText + currentValue.substring(caretPos);\n const newCaretPos = replaceStartPos + insertText.length;\n\n this.inputElement.value = newValue;\n this._storeLastAcceptedBoundary({\n start: replaceStartPos,\n end: newCaretPos,\n insertedText: insertText,\n textSnapshot: newValue.substring(0, newCaretPos),\n });\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.hide();\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n\n async getInsertText(relativePath) {\n if (typeof this.behavior.getInsertText === 'function') {\n try {\n const result = await this.behavior.getInsertText(this, relativePath);\n if (typeof result === 'string' && result.length > 0) {\n return result;\n }\n } catch (error) {\n console.warn('Failed to format autocomplete insertion:', error);\n }\n }\n\n const trimmed = typeof relativePath === 'string' ? relativePath.trim() : '';\n if (!trimmed) {\n return '';\n }\n return formatAutocompleteInsertion(trimmed);\n }\n\n /**\n * Check if the autocomplete instance is still valid\n * (input element exists and is in the DOM)\n * @returns {boolean}\n */\n isValid() {\n return this.inputElement && document.body.contains(this.inputElement);\n }\n\n /**\n * Refresh the TextAreaCaretHelper to update cached measurements\n * Useful after element is moved in DOM (e.g., Vue mode switch)\n */\n refreshCaretHelper() {\n if (this.inputElement && document.body.contains(this.inputElement)) {\n this.helper = new TextAreaCaretHelper(this.inputElement, () => app.canvas.ds.scale);\n }\n }\n\n /**\n * Handle toggle setting command (e.g., /autocomplete, /activefilters)\n * @param {Object} command - The toggle command with settingId and value\n */\n async _handleToggleSettingCommand(command) {\n const { settingId, value } = command;\n\n try {\n const success = await setLoraManagerSettingValue(settingId, value);\n if (success) {\n this._showToggleFeedback(command, value);\n this._clearCurrentToken();\n } else {\n throw new Error('settings API unavailable');\n }\n } catch (error) {\n console.error('[Lora Manager] Failed to toggle setting:', error);\n showToast({\n severity: 'error',\n summary: 'Error',\n detail: 'Failed to toggle autocomplete setting',\n life: 3000\n });\n }\n\n this.hide();\n }\n\n /**\n * Show visual feedback for toggle action using toast\n * @param {Object} command - The toggle command that was executed\n * @param {boolean} enabled - New autocomplete state\n */\n _showToggleFeedback(command, enabled) {\n showToast({\n severity: enabled ? 'success' : 'secondary',\n summary: command.feedbackSummary || (enabled ? 'Autocomplete Enabled' : 'Autocomplete Disabled'),\n detail: command.feedbackDetail || (enabled\n ? 'Tag autocomplete is now ON. Type to see suggestions.'\n : 'Tag autocomplete is now OFF. Use /autocomplete or the node right-click menu to re-enable.'),\n life: 3000\n });\n }\n\n /**\n * Clear the current command token from input\n * Preserves leading spaces after delimiters (e.g., \"1girl, /emb\" -> \"1girl, \")\n */\n _clearCurrentToken() {\n const currentValue = this.inputElement.value;\n const activeRange = this.getActiveSearchRange(currentValue);\n const caretPos = activeRange.end;\n const lastSegment = activeRange.rawText;\n \n // Find the command start position, preserving leading spaces\n // lastSegment includes leading spaces (e.g., \" /emb\"), find where command actually starts\n const commandMatch = lastSegment.match(/^(\\s*)(\\/\\w+)/);\n if (commandMatch) {\n // commandMatch[1] is leading spaces, commandMatch[2] is the command\n const leadingSpaces = commandMatch[1].length;\n // Keep the spaces by starting after them\n const commandStartPos = activeRange.start + leadingSpaces;\n \n // Skip trailing spaces when deleting\n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n // Trigger input event to notify about the change\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n // Focus back to input and position cursor\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n } else {\n // Fallback: delete the whole last segment (original behavior)\n const commandStartPos = activeRange.start;\n \n let endPos = caretPos;\n while (endPos < currentValue.length && currentValue[endPos] === ' ') {\n endPos++;\n }\n\n const newValue = currentValue.substring(0, commandStartPos) + currentValue.substring(endPos);\n const newCaretPos = commandStartPos;\n\n this.inputElement.value = newValue;\n\n const event = new Event('input', { bubbles: true });\n this.inputElement.dispatchEvent(event);\n\n this.inputElement.focus();\n this.inputElement.setSelectionRange(newCaretPos, newCaretPos);\n }\n }\n\n destroy() {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n if (this.onInput) {\n this.inputElement.removeEventListener('input', this.onInput);\n this.onInput = null;\n }\n\n if (this.onKeyDown) {\n this.inputElement.removeEventListener('keydown', this.onKeyDown);\n this.onKeyDown = null;\n }\n\n if (this.onBlur) {\n this.inputElement.removeEventListener('blur', this.onBlur);\n this.onBlur = null;\n }\n\n if (this.onDocumentClick) {\n document.removeEventListener('click', this.onDocumentClick);\n this.onDocumentClick = null;\n }\n\n if (this.onScroll && this.scrollContainer) {\n this.scrollContainer.removeEventListener('scroll', this.onScroll);\n this.onScroll = null;\n }\n\n if (typeof this.behavior.destroy === 'function') {\n this.behavior.destroy(this);\n } else if (this.previewTooltip) {\n this.previewTooltip.cleanup();\n this.previewTooltip = null;\n }\n this.previewTooltipPromise = null;\n \n if (this.dropdown && this.dropdown.parentNode) {\n this.dropdown.parentNode.removeChild(this.dropdown);\n this.dropdown = null;\n }\n \n }\n}\n\nexport { AutoComplete, refreshLoraSyntaxFormat };\n","/**\n * Base-path helpers for code running inside the ComfyUI page.\n *\n * When ComfyUI is served under a URL subpath by a reverse proxy (e.g.\n * llama-swap serves it at \"/comfyui/\", SwarmUI at \"/ComfyBackendDirect/\"),\n * the ComfyUI SPA always sits at the root of that prefix, so the prefix is\n * the current pathname without the trailing slash — the same convention the\n * ComfyUI frontend uses for its own api_base. Proxies strip the prefix and\n * forward no headers, so the page URL is the only place to learn it.\n */\n\nexport function getComfyUIBasePath() {\n const { pathname } = window.location;\n return pathname.endsWith(\"/\") ? pathname.slice(0, -1) : pathname;\n}\n\nexport function lmUrl(path) {\n return `${getComfyUIBasePath()}${path}`;\n}\n","export const CONVERTED_TYPE = 'converted-widget';\nimport { app } from \"../../scripts/app.js\";\nimport { AutoComplete } from \"./autocomplete.js\";\nimport { lmUrl } from \"./base_path.js\";\n\nconst ROOT_GRAPH_ID = \"root\";\n\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n];\n\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n];\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n];\n\nexport function isLoraProviderNode(comfyClass) {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraStackAggregatorNode(comfyClass) {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass);\n}\n\nexport function isLoraChainNode(comfyClass) {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass);\n}\n\nfunction isMapLike(collection) {\n return collection && typeof collection.entries === \"function\" && typeof collection.values === \"function\";\n}\n\n/**\n * Return the subgraph LGraph instances nested under `graph`, across both\n * Map-like and plain-object `_subgraphs` containers.\n */\nexport function getChildGraphs(graph) {\n if (!graph || !graph._subgraphs) {\n return [];\n }\n\n const rawSubgraphs = isMapLike(graph._subgraphs)\n ? Array.from(graph._subgraphs.values())\n : Object.values(graph._subgraphs);\n\n return rawSubgraphs\n .map((subgraph) => subgraph?.graph || subgraph?._graph || subgraph)\n .filter((subgraph) => subgraph && subgraph !== graph);\n}\n\nfunction traverseGraphs(rootGraph, visitor, visited = new Set()) {\n const graph = rootGraph || app.graph;\n if (!graph) {\n return;\n }\n\n const graphId = getGraphId(graph);\n if (visited.has(graphId)) {\n return;\n }\n visited.add(graphId);\n visitor(graph);\n\n for (const subgraph of getChildGraphs(graph)) {\n traverseGraphs(subgraph, visitor, visited);\n }\n}\n\nexport function getGraphId(graph) {\n return graph?.id ?? ROOT_GRAPH_ID;\n}\n\nexport function getNodeGraphId(node) {\n if (!node) {\n return ROOT_GRAPH_ID;\n }\n return getGraphId(node.graph || app.graph);\n}\n\nexport function getGraphById(graphId, rootGraph = app.graph) {\n if (!graphId) {\n return rootGraph;\n }\n\n let foundGraph = null;\n traverseGraphs(rootGraph, (graph) => {\n if (!foundGraph && getGraphId(graph) === graphId) {\n foundGraph = graph;\n }\n });\n return foundGraph;\n}\n\nexport function getNodeFromGraph(graphId, nodeId) {\n const graph = getGraphById(graphId) || app.graph;\n if (!graph || typeof graph.getNodeById !== \"function\") {\n return null;\n }\n\n const numericId = typeof nodeId === \"string\" ? Number(nodeId) : nodeId;\n return graph.getNodeById(Number.isNaN(numericId) ? nodeId : numericId) || null;\n}\n\nexport function getAllGraphNodes(rootGraph = app.graph) {\n const nodes = [];\n traverseGraphs(rootGraph, (graph) => {\n if (Array.isArray(graph._nodes)) {\n for (const node of graph._nodes) {\n nodes.push({ graph, node });\n }\n }\n });\n return nodes;\n}\n\nexport function getNodeReference(node) {\n if (!node) {\n return null;\n }\n return {\n node_id: node.id,\n graph_id: getNodeGraphId(node),\n };\n}\n\nexport function getNodeKey(node) {\n if (!node) {\n return null;\n }\n return `${getNodeGraphId(node)}:${node.id}`;\n}\n\nexport function getWidgetByName(node, widgetName) {\n if (!node || !Array.isArray(node.widgets)) {\n return null;\n }\n\n return node.widgets.find((widget) => widget?.name === widgetName) || null;\n}\n\nexport function getWidgetSerializedValue(node, widgetName) {\n if (!node || !Array.isArray(node.widgets) || !Array.isArray(node.widgets_values)) {\n return undefined;\n }\n\n const widgetIndex = node.widgets.findIndex((widget) => widget?.name === widgetName);\n if (widgetIndex === -1) {\n return undefined;\n }\n\n return node.widgets_values[widgetIndex];\n}\n\nexport function getLinkFromGraph(graph, linkId) {\n if (!graph || graph.links == null) {\n return null;\n }\n\n if (isMapLike(graph.links)) {\n return graph.links.get(linkId) || null;\n }\n\n return graph.links[linkId] || null;\n}\n\nexport function chainCallback(object, property, callback) {\n if (object == undefined) {\n //This should not happen.\n console.error(\"Tried to add callback to non-existant object\")\n return;\n }\n if (property in object) {\n const callback_orig = object[property]\n object[property] = function () {\n const r = callback_orig.apply(this, arguments);\n callback.apply(this, arguments);\n return r\n };\n } else {\n object[property] = callback;\n }\n}\n\n/**\n * Find a `mode` accessor (getter/setter) on the node's prototype chain.\n * Since ComfyUI frontend 1.53, `LGraphNode.mode` is a prototype accessor\n * backed by the node's shell state (`node._state.mode`); on legacy frontends\n * `mode` is a plain data property on the instance and no accessor exists.\n */\nfunction findModeAccessor(node) {\n let proto = Object.getPrototypeOf(node);\n while (proto && proto !== Object.prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, \"mode\");\n if (descriptor && (descriptor.get || descriptor.set)) {\n return descriptor;\n }\n proto = Object.getPrototypeOf(proto);\n }\n return null;\n}\n\n/**\n * Observe node mode changes (Always/Never/On Trigger/Bypass) without\n * breaking the frontend's own `mode` property.\n *\n * Since ComfyUI frontend 1.53, `mode` is a prototype accessor backed by\n * shell state and serialization reads that state directly. Redefining `mode`\n * on the instance would shadow the prototype setter, so bypass/mute never\n * reaches the serialized workflow and silently reverts to Always on reload.\n * When a prototype accessor exists we delegate to it and only observe the\n * change; on legacy frontends we keep the value in a closure as before.\n *\n * Multiple listeners can be registered on the same node; the accessor is\n * intercepted only once and every change is broadcast to all listeners.\n *\n * @param {Object} node - The litegraph node instance\n * @param {(newMode: number, oldMode: number) => void} onModeChange - Called when the mode actually changes\n */\nexport function interceptModeChange(node, onModeChange) {\n if (!node || typeof onModeChange !== \"function\") {\n return;\n }\n\n if (!Array.isArray(node._lmModeChangeListeners)) {\n Object.defineProperty(node, \"_lmModeChangeListeners\", {\n configurable: true,\n writable: true,\n value: [],\n });\n }\n node._lmModeChangeListeners.push(onModeChange);\n\n if (node._lmModeChangeIntercepted) {\n return;\n }\n Object.defineProperty(node, \"_lmModeChangeIntercepted\", {\n configurable: true,\n writable: true,\n value: true,\n });\n\n const notify = (newMode, oldMode) => {\n for (const listener of node._lmModeChangeListeners ?? []) {\n try {\n listener(newMode, oldMode);\n } catch (listenerError) {\n console.error(\"LoRA Manager: mode change listener failed\", listenerError);\n }\n }\n };\n\n const delegate = findModeAccessor(node);\n\n if (delegate && typeof delegate.get === \"function\" && typeof delegate.set === \"function\") {\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return delegate.get.call(this);\n },\n set(value) {\n const oldValue = delegate.get.call(this);\n delegate.set.call(this, value);\n if (oldValue !== value) {\n notify(value, oldValue);\n }\n },\n });\n return;\n }\n\n let currentMode = node.mode;\n Object.defineProperty(node, \"mode\", {\n configurable: true,\n get() {\n return currentMode;\n },\n set(value) {\n const oldValue = currentMode;\n currentMode = value;\n if (oldValue !== value) {\n notify(value, oldValue);\n }\n },\n });\n}\n\n/**\n * Show a toast notification\n * @param {Object|string} options - Toast options object or message string for backward compatibility\n * @param {string} [options.severity] - Message severity level (success, info, warn, error, secondary, contrast)\n * @param {string} [options.summary] - Short title for the toast\n * @param {any} [options.detail] - Detailed message content\n * @param {boolean} [options.closable] - Whether user can close the toast (default: true)\n * @param {number} [options.life] - Duration in milliseconds before auto-closing\n * @param {string} [options.group] - Group identifier for managing related toasts\n * @param {any} [options.styleClass] - Style class of the message\n * @param {any} [options.contentStyleClass] - Style class of the content\n * @param {string} [type] - Deprecated: severity type for backward compatibility\n */\nexport function showToast(options, type = 'info') {\n // Handle backward compatibility: showToast(message, type)\n if (typeof options === 'string') {\n options = {\n detail: options,\n severity: type\n };\n }\n \n // Set defaults\n const toastOptions = {\n severity: options.severity || 'info',\n summary: options.summary,\n detail: options.detail,\n closable: options.closable !== false, // default to true\n life: options.life,\n group: options.group,\n styleClass: options.styleClass,\n contentStyleClass: options.contentStyleClass\n };\n \n // Remove undefined properties\n Object.keys(toastOptions).forEach(key => {\n if (toastOptions[key] === undefined) {\n delete toastOptions[key];\n }\n });\n \n if (app && app.extensionManager && app.extensionManager.toast) {\n app.extensionManager.toast.add(toastOptions);\n } else {\n const message = toastOptions.detail || toastOptions.summary || 'No message';\n const severity = toastOptions.severity.toUpperCase();\n console.log(`${severity}: ${message}`);\n // Fallback alert for critical errors only\n if (toastOptions.severity === 'error') {\n alert(message);\n }\n }\n}\n\nexport function hideWidgetForGood(node, widget, suffix = \"\") {\n widget.origType = widget.type;\n widget.origComputeSize = widget.computeSize;\n widget.origSerializeValue = widget.serializeValue;\n widget.computeSize = () => [0, -4]; // -4 is due to the gap litegraph adds between widgets automatically\n widget.type = CONVERTED_TYPE + suffix;\n // widget.serializeValue = () => {\n // // Prevent serializing the widget if we have no input linked\n // const w = node.inputs?.find((i) => i.widget?.name === widget.name);\n // if (w?.link == null) {\n // return undefined;\n // }\n // return widget.origSerializeValue ? widget.origSerializeValue() : widget.value;\n // };\n\n // Hide any linked widgets, e.g. seed+seedControl\n if (widget.linkedWidgets) {\n for (const w of widget.linkedWidgets) {\n hideWidgetForGood(node, w, `:${widget.name}`);\n }\n }\n}\n\n// Update pattern to match both formats: or \nexport const LORA_PATTERN = //g;\n\nfunction isLoraStackInput(input) {\n return input?.type === \"LORA_STACK\";\n}\n\n// Get connected LORA_STACK chain nodes that feed into the current node\nexport function getConnectedInputLoraChainNodes(node) {\n const connectedNodes = [];\n\n if (!node?.inputs) {\n return connectedNodes;\n }\n\n for (const input of node.inputs) {\n if (!isLoraStackInput(input) || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && isLoraChainNode(sourceNode.comfyClass)) {\n connectedNodes.push(sourceNode);\n }\n }\n\n return connectedNodes;\n}\n\n// Get connected TriggerWord Toggle nodes that receive output from the current node\nexport function getConnectedTriggerToggleNodes(node) {\n const connectedNodes = [];\n\n if (!node?.outputs) {\n return connectedNodes;\n }\n\n for (const output of node.outputs) {\n if (!output?.links?.length) {\n continue;\n }\n\n for (const linkId of output.links) {\n const link = getLinkFromGraph(node.graph, linkId);\n if (!link) {\n continue;\n }\n\n const targetNode = node.graph?.getNodeById?.(link.target_id);\n if (targetNode && targetNode.comfyClass === \"TriggerWord Toggle (LoraManager)\") {\n connectedNodes.push(targetNode);\n }\n }\n }\n\n return connectedNodes;\n}\n\n// Extract active lora names from a node's widgets\nexport function getActiveLorasFromNode(node) {\n const activeLoraNames = new Set();\n\n // Handle Lora Cycler (single LoRA from cycler_config widget)\n if (node.comfyClass === \"Lora Cycler (LoraManager)\") {\n const cyclerWidget = node.widgets?.find(w => w.name === 'cycler_config');\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n return activeLoraNames;\n }\n\n // Aggregator nodes do not own LoRA state directly; they only forward upstream stacks.\n if (isLoraStackAggregatorNode(node.comfyClass)) {\n return activeLoraNames;\n }\n\n // Handle Lora Stacker and Lora Randomizer (lorasWidget)\n let lorasWidget = node.lorasWidget;\n if (!lorasWidget && node.widgets) {\n lorasWidget = node.widgets.find(w => w.name === 'loras');\n }\n\n if (lorasWidget && lorasWidget.value) {\n lorasWidget.value.forEach(lora => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n// Recursively collect all active loras from a node and its input chain\n// A node is considered active only if its mode is 0 (Always) or 3 (On Trigger)\nexport function collectActiveLorasFromChain(node, visited = new Set()) {\n // Prevent infinite loops from circular references\n const nodeKey = getNodeKey(node);\n if (!nodeKey) {\n return new Set();\n }\n if (visited.has(nodeKey)) {\n return new Set();\n }\n visited.add(nodeKey);\n\n // Check if node is active (mode 0 for Always, mode 3 for On Trigger)\n // Mode 2 is Never, Mode 4 is Bypass\n const isNodeActive = node.mode === undefined || node.mode === 0 || node.mode === 3;\n \n if (!isNodeActive) {\n return new Set();\n }\n\n // Get active loras from current node only if node is active\n const allActiveLoraNames = getActiveLorasFromNode(node);\n \n // Get connected input LORA_STACK chain nodes and collect their active loras\n const inputChainNodes = getConnectedInputLoraChainNodes(node);\n for (const chainNode of inputChainNodes) {\n const upstreamLoras = collectActiveLorasFromChain(chainNode, visited);\n upstreamLoras.forEach(name => allActiveLoraNames.add(name));\n }\n \n return allActiveLoraNames;\n}\n\n// Update trigger words for connected toggle nodes\nexport function updateConnectedTriggerWords(node, loraNames) {\n const connectedNodes = getConnectedTriggerToggleNodes(node);\n if (connectedNodes.length > 0) {\n const nodeIds = connectedNodes\n .map((connectedNode) => getNodeReference(connectedNode))\n .filter((reference) => reference !== null);\n\n if (nodeIds.length === 0) {\n return;\n }\n\n fetch(lmUrl(\"/api/lm/loras/get_trigger_words\"), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n lora_names: Array.from(loraNames),\n node_ids: nodeIds\n })\n }).catch(err => console.error(\"Error fetching trigger words:\", err));\n }\n}\n\nexport function mergeLoras(lorasText, lorasArr) {\n // Parse lorasText into a map: name -> {strength, clipStrength}\n const parsedLoras = {};\n let match;\n LORA_PATTERN.lastIndex = 0;\n while ((match = LORA_PATTERN.exec(lorasText)) !== null) {\n const name = match[1];\n const modelStrength = Number(match[2]);\n const clipStrength = match[3] ? Number(match[3]) : modelStrength;\n parsedLoras[name] = { strength: modelStrength, clipStrength };\n }\n\n // Build result array in the order of lorasArr\n const result = [];\n const usedNames = new Set();\n\n for (const lora of lorasArr) {\n if (parsedLoras[lora.name]) {\n result.push({\n name: lora.name,\n strength: lora.strength !== undefined ? lora.strength : parsedLoras[lora.name].strength,\n active: lora.active !== undefined ? lora.active : true,\n expanded: lora.expanded !== undefined ? lora.expanded : false,\n clipStrength: lora.clipStrength !== undefined ? lora.clipStrength : parsedLoras[lora.name].clipStrength,\n selected: !!lora.selected,\n });\n usedNames.add(lora.name);\n }\n }\n\n // Add any new loras from lorasText that are not in lorasArr, in their text order\n for (const name in parsedLoras) {\n if (!usedNames.has(name)) {\n result.push({\n name,\n strength: parsedLoras[name].strength,\n active: true,\n clipStrength: parsedLoras[name].clipStrength,\n selected: false,\n });\n }\n }\n\n return result;\n}\n\n/**\n * Find the actual input element for a widget\n * @param {Object} node - The node instance\n * @param {Object} widget - The widget to find input element for\n * @returns {Promise} The input element or null\n */\nasync function findWidgetInputElement(node, widget) {\n if (widget.inputEl && document.body.contains(widget.inputEl)) {\n return widget.inputEl;\n }\n\n const nodeId = node.id;\n const widgetName = widget.name;\n const maxAttempts = 20;\n const searchInterval = 50;\n\n const searchForInput = (attempt = 0) => {\n return new Promise((resolve) => {\n const doSearch = () => {\n let inputElement = null;\n\n // PRIORITY 1: Use data-node-id attribute (most reliable)\n // Always try this first, regardless of mode - Vue elements may still exist after mode switch\n const nodeContainer = document.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (nodeContainer) {\n // For text widgets, specifically look for textarea (not checkbox/toggle inputs)\n if (widgetName === 'text') {\n const textarea = nodeContainer.querySelector('textarea');\n if (textarea) {\n inputElement = textarea;\n console.log(`[Lora Manager] Found textarea for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n }\n } else {\n // For other widgets, find input within widget containers\n const widgetContainers = nodeContainer.querySelectorAll('.lg-node-widget');\n for (const container of widgetContainers) {\n const input = container.querySelector('input:not([type=\"checkbox\"]), textarea');\n if (input) {\n inputElement = input;\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via data-node-id`);\n break;\n }\n }\n }\n }\n\n // PRIORITY 2: Fallback - heuristic search using widget containers\n if (!inputElement) {\n const allWidgetContainers = document.querySelectorAll('.lg-node-widget, .dom-widget');\n\n for (const container of allWidgetContainers) {\n const hasInput = !!container.querySelector('input, textarea');\n if (!hasInput) continue;\n\n const textContent = container.textContent.toLowerCase();\n const containsWidgetName = textContent.includes(widgetName.toLowerCase());\n const containsNodeTitle = textContent.includes(node.title?.toLowerCase() || '');\n\n // For text widgets, check if it's a textarea\n const isTextareaWidget = widgetName === 'text' && container.querySelector('textarea');\n\n if (containsWidgetName || containsNodeTitle || isTextareaWidget) {\n inputElement = container.querySelector('input, textarea');\n console.log(`[Lora Manager] Found input element for widget \"${widgetName}\" on node ${nodeId} via heuristic`);\n break;\n }\n }\n }\n\n if (inputElement) {\n resolve(inputElement);\n } else if (attempt < maxAttempts) {\n setTimeout(() => searchForInput(attempt + 1).then(resolve), searchInterval);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${widgetName}\" on node ${nodeId} after ${maxAttempts} attempts`);\n resolve(null);\n }\n };\n doSearch();\n });\n };\n\n return searchForInput();\n}\n\n/**\n * Initialize autocomplete for an input widget and setup cleanup\n * @param {Object} node - The node instance\n * @param {Object} inputWidget - The input widget to add autocomplete to\n * @param {Function} originalCallback - The original callback function\n * @param {string} [modelType='loras'] - The model type used by the autocomplete API\n * @param {Object} [autocompleteOptions] - Additional options for the autocomplete instance\n * @returns {Function} Enhanced callback function with autocomplete\n */\nexport function setupInputWidgetWithAutocomplete(node, inputWidget, originalCallback, modelType = 'loras', autocompleteOptions = {}) {\n const defaultOptions = {\n maxItems: 20,\n minChars: 1,\n debounceDelay: 200,\n };\n const mergedOptions = { ...defaultOptions, ...autocompleteOptions };\n\n setupAutocompleteCleanup(node);\n\n // Track rendering mode changes per node\n let lastVueNodesMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n\n const initializeAutocomplete = async () => {\n if (node.autocomplete) {\n console.log(`[Lora Manager] Autocomplete already initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n return;\n }\n\n try {\n let inputElement = null;\n\n // PRIORITY 1: Always prefer widget.inputEl if it exists (even if not yet in DOM)\n // This is the authoritative element created by ComfyUI\n if (inputWidget.inputEl) {\n inputElement = inputWidget.inputEl;\n // If not yet in DOM, wait for it to be added\n if (!document.body.contains(inputElement)) {\n console.log(`[Lora Manager] widget.inputEl exists but not in DOM yet, waiting for node ${node.id}`);\n const maxWait = 1000; // 1 second max\n const checkInterval = 50;\n let waited = 0;\n while (!document.body.contains(inputElement) && waited < maxWait) {\n await new Promise(r => setTimeout(r, checkInterval));\n waited += checkInterval;\n }\n if (!document.body.contains(inputElement)) {\n console.warn(`[Lora Manager] widget.inputEl still not in DOM after ${maxWait}ms for node ${node.id}`);\n inputElement = null; // Fall through to DOM search\n }\n }\n if (inputElement) {\n console.log(`[Lora Manager] Using widget.inputEl for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n }\n\n // PRIORITY 2: DOM search only if widget.inputEl doesn't exist\n if (!inputElement) {\n console.log(`[Lora Manager] Searching DOM for input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n inputElement = await findWidgetInputElement(node, inputWidget);\n }\n\n if (inputElement) {\n const autocomplete = new AutoComplete(inputElement, modelType, mergedOptions);\n node.autocomplete = autocomplete;\n console.log(`[Lora Manager] Autocomplete initialized for widget \"${inputWidget.name}\" on node ${node.id}`);\n } else {\n console.warn(`[Lora Manager] Could not find input element for widget \"${inputWidget.name}\" on node ${node.id}`);\n }\n } catch (error) {\n console.error('[Lora Manager] Error initializing autocomplete:', error);\n }\n };\n\n const checkAndInvalidateAutocomplete = () => {\n // Check for rendering mode change\n const currentMode = typeof LiteGraph !== 'undefined' ? LiteGraph.vueNodesMode : false;\n if (currentMode !== lastVueNodesMode) {\n lastVueNodesMode = currentMode;\n if (node.autocomplete) {\n console.log(`[Lora Manager] Rendering mode changed, reinitializing autocomplete for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n }\n return true;\n }\n\n // Check if existing autocomplete's input element is still valid\n if (node.autocomplete) {\n const currentInputEl = node.autocomplete.inputElement;\n if (!currentInputEl || !document.body.contains(currentInputEl)) {\n console.log(`[Lora Manager] Autocomplete element detached, reinitializing for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if autocomplete is bound to wrong element (different from widget.inputEl)\n // Only do this check if widget.inputEl is actually in the DOM - it may be stale\n if (inputWidget.inputEl && document.body.contains(inputWidget.inputEl) && currentInputEl !== inputWidget.inputEl) {\n console.log(`[Lora Manager] Autocomplete bound to wrong element, rebinding for node ${node.id}`);\n node.autocomplete.destroy();\n node.autocomplete = null;\n return true;\n }\n\n // Check if events need rebinding (element exists but events not bound)\n // This can happen when Vue moves the element in the DOM\n if (node.autocomplete.needsRebind()) {\n console.log(`[Lora Manager] Autocomplete events need rebinding for node ${node.id}`);\n node.autocomplete.rebindEvents();\n }\n }\n\n return false;\n };\n\n const enhancedCallback = (value) => {\n // Check validity and invalidate if needed\n checkAndInvalidateAutocomplete();\n\n if (!node.autocomplete) {\n initializeAutocomplete();\n }\n\n if (typeof originalCallback === \"function\") {\n originalCallback.call(node, value);\n }\n };\n\n return enhancedCallback;\n}\n\n/**\n * Setup autocomplete cleanup when node is removed\n * @param {Object} node - The node instance\n */\nexport function setupAutocompleteCleanup(node) {\n // Override onRemoved to cleanup autocomplete\n const originalOnRemoved = node.onRemoved;\n node.onRemoved = function() {\n if (this.autocomplete) {\n this.autocomplete.destroy();\n this.autocomplete = null;\n }\n \n if (originalOnRemoved) {\n originalOnRemoved.call(this);\n }\n };\n}\n\n/**\n * Forward middle mouse (button 1) pointer events from a container to the ComfyUI canvas,\n * so that workflow panning works even when the pointer is over a DOM widget.\n * @param {HTMLElement} container - The root DOM element of the widget\n */\nexport function forwardMiddleMouseToCanvas(container) {\n if (!container) return;\n // Forward pointerdown\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseDown(event);\n }\n });\n // Forward pointermove\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n app.canvas.processMouseMove(event);\n }\n });\n // Forward pointerup\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n app.canvas.processMouseUp(event);\n }\n });\n}\n\n/**\n * Forward wheel events from a container to the ComfyUI canvas for zooming,\n * unless the container has scrollable content.\n * This allows canvas zoom to work when hovering over DOM widgets.\n * @param {HTMLElement} container - The root DOM element of the widget\n * @param {Object} options - Configuration options\n * @param {boolean} options.captureWheel - If true, always capture wheel events (default: false)\n */\nexport function forwardWheelToCanvas(container, options = {}) {\n if (!container) return;\n\n const { captureWheel = false } = options;\n\n container.addEventListener('wheel', (event) => {\n // If explicitly capturing wheel (for internal scrolling), stop here\n if (captureWheel) {\n event.stopPropagation();\n return;\n }\n\n // Access ComfyUI app from global window\n const comfyApp = window.app;\n if (!comfyApp || !comfyApp.canvas || typeof comfyApp.canvas.processMouseWheel !== 'function') {\n return;\n }\n\n const deltaX = event.deltaX;\n const deltaY = event.deltaY;\n const isHorizontal = Math.abs(deltaX) > Math.abs(deltaY);\n\n // 1. Handle pinch-to-zoom (ctrlKey is true for pinch-to-zoom on most browsers)\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 2. Horizontal scroll: pass to canvas (widgets usually don't scroll horizontally)\n if (isHorizontal) {\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n return;\n }\n\n // 3. Vertical scrolling: check if container is scrollable\n const canScrollY = container.scrollHeight > container.clientHeight;\n\n if (canScrollY) {\n // Container is scrollable, let it handle the wheel event but stop propagation\n // to prevent the canvas from zooming while the user is trying to scroll\n event.stopPropagation();\n } else {\n // Container is NOT scrollable, forward the wheel event to the canvas\n // so it can trigger zoom in/out\n event.preventDefault();\n event.stopPropagation();\n comfyApp.canvas.processMouseWheel(event);\n }\n }, { passive: false });\n}\n\n// Marks scrollable containers whose wheel scrolling must win over canvas zoom.\nconst LM_WHEEL_CLASS = 'lm-wheel-scrollable';\nlet lmWheelHookInstalled = false;\n\n/**\n * Keep vertical wheel scrolling inside a scrollable widget container, even in\n * Nodes 2.0 / Vue mode where ComfyUI's wheel→zoom handler runs on the document\n * in the capture phase (outer than any container-level listener).\n * Installs a single capture-phase hook on `window` (the outermost dispatch\n * point). When the wheel is over a marked, scrollable element, we manually\n * scroll it and fully consume the event so canvas zoom never sees it.\n */\nexport function enableListWheelScroll(container) {\n if (!container) return;\n container.classList.add(LM_WHEEL_CLASS);\n\n if (lmWheelHookInstalled) return;\n lmWheelHookInstalled = true;\n\n window.addEventListener('wheel', (event) => {\n // Let pinch/zoom and horizontal gestures pass through.\n if (event.ctrlKey) return;\n if (Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n\n const target = event.target;\n if (!target || typeof target.closest !== 'function') return;\n const el = target.closest(`.${LM_WHEEL_CLASS}`);\n if (!el) return;\n\n const canScrollY = el.scrollHeight > el.clientHeight + 1;\n if (!canScrollY) return;\n\n // Translate deltaMode to approximate pixels.\n const unit = event.deltaMode === 1 ? 16\n : event.deltaMode === 2 ? el.clientHeight\n : 1;\n\n el.scrollTop += event.deltaY * unit;\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n }, { capture: true, passive: false });\n}\n\n// Get connected Lora Pool node from pool_config input\nexport function getConnectedPoolConfigNode(node) {\n if (!node?.inputs) {\n return null;\n }\n\n for (const input of node.inputs) {\n if (input.name !== \"pool_config\" || !input.link) {\n continue;\n }\n\n const link = getLinkFromGraph(node.graph, input.link);\n if (!link) {\n continue;\n }\n\n const sourceNode = node.graph?.getNodeById?.(link.origin_id);\n if (sourceNode && sourceNode.comfyClass === \"Lora Pool (LoraManager)\") {\n return sourceNode;\n }\n }\n\n return null;\n}\n\n// Get pool config widget value from connected Lora Pool node\nexport function getPoolConfigFromConnectedNode(node) {\n const poolNode = getConnectedPoolConfigNode(node);\n if (!poolNode) {\n return null;\n }\n\n const isNodeActive = poolNode.mode === undefined || poolNode.mode === 0 || poolNode.mode === 3;\n if (!isNodeActive) {\n return null;\n }\n\n const poolWidget = poolNode.widgets?.find(w => w.name === \"pool_config\");\n return poolWidget?.value || null;\n}\n\n// Helper function to find and update downstream Lora Loader nodes\nexport function updateDownstreamLoaders(startNode, visited = new Set()) {\n const nodeKey = getNodeKey(startNode);\n if (!nodeKey || visited.has(nodeKey)) return;\n visited.add(nodeKey);\n\n // Check each output link\n if (startNode.outputs) {\n for (const output of startNode.outputs) {\n if (output.links) {\n for (const linkId of output.links) {\n const link = getLinkFromGraph(startNode.graph, linkId);\n if (link) {\n const targetNode = startNode.graph?.getNodeById?.(link.target_id);\n\n // If target is a Lora Loader, collect all active loras in the chain and update\n if (\n targetNode &&\n targetNode.comfyClass === \"Lora Loader (LoraManager)\"\n ) {\n const allActiveLoraNames =\n collectActiveLorasFromChain(targetNode);\n updateConnectedTriggerWords(targetNode, allActiveLoraNames);\n }\n // If target is another LORA_STACK chain node, recursively check its outputs\n else if (targetNode && isLoraChainNode(targetNode.comfyClass)) {\n updateDownstreamLoaders(targetNode, visited);\n }\n }\n }\n }\n }\n }\n}\n","/**\n * Mode change handler for LoRA provider nodes.\n *\n * Provides common mode change logic for nodes that provide LoRA configurations:\n * - Lora Stacker (LoraManager)\n * - Lora Randomizer (LoraManager)\n * - Lora Cycler (LoraManager)\n */\n\n// @ts-ignore\nimport { interceptModeChange } from '../../web/comfyui/utils.js'\n\n/**\n * List of node types that act as LoRA providers in the workflow chain.\n * These nodes can be traversed when collecting active LoRAs and can trigger\n * downstream loader updates when their mode or active LoRAs change.\n */\nexport const LORA_PROVIDER_NODE_TYPES = [\n \"Lora Stacker (LoraManager)\",\n \"Lora Randomizer (LoraManager)\",\n \"Lora Cycler (LoraManager)\",\n \"Create Hook LoRA (LoraManager)\",\n] as const;\n\n/**\n * Nodes that do not own LoRA state themselves, but merge or forward LORA_STACK\n * inputs so downstream trigger-word updates must traverse through them.\n */\nexport const LORA_STACK_AGGREGATOR_NODE_TYPES = [\n \"Lora Stack Combiner (LoraManager)\",\n] as const;\n\nexport const LORA_CHAIN_NODE_TYPES = [\n ...LORA_PROVIDER_NODE_TYPES,\n ...LORA_STACK_AGGREGATOR_NODE_TYPES,\n] as const;\n\nexport type LoraProviderNodeType = typeof LORA_PROVIDER_NODE_TYPES[number];\nexport type LoraStackAggregatorNodeType = typeof LORA_STACK_AGGREGATOR_NODE_TYPES[number];\nexport type LoraChainNodeType = typeof LORA_CHAIN_NODE_TYPES[number];\n\n/**\n * Check if a node class is a LoRA provider node.\n */\nexport function isLoraProviderNode(comfyClass: string): comfyClass is LoraProviderNodeType {\n return LORA_PROVIDER_NODE_TYPES.includes(comfyClass as LoraProviderNodeType);\n}\n\nexport function isLoraStackAggregatorNode(\n comfyClass: string\n): comfyClass is LoraStackAggregatorNodeType {\n return LORA_STACK_AGGREGATOR_NODE_TYPES.includes(comfyClass as LoraStackAggregatorNodeType);\n}\n\nexport function isLoraChainNode(comfyClass: string): comfyClass is LoraChainNodeType {\n return LORA_CHAIN_NODE_TYPES.includes(comfyClass as LoraChainNodeType);\n}\n\n/**\n * Extract active LoRA filenames from a node based on its type.\n *\n * For Lora Stacker and Lora Randomizer: extracts from lorasWidget (array of loras, filtered by active)\n * For Lora Cycler: extracts from cycler_config widget (single current_lora_filename)\n */\nexport function getActiveLorasFromNodeByType(node: any): Set {\n const comfyClass = node?.comfyClass;\n\n if (comfyClass === \"Lora Cycler (LoraManager)\") {\n return extractFromCyclerConfig(node);\n }\n\n if (isLoraStackAggregatorNode(comfyClass)) {\n return new Set();\n }\n\n // Default: use lorasWidget (works for Stacker and Randomizer)\n return extractFromLorasWidget(node);\n}\n\n/**\n * Extract active LoRAs from a node's lorasWidget.\n * Used by Lora Stacker and Lora Randomizer.\n */\nfunction extractFromLorasWidget(node: any): Set {\n const activeLoraNames = new Set();\n const lorasWidget = node.lorasWidget || node.widgets?.find((w: any) => w.name === 'loras');\n\n if (lorasWidget?.value) {\n lorasWidget.value.forEach((lora: any) => {\n if (lora.active) {\n activeLoraNames.add(lora.name);\n }\n });\n }\n\n return activeLoraNames;\n}\n\n/**\n * Extract the active LoRA from a Lora Cycler node.\n * The Cycler has only one active LoRA at a time, stored in cycler_config.current_lora_filename.\n */\nfunction extractFromCyclerConfig(node: any): Set {\n const activeLoraNames = new Set();\n const cyclerWidget = node.widgets?.find((w: any) => w.name === 'cycler_config');\n\n if (cyclerWidget?.value?.current_lora_filename) {\n activeLoraNames.add(cyclerWidget.value.current_lora_filename);\n }\n\n return activeLoraNames;\n}\n\n/**\n * Check if a mode value represents an active node.\n * Active modes: 0 (Always), 3 (On Trigger)\n * Inactive modes: 2 (Never), 4 (Bypass)\n */\nexport function isNodeActive(mode: number | undefined): boolean {\n return mode === undefined || mode === 0 || mode === 3;\n}\n\n/**\n * Setup a mode change handler for a node.\n *\n * Delegates to `interceptModeChange`, which observes the mode property\n * without shadowing the frontend's own `mode` accessor. Since ComfyUI\n * frontend 1.53, `mode` is backed by shell state (`node._state.mode`) that\n * serialization reads directly — redefining the property on the instance\n * would silently revert bypass/mute on save/reload.\n *\n * @param node - The node to set up the handler for\n * @param onModeChange - Callback function called when mode changes (receives newMode and oldMode)\n */\nexport function setupModeChangeHandler(\n node: any,\n onModeChange: (newMode: number, oldMode: number) => void\n): void {\n interceptModeChange(node, onModeChange);\n}\n\n/**\n * Create a mode change callback that updates downstream loaders.\n *\n * This is the standard callback used by all LoRA provider nodes.\n * When mode changes:\n * 1. Determine if the node is active (mode 0 or 3)\n * 2. Get active LoRAs (empty set if inactive)\n * 3. Call the optional node-specific callback (e.g., updateConnectedTriggerWords for Stacker)\n * 4. Update downstream loaders\n *\n * @param node - The node instance\n * @param updateDownstreamLoaders - Function to update downstream loaders (from utils.js)\n * @param nodeSpecificCallback - Optional callback for node-specific behavior\n */\nexport function createModeChangeCallback(\n node: any,\n updateDownstreamLoaders: (node: any) => void,\n nodeSpecificCallback?: (activeLoraNames: Set) => void\n): (newMode: number, oldMode: number) => void {\n return (newMode: number, _oldMode: number) => {\n const isNodeCurrentlyActive = isNodeActive(newMode);\n const activeLoraNames = isNodeCurrentlyActive\n ? getActiveLorasFromNodeByType(node)\n : new Set();\n\n // Node-specific handling (e.g., Lora Stacker's direct trigger toggle updates)\n if (nodeSpecificCallback) {\n nodeSpecificCallback(activeLoraNames);\n }\n\n // Always update downstream loaders\n updateDownstreamLoaders(node);\n };\n}\n","import { createApp, type App as VueApp } from 'vue'\nimport PrimeVue from 'primevue/config'\nimport LoraPoolWidget from '@/components/LoraPoolWidget.vue'\nimport LoraRandomizerWidget from '@/components/LoraRandomizerWidget.vue'\nimport LoraCyclerWidget from '@/components/LoraCyclerWidget.vue'\nimport JsonDisplayWidget from '@/components/JsonDisplayWidget.vue'\nimport AutocompleteTextWidget from '@/components/AutocompleteTextWidget.vue'\nimport LoraInfoWidget from '@/components/LoraInfoWidget.vue'\nimport { createVueWidgetCleanup } from './vue-widget-cleanup'\nimport type { LoraPoolConfig, RandomizerConfig, CyclerConfig } from './composables/types'\nimport {\n setupModeChangeHandler,\n createModeChangeCallback,\n LORA_CHAIN_NODE_TYPES\n} from './mode-change-handler'\n\nconst LORA_POOL_WIDGET_MIN_WIDTH = 500\nconst LORA_POOL_WIDGET_MIN_HEIGHT = 520\nconst LORA_RANDOMIZER_WIDGET_MIN_WIDTH = 500\nconst LORA_RANDOMIZER_WIDGET_MIN_HEIGHT = 448\nconst LORA_RANDOMIZER_WIDGET_MAX_HEIGHT = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\nconst LORA_CYCLER_WIDGET_MIN_WIDTH = 380\nconst LORA_CYCLER_WIDGET_MIN_HEIGHT = 408\nconst LORA_CYCLER_WIDGET_MAX_HEIGHT = LORA_CYCLER_WIDGET_MIN_HEIGHT\nconst JSON_DISPLAY_WIDGET_MIN_WIDTH = 300\nconst JSON_DISPLAY_WIDGET_MIN_HEIGHT = 200\nconst LORA_INFO_WIDGET_MIN_WIDTH = 300\nconst LORA_INFO_WIDGET_MIN_HEIGHT = 200\nconst AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT = 60\nconst AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT = 100\n// Per-modelType min size hints for node initial sizing.\n// These are returned from the factory so ComfyUI's _initialMinSize mechanism\n// gives the node a sensible default width (and height for prompt/embeddings).\nconst AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT = 400\nconst AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT = 300\nconst AUTOCOMPLETE_METADATA_VERSION = 1\nconst LORA_MANAGER_WIDGET_IDS_PROPERTY = '__lm_widget_ids'\n\n// Access LiteGraph global for Vue DOM mode detection (matches AutocompleteTextWidget.vue)\ndeclare const LiteGraph: { vueNodesMode?: boolean } | undefined\n\n// @ts-ignore - ComfyUI external module\nimport { app } from '../../../scripts/app.js'\n// @ts-ignore - ComfyUI external module\nimport { api } from '../../../scripts/api.js'\n// @ts-ignore\nimport { getPoolConfigFromConnectedNode, getActiveLorasFromNode, updateConnectedTriggerWords, updateDownstreamLoaders } from '../../web/comfyui/utils.js'\n// @ts-ignore\nimport { stripAutocompleteMetadataFromPromptResult } from '../../web/comfyui/autocomplete.js'\n\n// Strip the autocomplete lastAccepted boundary from exported workflows.\n// lastAccepted carries old prompt text (insertedText/textSnapshot) and is\n// session-only state; it must not leak into exported JSON (#1093).\n// graphToPrompt is shared by workflow export, Export API and queueing.\n// Local saves go through the change-tracker snapshot (no graphToPrompt) and\n// are intentionally left untouched so cross-session caret continuity is kept.\n// Post-processing the resolved result avoids any window/race with\n// change-tracker or copy/paste serialization of live state.\nconst originalGraphToPrompt = app.graphToPrompt.bind(app)\napp.graphToPrompt = async (...args: unknown[]) => {\n const result = await originalGraphToPrompt(...args)\n stripAutocompleteMetadataFromPromptResult(result)\n return result\n}\n\nfunction forwardMiddleMouseToCanvas(container: HTMLElement) {\n if (!container) return\n\n container.addEventListener('pointerdown', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseDown === 'function') {\n canvas.processMouseDown(event)\n }\n }\n })\n\n container.addEventListener('pointermove', (event) => {\n if ((event.buttons & 4) === 4) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseMove === 'function') {\n canvas.processMouseMove(event)\n }\n }\n })\n\n container.addEventListener('pointerup', (event) => {\n if (event.button === 1) {\n const canvas = app.canvas\n if (canvas && typeof canvas.processMouseUp === 'function') {\n canvas.processMouseUp(event)\n }\n }\n })\n}\n\nconst vueApps = new Map()\nlet autocompleteTextWidgetInstanceId = 0\n\nexport function createAutocompleteTextWidgetInstanceId() {\n autocompleteTextWidgetInstanceId += 1\n return autocompleteTextWidgetInstanceId\n}\n\n// @ts-ignore\nfunction createLoraPoolWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-pool-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: LoraPoolConfig | undefined\n\n const widget = node.addDOMWidget(\n 'pool_config',\n 'LORA_POOL_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: LoraPoolConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n // Keep LM DOM widgets out of the right-side Properties Panel: the panel\n // falls back to WidgetLegacy for unknown widget types and writes\n // widget.width onto the real widget, squashing the canvas overlay\n // (ComfyUI_frontend #11574).\n hideInPanel: true,\n // Per dev guide: providing getMinHeight via options allows the system to\n // skip expensive DOM measurements during rendering loop, improving performance\n getMinHeight() {\n return LORA_POOL_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraPoolWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id, vueApp)\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_POOL_WIDGET_MIN_WIDTH\n const minHeight = LORA_POOL_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraRandomizerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-randomizer-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n // Initialize with default config to avoid sending undefined/empty string to backend\n const defaultConfig: RandomizerConfig = {\n count_mode: 'range',\n count_fixed: 3,\n count_min: 2,\n count_max: 5,\n model_strength_min: 0.0,\n model_strength_max: 1.0,\n use_same_clip_strength: true,\n clip_strength_min: 0.0,\n clip_strength_max: 1.0,\n roll_mode: 'fixed',\n use_recommended_strength: false,\n recommended_strength_scale_min: 0.5,\n recommended_strength_scale_max: 1.0,\n }\n let internalValue: RandomizerConfig = defaultConfig\n\n const widget = node.addDOMWidget(\n 'randomizer_config',\n 'RANDOMIZER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: RandomizerConfig) {\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n // Handle roll event from Vue component\n widget.onRoll = (randomLoras: any[]) => {\n // Find the loras widget on this node and update it\n const lorasWidget = node.widgets.find((w: any) => w.name === 'loras')\n if (lorasWidget) {\n lorasWidget.value = randomLoras\n }\n }\n\n const vueApp = createApp(LoraRandomizerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 10000, vueApp) // Offset to avoid collision with pool widget\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_RANDOMIZER_WIDGET_MIN_WIDTH\n const minHeight = LORA_RANDOMIZER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_RANDOMIZER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 10000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 10000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createLoraCyclerWidget(node) {\n const container = document.createElement('div')\n container.id = `lora-cycler-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n const defaultConfig: CyclerConfig = {\n current_index: 1,\n total_count: 0,\n pool_config_hash: '',\n model_strength: 1.0,\n clip_strength: 1.0,\n use_same_clip_strength: true,\n use_preset_strength: false,\n preset_strength_scale: 1.0,\n sort_by: 'filename',\n current_lora_name: '',\n current_lora_filename: '',\n repeat_count: 1,\n repeat_used: 0,\n is_paused: false,\n include_no_lora: false,\n }\n let internalValue: CyclerConfig | undefined = defaultConfig\n\n const widget = node.addDOMWidget(\n 'cycler_config',\n 'CYCLER_CONFIG',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: CyclerConfig) {\n const oldFilename = internalValue?.current_lora_filename\n internalValue = v\n // ComfyUI automatically calls widget.callback after setValue\n // No need for custom onSetValue mechanism\n // Update downstream loaders when the active LoRA filename changes\n if (oldFilename !== v?.current_lora_filename) {\n updateDownstreamLoaders(node)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_CYCLER_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n // Add method to get pool config from connected node\n node.getPoolConfig = () => getPoolConfigFromConnectedNode(node)\n\n const vueApp = createApp(LoraCyclerWidget, {\n widget,\n node,\n api\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 30000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_CYCLER_WIDGET_MIN_WIDTH\n const minHeight = LORA_CYCLER_WIDGET_MIN_HEIGHT\n const maxHeight = LORA_CYCLER_WIDGET_MAX_HEIGHT\n\n return { minHeight, minWidth, maxHeight }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 30000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 30000)\n }\n }\n\n return { widget }\n}\n\n// @ts-ignore\nfunction createJsonDisplayWidget(node) {\n const container = document.createElement('div')\n container.id = `json-display-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: Record | undefined\n\n const widget = node.addDOMWidget(\n 'metadata',\n 'JSON_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: Record) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: false, // Display-only widget - don't save metadata in workflows\n hideInPanel: true,\n getMinHeight() {\n return JSON_DISPLAY_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(JsonDisplayWidget, {\n widget,\n node\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 20000, vueApp) // Offset to avoid collision with other widgets\n\n widget.computeLayoutSize = () => {\n const minWidth = JSON_DISPLAY_WIDGET_MIN_WIDTH\n const minHeight = JSON_DISPLAY_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 20000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 20000)\n }\n }\n\n return { widget }\n}\n\nconst widgetInputOptions: Map = new Map()\n\nfunction getSerializableWidgetNames(node: any): string[] {\n return (node.widgets || [])\n .filter((widget: any) => widget && widget.serialize !== false)\n .map((widget: any) => widget.name)\n}\n\nfunction createAutocompleteMetadataValue(textWidgetName = 'text') {\n return {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName\n }\n}\n\nfunction shouldBypassAutocompleteWidgetMigration(\n node: any,\n widgetValues: unknown[]\n): boolean {\n const inputDefs = node?.constructor?.nodeData?.inputs\n if (!inputDefs || !Array.isArray(widgetValues)) {\n return false\n }\n\n const widgetNames = new Set((node.widgets || []).map((widget: any) => widget?.name))\n const hasAutocompleteMetadataWidget = Array.from(widgetNames).some((name) =>\n typeof name === 'string' && name.startsWith('__lm_autocomplete_meta_')\n )\n\n if (!hasAutocompleteMetadataWidget) {\n return false\n }\n\n const originalWidgetsInputs = Object.values(inputDefs).filter((input: any) =>\n widgetNames.has(input.name) || input.forceInput\n )\n\n const widgetIndexHasForceInput = originalWidgetsInputs.flatMap((input: any) =>\n input.control_after_generate\n ? [!!input.forceInput, false]\n : [!!input.forceInput]\n )\n\n const result = (\n widgetIndexHasForceInput.some(Boolean) &&\n widgetIndexHasForceInput.length === widgetValues.length\n )\n\n return result\n}\n\nfunction remapWidgetValuesByName(\n widgetValues: unknown[],\n savedWidgetNames: string[],\n currentWidgetNames: string[]\n): unknown[] {\n const valueByName = new Map()\n savedWidgetNames.forEach((name, index) => {\n if (index < widgetValues.length) {\n valueByName.set(name, widgetValues[index])\n }\n })\n\n const currentWidgetNameSet = new Set(currentWidgetNames)\n const remappedValues: unknown[] = []\n for (const name of currentWidgetNames) {\n if (valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n // Append values for saved widget names that are NOT in the current widget\n // list (e.g. forceInput widgets like \"seed\" that haven't been converted\n // back to DOM widgets yet at configure time). Without these, the\n // resulting array may accidentally match the length of ComfyUI's\n // widgetIndexHasForceInput array, causing migrateWidgetsValues to\n // incorrectly filter out the wrong values and drop real widget content.\n for (const name of savedWidgetNames) {\n if (!currentWidgetNameSet.has(name) && valueByName.has(name)) {\n remappedValues.push(valueByName.get(name))\n }\n }\n\n return remappedValues\n}\n\nfunction injectDefaultAutocompleteMetadataValues(\n widgetValues: unknown[],\n currentWidgetNames: string[]\n): unknown[] {\n const repairedValues: unknown[] = []\n let legacyValueIndex = 0\n\n for (const widgetName of currentWidgetNames) {\n if (widgetName.startsWith('__lm_autocomplete_meta_')) {\n const textWidgetName = widgetName.replace('__lm_autocomplete_meta_', '') || 'text'\n repairedValues.push(createAutocompleteMetadataValue(textWidgetName))\n continue\n }\n\n if (legacyValueIndex < widgetValues.length) {\n repairedValues.push(widgetValues[legacyValueIndex])\n legacyValueIndex++\n }\n }\n\n return repairedValues\n}\n\nfunction normalizeAutocompleteWidgetValues(node: any, info: any) {\n if (!info || !Array.isArray(info.widgets_values)) {\n return\n }\n\n const currentWidgetNames = getSerializableWidgetNames(node)\n\n if (currentWidgetNames.length === 0) {\n return\n }\n\n const savedWidgetNames = info.properties?.[LORA_MANAGER_WIDGET_IDS_PROPERTY]\n\n if (Array.isArray(savedWidgetNames) && savedWidgetNames.length > 0) {\n const remappedValues = remapWidgetValuesByName(\n info.widgets_values,\n savedWidgetNames,\n currentWidgetNames\n )\n info.widgets_values = remappedValues\n return\n }\n\n const metadataWidgetCount = currentWidgetNames.filter((name) =>\n name.startsWith('__lm_autocomplete_meta_')\n ).length\n\n if (\n metadataWidgetCount > 0 &&\n info.widgets_values.length === currentWidgetNames.length - metadataWidgetCount\n ) {\n const repairedValues = injectDefaultAutocompleteMetadataValues(\n info.widgets_values,\n currentWidgetNames\n )\n info.widgets_values = repairedValues\n }\n}\n\nfunction applyAutocompleteTextLayoutFix(\n widget: any,\n _container: HTMLElement | undefined,\n isVueMode: boolean\n): void {\n // In Vue rendering mode the WidgetDOM wrapper handles sizing, so we\n // only provide a computeSize hint and leave the container unconstrained.\n // In canvas mode we clear all custom sizing so LiteGraph's default\n // widget-area layout takes over. Neither path sets a hard max-height;\n // the textarea can grow freely (e.g. in app mode where\n // [&_textarea]:resize-y applies).\n if (isVueMode) {\n ;(widget as any).computeLayoutSize = undefined\n widget.computeSize = (width?: number) =>\n [width ?? 200, AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT - 4]\n } else {\n delete (widget as any).computeLayoutSize\n delete (widget as any).computeSize\n }\n}\n\n// Listen for Vue DOM mode setting changes and dispatch custom event\nconst initVueDomModeListener = () => {\n if (app.ui?.settings?.addEventListener) {\n app.ui.settings.addEventListener('Comfy.VueNodes.Enabled.change', () => {\n // Use requestAnimationFrame to ensure the setting value has been updated\n // before we read it (the event may fire before internal state updates)\n requestAnimationFrame(() => {\n const isVueDomMode = app.ui?.settings?.getSettingValue?.('Comfy.VueNodes.Enabled') ?? false\n\n if (app.graph?.nodes) {\n for (const node of app.graph.nodes) {\n const textWidget = node.widgets?.find(\n (w: any) => w.type === 'AUTOCOMPLETE_TEXT_LORAS'\n )\n if (!textWidget) continue\n const container = (textWidget as any).element as HTMLElement | undefined\n applyAutocompleteTextLayoutFix(textWidget, container, isVueDomMode)\n }\n }\n\n requestAnimationFrame(() => {\n for (const nodeEl of document.querySelectorAll('[data-node-id]')) {\n const grid = nodeEl.querySelector('[data-testid=\"node-widgets\"]') as HTMLElement | null\n if (!grid) continue\n const nodeId = nodeEl.getAttribute('data-node-id')\n const node = app.graph?.getNodeById(nodeId as any)\n if (!node) continue\n const rows: string[] = []\n let needsFix = false\n for (const w of node.widgets ?? []) {\n if (w.type === 'LORA_MANAGER_AUTOCOMPLETE_METADATA') {\n rows.push('min-content')\n } else if (w.name === 'loras') {\n rows.push('auto')\n } else if (w.name === 'text' && w.type === 'AUTOCOMPLETE_TEXT_LORAS') {\n rows.push(isVueDomMode ? 'min-content' : 'auto')\n needsFix = true\n } else {\n rows.push('auto')\n }\n }\n if (needsFix) {\n grid.style.gridTemplateRows = rows.join(' ')\n }\n }\n })\n\n app.canvas?.setDirty(true, true)\n\n document.dispatchEvent(new CustomEvent('lora-manager:vue-mode-change', {\n detail: { isVueDomMode }\n }))\n })\n })\n }\n}\n\n// Initialize listener when app is ready\nif (app.ui?.settings) {\n initVueDomModeListener()\n} else {\n // Defer until app is ready\n const checkAppReady = setInterval(() => {\n if (app.ui?.settings) {\n initVueDomModeListener()\n clearInterval(checkAppReady)\n }\n }, 100)\n}\n\n// @ts-ignore\nfunction createLoraInfoWidget(node: any) {\n const container = document.createElement('div')\n container.id = `lora-info-widget-${node.id}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n\n forwardMiddleMouseToCanvas(container)\n\n let internalValue: { name?: string; notes?: string; filePath?: string; activeTab?: string } | undefined\n\n const widget = node.addDOMWidget(\n 'lora_info_display',\n 'LORA_INFO_DISPLAY',\n container,\n {\n getValue() {\n return internalValue\n },\n setValue(v: { name?: string; notes?: string; filePath?: string; activeTab?: string }) {\n internalValue = v\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v)\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return LORA_INFO_WIDGET_MIN_HEIGHT\n }\n }\n )\n\n const vueApp = createApp(LoraInfoWidget, {\n widget,\n node,\n api,\n app,\n isVueMode: typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode,\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n vueApps.set(node.id + 40000, vueApp) // Offset to avoid collision\n\n widget.computeLayoutSize = () => {\n const minWidth = LORA_INFO_WIDGET_MIN_WIDTH\n const minHeight = LORA_INFO_WIDGET_MIN_HEIGHT\n\n return { minHeight, minWidth }\n }\n\n widget.onRemove = () => {\n const vueApp = vueApps.get(node.id + 40000)\n if (vueApp) {\n vueApp.unmount()\n vueApps.delete(node.id + 40000)\n }\n }\n\n return { widget }\n}\n\n// Factory function for creating autocomplete text widgets\n// @ts-ignore\nfunction createAutocompleteTextWidgetFactory(\n node: any,\n widgetName: string,\n modelType: 'loras' | 'prompt',\n inputOptions: { placeholder?: string } = {}\n) {\n const metadataWidgetName = `__lm_autocomplete_meta_${widgetName}`\n\n let container: HTMLElement | null = null\n\n const existingContainers = document.querySelectorAll(\n '[id^=\"autocomplete-text-widget-\"]'\n )\n for (const el of existingContainers) {\n if (el.children.length === 0) {\n container = el\n break\n }\n }\n\n if (!container) {\n const instanceId = String(createAutocompleteTextWidgetInstanceId())\n container = document.createElement('div')\n container.id = `autocomplete-text-widget-${instanceId}`\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.flexDirection = 'column'\n container.style.overflow = 'hidden'\n forwardMiddleMouseToCanvas(container)\n }\n\n // Store textarea reference on the container element so cloned widgets can access it\n // This is necessary because when widgets are promoted to subgraph nodes,\n // the cloned widget shares the same element but needs access to inputEl\n const widgetElementRef = { inputEl: undefined as HTMLTextAreaElement | undefined }\n ;(container as any).__widgetInputEl = widgetElementRef\n\n const metadataWidget = node.addWidget('text', metadataWidgetName, {\n version: AUTOCOMPLETE_METADATA_VERSION,\n textWidgetName: widgetName\n })\n metadataWidget.value = createAutocompleteMetadataValue(widgetName)\n metadataWidget.type = 'LORA_MANAGER_AUTOCOMPLETE_METADATA'\n metadataWidget.hidden = true\n metadataWidget.computeSize = () => [0, -4]\n metadataWidget.serializeValue = () => metadataWidget.value\n\n const widget = node.addDOMWidget(\n widgetName,\n `AUTOCOMPLETE_TEXT_${modelType.toUpperCase()}`,\n container,\n {\n getValue() {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n return inputEl?.value ?? ''\n },\n setValue(v: string) {\n // Access inputEl from widget or from the shared element reference\n const inputEl = widget.inputEl ?? (container as any).__widgetInputEl?.inputEl\n if (inputEl) {\n inputEl.value = v ?? ''\n // Notify Vue component of value change via custom event\n inputEl.dispatchEvent(new CustomEvent('lora-manager:autocomplete-value-changed', {\n detail: { value: v ?? '' }\n }))\n } else {\n ;(widget as any)._pendingValue = v ?? ''\n }\n // Also call onSetValue if defined (for Vue component integration)\n if (typeof widget.onSetValue === 'function') {\n widget.onSetValue(v ?? '')\n }\n },\n serialize: true,\n hideInPanel: true,\n getMinHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT\n },\n ...(modelType === 'loras' && {\n getMaxHeight() {\n return AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT\n }\n })\n }\n )\n widget.metadataWidget = metadataWidget\n\n // Get spellcheck setting from ComfyUI settings (default: false)\n const spellcheck = app.ui?.settings?.getSettingValue?.('Comfy.TextareaWidget.Spellcheck') ?? false\n\n const maxHeight = modelType === 'loras' ? AUTOCOMPLETE_TEXT_WIDGET_MAX_HEIGHT : undefined\n\n const vueApp = createApp(AutocompleteTextWidget, {\n widget,\n node,\n modelType,\n placeholder: inputOptions.placeholder || widgetName,\n showPreview: true,\n spellcheck,\n maxHeight\n })\n\n vueApp.use(PrimeVue, {\n unstyled: true,\n ripple: false\n })\n\n vueApp.mount(container)\n const appKey = container.id\n vueApps.set(appKey, vueApp)\n\n if (maxHeight) {\n container.style.minHeight = `${AUTOCOMPLETE_TEXT_WIDGET_MIN_HEIGHT}px`\n }\n\n if (modelType === 'loras') {\n applyAutocompleteTextLayoutFix(\n widget,\n container,\n typeof LiteGraph !== 'undefined' && LiteGraph.vueNodesMode === true\n )\n }\n\n const vueCleanup = createVueWidgetCleanup(vueApp, () => {\n vueApps.delete(appKey)\n })\n\n widget.onRemove = () => {\n vueCleanup()\n }\n\n // Return minWidth/minHeight hints so ComfyUI's _initialMinSize mechanism\n // sets a sensible initial node width (and height for prompt/embeddings).\n // loras modelType retains its existing height constraints (getMaxHeight: 100).\n const minWidth = AUTOCOMPLETE_TEXT_MIN_WIDTH_DEFAULT\n const minHeight = modelType === 'loras' ? undefined : AUTOCOMPLETE_TEXT_MIN_HEIGHT_DEFAULT\n\n return { widget, minWidth, minHeight }\n}\n\napp.registerExtension({\n name: 'LoraManager.VueWidgets',\n\n getCustomWidgets() {\n return {\n // @ts-ignore\n LORA_POOL_CONFIG(node) {\n return createLoraPoolWidget(node)\n },\n // @ts-ignore\n RANDOMIZER_CONFIG(node) {\n return createLoraRandomizerWidget(node)\n },\n // @ts-ignore\n CYCLER_CONFIG(node) {\n return createLoraCyclerWidget(node)\n },\n // Autocomplete text widget for LoRAs (used by Lora Loader, Lora Stacker, WanVideo Lora Select)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_LORAS(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'loras', options)\n },\n // Autocomplete text widget for prompt (used by Prompt and Text nodes)\n // @ts-ignore\n AUTOCOMPLETE_TEXT_PROMPT(node) {\n const options = widgetInputOptions.get(`${node.comfyClass}:text`) || {}\n return createAutocompleteTextWidgetFactory(node, 'text', 'prompt', options)\n },\n }\n },\n\n // Add display-only widget to Debug Metadata node\n // Register mode change handlers for LoRA provider nodes\n // Extract and store input options for autocomplete widgets\n // @ts-ignore\n async beforeRegisterNodeDef(nodeType, nodeData) {\n const comfyClass = nodeType.comfyClass\n const inputs = { ...nodeData.input?.required, ...nodeData.input?.optional }\n let hasAutocompleteWidget = false\n\n // Extract and store input options for autocomplete widgets\n for (const [inputName, inputDef] of Object.entries(inputs)) {\n // @ts-ignore\n if (Array.isArray(inputDef) && typeof inputDef[0] === 'string' && inputDef[0].startsWith('AUTOCOMPLETE_TEXT_')) {\n // @ts-ignore\n const options = inputDef[1] || {}\n widgetInputOptions.set(`${nodeData.name}:${inputName}`, options)\n hasAutocompleteWidget = true\n }\n }\n\n if (hasAutocompleteWidget) {\n const originalOnSerialize = nodeType.prototype.onSerialize\n const originalConfigure = nodeType.prototype.configure\n\n nodeType.prototype.onSerialize = function (serialized: any) {\n originalOnSerialize?.apply(this, arguments)\n\n serialized.properties = serialized.properties || {}\n const widgetIds = getSerializableWidgetNames(this)\n serialized.properties[LORA_MANAGER_WIDGET_IDS_PROPERTY] = widgetIds\n }\n\n nodeType.prototype.configure = function (info: any) {\n normalizeAutocompleteWidgetValues(this, info)\n\n const bypassResult = shouldBypassAutocompleteWidgetMigration(this, info?.widgets_values ?? [])\n\n if (bypassResult) {\n info.widgets_values = [...(info.widgets_values ?? []), null]\n }\n\n return originalConfigure?.apply(this, arguments)\n }\n }\n\n // Register mode change handlers for LORA_STACK chain nodes\n if (LORA_CHAIN_NODE_TYPES.includes(comfyClass)) {\n const originalOnNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n originalOnNodeCreated?.apply(this, arguments)\n\n // Create node-specific callback for Lora Stacker (updates direct trigger toggles)\n const nodeSpecificCallback = comfyClass === \"Lora Stacker (LoraManager)\"\n ? (activeLoraNames: Set) => updateConnectedTriggerWords(this, activeLoraNames)\n : undefined\n\n // Create and set up the mode change handler\n const onModeChange = createModeChangeCallback(this, updateDownstreamLoaders, nodeSpecificCallback)\n setupModeChangeHandler(this, onModeChange)\n }\n }\n\n // Add the JSON display widget to Debug Metadata node\n if (nodeData.name === 'Debug Metadata (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Add the JSON display widget\n createJsonDisplayWidget(this)\n }\n }\n\n // Add the Lora Info display widget\n if (nodeData.name === 'Lora Info (LoraManager)') {\n const onNodeCreated = nodeType.prototype.onNodeCreated\n\n nodeType.prototype.onNodeCreated = function () {\n onNodeCreated?.apply(this, [])\n\n // Create the lora info display widget\n createLoraInfoWidget(this)\n }\n }\n }\n})\n"],"names":["i","hasOwnProperty","c","s","a","b","isRef","v","_a","l","computed","self","readonly","watch","effect","p","callHook","remove","ref","h","m","createApp","app","isModelListener","emit","remove2","style","setup","tt","resolve","d","camelize$1","k","ie","ae","N","$","Y","ot","P","$e","J","ut","mt","se","St","yt","Ee","xt","bt","_t","y","T","z","_","re","K","A","G","H","ee","he","Oe","kt","we","_typeof","o","ownKeys","r","_objectSpread","_defineProperty","_toPropertyKey","_toPrimitive","css","isClient","document","stop","load","_id","setAttributes","setAttribute","unload","isExist","dt","css$1","isNotEmpty","minifyCSS","Theme","extend","EventBus","PrimeVue","ThemeService","loadCommonTheme","global","mergeKeys","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_1","_toDisplayString","_openBlock","_hoisted_2","$emit","_createVNode","_hoisted_3","_hoisted_4","_hoisted_5","_Fragment","_renderList","_createBlock","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_14","_hoisted_15","_Transition","_Teleport","$slots","_renderSlot","_withModifiers","_e","api","_unref","percent","_normalizeStyle","_hoisted_13","_hoisted_16","_hoisted_17","_hoisted_18","w","lorasWidget","_createTextVNode","defaultOptions","_withDirectives","LORA_MANAGER_WIDGET_IDS_PROPERTY","LORA_PROVIDER_NODE_TYPES","LORA_STACK_AGGREGATOR_NODE_TYPES","LORA_CHAIN_NODE_TYPES","isLoraStackAggregatorNode","isNodeActive","updateDownstreamLoaders","vueApp","_b"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13]} \ No newline at end of file From 7d071ab3aa4b8edc58ab506b1344d2418e2683fc Mon Sep 17 00:00:00 2001 From: Will Miao Date: Wed, 28 Oct 2026 16:47:11 +0800 Subject: [PATCH 02/13] feat(workflows): accept zip/png/webp artifacts with derived workflow documents Library entries are the original artifact bytes (SHA256 = CivitAI identity); container artifacts (.zip, .png, .webp) get their extracted workflow document materialized as a *.workflow.json sidecar that follows rename/move/delete. - workflow_extraction: json direct-read, zip candidate pick, png/webp metadata - scanner whitelist extended; non-workflow files rejected; adjust_metadata fills analysis fields for downloaded entries; image artifacts self-preview - download_manager: workflow branch end-to-end, no zip unpacking, file selection prefers primary then json/zip/image - lifecycle: delete/rename/pending-delete carry the derived document - send-to-comfy reads the derived document for container artifacts - fix: force_refresh with no cache falls back to full initialization (first scan before deferred background init no longer crashes) --- py/routes/workflow_routes.py | 16 +- py/services/download_manager.py | 109 ++++- py/services/model_lifecycle_service.py | 20 + py/services/model_scanner.py | 5 +- py/services/pending_delete_service.py | 9 + py/services/workflow_scanner.py | 75 +++- py/utils/constants.py | 3 + py/utils/exif_utils.py | 10 + py/utils/models.py | 5 +- py/utils/sidecar_paths.py | 2 + py/utils/workflow_analysis.py | 11 + py/utils/workflow_extraction.py | 202 +++++++++ tests/routes/test_workflow_routes.py | 31 ++ .../test_download_manager_workflows.py | 394 ++++++++++++++++++ .../services/test_model_lifecycle_service.py | 119 ++++++ tests/services/test_model_scanner.py | 17 + tests/services/test_workflow_scanner.py | 128 +++++- tests/utils/test_workflow_extraction.py | 200 +++++++++ 18 files changed, 1333 insertions(+), 23 deletions(-) create mode 100644 py/utils/workflow_extraction.py create mode 100644 tests/services/test_download_manager_workflows.py create mode 100644 tests/utils/test_workflow_extraction.py diff --git a/py/routes/workflow_routes.py b/py/routes/workflow_routes.py index cd278b10..fa334e6b 100644 --- a/py/routes/workflow_routes.py +++ b/py/routes/workflow_routes.py @@ -11,14 +11,11 @@ from ..config import config from ..services.model_lifecycle_service import _require_path_in_library_roots from ..services.service_registry import ServiceRegistry from ..services.workflow_service import WorkflowService -from ..utils.workflow_analysis import load_workflow_file +from ..utils.constants import WORKFLOW_CIVITAI_TYPES +from ..utils.workflow_extraction import load_artifact_workflow_document logger = logging.getLogger(__name__) -# CivitAI model types that map onto the workflow library (ComfyWorkflows is -# retired on CivitAI but grandfathered models still carry it). -WORKFLOW_CIVITAI_TYPES = frozenset({"workflows", "comfyworkflows"}) - class WorkflowRoutes(BaseModelRoutes): """Workflow-specific route controller (ComfyUI workflow JSON resources). @@ -201,7 +198,12 @@ class WorkflowRoutes(BaseModelRoutes): return payload if isinstance(payload, dict) else {} async def _load_workflow_payload(self, file_path: str): - """Read and validate the workflow document off the event loop.""" + """Read the extracted workflow document off the event loop. + + ``.json`` artifacts are read directly; containers (``.zip``/image + files) resolve to their derived ``.workflow.json`` sidecar, which is + materialized on demand when missing. + """ import asyncio - return await asyncio.to_thread(load_workflow_file, file_path) + return await asyncio.to_thread(load_artifact_workflow_document, file_path) diff --git a/py/services/download_manager.py b/py/services/download_manager.py index 26b3def0..5506fbfd 100644 --- a/py/services/download_manager.py +++ b/py/services/download_manager.py @@ -22,6 +22,7 @@ from ..utils.models import ( CheckpointMetadata, EmbeddingMetadata, OtherModelMetadata, + WorkflowMetadata, ) from ..utils.constants import ( CARD_PREVIEW_WIDTH, @@ -32,6 +33,7 @@ from ..utils.constants import ( SUPPORTED_MEDIA_EXTENSIONS, VALID_LORA_TYPES, VALID_OTHER_CIVITAI_TYPES, + WORKFLOW_CIVITAI_TYPES, ) from ..utils.civitai_utils import normalize_civitai_download_url, rewrite_preview_url from ..utils.paid_access import ( @@ -109,6 +111,18 @@ def _other_models_disabled_response() -> Dict[str, Any]: } +def _workflows_disabled_response() -> Dict[str, Any]: + """Structured rejection when Workflow management is turned off.""" + return { + "success": False, + "error": ( + "Workflow management is disabled. Enable it in " + "Settings > Library before downloading workflow files." + ), + "reason": "workflows_disabled", + } + + @dataclass class _PathSlot: lock: asyncio.Lock = field(default_factory=asyncio.Lock) @@ -400,6 +414,8 @@ class DownloadManager: return await ServiceRegistry.get_embedding_scanner() if model_type == "other": return await ServiceRegistry.get_other_scanner() + if model_type == "workflow": + return await ServiceRegistry.get_workflow_scanner() if model_type == "lora": return await self._get_lora_scanner() raise ValueError(f'Unknown model type "{model_type}"') @@ -486,6 +502,37 @@ class DownloadManager: return file_info + @staticmethod + def _select_workflow_download_file( + files: Any, + ) -> Optional[Dict[str, Any]]: + """Pick the workflow artifact within a workflow version's file list. + + Workflow versions ship no weight files, so the generic + primary/weights selection finds nothing. The ranking mirrors + CivitAI's own default pick for Workflow resources (a single-workflow + Config .json first, then an Archive .zip, then an image carrying an + embedded workflow), with CivitAI's primary flag breaking ties. + """ + + def rank(file_info: Dict[str, Any]) -> int: + name = str(file_info.get("name") or "").lower() + if name.endswith(".json"): + return 0 + if name.endswith(".zip"): + return 1 + if name.endswith((".png", ".webp")): + return 2 + return 3 + + candidates = [f for f in files or [] if isinstance(f, dict)] + if not candidates: + return None + candidates.sort( + key=lambda f: (not bool(f.get("primary")), rank(f), f.get("id") or 0) + ) + return candidates[0] + async def _find_local_file_entry( self, model_type: str, @@ -1196,6 +1243,8 @@ class DownloadManager: return EmbeddingMetadata.from_civitai_info(version_info, file_info, save_path) if model_type == "other": return OtherModelMetadata.from_civitai_info(version_info, file_info, save_path) + if model_type == "workflow": + return WorkflowMetadata.from_civitai_info(version_info, file_info, save_path) return LoraMetadata.from_civitai_info(version_info, file_info, save_path) def _resolve_save_path_from_persisted_record(self, record: Dict[str, Any]) -> Optional[str]: @@ -1708,6 +1757,17 @@ class DownloadManager: "error": "Model version already exists in other library", } + # Check workflow scanner (opt-in feature) + if get_settings_manager().is_workflows_enabled(): + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + if await workflow_scanner.check_model_version_exists( + model_version_id + ): + return { + "success": False, + "error": "Model version already exists in workflow library", + } + # Use CivArchive provider directly when source is 'civarchive' # This prioritizes CivArchive metadata (with mirror availability info) over Civitai if source == "civarchive": @@ -1823,6 +1883,10 @@ class DownloadManager: if not get_settings_manager().is_other_models_enabled(): return _other_models_disabled_response() model_type = "other" + elif model_type_from_info in WORKFLOW_CIVITAI_TYPES: + if not get_settings_manager().is_workflows_enabled(): + return _workflows_disabled_response() + model_type = "workflow" else: return { "success": False, @@ -2002,6 +2066,13 @@ class DownloadManager: "success": False, "error": "Model version already exists in other library", } + elif model_type == "workflow": + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + if await workflow_scanner.check_model_version_exists(version_id): + return { + "success": False, + "error": "Model version already exists in workflow library", + } # Handle use_default_paths if use_default_paths: @@ -2103,6 +2174,20 @@ class DownloadManager: "reason": reason, } save_dir = default_path + elif model_type == "workflow": + # Workflows have no default-root setting: the first + # configured workflow root is the download target. + workflow_scanner = await ServiceRegistry.get_workflow_scanner() + workflow_roots = workflow_scanner.get_model_roots() + if not workflow_roots: + return { + "success": False, + "error": ( + "No workflow folder configured. Add one in " + "Settings > Library before downloading workflows." + ), + } + save_dir = workflow_roots[0] # Calculate relative path using template relative_path = self._calculate_relative_path(version_info, model_type) @@ -2194,6 +2279,14 @@ class DownloadManager: ) # Fallback to primary file if no match found + if not file_info and model_type == "workflow": + file_info = self._select_workflow_download_file(files) + if file_info: + logger.debug( + "[download] Workflow file selected: id=%s, name=%s", + file_info.get("id"), file_info.get("name"), + ) + if not file_info: logger.debug("[download] Looking for primary file as fallback") # Prefer a weights-type file CivitAI marked primary; then any @@ -2335,6 +2428,11 @@ class DownloadManager: version_info, file_info, save_path ) logger.info(f"Creating OtherModelMetadata for {file_name}") + elif model_type == "workflow": + metadata = WorkflowMetadata.from_civitai_info( + version_info, file_info, save_path + ) + logger.info(f"Creating WorkflowMetadata for {file_name}") else: return { "success": False, @@ -2553,6 +2651,8 @@ class DownloadManager: scanner = await ServiceRegistry.get_embedding_scanner() elif model_type == "other": scanner = await ServiceRegistry.get_other_scanner() + elif model_type == "workflow": + scanner = await ServiceRegistry.get_workflow_scanner() except Exception as exc: logger.debug("Failed to acquire scanner for %s models: %s", model_type, exc) @@ -3023,7 +3123,11 @@ class DownloadManager: # 4. Handle archive extraction and prepare per-file metadata actual_file_paths = [save_path] - if zipfile.is_zipfile(save_path): + # Workflow downloads never extract archives: the zip IS the + # artifact, kept byte-identical so its SHA256 stays the CivitAI + # identity; the workflow document is materialized into a derived + # sidecar by the scanner instead. + if model_type != "workflow" and zipfile.is_zipfile(save_path): supported_extensions = self._get_supported_extensions_for_type( model_type ) @@ -3087,6 +3191,9 @@ class DownloadManager: elif model_type == "other": scanner = await ServiceRegistry.get_other_scanner() logger.info(f"Updating other-model cache for {actual_file_paths[0]}") + elif model_type == "workflow": + scanner = await ServiceRegistry.get_workflow_scanner() + logger.info(f"Updating workflow cache for {actual_file_paths[0]}") adjust_cached_entry = ( getattr(scanner, "adjust_cached_entry", None) diff --git a/py/services/model_lifecycle_service.py b/py/services/model_lifecycle_service.py index b6a3fb4c..e170fb24 100644 --- a/py/services/model_lifecycle_service.py +++ b/py/services/model_lifecycle_service.py @@ -14,6 +14,7 @@ from ..services.pending_delete_service import get_pending_delete_service from ..utils.constants import PREVIEW_EXTENSIONS from ..utils.metadata_manager import MetadataManager from ..utils.sidecar_paths import get_metadata_path, get_preview_dir, get_sidecar_dir +from ..utils.workflow_extraction import WORKFLOW_DOCUMENT_SUFFIX logger = logging.getLogger(__name__) @@ -55,20 +56,28 @@ async def delete_model_artifacts( model_path = os.path.join(target_dir, main_file) sidecar_dir = get_sidecar_dir(model_path) patterns = [os.path.basename(get_metadata_path(model_path))] + # Derived workflow document (workflow artifacts only; absent elsewhere). + patterns.append(f"{file_name}{WORKFLOW_DOCUMENT_SUFFIX}") for ext in PREVIEW_EXTENSIONS: patterns.append(f"{file_name}{ext}") deleted: List[str] = [] main_path = model_path.replace(os.sep, "/") + deleted_paths: set[str] = set() if os.path.exists(main_path): os.remove(main_path) deleted.append(main_path) + deleted_paths.add(os.path.normcase(os.path.abspath(main_path))) else: logger.warning("Model file not found: %s", main_file) for pattern in patterns: path = os.path.join(sidecar_dir, pattern) + # The model file can double as its own preview (workflow image + # artifacts); never delete the same path twice. + if os.path.normcase(os.path.abspath(path)) in deleted_paths: + continue if os.path.exists(path): try: os.remove(path) @@ -467,14 +476,24 @@ class ModelLifecycleService: (target_dir, f"{old_file_name}{old_extension}"), (sidecar_dir, metadata_filename), (sidecar_dir, f"{metadata_filename}.bak"), + # Derived workflow document (workflow artifacts only). + (sidecar_dir, f"{old_file_name}{WORKFLOW_DOCUMENT_SUFFIX}"), ] for ext in PREVIEW_EXTENSIONS: patterns.append((sidecar_dir, f"{old_file_name}{ext}")) existing_files: List[tuple[str, str]] = [] + seen_paths: set[str] = set() for pattern_dir, pattern in patterns: path = os.path.join(pattern_dir, pattern) + # An image workflow artifact doubles as its own preview: the same + # path then appears under both the main-file and preview patterns + # and must only be renamed once. + dedupe_key = os.path.normcase(os.path.abspath(path)) + if dedupe_key in seen_paths: + continue if os.path.exists(path): + seen_paths.add(dedupe_key) existing_files.append((path, pattern)) metadata_path = get_metadata_path(file_path) @@ -585,6 +604,7 @@ class ModelLifecycleService: known_suffixes = [ ".metadata.json.bak", ".metadata.json", + WORKFLOW_DOCUMENT_SUFFIX, ".safetensors", *PREVIEW_EXTENSIONS, ] diff --git a/py/services/model_scanner.py b/py/services/model_scanner.py index 2c1122ff..857535eb 100644 --- a/py/services/model_scanner.py +++ b/py/services/model_scanner.py @@ -1869,7 +1869,10 @@ class ModelScanner: # If force refresh is requested, initialize the cache directly if force_refresh: - if rebuild_cache: + # A reconcile diffs against the existing cache; when there is no + # cache yet (e.g. a scan fired while background initialization is + # still deferred), a full initialization is the only option. + if rebuild_cache or self._cache is None: self._last_reconcile_summary = None await self._initialize_cache() else: diff --git a/py/services/pending_delete_service.py b/py/services/pending_delete_service.py index 38b77376..b9c914b8 100644 --- a/py/services/pending_delete_service.py +++ b/py/services/pending_delete_service.py @@ -39,6 +39,7 @@ from typing import ( from ..utils.constants import PREVIEW_EXTENSIONS from ..utils.sidecar_paths import get_metadata_path, get_sidecar_dir +from ..utils.workflow_extraction import WORKFLOW_DOCUMENT_SUFFIX from ..utils import settings_paths logger = logging.getLogger(__name__) @@ -706,12 +707,20 @@ class PendingDeleteService: # alongside mode, the centralized mirror otherwise). sidecar_dir = get_sidecar_dir(model_path) patterns = [os.path.basename(get_metadata_path(model_path))] + # Derived workflow document (workflow artifacts only; absent elsewhere). + patterns.append(f"{file_name}{WORKFLOW_DOCUMENT_SUFFIX}") for ext in PREVIEW_EXTENSIONS: patterns.append(f"{file_name}{ext}") + seen = {os.path.normcase(main_path)} for pattern in patterns: path = os.path.abspath(os.path.join(sidecar_dir, pattern)) + # An image workflow artifact doubles as its own preview: it then + # matches both the main file and a preview pattern — stage it once. + if os.path.normcase(path) in seen: + continue if os.path.exists(path): + seen.add(os.path.normcase(path)) artifacts.append(path) return artifacts diff --git a/py/services/workflow_scanner.py b/py/services/workflow_scanner.py index 5c2dd367..349a8f5b 100644 --- a/py/services/workflow_scanner.py +++ b/py/services/workflow_scanner.py @@ -1,4 +1,4 @@ -"""Scanner for ComfyUI workflow resources (.json graph documents).""" +"""Scanner for ComfyUI workflow resources (.json documents and containers).""" from __future__ import annotations @@ -17,29 +17,39 @@ from ..utils.metadata_manager import MetadataManager from ..utils.models import WorkflowMetadata from ..utils.sidecar_paths import get_preview_dir from ..utils.workflow_analysis import analyze_workflow_file +from ..utils.workflow_extraction import ( + IMAGE_CONTAINER_EXTENSIONS, + WORKFLOW_ARTIFACT_EXTENSIONS, + WORKFLOW_DOCUMENT_SUFFIX, + materialize_workflow_document, +) from .model_hash_index import ModelHashIndex from .model_scanner import ModelScanner logger = logging.getLogger(__name__) # Sidecar files share the .json extension; they must never enter the library. -_SIDECAR_SUFFIXES = (".metadata.json",) +_SIDECAR_SUFFIXES = (".metadata.json", WORKFLOW_DOCUMENT_SUFFIX) class WorkflowScanner(ModelScanner): - """Scan and manage ComfyUI workflow JSON files. + """Scan and manage ComfyUI workflow artifacts. - Unlike weight files, workflow JSON is cheap to hash (eager SHA256) and its - "metadata" comes from parsing the graph itself rather than a safetensors - header. Non-workflow JSON documents (settings, sidecars, ...) are rejected - by format sniffing and never enter the cache. + Library entries are the original uploaded files, kept byte-identical so + their SHA256 stays the CivitAI identity (by-hash lookup and version + tracking depend on it). ``.json`` artifacts carry the graph directly; + ``.zip``/``.png``/``.webp`` containers get the workflow document + extracted into a derived ``.workflow.json`` sidecar that every consumer + (graph analysis, send-to-ComfyUI) reads. Files from which no workflow + document can be extracted never enter the library — this keeps settings + JSON and plain preview images out. """ def __init__(self): super().__init__( model_type="workflow", model_class=WorkflowMetadata, - file_extensions={".json"}, + file_extensions=set(WORKFLOW_ARTIFACT_EXTENSIONS), hash_index=ModelHashIndex(), ) @@ -67,12 +77,45 @@ class WorkflowScanner(ModelScanner): unique_roots.append(root) return unique_roots + @staticmethod + def _is_image_artifact(file_path: str) -> bool: + return os.path.splitext(file_path)[1].lower() in IMAGE_CONTAINER_EXTENSIONS + + def adjust_metadata(self, metadata, file_path, root_path): + """Fill workflow analysis fields when they are missing. + + Runs on every scan and on the post-download path. The extraction + result is cached in the derived ``.workflow.json`` sidecar, so the + steady-state cost is one small JSON parse per entry whose analysis + fields have not been populated yet. + """ + if not isinstance(metadata, WorkflowMetadata) or metadata.workflow_format: + return metadata + try: + document_path = materialize_workflow_document(file_path) + analysis = ( + analyze_workflow_file(document_path) if document_path else None + ) + except Exception as exc: + logger.debug( + "Workflow analysis refresh failed for %s: %s", file_path, exc + ) + return metadata + if analysis is None: + return metadata + metadata.workflow_format = analysis.workflow_format + metadata.node_count = analysis.node_count + metadata.node_classes = analysis.node_classes + metadata.model_refs = analysis.model_refs + metadata.civitai_refs = analysis.civitai_refs + return metadata + async def _create_default_metadata( self, file_path: str ) -> Optional[WorkflowMetadata]: - """Create metadata by hashing the file and parsing the workflow graph. + """Create metadata by hashing the artifact and analyzing its workflow. - Returns None for JSON documents that are not ComfyUI workflows, so + Returns None for files that carry no ComfyUI workflow document, so they stay out of the library. """ try: @@ -81,13 +124,21 @@ class WorkflowScanner(ModelScanner): logger.error(f"File not found: {file_path}") return None - analysis = analyze_workflow_file(real_path) + document_path = materialize_workflow_document( + file_path, read_path=real_path + ) + analysis = ( + analyze_workflow_file(document_path) if document_path else None + ) if analysis is None: - logger.debug(f"Skipping non-workflow JSON: {file_path}") + logger.debug(f"Skipping artifact without a workflow: {file_path}") return None base_name = os.path.splitext(os.path.basename(file_path))[0] preview_url = find_preview_file(base_name, get_preview_dir(file_path)) + if not preview_url and self._is_image_artifact(file_path): + # An image artifact doubles as its own preview. + preview_url = file_path sha256 = await calculate_sha256(real_path) if not sha256: logger.warning( diff --git a/py/utils/constants.py b/py/utils/constants.py index c07e4752..d5046a7c 100644 --- a/py/utils/constants.py +++ b/py/utils/constants.py @@ -190,6 +190,9 @@ VALID_OTHER_CIVITAI_TYPES = { "controlnet", "other", } +# CivitAI model.type values that map onto the workflow library (lowercased). +# ComfyWorkflows is retired on CivitAI but grandfathered models still carry it. +WORKFLOW_CIVITAI_TYPES = frozenset({"workflows", "comfyworkflows"}) # CivitAI model.type -> internal sub_type for the "other" model page. CIVITAI_TYPE_TO_OTHER_SUB_TYPE = { "vae": "vae", diff --git a/py/utils/exif_utils.py b/py/utils/exif_utils.py index c88de9b4..24b237a8 100644 --- a/py/utils/exif_utils.py +++ b/py/utils/exif_utils.py @@ -161,6 +161,16 @@ class ExifUtils: return value return str(value) + @staticmethod + def load_structured_metadata(image_path: str) -> dict[str, Optional[str]]: + """Public wrapper for the structured-metadata reader. + + Returns a dict with ``parameters``/``prompt``/``workflow``/``comment`` + keys (values may be None). May raise on unreadable images; callers + that treat metadata as optional should catch exceptions. + """ + return ExifUtils._load_structured_metadata(image_path) + @staticmethod def _load_structured_metadata(image_path: str) -> dict[str, Optional[str]]: metadata: dict[str, Optional[str]] = { diff --git a/py/utils/models.py b/py/utils/models.py index 60b5443c..c911b4d7 100644 --- a/py/utils/models.py +++ b/py/utils/models.py @@ -513,7 +513,10 @@ class WorkflowMetadata(BaseModelMetadata): ) -> "WorkflowMetadata": """Create WorkflowMetadata instance from Civitai version info""" file_name = file_info.get("name", "") - base_name = strip_model_extension(file_name) + # Workflow artifacts are .json/.zip/.png/... — none of them weight + # extensions — so strip one real extension instead of consulting the + # weight-extension allowlist. + base_name = os.path.splitext(file_name)[0] base_model = determine_base_model(version_info.get("baseModel", "")) sha256_value = (file_info.get("hashes") or {}).get("SHA256", "").lower() diff --git a/py/utils/sidecar_paths.py b/py/utils/sidecar_paths.py index c2310e1a..981bfb05 100644 --- a/py/utils/sidecar_paths.py +++ b/py/utils/sidecar_paths.py @@ -205,10 +205,12 @@ def _iter_model_roots() -> List[str]: "base_models_roots", "embeddings_roots", "other_roots", + "workflows_roots", "extra_loras_roots", "extra_checkpoints_roots", "extra_unet_roots", "extra_embeddings_roots", + "extra_workflows_roots", ): value = getattr(config, attr, None) if value: diff --git a/py/utils/workflow_analysis.py b/py/utils/workflow_analysis.py index be8173b7..71505b19 100644 --- a/py/utils/workflow_analysis.py +++ b/py/utils/workflow_analysis.py @@ -83,6 +83,17 @@ def sniff_workflow_text(text: str) -> Optional[str]: return _sniff(data) +def parse_workflow_text(text: str) -> Optional[Dict[str, Any]]: + """Parse + sniff raw JSON text; return the document when it is a workflow.""" + try: + data = json.loads(text) + except (TypeError, ValueError): + return None + if _sniff(data) is None: + return None + return data + + def load_workflow_file(file_path: str) -> Optional[Dict[str, Any]]: """Load and sniff a workflow JSON file. diff --git a/py/utils/workflow_extraction.py b/py/utils/workflow_extraction.py new file mode 100644 index 00000000..90ad9f36 --- /dev/null +++ b/py/utils/workflow_extraction.py @@ -0,0 +1,202 @@ +"""Extraction of the ComfyUI workflow document from a library artifact. + +The workflow library keeps the original uploaded file byte-identical — its +SHA256 is the identity CivitAI hashed (by-hash lookup and version tracking +depend on it). Consumers (send-to-ComfyUI, graph analysis) work on the +extracted workflow document instead: + +- ``.json`` artifacts ARE the document; they are validated and read in place. +- ``.zip`` / ``.png`` / ``.webp`` containers get the document materialized + once into an LM-owned derived sidecar ``.workflow.json`` inside the + artifact's sidecar directory. Scanners exclude the suffix from the library + walk; lifecycle operations (move/rename/delete) carry it like any other + sidecar. +""" + +from __future__ import annotations + +import json +import logging +import os +import zipfile +from typing import Any, Dict, List, Optional + +from .sidecar_paths import get_sidecar_dir +from .workflow_analysis import ( + MAX_WORKFLOW_JSON_BYTES, + load_workflow_file, + parse_workflow_text, +) + +logger = logging.getLogger(__name__) + +WORKFLOW_DOCUMENT_SUFFIX = ".workflow.json" + +# Image containers whose metadata chunks can embed a ComfyUI workflow. +IMAGE_CONTAINER_EXTENSIONS = frozenset({".png", ".webp"}) + +# Every file type the workflow library accepts. +WORKFLOW_ARTIFACT_EXTENSIONS = frozenset({".json", ".zip"} | IMAGE_CONTAINER_EXTENSIONS) + +# Bounds for zip exploration: workflow archives are user uploads with no +# structural contract, so candidate discovery is capped rather than exhaustive. +_MAX_ZIP_JSON_CANDIDATES = 64 + + +def get_workflow_document_path(artifact_path: str) -> str: + """Return the path of the extracted workflow document for an artifact. + + ``.json`` artifacts are their own document; containers map to the + derived ``.workflow.json`` in the artifact's sidecar directory + (alongside the artifact or in the centralized mirror). + """ + + if os.path.splitext(artifact_path)[1].lower() == ".json": + return artifact_path + base_name = os.path.splitext(os.path.basename(artifact_path))[0] + return os.path.join( + get_sidecar_dir(artifact_path), base_name + WORKFLOW_DOCUMENT_SUFFIX + ) + + +def _zip_json_candidates(archive: zipfile.ZipFile) -> List[zipfile.ZipInfo]: + """Return the archive's plausible workflow documents, best first.""" + + candidates: List[zipfile.ZipInfo] = [] + for info in archive.infolist(): + if info.is_dir(): + continue + parts = info.filename.replace("\\", "/").split("/") + # Skip macOS resource forks and hidden files/directories. + if any(part == "__MACOSX" or part.startswith(".") for part in parts): + continue + if not parts[-1].lower().endswith(".json"): + continue + if info.file_size > MAX_WORKFLOW_JSON_BYTES: + continue + candidates.append(info) + if len(candidates) >= _MAX_ZIP_JSON_CANDIDATES: + break + # Prefer shallow, small documents: the workflow is typically the + # archive's headline content, not a bundled config deep in a subfolder. + candidates.sort(key=lambda info: (len(info.filename.split("/")), info.file_size)) + return candidates + + +def _extract_from_zip(archive_path: str) -> Optional[Dict[str, Any]]: + try: + with zipfile.ZipFile(archive_path, "r") as archive: + for info in _zip_json_candidates(archive): + try: + with archive.open(info) as handle: + raw = handle.read(MAX_WORKFLOW_JSON_BYTES + 1) + text = raw.decode("utf-8") + except (OSError, UnicodeDecodeError, zipfile.BadZipFile): + continue + document = parse_workflow_text(text) + if document is not None: + return document + except (OSError, zipfile.BadZipFile) as exc: + logger.debug("Workflow archive unreadable: %s (%s)", archive_path, exc) + return None + + +def _extract_from_image(image_path: str) -> Optional[Dict[str, Any]]: + # Local import: PIL/piexif are heavy and only needed for image artifacts. + from .exif_utils import ExifUtils + + try: + metadata = ExifUtils.load_structured_metadata(image_path) + except Exception as exc: + logger.debug("Workflow image metadata unreadable: %s (%s)", image_path, exc) + return None + # The UI-format document ("workflow") is what ComfyUI's loadGraphData + # consumes; fall back to the API-format "prompt" payload. + for key in ("workflow", "prompt"): + text = metadata.get(key) + if not text: + continue + document = parse_workflow_text(text) + if document is not None: + return document + return None + + +def extract_workflow_document(artifact_path: str) -> Optional[Dict[str, Any]]: + """Extract the ComfyUI workflow document from an artifact. + + Returns the parsed document when the artifact carries a recognizable + workflow, ``None`` otherwise (unreadable file, unknown extension, no + workflow inside). Never raises. + """ + + extension = os.path.splitext(artifact_path)[1].lower() + try: + if extension == ".json": + return load_workflow_file(artifact_path) + if extension == ".zip": + return _extract_from_zip(artifact_path) + if extension in IMAGE_CONTAINER_EXTENSIONS: + return _extract_from_image(artifact_path) + except Exception as exc: # defensive: extraction must never break a scan + logger.debug("Workflow extraction failed for %s: %s", artifact_path, exc) + return None + + +def materialize_workflow_document( + artifact_path: str, *, read_path: Optional[str] = None +) -> Optional[str]: + """Ensure the extracted workflow document exists on disk. + + Returns the document path, or ``None`` when the artifact carries no + recognizable workflow. ``.json`` artifacts are their own document (the + path is returned after validation; nothing is written). Containers get + the document written to the derived sidecar path; an up-to-date derived + file is reused without re-extracting. + + ``read_path`` overrides the path the artifact bytes are read from (the + scanner hashes/extracts via the real path while sidecar locations derive + from the business path). + """ + + read_path = read_path or artifact_path + + if os.path.splitext(artifact_path)[1].lower() == ".json": + return artifact_path if load_workflow_file(read_path) is not None else None + + document_path = get_workflow_document_path(artifact_path) + try: + if os.path.exists(document_path) and os.path.getmtime( + document_path + ) >= os.path.getmtime(read_path): + return document_path + except OSError: + pass + + document = extract_workflow_document(read_path) + if document is None: + return None + + try: + os.makedirs(os.path.dirname(document_path), exist_ok=True) + with open(document_path, "w", encoding="utf-8") as handle: + json.dump(document, handle, ensure_ascii=False) + except OSError as exc: + logger.warning( + "Failed to write workflow document %s: %s", document_path, exc + ) + return None + return document_path + + +def load_artifact_workflow_document(artifact_path: str) -> Optional[Dict[str, Any]]: + """Load the workflow document for a library artifact. + + Reads the derived sidecar for containers (materializing it on demand + when missing or stale) and the artifact itself for bare JSON. + """ + + document_path = materialize_workflow_document(artifact_path) + if document_path is None: + return None + return load_workflow_file(document_path) diff --git a/tests/routes/test_workflow_routes.py b/tests/routes/test_workflow_routes.py index 387b5778..19e372a3 100644 --- a/tests/routes/test_workflow_routes.py +++ b/tests/routes/test_workflow_routes.py @@ -331,3 +331,34 @@ async def test_send_to_comfy_accepts_get_with_query(routes, plugin_mode, tmp_pat payload = json.loads(response.text) assert payload == {"success": True, "sent": True} send_sync.assert_called_once() + + +async def test_send_to_comfy_reads_derived_document_for_zip(routes, plugin_mode, tmp_path, monkeypatch): + """Container artifacts send the extracted document, not the zip bytes.""" + import server + import zipfile + from types import SimpleNamespace + from unittest.mock import MagicMock + + send_sync = MagicMock() + monkeypatch.setattr( + server.PromptServer, "instance", SimpleNamespace(send_sync=send_sync) + ) + + root = tmp_path / "workflows" + root.mkdir() + workflow = {"1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}} + target = root / "pack.zip" + with zipfile.ZipFile(target, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + routes.service.scanner = StubScanner([str(root)]) + + response = await routes.send_to_comfy(DummyRequest(body={"file_path": str(target)})) + payload = json.loads(response.text) + + assert payload == {"success": True, "sent": True} + send_sync.assert_called_once_with( + "lm_load_workflow", {"workflow": workflow, "name": "pack"} + ) + # The extraction is cached as a derived sidecar document. + assert (root / "pack.workflow.json").exists() diff --git a/tests/services/test_download_manager_workflows.py b/tests/services/test_download_manager_workflows.py new file mode 100644 index 00000000..7f99bbb1 --- /dev/null +++ b/tests/services/test_download_manager_workflows.py @@ -0,0 +1,394 @@ +"""DownloadManager support for the "workflow" model type. + +Covers type routing (Workflows/ComfyWorkflows), the opt-in gate, existence +checks against the workflow scanner, the default save root, file selection +for weight-less workflow versions, and the rule that workflow archives are +kept byte-identical (never extracted). +""" + +import json +import zipfile +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import AsyncMock + +import pytest + +from py.services import aria2_transfer_state +from py.services import download_manager +from py.services.download_manager import DownloadManager +from py.services.service_registry import ServiceRegistry +from py.services.settings_manager import SettingsManager, get_settings_manager +from py.utils.models import WorkflowMetadata + + +@pytest.fixture(autouse=True) +def reset_download_manager(): + """Ensure each test operates on a fresh singleton.""" + DownloadManager._instance = None + yield + DownloadManager._instance = None + + +@pytest.fixture(autouse=True) +def isolate_settings(monkeypatch, tmp_path): + """Point settings writes at a temporary directory to avoid touching real files.""" + manager = get_settings_manager() + default_settings = manager._get_default_settings() + default_settings.update( + { + "enable_workflows": True, + "skip_previously_downloaded_model_versions": False, + "download_skip_base_models": [], + "download_path_templates": {}, + "download_filename_templates": {}, + } + ) + monkeypatch.setattr(manager, "settings", default_settings) + monkeypatch.setattr(SettingsManager, "_save_settings", lambda self: None) + + +@pytest.fixture(autouse=True) +def isolate_aria2_state(monkeypatch, tmp_path): + state_path = tmp_path / "cache" / "aria2" / "downloads.json" + monkeypatch.setattr( + aria2_transfer_state, + "get_aria2_state_path", + lambda: str(state_path), + ) + + +class DummyScanner: + def __init__(self, exists: bool = False, roots=None): + self.exists = exists + self.calls = [] + self._roots = list(roots or []) + self._cache = SimpleNamespace(raw_data=[]) + + async def check_model_version_exists(self, version_id): + self.calls.append(version_id) + return self.exists + + async def get_cached_data(self): + return self._cache + + def get_model_roots(self): + return list(self._roots) + + +@pytest.fixture +def scanners(monkeypatch): + lora_scanner = DummyScanner() + checkpoint_scanner = DummyScanner() + embedding_scanner = DummyScanner() + other_scanner = DummyScanner() + workflow_scanner = DummyScanner() + + monkeypatch.setattr( + ServiceRegistry, "get_lora_scanner", AsyncMock(return_value=lora_scanner) + ) + monkeypatch.setattr( + ServiceRegistry, + "get_checkpoint_scanner", + AsyncMock(return_value=checkpoint_scanner), + ) + monkeypatch.setattr( + ServiceRegistry, + "get_embedding_scanner", + AsyncMock(return_value=embedding_scanner), + ) + monkeypatch.setattr( + ServiceRegistry, + "get_other_scanner", + AsyncMock(return_value=other_scanner), + ) + monkeypatch.setattr( + ServiceRegistry, + "get_workflow_scanner", + AsyncMock(return_value=workflow_scanner), + ) + + return SimpleNamespace( + lora=lora_scanner, + checkpoint=checkpoint_scanner, + embedding=embedding_scanner, + other=other_scanner, + workflow=workflow_scanner, + ) + + +def _workflow_payload(civitai_type: str, *, files=None) -> dict: + return { + "id": 42, + "model": {"type": civitai_type, "tags": ["utility"], "name": "Flow"}, + "baseModel": "SDXL 1.0", + "creator": {"username": "Author"}, + "files": files + or [ + { + "id": 7, + "type": "Config", + "primary": True, + "downloadUrl": "https://example.invalid/flow.json", + "name": "flow.json", + "hashes": {"SHA256": "ab" * 32}, + } + ], + } + + +@pytest.fixture +def metadata_provider(monkeypatch): + class DummyProvider: + def __init__(self): + self.calls = [] + self.payload = _workflow_payload("Workflows") + + async def get_model_version(self, model_id, model_version_id): + self.calls.append((model_id, model_version_id)) + return self.payload + + provider = DummyProvider() + monkeypatch.setattr( + download_manager, + "get_default_metadata_provider", + AsyncMock(return_value=provider), + ) + return provider + + +def _capture_execute(monkeypatch, captured): + async def fake_execute_download(self, **kwargs): + captured.update(kwargs) + return {"success": True} + + monkeypatch.setattr( + DownloadManager, "_execute_download", fake_execute_download, raising=False + ) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("civitai_type", ["Workflows", "ComfyWorkflows"]) +async def test_download_accepts_workflow_model_types( + monkeypatch, scanners, metadata_provider, tmp_path, civitai_type +): + metadata_provider.payload = _workflow_payload(civitai_type) + + captured = {} + _capture_execute(monkeypatch, captured) + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is True + assert captured["model_type"] == "workflow" + assert isinstance(captured["metadata"], WorkflowMetadata) + assert captured["metadata"].file_name == "flow" + + +@pytest.mark.asyncio +async def test_download_rejects_workflows_when_feature_disabled( + monkeypatch, scanners, metadata_provider, tmp_path +): + manager_settings = get_settings_manager() + manager_settings.settings["enable_workflows"] = False + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is False + assert result["reason"] == "workflows_disabled" + + +@pytest.mark.asyncio +async def test_early_gate_checks_workflow_scanner( + monkeypatch, scanners, metadata_provider, tmp_path +): + scanners.workflow.exists = True + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is False + assert "workflow library" in result["error"] + assert 99 in scanners.workflow.calls + + +@pytest.mark.asyncio +async def test_early_gate_skips_workflow_scanner_when_disabled( + monkeypatch, scanners, metadata_provider, tmp_path +): + get_settings_manager().settings["enable_workflows"] = False + # Route the download to a non-workflow type so the run proceeds. + metadata_provider.payload = { + "id": 42, + "model": {"type": "LORA", "tags": []}, + "baseModel": "SDXL 1.0", + "files": [ + { + "type": "Model", + "primary": True, + "downloadUrl": "https://example.invalid/file.safetensors", + "name": "file.safetensors", + } + ], + } + + captured = {} + _capture_execute(monkeypatch, captured) + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, save_dir=str(tmp_path) + ) + + assert result["success"] is True + assert scanners.workflow.calls == [] + + +@pytest.mark.asyncio +async def test_default_paths_use_first_workflow_root( + monkeypatch, scanners, metadata_provider, tmp_path +): + workflow_root = tmp_path / "workflows" + workflow_root.mkdir() + scanners.workflow._roots = [str(workflow_root)] + + captured = {} + _capture_execute(monkeypatch, captured) + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, use_default_paths=True + ) + + assert result["success"] is True + assert captured["save_dir"] == str(workflow_root) + + +@pytest.mark.asyncio +async def test_default_paths_error_without_workflow_root( + monkeypatch, scanners, metadata_provider +): + scanners.workflow._roots = [] + + manager = DownloadManager() + result = await manager.download_from_civitai( + model_version_id=99, use_default_paths=True + ) + + assert result["success"] is False + assert "workflow folder" in result["error"] + + +@pytest.mark.asyncio +async def test_scanner_dispatch_resolves_workflow(monkeypatch, scanners): + manager = DownloadManager() + scanner = await manager._get_scanner_for_model_type("workflow") + assert scanner is scanners.workflow + + +def test_select_workflow_download_file_ranking(): + files = [ + {"id": 1, "type": "Other", "name": "notes.txt"}, + {"id": 2, "type": "Archive", "name": "pack.zip"}, + {"id": 3, "type": "Config", "name": "flow.json"}, + ] + selected = DownloadManager._select_workflow_download_file(files) + assert selected["name"] == "flow.json" + + # Without a JSON the archive wins; a primary flag breaks ties. + files = files[:2] + assert DownloadManager._select_workflow_download_file(files)["name"] == "pack.zip" + files[0]["primary"] = True + assert DownloadManager._select_workflow_download_file(files)["name"] == "notes.txt" + + assert DownloadManager._select_workflow_download_file([]) is None + + +def test_build_metadata_for_resume_uses_workflow_metadata(): + manager = DownloadManager() + metadata = manager._build_metadata_for_resume( + model_type="workflow", + version_info=_workflow_payload("Workflows"), + file_info={"name": "flow.zip", "hashes": {}}, + save_path="/tmp/flow.zip", + ) + assert isinstance(metadata, WorkflowMetadata) + assert metadata.file_name == "flow" + + +@pytest.mark.asyncio +async def test_workflow_download_keeps_zip_archive_intact( + monkeypatch, scanners, tmp_path +): + """A downloaded workflow zip is the library artifact: never extracted.""" + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {}}, + } + zip_path = tmp_path / "pack.zip" + with zipfile.ZipFile(zip_path, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + zip_bytes = zip_path.read_bytes() + + async def fake_download_file(self, url, save_path, **kwargs): + with open(save_path, "wb") as handle: + handle.write(zip_bytes) + return True, "" + + monkeypatch.setattr( + DownloadManager, "_download_model_file", fake_download_file, raising=False + ) + + added = [] + + class PipelineScanner: + def _find_root_for_file(self, file_path): + return None + + def adjust_metadata(self, metadata, file_path, root_path): + return metadata + + async def add_model_to_cache(self, metadata_dict, relative_path): + added.append(metadata_dict) + + monkeypatch.setattr( + ServiceRegistry, + "get_workflow_scanner", + AsyncMock(return_value=PipelineScanner()), + ) + + save_path = tmp_path / "pack_downloaded.zip" + metadata = WorkflowMetadata( + file_name="pack_downloaded", + model_name="pack_downloaded", + file_path=str(save_path), + size=0, + modified=0, + sha256="", + base_model="Unknown", + preview_url="", + ) + + manager = DownloadManager() + result = await manager._execute_download( + download_urls=["https://example.invalid/pack.zip"], + save_dir=str(tmp_path), + metadata=metadata, + version_info={"id": 42, "model": {"type": "Workflows"}, "images": []}, + relative_path="", + model_type="workflow", + ) + + assert result["success"] is True + # The archive is still there, unextracted, and no member files appeared. + assert save_path.exists() + assert save_path.read_bytes() == zip_bytes + assert not (tmp_path / "workflow.json").exists() + assert added and added[0]["file_path"].endswith("pack_downloaded.zip") diff --git a/tests/services/test_model_lifecycle_service.py b/tests/services/test_model_lifecycle_service.py index 7c9a35fd..bf89de0d 100644 --- a/tests/services/test_model_lifecycle_service.py +++ b/tests/services/test_model_lifecycle_service.py @@ -1080,3 +1080,122 @@ async def test_delete_model_falls_back_when_staging_fails( # staging parent, if left behind by the rollback, holds no data). staging_parent = root / PENDING_DELETE_DIR_NAME assert not staging_parent.exists() or not any(staging_parent.iterdir()) + + +@pytest.mark.asyncio +async def test_delete_model_artifacts_removes_derived_workflow_document(tmp_path: Path): + from py.services.model_lifecycle_service import delete_model_artifacts + + artifact = tmp_path / "pack.zip" + artifact.write_bytes(b"zip") + derived = tmp_path / "pack.workflow.json" + derived.write_text("{}", encoding="utf-8") + metadata = tmp_path / "pack.metadata.json" + metadata.write_text("{}", encoding="utf-8") + + deleted = await delete_model_artifacts( + str(tmp_path), "pack", main_extension=".zip" + ) + + assert not artifact.exists() + assert not derived.exists() + assert not metadata.exists() + assert any(str(name).endswith("pack.workflow.json") for name in deleted) + + +@pytest.mark.asyncio +async def test_delete_model_artifacts_image_artifact_deleted_once(tmp_path: Path): + """An image workflow artifact doubles as its own preview: same path.""" + from py.services.model_lifecycle_service import delete_model_artifacts + + artifact = tmp_path / "flow.png" + artifact.write_bytes(b"png") + + deleted = await delete_model_artifacts( + str(tmp_path), "flow", main_extension=".png" + ) + + assert not artifact.exists() + assert len(deleted) == len(set(deleted)) + + +@pytest.mark.asyncio +async def test_rename_model_carries_derived_workflow_document(tmp_path: Path): + old_name = "pack" + new_name = "pack-renamed" + + model_path = tmp_path / f"{old_name}.zip" + model_path.write_bytes(b"zip") + + derived = tmp_path / f"{old_name}.workflow.json" + derived.write_text("{}", encoding="utf-8") + + metadata_path = tmp_path / f"{old_name}.metadata.json" + metadata_payload = { + "file_name": old_name, + "file_path": model_path.as_posix(), + } + metadata_path.write_text(json.dumps(metadata_payload)) + + async def metadata_loader(path: str): + with open(path, "r", encoding="utf-8") as handle: + return json.load(handle) + + scanner = DummyScanner() + metadata_manager = PassthroughMetadataManager() + service = ModelLifecycleService( + scanner=scanner, + metadata_manager=metadata_manager, + metadata_loader=metadata_loader, + ) + + result = await service.rename_model( + file_path=model_path.as_posix(), + new_file_name=new_name, + ) + + assert (tmp_path / f"{new_name}.zip").exists() + assert (tmp_path / f"{new_name}.workflow.json").exists() + assert not derived.exists() + assert isinstance(result["new_file_path"], str) + assert result["new_file_path"].endswith(f"{new_name}.zip") + + +@pytest.mark.asyncio +async def test_rename_image_workflow_artifact_renames_main_file_once(tmp_path: Path): + """The image artifact matches both the main-file and a preview pattern.""" + old_name = "flow" + new_name = "flow-renamed" + + model_path = tmp_path / f"{old_name}.png" + model_path.write_bytes(b"png") + + metadata_path = tmp_path / f"{old_name}.metadata.json" + metadata_payload = { + "file_name": old_name, + "file_path": model_path.as_posix(), + "preview_url": model_path.as_posix(), + } + metadata_path.write_text(json.dumps(metadata_payload)) + + async def metadata_loader(path: str): + with open(path, "r", encoding="utf-8") as handle: + return json.load(handle) + + scanner = DummyScanner() + metadata_manager = PassthroughMetadataManager() + service = ModelLifecycleService( + scanner=scanner, + metadata_manager=metadata_manager, + metadata_loader=metadata_loader, + ) + + result = await service.rename_model( + file_path=model_path.as_posix(), + new_file_name=new_name, + ) + + assert (tmp_path / f"{new_name}.png").exists() + assert not model_path.exists() + renamed = result["renamed_files"] + assert len(renamed) == len(set(renamed)) diff --git a/tests/services/test_model_scanner.py b/tests/services/test_model_scanner.py index 2048b230..92b3b65f 100644 --- a/tests/services/test_model_scanner.py +++ b/tests/services/test_model_scanner.py @@ -268,6 +268,23 @@ async def test_initialize_cache_populates_cache(tmp_path: Path): assert sorted(cache.folders) == ["", "nested"] +@pytest.mark.asyncio +async def test_force_refresh_without_cache_falls_back_to_full_initialization(tmp_path: Path): + """A scan fired before background init has run has no cache to reconcile + against; it must initialize from scratch instead of crashing.""" + _create_files(tmp_path) + scanner = DummyScanner(tmp_path) + assert scanner._cache is None + + cache = await scanner.get_cached_data(force_refresh=True) + + assert scanner._cache is not None + assert {item["file_path"] for item in cache.raw_data} == { + _normalize_path(tmp_path / "one.txt"), + _normalize_path(tmp_path / "nested" / "two.txt"), + } + + @pytest.mark.asyncio async def test_initialize_cache_sync_returns_result_without_mutating_state(tmp_path: Path, monkeypatch): _create_files(tmp_path) diff --git a/tests/services/test_workflow_scanner.py b/tests/services/test_workflow_scanner.py index 11e6fea7..2d0ba308 100644 --- a/tests/services/test_workflow_scanner.py +++ b/tests/services/test_workflow_scanner.py @@ -48,7 +48,7 @@ def _make_scanner() -> WorkflowScanner: scanner = object.__new__(WorkflowScanner) scanner.model_type = "workflow" scanner.model_class = WorkflowMetadata - scanner.file_extensions = {".json"} + scanner.file_extensions = {".json", ".zip", ".png", ".webp"} return scanner @@ -72,6 +72,9 @@ def test_filename_filter_rejects_sidecars(enable_workflows): assert scanner._is_indexable_filename("flow.json") is True assert scanner._is_indexable_filename("flow.metadata.json") is False assert scanner._is_indexable_filename("FLOW.METADATA.JSON") is False + # The derived workflow document of a container artifact is also a sidecar. + assert scanner._is_indexable_filename("flow.workflow.json") is False + assert scanner._is_indexable_filename("FLOW.WORKFLOW.JSON") is False async def test_create_default_metadata_parses_workflow(workflow_root, enable_workflows, tmp_path): @@ -110,3 +113,126 @@ async def test_create_default_metadata_skips_sidecar(workflow_root, enable_workf scanner = _make_scanner() assert await scanner._create_default_metadata(str(file_path)) is None + + +async def test_create_default_metadata_from_zip_artifact(workflow_root, enable_workflows): + import zipfile + + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + } + file_path = workflow_root / "pack.zip" + with zipfile.ZipFile(file_path, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + archive.writestr("readme.txt", "hello") + + scanner = _make_scanner() + metadata = await scanner._create_default_metadata(str(file_path)) + + assert metadata is not None + assert metadata.file_name == "pack" + assert metadata.workflow_format == "api" + assert metadata.node_count == 1 + assert metadata.model_refs == ["base.safetensors"] + # The artifact is hashed, not the extracted document. + assert metadata.sha256 + + # The derived workflow document is materialized as a sidecar. + derived = workflow_root / "pack.workflow.json" + assert derived.exists() + assert json.loads(derived.read_text(encoding="utf-8")) == workflow + + +async def test_create_default_metadata_skips_zip_without_workflow(workflow_root, enable_workflows): + import zipfile + + file_path = workflow_root / "images.zip" + with zipfile.ZipFile(file_path, "w") as archive: + archive.writestr("note.txt", "no graphs here") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + assert not (workflow_root / "images.workflow.json").exists() + + +async def test_create_default_metadata_image_artifact_self_preview(workflow_root, enable_workflows): + PIL = pytest.importorskip("PIL.Image") + from py.utils.exif_utils import ExifUtils + + workflow = { + "nodes": [{"id": 1, "type": "CheckpointLoaderSimple"}], + "links": [], + } + file_path = workflow_root / "flow.png" + PIL.new("RGB", (8, 8)).save(file_path, format="PNG") + ExifUtils.embed_workflow(str(file_path), json.dumps(workflow)) + + scanner = _make_scanner() + metadata = await scanner._create_default_metadata(str(file_path)) + + assert metadata is not None + assert metadata.workflow_format == "ui" + # The image artifact doubles as its own preview. + assert metadata.preview_url.replace(os.sep, "/").endswith("flow.png") + + +async def test_create_default_metadata_plain_image_skipped(workflow_root, enable_workflows): + PIL = pytest.importorskip("PIL.Image") + + file_path = workflow_root / "preview.png" + PIL.new("RGB", (8, 8)).save(file_path, format="PNG") + + scanner = _make_scanner() + assert await scanner._create_default_metadata(str(file_path)) is None + + +def test_adjust_metadata_fills_missing_analysis(workflow_root, enable_workflows): + """Downloaded entries carry CivitAI metadata but no analysis fields yet.""" + import zipfile + + workflow = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + } + file_path = workflow_root / "downloaded.zip" + with zipfile.ZipFile(file_path, "w") as archive: + archive.writestr("workflow.json", json.dumps(workflow)) + + metadata = WorkflowMetadata( + file_name="downloaded", + model_name="downloaded", + file_path=_normalize(file_path), + size=file_path.stat().st_size, + modified=0, + sha256="abc", + base_model="Unknown", + preview_url="", + from_civitai=True, + ) + + scanner = _make_scanner() + adjusted = scanner.adjust_metadata(metadata, str(file_path), None) + + assert adjusted.workflow_format == "api" + assert adjusted.node_count == 1 + assert adjusted.model_refs == ["base.safetensors"] + assert (workflow_root / "downloaded.workflow.json").exists() + + +def test_adjust_metadata_keeps_populated_analysis(workflow_root, enable_workflows): + metadata = WorkflowMetadata( + file_name="flow", + model_name="flow", + file_path=_normalize(workflow_root / "flow.json"), + size=1, + modified=0, + sha256="abc", + base_model="Unknown", + preview_url="", + workflow_format="ui", + node_count=7, + ) + + scanner = _make_scanner() + adjusted = scanner.adjust_metadata(metadata, str(workflow_root / "flow.json"), None) + + assert adjusted.node_count == 7 # untouched: no re-extraction diff --git a/tests/utils/test_workflow_extraction.py b/tests/utils/test_workflow_extraction.py new file mode 100644 index 00000000..626538aa --- /dev/null +++ b/tests/utils/test_workflow_extraction.py @@ -0,0 +1,200 @@ +"""Tests for workflow document extraction from library artifacts.""" + +import json +import os +import zipfile + +import pytest + +from py.utils.workflow_extraction import ( + WORKFLOW_DOCUMENT_SUFFIX, + extract_workflow_document, + get_workflow_document_path, + load_artifact_workflow_document, + materialize_workflow_document, +) + +API_WORKFLOW = { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": "base.safetensors"}}, + "2": {"class_type": "LoraLoader", "inputs": {"lora_name": "lora.safetensors"}}, +} + +UI_WORKFLOW = { + "nodes": [{"id": 1, "type": "CheckpointLoaderSimple", "widgets_values": ["base.safetensors"]}], + "links": [], +} + + +def _write_json(path, payload): + path.write_text(json.dumps(payload), encoding="utf-8") + + +def _write_zip(path, members): + with zipfile.ZipFile(path, "w") as archive: + for name, payload in members.items(): + archive.writestr(name, payload) + + +def _write_png_with_workflow(path, workflow): + PIL = pytest.importorskip("PIL.Image") + from py.utils.exif_utils import ExifUtils + + img = PIL.new("RGB", (8, 8), color=(0, 0, 0)) + img.save(path, format="PNG") + ExifUtils.embed_workflow(str(path), json.dumps(workflow)) + + +def _write_webp_with_workflow(path, workflow): + PIL = pytest.importorskip("PIL.Image") + from py.utils.exif_utils import ExifUtils + + img = PIL.new("RGB", (8, 8), color=(0, 0, 0)) + img.save(path, format="WEBP") + ExifUtils.embed_workflow(str(path), json.dumps(workflow)) + + +def test_document_path_identity_for_json(tmp_path): + artifact = tmp_path / "flow.json" + assert get_workflow_document_path(str(artifact)) == str(artifact) + + +def test_document_path_derived_for_containers(tmp_path): + artifact = tmp_path / "flow.zip" + derived = get_workflow_document_path(str(artifact)) + assert derived == str(tmp_path / f"flow{WORKFLOW_DOCUMENT_SUFFIX}") + + image = tmp_path / "flow.png" + assert get_workflow_document_path(str(image)) == str( + tmp_path / f"flow{WORKFLOW_DOCUMENT_SUFFIX}" + ) + + +def test_extract_json_artifact(tmp_path): + artifact = tmp_path / "flow.json" + _write_json(artifact, API_WORKFLOW) + document = extract_workflow_document(str(artifact)) + assert document == API_WORKFLOW + + +def test_extract_rejects_non_workflow_json(tmp_path): + artifact = tmp_path / "settings.json" + _write_json(artifact, {"some": "config"}) + assert extract_workflow_document(str(artifact)) is None + assert materialize_workflow_document(str(artifact)) is None + + +def test_extract_from_zip_top_level(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip( + artifact, + { + "workflow.json": json.dumps(UI_WORKFLOW), + "readme.txt": "hello", + }, + ) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_zip_prefers_shallow_candidates(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip( + artifact, + { + "nested/deep/config.json": json.dumps(API_WORKFLOW), + "top.json": json.dumps(UI_WORKFLOW), + }, + ) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_zip_skips_macosx_and_hidden(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip( + artifact, + { + "__MACOSX/workflow.json": json.dumps(UI_WORKFLOW), + ".hidden/workflow.json": json.dumps(UI_WORKFLOW), + "real.json": json.dumps(API_WORKFLOW), + }, + ) + document = extract_workflow_document(str(artifact)) + assert document == API_WORKFLOW + + +def test_extract_from_zip_without_workflow_returns_none(tmp_path): + artifact = tmp_path / "images.zip" + _write_zip(artifact, {"note.txt": "no graphs here", "config.json": "{}"}) + assert extract_workflow_document(str(artifact)) is None + + +def test_extract_from_corrupt_zip_returns_none(tmp_path): + artifact = tmp_path / "broken.zip" + artifact.write_bytes(b"not a zip at all") + assert extract_workflow_document(str(artifact)) is None + + +def test_extract_from_png_with_embedded_workflow(tmp_path): + artifact = tmp_path / "flow.png" + _write_png_with_workflow(artifact, UI_WORKFLOW) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_webp_with_embedded_workflow(tmp_path): + artifact = tmp_path / "flow.webp" + _write_webp_with_workflow(artifact, UI_WORKFLOW) + document = extract_workflow_document(str(artifact)) + assert document == UI_WORKFLOW + + +def test_extract_from_plain_image_returns_none(tmp_path): + PIL = pytest.importorskip("PIL.Image") + artifact = tmp_path / "plain.png" + PIL.new("RGB", (8, 8)).save(artifact, format="PNG") + assert extract_workflow_document(str(artifact)) is None + assert materialize_workflow_document(str(artifact)) is None + + +def test_materialize_writes_derived_document_once(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip(artifact, {"workflow.json": json.dumps(API_WORKFLOW)}) + + derived = materialize_workflow_document(str(artifact)) + assert derived == str(tmp_path / f"pack{WORKFLOW_DOCUMENT_SUFFIX}") + with open(derived, "r", encoding="utf-8") as handle: + assert json.load(handle) == API_WORKFLOW + + # A fresh derived file is reused without re-extracting: corrupt the zip + # and confirm the cached document is still returned. + artifact_mtime = os.path.getmtime(artifact) + os.utime(derived, (artifact_mtime + 1, artifact_mtime + 1)) + artifact.write_bytes(b"corrupted") + assert materialize_workflow_document(str(artifact)) == derived + + +def test_materialize_reextracts_when_artifact_is_newer(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip(artifact, {"workflow.json": json.dumps(API_WORKFLOW)}) + + derived = materialize_workflow_document(str(artifact)) + + # Replace the artifact with a newer mtime than the derived document. + _write_zip(artifact, {"workflow.json": json.dumps(UI_WORKFLOW)}) + artifact_mtime = os.path.getmtime(artifact) + os.utime(artifact, (artifact_mtime + 10, artifact_mtime + 10)) + + assert materialize_workflow_document(str(artifact)) == derived + with open(derived, "r", encoding="utf-8") as handle: + assert json.load(handle) == UI_WORKFLOW + + +def test_load_artifact_workflow_document_round_trip(tmp_path): + artifact = tmp_path / "pack.zip" + _write_zip(artifact, {"workflow.json": json.dumps(API_WORKFLOW)}) + assert load_artifact_workflow_document(str(artifact)) == API_WORKFLOW + + bare = tmp_path / "bare.json" + _write_json(bare, UI_WORKFLOW) + assert load_artifact_workflow_document(str(bare)) == UI_WORKFLOW From 7221f5632d429ab7c7ba569e210ff91e7546c38d Mon Sep 17 00:00:00 2001 From: Will Miao Date: Wed, 28 Oct 2026 16:59:05 +0800 Subject: [PATCH 03/13] fix(download): show brand-new model cards without a manual refresh The in-place reconcile from #1078 no-oped whenever the downloaded model had no card in the current view, which silently swallowed brand-new downloads (e.g. pasting a CivitAI URL for a model never downloaded before): the backend added the entry but the listing only caught up on manual refresh. Reconcile now takes wasLocallyOwned (derived from the existsLocally flags of the version list the modal fetched before the download): - owned model outside the current view: keep the #1078 no-op - brand-new or unknown ownership with no matching card: fall back to the legacy reload so the new card appears --- static/js/managers/DownloadManager.js | 45 ++++++++++++--- .../downloadManager.reconcileView.test.js | 57 +++++++++++++++++-- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/static/js/managers/DownloadManager.js b/static/js/managers/DownloadManager.js index f257749e..3e42bf48 100644 --- a/static/js/managers/DownloadManager.js +++ b/static/js/managers/DownloadManager.js @@ -1477,6 +1477,7 @@ export class DownloadManager { suppressSuccessToast = false, suppressFailureSummary = false, isLatestVersion = null, + wasLocallyOwned = null, }) { const config = this.apiClient?.apiConfig?.config; @@ -1485,7 +1486,7 @@ export class DownloadManager { } const displayName = versionName || `#${versionId}`; - const retryParams = { modelId, versionId, versionName, modelRoot, targetFolder, useDefaultPaths, useSaveDirAsRoot, source, fileParams, closeModal: false, deferReload, suppressSuccessToast, suppressFailureSummary, isLatestVersion }; + const retryParams = { modelId, versionId, versionName, modelRoot, targetFolder, useDefaultPaths, useSaveDirAsRoot, source, fileParams, closeModal: false, deferReload, suppressSuccessToast, suppressFailureSummary, isLatestVersion, wasLocallyOwned }; this._lastDownloadError = null; let ws = null; let updateProgress = () => { }; @@ -1640,6 +1641,7 @@ export class DownloadManager { await this._reconcileViewAfterDownload({ modelId, isLatestVersion: isLatestVersion ?? this._isDownloadingLatestVersion(versionId), + wasLocallyOwned, }); } @@ -1696,9 +1698,10 @@ export class DownloadManager { * (the update flag is model-level, so every visible card of the * model disappears at once). * - Normal listing: the card stays; only the update flag is cleared. - * - The model is not in the current view (different folder / filter / - * window): nothing changes, which also covers brand-new models whose - * card did not exist before. + * - An owned model outside the current view (different folder / filter / + * window): nothing changes. + * - A brand-new model has no card to reconcile in place, so the listing + * falls back to the legacy reload to make the new card visible. * * The sidebar folder tree is refreshed separately so folder counts * stay accurate without touching the model listing or scroll position. @@ -1712,9 +1715,14 @@ export class DownloadManager { * @param {boolean} [opts.refreshSidebar=true] Whether to refresh the * sidebar folder tree afterwards (batch callers batch this into a * single refresh). + * @param {boolean|null} [opts.wasLocallyOwned=null] Whether any version + * of the model was already in the library before this download. Only + * an explicit true keeps the no-op for a model outside the current + * view; false (brand-new) and null (unknown) reload the listing so a + * new card can appear. * @returns {Promise} True when an in-place update was applied. */ - async _reconcileViewAfterDownload({ modelId, isLatestVersion = true, refreshSidebar = true } = {}) { + async _reconcileViewAfterDownload({ modelId, isLatestVersion = true, refreshSidebar = true, wasLocallyOwned = null } = {}) { const scroller = state?.virtualScroller; const items = Array.isArray(scroller?.items) ? scroller.items : []; @@ -1738,8 +1746,15 @@ export class DownloadManager { }); if (matches.length === 0) { - // Downloaded model is not visible in the current view — keep the - // listing untouched, only refresh folder counts. + // No card of this model is visible. A brand-new model (or one + // whose ownership is unknown) has no card anywhere in the + // listing to reconcile in place — fall back to the legacy + // reload so the new card becomes visible. An owned model that + // merely sits outside the current view keeps the no-op (#1078). + if (wasLocallyOwned !== true) { + await resetAndReload(true); + return true; + } await this._refreshSidebarAfterReconcile(refreshSidebar); return false; } @@ -1792,6 +1807,7 @@ export class DownloadManager { modelId, isLatestVersion: this._isVersionLatest(item.selectedVersion?.id, item.versions), refreshSidebar: false, + wasLocallyOwned: this._computeWasLocallyOwned(item.versions), }); } await this._refreshSidebarAfterReconcile(true); @@ -1851,6 +1867,19 @@ export class DownloadManager { return this._isVersionLatest(versionId, this.versions); } + /** + * Whether any version of the model was already in the library before + * the download, derived from the `existsLocally` flags of the version + * list the modal fetched up front. Returns null when no version list is + * available (callers outside the modal flow). + */ + _computeWasLocallyOwned(versions) { + if (!Array.isArray(versions) || versions.length === 0) { + return null; + } + return versions.some(version => version && version.existsLocally === true); + } + /** * Download multiple selected files of the same version sequentially, * reusing the location-step choices for every file. Per-file toasts, @@ -1937,6 +1966,7 @@ export class DownloadManager { await this._reconcileViewAfterDownload({ modelId: this.modelId, isLatestVersion: this._isDownloadingLatestVersion(this.currentVersion?.id), + wasLocallyOwned: this._computeWasLocallyOwned(this.versions), }); } return failedItems.length === 0; @@ -2521,6 +2551,7 @@ export class DownloadManager { source: this.source, fileParams, closeModal: true, + wasLocallyOwned: this._computeWasLocallyOwned(this.versions), }); } diff --git a/tests/frontend/managers/downloadManager.reconcileView.test.js b/tests/frontend/managers/downloadManager.reconcileView.test.js index e2f00fec..38c4aff2 100644 --- a/tests/frontend/managers/downloadManager.reconcileView.test.js +++ b/tests/frontend/managers/downloadManager.reconcileView.test.js @@ -209,8 +209,25 @@ describe('DownloadManager post-download in-place reconciliation (#1078)', () => }); }); - describe('_reconcileViewAfterDownload', () => { - it('removes the model cards in the Updates view when the latest version was installed', async () => { + describe('_computeWasLocallyOwned', () => { + it('returns null when no version list is available', () => { + expect(manager._computeWasLocallyOwned(null)).toBe(null); + expect(manager._computeWasLocallyOwned(undefined)).toBe(null); + expect(manager._computeWasLocallyOwned([])).toBe(null); + }); + + it('returns true when any version was already local', () => { + const versions = [{ id: 1, existsLocally: false }, { id: 2, existsLocally: true }]; + expect(manager._computeWasLocallyOwned(versions)).toBe(true); + }); + + it('returns false when no version was local (brand-new model)', () => { + const versions = [{ id: 1, existsLocally: false }, { id: 2, existsLocally: false }]; + expect(manager._computeWasLocallyOwned(versions)).toBe(false); + }); + }); + + describe('_reconcileViewAfterDownload', () => { it('removes the model cards in the Updates view when the latest version was installed', async () => { stateMock.virtualScroller.items = [ makeItem('/models/loras/old.safetensors', 837884), makeItem('/models/loras/unrelated.safetensors', 999999), @@ -260,11 +277,15 @@ describe('DownloadManager post-download in-place reconciliation (#1078)', () => expect(sidebarRefreshMock).toHaveBeenCalledTimes(1); }); - it('keeps the listing untouched when the downloaded model is not in the current view', async () => { + it('keeps the listing untouched when an owned model is not in the current view', async () => { stateMock.virtualScroller.items = [makeItem('/models/loras/other.safetensors', 999999)]; mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); - const result = await manager._reconcileViewAfterDownload({ modelId: 837884, isLatestVersion: true }); + const result = await manager._reconcileViewAfterDownload({ + modelId: 837884, + isLatestVersion: true, + wasLocallyOwned: true, + }); expect(result).toBe(false); expect(mockScroller.removeMultipleItemsByFilePath).not.toHaveBeenCalled(); @@ -273,6 +294,34 @@ describe('DownloadManager post-download in-place reconciliation (#1078)', () => expect(sidebarRefreshMock).toHaveBeenCalledTimes(1); }); + it('reloads the listing when a brand-new model has no card to reconcile', async () => { + stateMock.virtualScroller.items = [makeItem('/models/loras/other.safetensors', 999999)]; + mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); + + const result = await manager._reconcileViewAfterDownload({ + modelId: 837884, + isLatestVersion: true, + wasLocallyOwned: false, + }); + + expect(result).toBe(true); + expect(resetAndReloadMock).toHaveBeenCalledWith(true); + expect(mockScroller.removeMultipleItemsByFilePath).not.toHaveBeenCalled(); + expect(mockScroller.updateSingleItem).not.toHaveBeenCalled(); + expect(sidebarRefreshMock).not.toHaveBeenCalled(); + }); + + it('reloads the listing when ownership is unknown and no card matches', async () => { + stateMock.virtualScroller.items = [makeItem('/models/loras/other.safetensors', 999999)]; + mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); + + const result = await manager._reconcileViewAfterDownload({ modelId: 837884, isLatestVersion: true }); + + expect(result).toBe(true); + expect(resetAndReloadMock).toHaveBeenCalledWith(true); + expect(sidebarRefreshMock).not.toHaveBeenCalled(); + }); + it('no-ops for models without a CivitAI identity (HF downloads)', async () => { stateMock.virtualScroller.items = [makeItem('/models/loras/a.safetensors', 123)]; mockApiClient.getPageState.mockReturnValue({ showUpdateAvailableOnly: true }); From 0c55dff8288ac483dd0f3c9db8a8af4d52965227 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Wed, 28 Oct 2026 17:43:59 +0800 Subject: [PATCH 04/13] feat(workflows): use WF as the workflow card badge abbreviation The fallback produced WORK (first four letters), which reads like a verb and is wider than the other badges; WF matches community shorthand and the two-letter style of CN/CV/TE. Also give the workflow sub-type its full display name so tooltips show Workflow instead of the raw key. --- static/js/utils/constants.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/static/js/utils/constants.js b/static/js/utils/constants.js index b3649858..b5e02713 100644 --- a/static/js/utils/constants.js +++ b/static/js/utils/constants.js @@ -112,6 +112,8 @@ export const MODEL_SUBTYPE_DISPLAY_NAMES = { text_encoder: "Text Encoder", clip_vision: "CLIP Vision", controlnet: "ControlNet", + // Workflow sub-types + workflow: "Workflow", }; // Backward compatibility alias @@ -130,6 +132,7 @@ export const MODEL_SUBTYPE_ABBREVIATIONS = { text_encoder: "TE", clip_vision: "CV", controlnet: "CN", + workflow: "WF", }; export function getSubTypeAbbreviation(subType) { From 7efeb592fdef90e7378f0fcbd64c93f51f7761f1 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Wed, 28 Oct 2026 19:19:36 +0800 Subject: [PATCH 05/13] feat(workflows): copy-to-clipboard flow and standalone-aware context menu - GET /api/lm/workflows/content returns the extracted workflow document (json direct, zip/png/webp via the derived sidecar); no ComfyUI needed, so it also serves standalone mode where send-to-comfy is unavailable - workflow cards gain a Copy Workflow context-menu action that puts the document JSON on the clipboard for paste-into-ComfyUI loading - the Open in ComfyUI item is hidden in standalone mode, where pushing to a graph is impossible by definition --- locales/de.json | 6 +- locales/en.json | 6 +- locales/es.json | 6 +- locales/fr.json | 6 +- locales/he.json | 6 +- locales/ja.json | 6 +- locales/ko.json | 6 +- locales/ru.json | 6 +- locales/zh-CN.json | 6 +- locales/zh-TW.json | 6 +- py/routes/workflow_routes.py | 45 +++++++ static/js/api/apiConfig.js | 1 + static/js/api/workflowApi.js | 15 +++ .../ContextMenu/WorkflowContextMenu.js | 22 +++- templates/workflows.html | 1 + .../ContextMenu/workflowContextMenu.test.js | 122 ++++++++++++++++++ tests/routes/test_workflow_routes.py | 99 ++++++++++++++ 17 files changed, 354 insertions(+), 11 deletions(-) create mode 100644 tests/frontend/components/ContextMenu/workflowContextMenu.test.js diff --git a/locales/de.json b/locales/de.json index d6e36b09..e00b83ff 100644 --- a/locales/de.json +++ b/locales/de.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/en.json b/locales/en.json index 0f85a9f7..7b315c88 100644 --- a/locales/en.json +++ b/locales/en.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "Workflows", "contextMenu": { - "sendToComfy": "Open in ComfyUI" + "sendToComfy": "Open in ComfyUI", + "copyWorkflow": "Copy Workflow" }, "sendToComfy": { "success": "Workflow sent to ComfyUI", "failed": "Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "Failed to copy workflow: {message}" + }, "disabled": { "title": "Workflow management is off", "description": "Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/es.json b/locales/es.json index 2553a35f..21e258af 100644 --- a/locales/es.json +++ b/locales/es.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/fr.json b/locales/fr.json index 39e0a0d9..2693e80d 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/he.json b/locales/he.json index 6ab90064..5203dbb0 100644 --- a/locales/he.json +++ b/locales/he.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/ja.json b/locales/ja.json index ddd66ef6..d1ffed2e 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/ko.json b/locales/ko.json index e22a8bfe..3c718eaa 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/ru.json b/locales/ru.json index 4ba7f4aa..2adf1a66 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/zh-CN.json b/locales/zh-CN.json index 4e22f7a0..3a18d6e1 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 2579df38..a1cd8634 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -1456,12 +1456,16 @@ "workflows": { "title": "[TODO: Translate] Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI" + "sendToComfy": "[TODO: Translate] Open in ComfyUI", + "copyWorkflow": "[TODO: Translate] Copy Workflow" }, "sendToComfy": { "success": "[TODO: Translate] Workflow sent to ComfyUI", "failed": "[TODO: Translate] Failed to send workflow: {message}" }, + "copyWorkflow": { + "failed": "[TODO: Translate] Failed to copy workflow: {message}" + }, "disabled": { "title": "[TODO: Translate] Workflow management is off", "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", diff --git a/py/routes/workflow_routes.py b/py/routes/workflow_routes.py index fa334e6b..81e34580 100644 --- a/py/routes/workflow_routes.py +++ b/py/routes/workflow_routes.py @@ -62,6 +62,11 @@ class WorkflowRoutes(BaseModelRoutes): registrar.add_prefixed_route( 'GET', '/api/lm/{prefix}/send-to-comfy', prefix, self.send_to_comfy ) + # Read the workflow document itself (copy-to-clipboard flow); works in + # standalone mode too since no ComfyUI connection is involved. + registrar.add_prefixed_route( + 'GET', '/api/lm/{prefix}/content', prefix, self.get_workflow_content + ) def _validate_civitai_model_type(self, model_type: str) -> bool: """Validate CivitAI model type for workflows (opt-in gated).""" @@ -190,6 +195,46 @@ class WorkflowRoutes(BaseModelRoutes): logger.error("Error sending workflow to ComfyUI: %s", exc, exc_info=True) return web.json_response({"success": False, "error": str(exc)}, status=500) + async def get_workflow_content(self, request: web.Request) -> web.Response: + """Return the extracted workflow document for a library entry. + + Used by the copy-to-clipboard flow; unlike send-to-comfy it does not + require a running ComfyUI, so it works in standalone mode as well. + """ + try: + if not self._settings.is_workflows_enabled(): + return web.json_response( + {"success": False, "error": "Workflow management is disabled"}, + status=400, + ) + + file_path = (request.query.get("file_path") or "").strip() + if not file_path: + return web.json_response( + {"success": False, "error": "file_path is required"}, status=400 + ) + + _require_path_in_library_roots( + file_path, self.service.scanner, label="File path" + ) + + workflow = await self._load_workflow_payload(file_path) + if workflow is None: + return web.json_response( + { + "success": False, + "error": "not_a_workflow", + "message": "File is missing or is not a ComfyUI workflow", + }, + status=404, + ) + return web.json_response({"success": True, "workflow": workflow}) + except ValueError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except Exception as exc: + logger.error("Error reading workflow content: %s", exc, exc_info=True) + return web.json_response({"success": False, "error": str(exc)}, status=500) + async def _read_json_body(self, request: web.Request) -> Dict[str, Any]: try: payload = await request.json() diff --git a/static/js/api/apiConfig.js b/static/js/api/apiConfig.js index 583fe635..0a4f6e03 100644 --- a/static/js/api/apiConfig.js +++ b/static/js/api/apiConfig.js @@ -183,6 +183,7 @@ export const MODEL_SPECIFIC_ENDPOINTS = { [MODEL_TYPES.WORKFLOW]: { metadata: `/api/lm/${MODEL_TYPES.WORKFLOW}/metadata`, sendToComfy: `/api/lm/${MODEL_TYPES.WORKFLOW}/send-to-comfy`, + content: `/api/lm/${MODEL_TYPES.WORKFLOW}/content`, } }; diff --git a/static/js/api/workflowApi.js b/static/js/api/workflowApi.js index f10911e3..49d52e31 100644 --- a/static/js/api/workflowApi.js +++ b/static/js/api/workflowApi.js @@ -20,4 +20,19 @@ export class WorkflowApiClient extends BaseModelApiClient { } return data; } + + /** + * Fetch the extracted workflow document for a library entry. + * GET /api/lm/workflows/content?file_path=... (works in standalone mode). + * @returns {Promise} The workflow JSON document. + */ + async fetchWorkflowContent(filePath) { + const url = `${this.apiConfig.endpoints.specific.content}?file_path=${encodeURIComponent(filePath)}`; + const response = await fetch(url); + const data = await response.json().catch(() => ({})); + if (!response.ok || data.success === false) { + throw new Error(data.error || data.message || `HTTP ${response.status}`); + } + return data.workflow; + } } diff --git a/static/js/components/ContextMenu/WorkflowContextMenu.js b/static/js/components/ContextMenu/WorkflowContextMenu.js index b4ea276e..89570f3c 100644 --- a/static/js/components/ContextMenu/WorkflowContextMenu.js +++ b/static/js/components/ContextMenu/WorkflowContextMenu.js @@ -3,7 +3,8 @@ import { ModelContextMenuMixin } from './ModelContextMenuMixin.js'; import { getModelApiClient, resetAndReload } from '../../api/modelApiFactory.js'; import { moveManager } from '../../managers/MoveManager.js'; import { showDeleteModal, showExcludeModal } from '../../utils/modalUtils.js'; -import { showToast } from '../../utils/uiHelpers.js'; +import { copyToClipboard, showToast } from '../../utils/uiHelpers.js'; +import { state } from '../../state/index.js'; export class WorkflowContextMenu extends BaseContextMenu { constructor() { @@ -23,6 +24,12 @@ export class WorkflowContextMenu extends BaseContextMenu { showMenu(x, y, card) { super.showMenu(x, y, card); this.updateExcludeMenuItem(); + // Standalone has no running ComfyUI to push a workflow into; the + // copy-to-clipboard action covers that mode instead. + const sendItem = this.menu?.querySelector('[data-action="send-to-comfy"]'); + if (sendItem) { + sendItem.style.display = state?.global?.settings?.standalone_mode ? 'none' : ''; + } } handleMenuAction(action) { @@ -42,6 +49,9 @@ export class WorkflowContextMenu extends BaseContextMenu { case 'send-to-comfy': this.sendToComfy(this.currentCard.dataset.filepath); break; + case 'copy-workflow': + this.copyWorkflowToClipboard(this.currentCard.dataset.filepath); + break; case 'replace-preview': // Add new action for replacing preview images apiClient.replaceModelPreview(this.currentCard.dataset.filepath); @@ -80,6 +90,16 @@ export class WorkflowContextMenu extends BaseContextMenu { showToast('workflows.sendToComfy.failed', { message: error.message }, 'error'); } } + + async copyWorkflowToClipboard(filePath) { + try { + const workflow = await getModelApiClient().fetchWorkflowContent(filePath); + await copyToClipboard(JSON.stringify(workflow)); + } catch (error) { + console.error('Failed to copy workflow:', error); + showToast('workflows.copyWorkflow.failed', { message: error.message }, 'error'); + } + } } // Mix in shared methods diff --git a/templates/workflows.html b/templates/workflows.html index ad845901..d1310bf9 100644 --- a/templates/workflows.html +++ b/templates/workflows.html @@ -72,6 +72,7 @@ + + + diff --git a/tests/frontend/components/ContextMenu/workflowContextMenu.test.js b/tests/frontend/components/ContextMenu/workflowContextMenu.test.js index d5ffbe4a..3293d3c3 100644 --- a/tests/frontend/components/ContextMenu/workflowContextMenu.test.js +++ b/tests/frontend/components/ContextMenu/workflowContextMenu.test.js @@ -9,12 +9,17 @@ const updateFromComfyMock = vi.fn(); const restoreMock = vi.fn(); const resetAndReloadMock = vi.fn(); const updateSingleItemMock = vi.fn(); +const showConfirmationModalMock = vi.fn(); + +const showSimpleLoadingMock = vi.fn(); +const hideLoadingMock = vi.fn(); const stateStub = { global: { settings: { standalone_mode: false } }, currentPageType: 'workflows', pages: {}, virtualScroller: { updateSingleItem: updateSingleItemMock, items: [] }, + loadingManager: { showSimpleLoading: showSimpleLoadingMock, hide: hideLoadingMock }, }; vi.mock('../../../../static/js/utils/uiHelpers.js', () => ({ @@ -48,6 +53,7 @@ vi.mock('../../../../static/js/managers/MoveManager.js', () => ({ vi.mock('../../../../static/js/utils/modalUtils.js', () => ({ showDeleteModal: vi.fn(), showExcludeModal: vi.fn(), + showConfirmationModal: showConfirmationModalMock, })); vi.mock('../../../../static/js/components/ContextMenu/ModelContextMenuMixin.js', () => ({ @@ -246,7 +252,7 @@ describe('WorkflowContextMenu', () => { }); it('restores the workflow on restore-download after confirmation', async () => { - window.confirm = vi.fn(() => true); + showConfirmationModalMock.mockResolvedValue(true); restoreMock.mockResolvedValue({ success: true, restored: 'downloaded', sha256: 'restoredsha' }); menu.handleMenuAction('restore-download'); @@ -260,6 +266,13 @@ describe('WorkflowContextMenu', () => { 'success' ) ); + // The confirmation goes through the app's modal, not the browser dialog. + expect(showConfirmationModalMock).toHaveBeenCalledWith( + expect.objectContaining({ danger: true }) + ); + // A blocking indicator covers the (potentially slow) re-download. + expect(showSimpleLoadingMock).toHaveBeenCalled(); + expect(hideLoadingMock).toHaveBeenCalled(); // The card is refreshed in place so it shows the "Updated" cue. expect(updateSingleItemMock).toHaveBeenCalledWith('/library/workflows/flow.json', { sha256: 'restoredsha', @@ -267,16 +280,17 @@ describe('WorkflowContextMenu', () => { }); it('does not call restore when the confirmation is declined', async () => { - window.confirm = vi.fn(() => false); + showConfirmationModalMock.mockResolvedValue(false); menu.handleMenuAction('restore-download'); - await new Promise((resolve) => setTimeout(resolve, 0)); + await vi.waitFor(() => expect(showConfirmationModalMock).toHaveBeenCalled()); expect(restoreMock).not.toHaveBeenCalled(); + expect(showSimpleLoadingMock).not.toHaveBeenCalled(); }); - it('shows an error toast when restore fails', async () => { - window.confirm = vi.fn(() => true); + it('shows an error toast when restore fails and still hides the loading', async () => { + showConfirmationModalMock.mockResolvedValue(true); const error = new Error('Workflow has no recorded CivitAI source to restore from'); error.kind = 'no_source'; restoreMock.mockRejectedValue(error); @@ -289,5 +303,6 @@ describe('WorkflowContextMenu', () => { 'error' ) ); + expect(hideLoadingMock).toHaveBeenCalled(); }); }); From 327edbce715ddcf5a853ee12e47b43e7e75bc165 Mon Sep 17 00:00:00 2001 From: Will Miao Date: Thu, 29 Oct 2026 16:28:42 +0800 Subject: [PATCH 13/13] i18n(workflows): translate the workflow management strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fill the 41 [TODO: Translate] placeholders left by the workflow management series across all 9 locales: the Workflows page (workflows.* - title, context menu, the send/update/copy/restore toasts, the restore confirmation modal, the disabled state and the "no workflow folders" empty state), the settings toggle and folder list (settings.folderSettings.enableWorkflows*, .workflowFolders*), the Workflow Paths folder-key label, the two nav paths and initialization.workflows.*. No [TODO: Translate] remains. Workflow follows the term already fixed per locale: 工作流 in zh-CN/zh-TW, ワークフロー in ja, 워크플로 in ko, and the Latin loanword in fr/de/es/ru/he - so header.navigation.workflows and workflows.title stay "Workflows" in those five. The copy reuses existing renderings rather than inventing terms: workflows.disabled.* mirrors other.disabled.* ("management is off", "Enable it to ...", "Failed to enable ..."), workflows.noPaths.* mirrors other.noPaths.* and its three open* buttons are byte-identical to their other.noPaths.open* twins, the nav-path hints follow other.disabled.hint ("Settings > Library") and other.noPaths.descriptionStandalone ("Settings -> Model Paths"), and the restoring line follows recipesPathMigrating. "CivitAI Workflow resources" keeps Workflow in Latin even in the CJK locales because it names CivitAI's resource type, and folder_paths.workflows stays byte-identical everywhere. Failure toasts keep {message} verbatim; CJK uses the full-width colon, the other locales ASCII (fr keeps its space before it). The guidelines doc gains a "Workflows feature" section in the term maps, plus a 2026-10 status entry. Verified with pytest tests/i18n (21 passed) and scripts/sync_translation_keys.py --dry-run (all locales up to date). --- docs/i18n-translation-guidelines.md | 42 +++++++++++++++ locales/de.json | 82 ++++++++++++++--------------- locales/es.json | 82 ++++++++++++++--------------- locales/fr.json | 82 ++++++++++++++--------------- locales/he.json | 82 ++++++++++++++--------------- locales/ja.json | 82 ++++++++++++++--------------- locales/ko.json | 82 ++++++++++++++--------------- locales/ru.json | 82 ++++++++++++++--------------- locales/zh-CN.json | 82 ++++++++++++++--------------- locales/zh-TW.json | 82 ++++++++++++++--------------- 10 files changed, 411 insertions(+), 369 deletions(-) diff --git a/docs/i18n-translation-guidelines.md b/docs/i18n-translation-guidelines.md index 862b984c..00570ca8 100644 --- a/docs/i18n-translation-guidelines.md +++ b/docs/i18n-translation-guidelines.md @@ -239,6 +239,18 @@ Locales: `en`, `zh-CN`, `zh-TW`, `ja`, `ko`, `fr`, `de`, `es`, `ru`, `he` (RTL). > `toast.contextMenu.linkHfSuccess` (the toast now says "model source" instead of > "HuggingFace", commit `5ab0e88ab`). No `[TODO: Translate]` placeholder remains. +> **Status (2026-10, workflow management):** the Workflows page (`workflows.*`) manages the +> ComfyUI workflow JSON files in their own library folders and shipped with the settings toggle +> and folder list (`settings.folderSettings.enableWorkflows*` / `.workflowFolders*`), the folder +> key label, the two folder-list nav paths and the initialization progress text — 41 keys +> `[TODO: Translate]` in all 9 locales, now translated (terminology in §2, "Workflows feature"). +> `Workflow` reuses the term already fixed in §5 per locale: Latin in fr/de/es/ru/he (so +> `header.navigation.workflows` and `workflows.title` stay `Workflows` there), 工作流 in +> zh-CN/zh-TW, ワークフロー in ja, 워크플로 in ko. The three `workflows.noPaths.open*` buttons are +> byte-identical to `other.noPaths.open*` (same actions), and the nav-path hints reuse +> `other.disabled.hint`'s "Settings > Library" / `other.noPaths.descriptionStandalone`'s +> "Settings → Model Paths" renderings. No `[TODO: Translate]` placeholder remains. + --- ## 1. Hard rules (do not violate) @@ -928,6 +940,36 @@ Most of these strings are assembled from existing renderings rather than new ter - `firstRun.language.label` reuses `common.language.select` (zh-CN keeps its 选择语言 verb label rather than introducing a second rendering of "Language"). +### Workflows feature (page, folders, restore/update actions) + +The Workflows page (`workflows.*`) lists the ComfyUI workflow JSON files kept in their own +library folders. **Workflow** is the §5 term per locale and never becomes a different noun; +"workflow management" is the feature name, built from that noun plus the locale's management +word (`Verwaltung` / `gestion` / `gestión` / `управление` / `ניהול`). + +| Term | Rendering | +|---|---| +| Workflows (page title / nav) | zh-CN 工作流 · zh-TW 工作流 · ja ワークフロー · ko 워크플로 · fr/de/es/ru/he Workflows | +| workflow (noun in prose) | zh-CN 工作流 · zh-TW 工作流 · ja ワークフロー · ko 워크플로 · fr workflow · de Workflow · es workflow · ru workflow · he workflow | +| Workflow Management (settings toggle) | zh-CN 工作流管理 · zh-TW 工作流管理 · ja ワークフロー管理 · ko 워크플로 관리 · fr Gestion des workflows · de Workflow-Verwaltung · es Gestión de workflows · ru Управление workflow · he ניהול workflow | +| Workflow Folders / Workflow Paths | zh-CN 工作流文件夹 / 工作流路径 · zh-TW 工作流資料夾 / 工作流路徑 · ja ワークフローフォルダー / ワークフローパス · ko 워크플로 폴더 / 워크플로 경로 · fr Dossiers de workflows / Chemins de workflows · de Workflow-Ordner / Workflow-Pfade · es Carpetas de workflows / Rutas de workflows · ru Папки workflow / Пути workflow · he תיקיות workflow / נתיבי workflow | +| Open in ComfyUI (card action and context menu) | zh-CN 在 ComfyUI 中打开 · zh-TW 在 ComfyUI 中開啟 · ja ComfyUIで開く · ko ComfyUI에서 열기 · fr Ouvrir dans ComfyUI · de In ComfyUI öffnen · es Abrir en ComfyUI · ru Открыть в ComfyUI · he פתח ב-ComfyUI | +| Update from ComfyUI | zh-CN 从 ComfyUI 更新 · zh-TW 從 ComfyUI 更新 · ja ComfyUIから更新 · ko ComfyUI에서 업데이트 · fr Mettre à jour depuis ComfyUI · de Von ComfyUI aktualisieren · es Actualizar desde ComfyUI · ru Обновить из ComfyUI · he עדכן מ-ComfyUI | +| Restore Downloaded Version | zh-CN 恢复已下载版本 · zh-TW 還原已下載版本 · ja ダウンロード済みバージョンを復元 · ko 다운로드한 버전 복원 · fr Restaurer la version téléchargée · de Heruntergeladene Version wiederherstellen · es Restaurar versión descargada · ru Восстановить загруженную версию · he שחזר את הגרסה שהורדה | + +- "CivitAI Workflow resources" keeps `Workflow` in Latin even in the CJK locales: it names + CivitAI's resource type (the §2 "Other Models" rule for model-type names), not this page. +- `folder_paths.workflows` is a JSON key and stays byte-identical in every locale. +- `noPaths.descriptionStandalone` keeps the standalone split — **Settings → Model Paths** plus + a restart — while `.descriptionComfyUI` points at **Settings → Library** and a page reload; + both reuse the nav-path renderings of `other.noPaths.*` / `other.disabled.hint`. +- `disabled.*` mirrors `other.disabled.*` sentence by sentence ("management is off", "Enable it + to …", "Failed to enable …"), and `noPaths.*` mirrors `other.noPaths.*` — including the three + `open*` buttons, which are byte-identical to their `other.noPaths.open*` twins. +- Failure toasts carry `{message}` verbatim. CJK uses the full-width colon (`:`); ko and the + Latin/Cyrillic/Hebrew locales use ASCII (fr with its space, ` : `). The `restoring` loading + line follows each locale's existing "… in progress" shape (`recipesPathMigrating`). + --- ## 3. Cross-cutting confusion hot-spots (must-fix list) diff --git a/locales/de.json b/locales/de.json index a102bcaa..5c417048 100644 --- a/locales/de.json +++ b/locales/de.json @@ -157,8 +157,8 @@ "modelNameCopied": "Modellname kopiert", "sendCheckpointToWorkflow": "An ComfyUI senden", "sendEmbeddingToWorkflow": "An ComfyUI senden", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "In ComfyUI öffnen", + "copyWorkflowToClipboard": "Workflow in die Zwischenablage kopieren" }, "nsfw": { "matureContent": "Nicht jugendfreie Inhalte", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Andere", - "workflows": "[TODO: Translate] Workflows", + "workflows": "Workflows", "statistics": "Statistiken" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "Legen Sie den Standard-ControlNet-Stammordner für Downloads, Importe und Verschiebungen fest", "enableOtherModels": "Verwaltung weiterer Modelle", "enableOtherModelsHelp": "Wenn deaktiviert, werden VAE-, Upscaler-, Text-Encoder-, CLIP-Vision- und ControlNet-Ordner nicht gescannt, die Seite für weitere Modelle bleibt deaktiviert und diese Modelltypen können nicht heruntergeladen werden.", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "Workflow-Verwaltung", + "enableWorkflowsHelp": "Wenn deaktiviert, werden Workflow-Ordner (folder_paths.workflows) nicht gescannt, die Workflows-Seite bleibt deaktiviert und CivitAI-Workflow-Ressourcen können weder verknüpft noch heruntergeladen werden.", + "workflowFolders": "Workflow-Ordner", + "workflowFoldersHelp": "Ordner, die nach ComfyUI-Workflow-JSON-Dateien gescannt werden. Werden nur von LoRA Manager verwaltet (nicht mit ComfyUI geteilt); Änderungen gelten sofort.", "otherSubTypes": "Verwaltete Modelltypen", "otherSubTypesHelp": "Wählen Sie, welche Kategorien weiterer Modelle gescannt und auf der Seite für weitere Modelle angezeigt werden.", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "CLIP-Pfade (Legacy)", "clip_vision": "CLIP-Vision-Pfade", "controlnet": "ControlNet-Pfade", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "Workflow-Pfade" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "In ComfyUI öffnen", + "updateFromComfy": "Von ComfyUI aktualisieren", + "copyWorkflow": "Workflow kopieren", + "restoreDownloaded": "Heruntergeladene Version wiederherstellen" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "Workflow an ComfyUI gesendet", + "failed": "Fehler beim Senden des Workflows: {message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "Heruntergeladene Version wiederherstellen?", + "message": "Dadurch werden lokale Änderungen verworfen und der Workflow auf die heruntergeladene Version zurückgesetzt.", + "confirmButton": "Wiederherstellen", + "restoring": "Workflow wird wiederhergestellt...", + "success": "Workflow auf die heruntergeladene Version zurückgesetzt", + "failed": "Fehler beim Wiederherstellen des Workflows: {message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "Workflow von ComfyUI aktualisiert", + "noChanges": "Keine Änderungen in ComfyUI zum Zurückschreiben", + "cancelled": "Aktualisierung abgebrochen", + "failed": "Fehler beim Aktualisieren von ComfyUI: {message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "Fehler beim Kopieren des Workflows: {message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "Die Workflow-Verwaltung ist deaktiviert", + "description": "Aktivieren Sie die Option, um ComfyUI-Workflow-Dateien zu scannen und zu verwalten, ihre CivitAI-Metadaten und Vorschaubilder zu behalten und sie in den laufenden ComfyUI-Graph zu senden.", + "enableButton": "Workflows aktivieren", + "hint": "Sie können die Funktion später unter Einstellungen > Bibliothek wieder deaktivieren.", + "enableFailed": "Aktivierung der Workflows fehlgeschlagen" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "Keine Workflow-Ordner gefunden", + "descriptionStandalone": "Die Workflow-Verwaltung ist aktiviert, aber es wurden keine Workflow-Ordner gefunden. Fügen Sie Ihre Workflow-Ordner unter Einstellungen → Modellpfade hinzu und starten Sie LoRA Manager anschließend neu.", + "hintStandalone": "Workflows werden aus den folder_paths.workflows-Einträgen gelesen.", + "descriptionComfyUI": "Die Workflow-Verwaltung ist aktiviert, aber es sind keine Workflow-Ordner konfiguriert. Fügen Sie Workflow-Ordner unter Einstellungen → Bibliothek hinzu und laden Sie diese Seite neu.", + "hintComfyUI": "Workflows liegen in eigenen Bibliotheksordnern (folder_paths.workflows); die integrierte Workflow-Liste von ComfyUI wird nicht verändert.", + "openSettings": "Einstellungen öffnen", + "openModelPaths": "Modellordner konfigurieren", + "openSettingsFolder": "Einstellungsordner öffnen" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "Modell-Cache wird gescannt und aufgebaut. Dies kann einige Minuten dauern..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "Workflow Manager wird initialisiert", + "message": "Workflow-Cache wird gescannt und aufgebaut. Dies kann einige Minuten dauern..." }, "recipes": { "title": "Rezept Manager wird initialisiert", diff --git a/locales/es.json b/locales/es.json index 41622fef..f3be65b7 100644 --- a/locales/es.json +++ b/locales/es.json @@ -157,8 +157,8 @@ "modelNameCopied": "Nombre del modelo copiado", "sendCheckpointToWorkflow": "Enviar a ComfyUI", "sendEmbeddingToWorkflow": "Enviar a ComfyUI", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "Abrir en ComfyUI", + "copyWorkflowToClipboard": "Copiar el workflow al portapapeles" }, "nsfw": { "matureContent": "Contenido para adultos", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Otros", - "workflows": "[TODO: Translate] Workflows", + "workflows": "Workflows", "statistics": "Estadísticas" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "Establecer el directorio raíz predeterminado de ControlNet para descargas, importaciones y movimientos", "enableOtherModels": "Gestión de otros modelos", "enableOtherModelsHelp": "Cuando está desactivado, las carpetas VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet no se escanean, la página Otros modelos permanece desactivada y estos tipos de modelos no se pueden descargar.", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "Gestión de workflows", + "enableWorkflowsHelp": "Cuando está desactivado, las carpetas de workflows (folder_paths.workflows) no se escanean, la página Workflows permanece desactivada y los recursos Workflow de CivitAI no se pueden vincular ni descargar.", + "workflowFolders": "Carpetas de workflows", + "workflowFoldersHelp": "Carpetas que se escanean en busca de archivos JSON de workflow de ComfyUI. Gestionadas solo por LoRA Manager (no se comparten con ComfyUI); los cambios se aplican de inmediato.", "otherSubTypes": "Tipos de modelos gestionados", "otherSubTypesHelp": "Elige qué categorías de otros modelos se escanean y se muestran en la página Otros modelos.", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "Rutas de CLIP (heredadas)", "clip_vision": "Rutas de CLIP Vision", "controlnet": "Rutas de ControlNet", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "Rutas de workflows" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "Abrir en ComfyUI", + "updateFromComfy": "Actualizar desde ComfyUI", + "copyWorkflow": "Copiar workflow", + "restoreDownloaded": "Restaurar versión descargada" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "Workflow enviado a ComfyUI", + "failed": "Error al enviar el workflow: {message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "¿Restaurar versión descargada?", + "message": "Esto descarta los cambios locales y restaura el workflow a su versión descargada.", + "confirmButton": "Restaurar", + "restoring": "Restaurando el workflow...", + "success": "Workflow restaurado a su versión descargada", + "failed": "Error al restaurar el workflow: {message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "Workflow actualizado desde ComfyUI", + "noChanges": "No hay cambios en ComfyUI que escribir de vuelta", + "cancelled": "Actualización cancelada", + "failed": "Error al actualizar desde ComfyUI: {message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "Error al copiar el workflow: {message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "La gestión de workflows está desactivada", + "description": "Actívala para escanear y gestionar archivos de workflow de ComfyUI, conservar sus metadatos y vistas previas de CivitAI y enviarlos al grafo de ComfyUI en ejecución.", + "enableButton": "Activar workflows", + "hint": "Puedes desactivar esta función más adelante en Configuración > Biblioteca.", + "enableFailed": "No se pudieron activar los workflows" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "No se encontraron carpetas de workflows", + "descriptionStandalone": "La gestión de workflows está activada, pero no se encontraron carpetas de workflows. Añade tus carpetas de workflows en Configuración → Rutas de modelos y reinicia LoRA Manager.", + "hintStandalone": "Los workflows se leen de las entradas folder_paths.workflows.", + "descriptionComfyUI": "La gestión de workflows está activada, pero no hay carpetas de workflows configuradas. Añade carpetas de workflows en Configuración → Biblioteca y recarga esta página.", + "hintComfyUI": "Los workflows se guardan en sus propias carpetas de biblioteca (folder_paths.workflows); la lista de workflows integrada de ComfyUI no se modifica.", + "openSettings": "Abrir configuración", + "openModelPaths": "Configurar carpetas de modelos", + "openSettingsFolder": "Abrir carpeta de ajustes" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "Escaneando y construyendo la caché de modelos. Esto puede tomar unos minutos..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "Inicializando gestor de workflows", + "message": "Escaneando y construyendo caché de workflows. Esto puede tomar unos minutos..." }, "recipes": { "title": "Inicializando gestor de recetas", diff --git a/locales/fr.json b/locales/fr.json index d80ce1ee..c4103bfa 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -157,8 +157,8 @@ "modelNameCopied": "Nom du modèle copié", "sendCheckpointToWorkflow": "Envoyer vers ComfyUI", "sendEmbeddingToWorkflow": "Envoyer vers ComfyUI", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "Ouvrir dans ComfyUI", + "copyWorkflowToClipboard": "Copier le workflow dans le presse-papiers" }, "nsfw": { "matureContent": "Contenu pour adultes", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Autres", - "workflows": "[TODO: Translate] Workflows", + "workflows": "Workflows", "statistics": "Statistiques" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "Définir le répertoire racine ControlNet par défaut pour les téléchargements, imports et déplacements", "enableOtherModels": "Gestion des autres modèles", "enableOtherModelsHelp": "Lorsque cette option est désactivée, les dossiers VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet ne sont pas analysés, la page Autres modèles reste désactivée et ces types de modèles ne peuvent pas être téléchargés.", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "Gestion des workflows", + "enableWorkflowsHelp": "Lorsque cette option est désactivée, les dossiers de workflows (folder_paths.workflows) ne sont pas analysés, la page Workflows reste désactivée et les ressources Workflow de CivitAI ne peuvent pas être liées ni téléchargées.", + "workflowFolders": "Dossiers de workflows", + "workflowFoldersHelp": "Dossiers analysés pour les fichiers JSON de workflow ComfyUI. Gérés uniquement par LoRA Manager (non partagés avec ComfyUI) ; les modifications s'appliquent immédiatement.", "otherSubTypes": "Types de modèles gérés", "otherSubTypesHelp": "Choisissez les catégories d’autres modèles analysées et affichées sur la page Autres modèles.", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "Chemins CLIP (hérité)", "clip_vision": "Chemins CLIP Vision", "controlnet": "Chemins ControlNet", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "Chemins de workflows" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "Ouvrir dans ComfyUI", + "updateFromComfy": "Mettre à jour depuis ComfyUI", + "copyWorkflow": "Copier le workflow", + "restoreDownloaded": "Restaurer la version téléchargée" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "Workflow envoyé vers ComfyUI", + "failed": "Échec de l'envoi du workflow : {message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "Restaurer la version téléchargée ?", + "message": "Cela supprime les modifications locales et restaure le workflow dans sa version téléchargée.", + "confirmButton": "Restaurer", + "restoring": "Restauration du workflow en cours...", + "success": "Workflow restauré dans sa version téléchargée", + "failed": "Échec de la restauration du workflow : {message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "Workflow mis à jour depuis ComfyUI", + "noChanges": "Aucune modification à réécrire depuis ComfyUI", + "cancelled": "Mise à jour annulée", + "failed": "Échec de la mise à jour depuis ComfyUI : {message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "Échec de la copie du workflow : {message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "La gestion des workflows est désactivée", + "description": "Activez-la pour analyser et gérer les fichiers de workflow ComfyUI, conserver leurs métadonnées et aperçus CivitAI et les envoyer dans le graphe ComfyUI en cours d'exécution.", + "enableButton": "Activer les workflows", + "hint": "Vous pourrez désactiver cette fonctionnalité plus tard dans Paramètres > Bibliothèque.", + "enableFailed": "Échec de l'activation des workflows" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "Aucun dossier de workflows trouvé", + "descriptionStandalone": "La gestion des workflows est activée, mais aucun dossier de workflows n'a été trouvé. Ajoutez vos dossiers de workflows dans Paramètres → Chemins de modèles, puis redémarrez LoRA Manager.", + "hintStandalone": "Les workflows sont lus depuis les entrées folder_paths.workflows.", + "descriptionComfyUI": "La gestion des workflows est activée, mais aucun dossier de workflows n'est configuré. Ajoutez des dossiers de workflows dans Paramètres → Bibliothèque, puis rechargez cette page.", + "hintComfyUI": "Les workflows résident dans leurs propres dossiers de bibliothèque (folder_paths.workflows) ; la liste de workflows intégrée à ComfyUI n'est pas modifiée.", + "openSettings": "Ouvrir les paramètres", + "openModelPaths": "Configurer les dossiers de modèles", + "openSettingsFolder": "Ouvrir le dossier des paramètres" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "Analyse et construction du cache de modèles. Cela peut prendre quelques minutes..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "Initialisation du gestionnaire de workflows", + "message": "Scan et construction du cache workflow. Cela peut prendre quelques minutes..." }, "recipes": { "title": "Initialisation du gestionnaire de recipes", diff --git a/locales/he.json b/locales/he.json index ce688bf8..c12acd41 100644 --- a/locales/he.json +++ b/locales/he.json @@ -157,8 +157,8 @@ "modelNameCopied": "שם המודל הועתק", "sendCheckpointToWorkflow": "שלח ל-ComfyUI", "sendEmbeddingToWorkflow": "שלח ל-ComfyUI", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "פתח ב-ComfyUI", + "copyWorkflowToClipboard": "העתק workflow ללוח" }, "nsfw": { "matureContent": "תוכן למבוגרים", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "אחרים", - "workflows": "[TODO: Translate] Workflows", + "workflows": "Workflows", "statistics": "סטטיסטיקה" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "הגדר את ספריית השורש המוגדרת כברירת מחדל של ControlNet להורדות, ייבוא והעברות", "enableOtherModels": "ניהול מודלים אחרים", "enableOtherModelsHelp": "כשהאפשרות כבויה, תיקיות VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet אינן נסרקות, עמוד המודלים האחרים נשאר מושבת ולא ניתן להוריד סוגי מודלים אלה.", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "ניהול workflow", + "enableWorkflowsHelp": "כשהאפשרות כבויה, תיקיות workflow (folder_paths.workflows) אינן נסרקות, עמוד Workflows נשאר מושבת ולא ניתן לקשר או להוריד משאבי Workflow מ-CivitAI.", + "workflowFolders": "תיקיות workflow", + "workflowFoldersHelp": "תיקיות שנסרקות עבור קובצי JSON של workflow של ComfyUI. מנוהלות על ידי LoRA Manager בלבד (אינן משותפות עם ComfyUI); השינויים חלים מיד.", "otherSubTypes": "סוגי מודלים מנוהלים", "otherSubTypesHelp": "בחר אילו קטגוריות של מודלים אחרים ייסרקו ויוצגו בעמוד המודלים האחרים.", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "נתיבי CLIP (ישן)", "clip_vision": "נתיבי CLIP Vision", "controlnet": "נתיבי ControlNet", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "נתיבי workflow" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "פתח ב-ComfyUI", + "updateFromComfy": "עדכן מ-ComfyUI", + "copyWorkflow": "העתק workflow", + "restoreDownloaded": "שחזר את הגרסה שהורדה" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "ה-workflow נשלח ל-ComfyUI", + "failed": "שליחת ה-workflow נכשלה: {message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "לשחזר את הגרסה שהורדה?", + "message": "פעולה זו מבטלת עריכות מקומיות ומשחזרת את ה-workflow לגרסה שהורדה.", + "confirmButton": "שחזר", + "restoring": "משחזר workflow...", + "success": "ה-workflow שוחזר לגרסה שהורדה", + "failed": "שחזור ה-workflow נכשל: {message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "ה-workflow עודכן מ-ComfyUI", + "noChanges": "אין שינויים ב-ComfyUI לכתיבה חזרה", + "cancelled": "העדכון בוטל", + "failed": "העדכון מ-ComfyUI נכשל: {message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "העתקת ה-workflow נכשלה: {message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "ניהול ה-workflow כבוי", + "description": "הפעל כדי לסרוק ולנהל קבצי workflow של ComfyUI, לשמור את המטא-נתונים והתצוגות המקדימות שלהם מ-CivitAI, ולשלוח אותם ל-ComfyUI הפעיל.", + "enableButton": "הפעל Workflows", + "hint": "ניתן לכבות את התכונה שוב מאוחר יותר בהגדרות > ספרייה.", + "enableFailed": "הפעלת Workflows נכשלה" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "לא נמצאו תיקיות workflow", + "descriptionStandalone": "ניהול ה-workflow פועל, אך לא נמצאו תיקיות workflow. הוסף את תיקיות ה-workflow שלך תחת הגדרות > נתיבי מודלים, ולאחר מכן הפעל מחדש את LoRA Manager.", + "hintStandalone": "קבצי workflow נקראים מהערכים של folder_paths.workflows.", + "descriptionComfyUI": "ניהול ה-workflow פועל, אך לא הוגדרו תיקיות workflow. הוסף תיקיות workflow תחת הגדרות > ספרייה, ולאחר מכן טען מחדש עמוד זה.", + "hintComfyUI": "קבצי workflow נמצאים בתיקיות ספרייה נפרדות (folder_paths.workflows); רשימת ה-workflow המובנית של ComfyUI אינה מושפעת.", + "openSettings": "פתח הגדרות", + "openModelPaths": "הגדר תיקיות מודלים", + "openSettingsFolder": "פתח תיקיית הגדרות" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "סורק ובונה מטמון מודלים. זה עשוי לקחת מספר דקות..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "מאתחל מנהל Workflow", + "message": "סורק ובונה מטמון workflow. זה עשוי לקחת מספר דקות..." }, "recipes": { "title": "מאתחל מנהל מתכונים", diff --git a/locales/ja.json b/locales/ja.json index f6ea9525..bc660545 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -157,8 +157,8 @@ "modelNameCopied": "モデル名をコピーしました", "sendCheckpointToWorkflow": "ComfyUIに送信", "sendEmbeddingToWorkflow": "ComfyUIに送信", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "ComfyUIで開く", + "copyWorkflowToClipboard": "ワークフローをクリップボードにコピー" }, "nsfw": { "matureContent": "成人向けコンテンツ", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "その他", - "workflows": "[TODO: Translate] Workflows", + "workflows": "ワークフロー", "statistics": "統計" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "ダウンロード、インポート、移動用のデフォルトControlNetルートディレクトリを設定", "enableOtherModels": "その他のモデル管理", "enableOtherModelsHelp": "オフにすると、VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet フォルダーはスキャンされず、その他のモデルページは無効のままになり、これらのモデルタイプはダウンロードできません。", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "ワークフロー管理", + "enableWorkflowsHelp": "オフにすると、ワークフローフォルダー(folder_paths.workflows)はスキャンされず、ワークフローページは無効のままになり、CivitAIのWorkflowリソースをリンクしたりダウンロードしたりできなくなります。", + "workflowFolders": "ワークフローフォルダー", + "workflowFoldersHelp": "ComfyUIのワークフローJSONファイルをスキャンするフォルダーです。LoRA Managerのみが管理し(ComfyUIとは共有されません)、変更はすぐに反映されます。", "otherSubTypes": "管理するモデルタイプ", "otherSubTypesHelp": "その他のモデルページでスキャンおよび表示するカテゴリを選択します。", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "CLIPパス(レガシー)", "clip_vision": "CLIP Visionパス", "controlnet": "ControlNetパス", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "ワークフローパス" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "ワークフロー", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "ComfyUIで開く", + "updateFromComfy": "ComfyUIから更新", + "copyWorkflow": "ワークフローをコピー", + "restoreDownloaded": "ダウンロード済みバージョンを復元" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "ワークフローをComfyUIへ送信しました", + "failed": "ワークフローの送信に失敗しました:{message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "ダウンロード済みバージョンを復元しますか?", + "message": "ローカルの編集内容は破棄され、ワークフローはダウンロード時のバージョンに復元されます。", + "confirmButton": "復元", + "restoring": "ワークフローを復元中...", + "success": "ワークフローをダウンロード済みバージョンに復元しました", + "failed": "ワークフローの復元に失敗しました:{message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "ComfyUIからワークフローを更新しました", + "noChanges": "ComfyUI側に書き戻す変更はありません", + "cancelled": "更新はキャンセルされました", + "failed": "ComfyUIからの更新に失敗しました:{message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "ワークフローのコピーに失敗しました:{message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "ワークフロー管理はオフです", + "description": "有効にすると、ComfyUIのワークフローファイルをスキャン・管理し、CivitAIのメタデータとプレビューを保持したまま、実行中のComfyUIに送信できます。", + "enableButton": "ワークフローを有効にする", + "hint": "この機能は後で「設定 > ライブラリ」から再度オフにできます。", + "enableFailed": "ワークフローの有効化に失敗しました" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "ワークフローフォルダーが見つかりません", + "descriptionStandalone": "ワークフロー管理はオンですが、ワークフローフォルダーが見つかりませんでした。「設定 > モデルパス」でワークフローフォルダーを追加し、LoRA Managerを再起動してください。", + "hintStandalone": "ワークフローはfolder_paths.workflowsのエントリから読み込まれます。", + "descriptionComfyUI": "ワークフロー管理はオンですが、ワークフローフォルダーが設定されていません。「設定 > ライブラリ」でワークフローフォルダーを追加し、このページを再読み込みしてください。", + "hintComfyUI": "ワークフローは専用のライブラリフォルダー(folder_paths.workflows)に保存されます。ComfyUI標準のワークフローリストには影響しません。", + "openSettings": "設定を開く", + "openModelPaths": "モデルフォルダーを設定", + "openSettingsFolder": "設定フォルダーを開く" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "モデルキャッシュをスキャンして構築中です。数分かかる場合があります..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "ワークフローマネージャーを初期化中", + "message": "ワークフローキャッシュをスキャンして構築中。数分かかる場合があります..." }, "recipes": { "title": "レシピマネージャーを初期化中", diff --git a/locales/ko.json b/locales/ko.json index c6ec8bc0..7845bbf1 100644 --- a/locales/ko.json +++ b/locales/ko.json @@ -157,8 +157,8 @@ "modelNameCopied": "모델 이름 복사됨", "sendCheckpointToWorkflow": "ComfyUI로 전송", "sendEmbeddingToWorkflow": "ComfyUI로 전송", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "ComfyUI에서 열기", + "copyWorkflowToClipboard": "워크플로를 클립보드에 복사" }, "nsfw": { "matureContent": "성인 콘텐츠", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "기타", - "workflows": "[TODO: Translate] Workflows", + "workflows": "워크플로", "statistics": "통계" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "다운로드, 가져오기 및 이동을 위한 기본 ControlNet 루트 디렉토리를 설정합니다", "enableOtherModels": "기타 모델 관리", "enableOtherModelsHelp": "끄면 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 폴더를 스캔하지 않으며, 기타 모델 페이지가 비활성화된 상태로 유지되고 이러한 모델 유형은 다운로드할 수 없습니다.", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "워크플로 관리", + "enableWorkflowsHelp": "끄면 워크플로 폴더(folder_paths.workflows)를 스캔하지 않으며, 워크플로 페이지가 비활성화된 상태로 유지되고 CivitAI의 Workflow 리소스를 연결하거나 다운로드할 수 없습니다.", + "workflowFolders": "워크플로 폴더", + "workflowFoldersHelp": "ComfyUI 워크플로 JSON 파일을 스캔할 폴더입니다. LoRA Manager에서만 관리하며(ComfyUI와 공유되지 않음), 변경 사항은 즉시 적용됩니다.", "otherSubTypes": "관리할 모델 유형", "otherSubTypesHelp": "기타 모델 페이지에서 스캔하고 표시할 카테고리를 선택합니다.", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "CLIP 경로 (레거시)", "clip_vision": "CLIP Vision 경로", "controlnet": "ControlNet 경로", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "워크플로 경로" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "워크플로", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "ComfyUI에서 열기", + "updateFromComfy": "ComfyUI에서 업데이트", + "copyWorkflow": "워크플로 복사", + "restoreDownloaded": "다운로드한 버전 복원" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "워크플로를 ComfyUI로 보냈습니다", + "failed": "워크플로 전송 실패: {message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "다운로드한 버전을 복원할까요?", + "message": "로컬 편집 내용이 삭제되고 워크플로가 다운로드한 버전으로 복원됩니다.", + "confirmButton": "복원", + "restoring": "워크플로 복원 중...", + "success": "워크플로를 다운로드한 버전으로 복원했습니다", + "failed": "워크플로 복원 실패: {message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "ComfyUI에서 워크플로를 업데이트했습니다", + "noChanges": "ComfyUI에 다시 기록할 변경 사항이 없습니다", + "cancelled": "업데이트가 취소되었습니다", + "failed": "ComfyUI에서 업데이트 실패: {message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "워크플로 복사 실패: {message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "워크플로 관리가 꺼져 있습니다", + "description": "활성화하면 ComfyUI 워크플로 파일을 스캔하고 관리하며, CivitAI 메타데이터와 미리보기를 유지하고 실행 중인 ComfyUI로 전송할 수 있습니다.", + "enableButton": "워크플로 활성화", + "hint": "나중에 설정 > 라이브러리에서 이 기능을 다시 끌 수 있습니다.", + "enableFailed": "워크플로 활성화 실패" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "워크플로 폴더를 찾을 수 없습니다", + "descriptionStandalone": "워크플로 관리가 켜져 있지만, 워크플로 폴더를 찾을 수 없습니다. 설정 → 모델 경로에서 워크플로 폴더를 추가한 뒤 LoRA Manager를 재시작하세요.", + "hintStandalone": "워크플로는 folder_paths.workflows 항목에서 읽어옵니다.", + "descriptionComfyUI": "워크플로 관리가 켜져 있지만, 설정된 워크플로 폴더가 없습니다. 설정 → 라이브러리에서 워크플로 폴더를 추가한 뒤 이 페이지를 새로 고침하세요.", + "hintComfyUI": "워크플로는 자체 라이브러리 폴더(folder_paths.workflows)에 있으며, ComfyUI에 내장된 워크플로 목록은 변경되지 않습니다.", + "openSettings": "설정 열기", + "openModelPaths": "모델 폴더 구성", + "openSettingsFolder": "설정 폴더 열기" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "모델 캐시를 스캔하고 구축하고 있습니다. 몇 분이 걸릴 수 있습니다..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "워크플로 매니저 초기화 중", + "message": "워크플로 캐시를 스캔하고 구축하고 있습니다. 몇 분이 걸릴 수 있습니다..." }, "recipes": { "title": "레시피 매니저 초기화 중", diff --git a/locales/ru.json b/locales/ru.json index e1d35839..6f5dc669 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -157,8 +157,8 @@ "modelNameCopied": "Имя модели скопировано", "sendCheckpointToWorkflow": "Отправить в ComfyUI", "sendEmbeddingToWorkflow": "Отправить в ComfyUI", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "Открыть в ComfyUI", + "copyWorkflowToClipboard": "Копировать workflow в буфер обмена" }, "nsfw": { "matureContent": "Контент для взрослых", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoints", "embeddings": "Embeddings", "other": "Другое", - "workflows": "[TODO: Translate] Workflows", + "workflows": "Workflows", "statistics": "Статистика" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "Установить корневую папку ControlNet по умолчанию для загрузок, импорта и перемещений", "enableOtherModels": "Управление другими моделями", "enableOtherModelsHelp": "Если выключено, папки VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet не сканируются, страница «Другие модели» остаётся отключённой, а эти типы моделей нельзя загрузить.", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "Управление workflow", + "enableWorkflowsHelp": "Если выключено, папки workflow (folder_paths.workflows) не сканируются, страница Workflows остаётся отключённой, а ресурсы Workflow с CivitAI нельзя связать или скачать.", + "workflowFolders": "Папки workflow", + "workflowFoldersHelp": "Папки, в которых сканируются JSON-файлы workflow ComfyUI. Управляются только LoRA Manager (не используются совместно с ComfyUI); изменения применяются сразу.", "otherSubTypes": "Управляемые типы моделей", "otherSubTypesHelp": "Выберите, какие категории других моделей сканируются и отображаются на странице «Другие модели».", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "Пути CLIP (устаревшие)", "clip_vision": "Пути CLIP Vision", "controlnet": "Пути ControlNet", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "Пути workflow" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "Workflows", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "Открыть в ComfyUI", + "updateFromComfy": "Обновить из ComfyUI", + "copyWorkflow": "Копировать workflow", + "restoreDownloaded": "Восстановить загруженную версию" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "Workflow отправлен в ComfyUI", + "failed": "Не удалось отправить workflow: {message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "Восстановить загруженную версию?", + "message": "Локальные изменения будут отброшены, а workflow вернётся к загруженной версии.", + "confirmButton": "Восстановить", + "restoring": "Восстановление workflow...", + "success": "Workflow восстановлен до загруженной версии", + "failed": "Не удалось восстановить workflow: {message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "Workflow обновлён из ComfyUI", + "noChanges": "В ComfyUI нет изменений для записи обратно", + "cancelled": "Обновление отменено", + "failed": "Не удалось обновить из ComfyUI: {message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "Не удалось скопировать workflow: {message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "Управление workflow отключено", + "description": "Включите, чтобы сканировать и управлять файлами workflow ComfyUI, сохранять их метаданные и превью CivitAI и отправлять их в работающий граф ComfyUI.", + "enableButton": "Включить Workflows", + "hint": "Вы сможете снова отключить эту функцию позже в разделе «Настройки > Библиотека».", + "enableFailed": "Не удалось включить Workflows" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "Папки workflow не найдены", + "descriptionStandalone": "Управление workflow включено, но папки workflow не найдены. Добавьте свои папки workflow в разделе «Настройки → Пути к моделям», затем перезапустите LoRA Manager.", + "hintStandalone": "Workflow читаются из записей folder_paths.workflows.", + "descriptionComfyUI": "Управление workflow включено, но папки workflow не настроены. Добавьте папки workflow в разделе «Настройки → Библиотека» и перезагрузите эту страницу.", + "hintComfyUI": "Workflow хранятся в собственных папках библиотеки (folder_paths.workflows); встроенный список workflow в ComfyUI не затрагивается.", + "openSettings": "Открыть настройки", + "openModelPaths": "Настроить папки моделей", + "openSettingsFolder": "Открыть папку настроек" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "Сканирование и построение кэша моделей. Это может занять несколько минут..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "Инициализация менеджера workflow", + "message": "Сканирование и построение кэша workflow. Это может занять несколько минут..." }, "recipes": { "title": "Инициализация менеджера рецептов", diff --git a/locales/zh-CN.json b/locales/zh-CN.json index f0f34d9b..331849f5 100644 --- a/locales/zh-CN.json +++ b/locales/zh-CN.json @@ -157,8 +157,8 @@ "modelNameCopied": "模型名称已复制", "sendCheckpointToWorkflow": "发送到 ComfyUI", "sendEmbeddingToWorkflow": "发送到 ComfyUI", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "在 ComfyUI 中打开", + "copyWorkflowToClipboard": "复制工作流到剪贴板" }, "nsfw": { "matureContent": "成熟内容", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "其他", - "workflows": "[TODO: Translate] Workflows", + "workflows": "工作流", "statistics": "统计" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "设置下载、导入和移动时的默认 ControlNet 根目录", "enableOtherModels": "其他模型管理", "enableOtherModelsHelp": "关闭后,不会扫描 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 文件夹,其他模型页面保持禁用,且无法下载这些模型类型。", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "工作流管理", + "enableWorkflowsHelp": "关闭后,不会扫描工作流文件夹(folder_paths.workflows),工作流页面保持禁用,且无法关联或下载 CivitAI 的 Workflow 资源。", + "workflowFolders": "工作流文件夹", + "workflowFoldersHelp": "扫描 ComfyUI 工作流 JSON 文件的文件夹。仅由 LoRA Manager 管理(不与 ComfyUI 共享);更改立即生效。", "otherSubTypes": "管理的模型类型", "otherSubTypesHelp": "选择要在其他模型页面中扫描和显示的其他模型类别。", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "CLIP 路径(旧版)", "clip_vision": "CLIP Vision 路径", "controlnet": "ControlNet 路径", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "工作流路径" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "工作流", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "在 ComfyUI 中打开", + "updateFromComfy": "从 ComfyUI 更新", + "copyWorkflow": "复制工作流", + "restoreDownloaded": "恢复已下载版本" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "工作流已发送到 ComfyUI", + "failed": "发送工作流失败:{message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "恢复已下载版本?", + "message": "这会丢弃本地修改,并将工作流恢复到下载时的版本。", + "confirmButton": "恢复", + "restoring": "正在恢复工作流...", + "success": "工作流已恢复到已下载版本", + "failed": "恢复工作流失败:{message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "已从 ComfyUI 更新工作流", + "noChanges": "ComfyUI 中没有需要写回的更改", + "cancelled": "更新已取消", + "failed": "从 ComfyUI 更新失败:{message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "复制工作流失败:{message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "工作流管理已关闭", + "description": "启用后可扫描和管理 ComfyUI 工作流文件,保留其 CivitAI 元数据和预览,并将它们发送到正在运行的 ComfyUI 中。", + "enableButton": "启用工作流", + "hint": "你可以稍后在“设置 > 库”中再次关闭此功能。", + "enableFailed": "启用工作流失败" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "未找到工作流文件夹", + "descriptionStandalone": "工作流管理已开启,但未找到工作流文件夹。请在“设置 → 模型路径”中添加工作流文件夹,然后重启 LoRA Manager。", + "hintStandalone": "工作流从 folder_paths.workflows 条目中读取。", + "descriptionComfyUI": "工作流管理已开启,但未配置工作流文件夹。请在“设置 → 库”中添加工作流文件夹,然后重新加载此页面。", + "hintComfyUI": "工作流存放在独立的库文件夹中(folder_paths.workflows);不会影响 ComfyUI 内置的工作流列表。", + "openSettings": "打开设置", + "openModelPaths": "配置模型文件夹", + "openSettingsFolder": "打开设置文件夹" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "正在扫描并构建模型缓存。这可能需要几分钟..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "初始化工作流管理器", + "message": "正在扫描并构建工作流缓存。这可能需要几分钟..." }, "recipes": { "title": "初始化配方管理器", diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 9b01b91c..1fd9c76e 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -157,8 +157,8 @@ "modelNameCopied": "模型名稱已複製", "sendCheckpointToWorkflow": "傳送到 ComfyUI", "sendEmbeddingToWorkflow": "傳送到 ComfyUI", - "openInComfyUI": "[TODO: Translate] Open in ComfyUI", - "copyWorkflowToClipboard": "[TODO: Translate] Copy workflow to clipboard" + "openInComfyUI": "在 ComfyUI 中開啟", + "copyWorkflowToClipboard": "複製工作流到剪貼簿" }, "nsfw": { "matureContent": "成熟內容", @@ -246,7 +246,7 @@ "checkpoints": "Checkpoint", "embeddings": "Embedding", "other": "其他", - "workflows": "[TODO: Translate] Workflows", + "workflows": "工作流", "statistics": "統計" }, "search": { @@ -636,10 +636,10 @@ "defaultControlnetRootHelp": "設定下載、匯入和移動時的預設 ControlNet 根目錄", "enableOtherModels": "其他模型管理", "enableOtherModelsHelp": "關閉後,不會掃描 VAE / Upscaler / Text Encoder / CLIP Vision / ControlNet 資料夾,其他模型頁面會保持停用,且無法下載這些模型類型。", - "enableWorkflows": "[TODO: Translate] Workflow Management", - "enableWorkflowsHelp": "[TODO: Translate] When off, workflow folders (folder_paths.workflows) are not scanned, the Workflows page stays disabled, and CivitAI Workflow resources cannot be linked or downloaded.", - "workflowFolders": "[TODO: Translate] Workflow Folders", - "workflowFoldersHelp": "[TODO: Translate] Folders scanned for ComfyUI workflow JSON files. Managed by LoRA Manager only (not shared with ComfyUI); changes apply immediately.", + "enableWorkflows": "工作流管理", + "enableWorkflowsHelp": "關閉後,不會掃描工作流資料夾(folder_paths.workflows),工作流頁面會保持停用,且無法連結或下載 CivitAI 的 Workflow 資源。", + "workflowFolders": "工作流資料夾", + "workflowFoldersHelp": "掃描 ComfyUI 工作流 JSON 檔案的資料夾。僅由 LoRA Manager 管理(不與 ComfyUI 共用);變更立即生效。", "otherSubTypes": "管理的模型類型", "otherSubTypesHelp": "選擇要在其他模型頁面中掃描和顯示的其他模型類別。", "subTypeVae": "VAE", @@ -694,7 +694,7 @@ "clip": "CLIP 路徑(舊版)", "clip_vision": "CLIP Vision 路徑", "controlnet": "ControlNet 路徑", - "workflows": "[TODO: Translate] Workflow Paths" + "workflows": "工作流路徑" } }, "directoryPicker": { @@ -1456,50 +1456,50 @@ } }, "workflows": { - "title": "[TODO: Translate] Workflows", + "title": "工作流", "contextMenu": { - "sendToComfy": "[TODO: Translate] Open in ComfyUI", - "updateFromComfy": "[TODO: Translate] Update from ComfyUI", - "copyWorkflow": "[TODO: Translate] Copy Workflow", - "restoreDownloaded": "[TODO: Translate] Restore Downloaded Version" + "sendToComfy": "在 ComfyUI 中開啟", + "updateFromComfy": "從 ComfyUI 更新", + "copyWorkflow": "複製工作流", + "restoreDownloaded": "還原已下載版本" }, "sendToComfy": { - "success": "[TODO: Translate] Workflow sent to ComfyUI", - "failed": "[TODO: Translate] Failed to send workflow: {message}" + "success": "工作流已傳送到 ComfyUI", + "failed": "傳送工作流失敗:{message}" }, "restoreDownloaded": { - "title": "[TODO: Translate] Restore Downloaded Version?", - "message": "[TODO: Translate] This discards local edits and restores the workflow to its downloaded version.", - "confirmButton": "[TODO: Translate] Restore", - "restoring": "[TODO: Translate] Restoring workflow...", - "success": "[TODO: Translate] Workflow restored to its downloaded version", - "failed": "[TODO: Translate] Failed to restore workflow: {message}" + "title": "要還原已下載版本嗎?", + "message": "這會捨棄本機修改,並將工作流還原為下載時的版本。", + "confirmButton": "還原", + "restoring": "正在還原工作流...", + "success": "工作流已還原為已下載版本", + "failed": "還原工作流失敗:{message}" }, "updateFromComfy": { - "success": "[TODO: Translate] Workflow updated from ComfyUI", - "noChanges": "[TODO: Translate] No changes in ComfyUI to write back", - "cancelled": "[TODO: Translate] Update cancelled", - "failed": "[TODO: Translate] Failed to update from ComfyUI: {message}" + "success": "已從 ComfyUI 更新工作流", + "noChanges": "ComfyUI 中沒有需要寫回的變更", + "cancelled": "更新已取消", + "failed": "從 ComfyUI 更新失敗:{message}" }, "copyWorkflow": { - "failed": "[TODO: Translate] Failed to copy workflow: {message}" + "failed": "複製工作流失敗:{message}" }, "disabled": { - "title": "[TODO: Translate] Workflow management is off", - "description": "[TODO: Translate] Enable it to scan and manage ComfyUI workflow files, keep their CivitAI metadata and previews, and send them into the running ComfyUI graph.", - "enableButton": "[TODO: Translate] Enable Workflows", - "hint": "[TODO: Translate] You can turn the feature off again later in Settings > Library.", - "enableFailed": "[TODO: Translate] Failed to enable Workflows" + "title": "工作流管理已關閉", + "description": "啟用後可掃描和管理 ComfyUI 工作流檔案,保留其 CivitAI 中繼資料和預覽,並將它們傳送到執行中的 ComfyUI 中。", + "enableButton": "啟用工作流", + "hint": "您稍後可以在「設定 > 模型庫」中再次關閉此功能。", + "enableFailed": "啟用工作流失敗" }, "noPaths": { - "title": "[TODO: Translate] No workflow folders found", - "descriptionStandalone": "[TODO: Translate] Workflow management is on, but no workflow folders were found. Add your workflow folders under Settings → Model Paths, then restart LoRA Manager.", - "hintStandalone": "[TODO: Translate] Workflows are read from the folder_paths.workflows entries.", - "descriptionComfyUI": "[TODO: Translate] Workflow management is on, but no workflow folders are configured. Add workflow folders in Settings → Library, then reload this page.", - "hintComfyUI": "[TODO: Translate] Workflows live in their own library folders (folder_paths.workflows); ComfyUI's built-in workflow list is not touched.", - "openSettings": "[TODO: Translate] Open Settings", - "openModelPaths": "[TODO: Translate] Configure Model Folders", - "openSettingsFolder": "[TODO: Translate] Open Settings Folder" + "title": "找不到工作流資料夾", + "descriptionStandalone": "工作流管理已開啟,但找不到工作流資料夾。請在「設定 > 模型路徑」中加入工作流資料夾,然後重新啟動 LoRA Manager。", + "hintStandalone": "工作流會從 folder_paths.workflows 項目讀取。", + "descriptionComfyUI": "工作流管理已開啟,但未設定工作流資料夾。請在「設定 > 模型庫」中加入工作流資料夾,然後重新載入此頁面。", + "hintComfyUI": "工作流存放在獨立的模型庫資料夾中(folder_paths.workflows);不會影響 ComfyUI 內建的工作流清單。", + "openSettings": "開啟設定", + "openModelPaths": "設定模型資料夾", + "openSettingsFolder": "開啟設定資料夾" } }, "sidebar": { @@ -2328,8 +2328,8 @@ "message": "正在掃描並建立模型快取。這可能需要幾分鐘..." }, "workflows": { - "title": "[TODO: Translate] Initializing Workflow Manager", - "message": "[TODO: Translate] Scanning and building workflow cache. This may take a few minutes..." + "title": "初始化工作流管理器", + "message": "正在掃描並建立工作流快取。這可能需要幾分鐘..." }, "recipes": { "title": "初始化配方管理器",