diff --git a/.gitignore b/.gitignore index c6a8ce39e..025826d0d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,8 @@ WebUI/external/service/ WebUI/external/workflows_intel/ WebUI/external/workflows_bak/ +*.pyc + *.7z *.whl hijacks/ diff --git a/AGENTS.md b/AGENTS.md index 1f7f81337..7ee12ae94 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -6,7 +6,7 @@ Concise reference for AI coding agents working in this repository. Electron + Vue.js desktop app for AI inference on Intel GPUs. Multi-process architecture: Electron main process orchestrates Vue.js frontend and multiple Python/native backend services -(AI Backend, ComfyUI, LlamaCPP, OpenVINO, Ollama). Frontend code lives in `WebUI/`. +(AI Backend, ComfyUI, LlamaCPP, OpenVINO). Frontend code lives in `WebUI/`. ## Mandatory Rules @@ -182,7 +182,7 @@ There is **no Vue Router**. Navigation is state-driven: - Once running, `promptStore.currentMode` controls which view renders: `chat` → `Chat.vue`, `imageGen`/`imageEdit`/`video` → `WorkflowResult.vue` - `PromptArea.vue` is the shared prompt input bar across all modes -### Backend Services (5 services, dynamic ports) +### Backend Services (4 services, dynamic ports) Managed by `electron/subprocesses/apiServiceRegistry.ts`. Each service spawns a child process and exposes an OpenAI-compatible HTTP API: @@ -192,14 +192,13 @@ Managed by `electron/subprocesses/apiServiceRegistry.ts`. Each service spawns a | `llamacpp-backend` | 39000-39999 | `llama-server` (native) | `/health` | GGUF model inference (LLM + embedding sub-servers) | | `openvino-backend` | 29000-29999 | `ovms` (native) | `/v2/health/ready` | OpenVINO inference (LLM + embedding + transcription sub-servers) | | `comfyui-backend` | 49000-49999 | ComfyUI `main.py` (Python) | `/queue` | Image/video/3D generation via workflows | -| `ollama-backend` | 40000-41000 | `ollama` (native) | `/api/version` | Ollama inference (preview feature) | ### Three Communication Patterns 1. **Electron IPC** (renderer ↔ main): ALL service lifecycle — start, stop, setup, device selection, `ensureBackendReadiness`. Renderer calls `window.electronAPI.*`, main handles via `ipcMain.handle()`. Main pushes events via `win.webContents.send()`. 2. **Direct HTTP** (renderer → backend): For actual AI operations after service is ready: - - **Chat inference**: Vercel AI SDK `streamText()` → `{backendUrl}/v1/chat/completions` (LlamaCpp/OpenVINO/Ollama) + - **Chat inference**: Vercel AI SDK `streamText()` → `{backendUrl}/v1/chat/completions` (LlamaCpp/OpenVINO) - **Model management**: `fetch()` → Flask ai-backend `/api/*` (download, check, size) - **Image generation**: `fetch()` → ComfyUI `/prompt`, `/upload/image`, `/interrupt`, `/free` @@ -254,12 +253,11 @@ User sends message → `textInference.ensureReadyForInference()` → IPC `ensure - `demoMode` — Demo mode overlay + auto-reset timer. IPC: `getDemoModeSettings`. No deps. - `speechToText` — STT enabled state, initialization. Deps: `backendServices`, `models`, `dialogs`, `globalSetup` - `audioRecorder` — Browser MediaRecorder, transcription via AI SDK. Deps: `backendServices` (lazy) -- `ollama` — Ollama model pull progress. Deps: `textInference` - `developerSettings` — Dev console on startup toggle. No deps. ### Feature → File Map -**Chat/LLM**: `views/Chat.vue` → stores: `openAiCompatibleChat`, `textInference`, `conversations`, `presets` → electron: `ensureBackendReadiness` IPC → backend: `llamacpp`/`openvino`/`ollama` via Vercel AI SDK +**Chat/LLM**: `views/Chat.vue` → stores: `openAiCompatibleChat`, `textInference`, `conversations`, `presets` → electron: `ensureBackendReadiness` IPC → backend: `llamacpp`/`openvino` via Vercel AI SDK **Image/Video Generation**: `views/WorkflowResult.vue` → stores: `imageGenerationPresets`, `comfyUiPresets`, `presets` → electron: service lifecycle IPC → backend: `comfyui-backend` via direct HTTP @@ -285,7 +283,56 @@ User sends message → `textInference.ensureReadyForInference()` → IPC `ensure | `electron/subprocesses/llamaCppBackendService.ts` | LlamaCPP native server (LLM + embedding sub-servers) | | `electron/subprocesses/openVINOBackendService.ts` | OpenVINO OVMS (LLM + embedding + transcription sub-servers) | | `electron/subprocesses/comfyUIBackendService.ts` | ComfyUI Python server | -| `electron/subprocesses/ollamaBackendService.ts` | Ollama binary (preview) | | `electron/subprocesses/langchain.ts` | RAG utility process (document splitting, embedding, vector search) | | `electron/subprocesses/deviceDetection.ts` | Intel GPU device detection and env var setup | | `electron/logging/logger.ts` | Logging, sends `debugLog` events to renderer | + +## Cursor Cloud specific instructions + +### Running the dev server + +```bash +cd /workspace/WebUI +npm run fetch-external-resources # first time only — downloads uv + 7zip binaries +DISPLAY=:1 npm run dev +``` + +The Vite dev server starts on `http://localhost:25413` and Electron opens automatically. +A virtual framebuffer (`Xvfb`) is already running on `:1`. + +### Backend services on Linux + +The `ai-backend` and `llamacpp-backend` services work on Linux (Ubuntu x64): + +- Run `npm run fetch-external-resources` once to download `uv` and `7zip` binaries for + the current platform (placed in `build/resources/`). +- Start the Electron app with `DISPLAY=:1 npm run dev`. On the setup dialog, click + **Install** next to `AI Playground` (ai-backend) and `Llama.cpp - GGUF` (llamacpp-backend). +- `ai-backend` runs a Python Flask server on port 59000 (health: `GET /healthy`). +- `llamacpp-backend` downloads the `ubuntu-x64` CPU build from GitHub releases and + provides on-demand LLM inference (health: `GET /health`). +- ComfyUI and OpenVINO are not yet supported on Linux. + +### Testing inference end-to-end + +A small test model (`LFM2.5-350M-Q4_K_M.gguf`, ~255 MB) is registered in `models.json`. +To test inference: + +1. Start the app, install both backends via the setup dialog, then click **Continue**. +2. Open **Chat Settings**, select **LFM2.5-350M-Q4_K_M.gguf** from the Model dropdown. +3. Type a message and send — the app auto-downloads the model from HuggingFace on first use. +4. The llamacpp-backend will load the model and serve streaming responses. + +**Network requirement**: Model downloads redirect through `cas-bridge.xethub.hf.co` +(HuggingFace Xet CDN). This domain must be in the egress allowlist. Allowlist changes +only take effect on new VM sessions — a running VM will not pick up changes. + +### Known issues + +- **`npm install` requires `--legacy-peer-deps`** due to a `zod@4` vs `zod@3` peer + conflict from `@browserbasehq/stagehand` (transitive dep of `@langchain/community`). +- **`electron/test/subprocesses/service.test.ts` fails** because the `electron` path alias + in `vitest.config.ts` shadows the `electron` package mock. This is a pre-existing issue + on the `dev` branch — 4 of 5 test files (24 tests) pass. +- **Prettier reports 2 pre-existing formatting issues** in `electron/subprocesses/openVINOBackendService.ts` + and `src/components/BackendOptions.vue` on the `dev` branch. diff --git a/OpenVINO/uv.lock b/OpenVINO/uv.lock index cf2a269d7..96d516806 100644 --- a/OpenVINO/uv.lock +++ b/OpenVINO/uv.lock @@ -84,127 +84,118 @@ wheels = [ [[package]] name = "numpy" -version = "2.3.5" +version = "2.4.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", ] -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, + { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, + { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, + { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, + { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, + { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, + { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, + { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, + { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, ] [[package]] name = "openvino" -version = "2025.4.1" +version = "2026.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "openvino-telemetry" }, - { name = "packaging" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/45/b4/d534747b511a5fd481e4ec887e10d6b6c92b9c915b574d28343016381d13/openvino-2025.4.1-20426-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:4fd1bf11820c6d331234748422a9e118961b77f1984c22f52591f0ed8580ec6f", size = 37639757, upload-time = "2025-12-17T16:17:34.734Z" }, - { url = "https://files.pythonhosted.org/packages/84/10/b993036d4bfdae5bfc0cada9ed84d863efea4e46f2c3f4f5eeae666c5913/openvino-2025.4.1-20426-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:73a3500de6191a1742615a2412909894d436728d26635e4fc3c23a4a93038a39", size = 32839385, upload-time = "2025-12-17T16:17:37.774Z" }, - { url = "https://files.pythonhosted.org/packages/49/24/67df322ba2a222bf5e0716a8255e5d8bc416ad729495d18bc72ccd6a421c/openvino-2025.4.1-20426-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:19c3cfd5f80b548106ccb2d91449c3b11a29ba7987e85c121ad16079e7846924", size = 50261673, upload-time = "2025-12-17T16:17:40.785Z" }, - { url = "https://files.pythonhosted.org/packages/eb/95/6ae139a534170810b84d7b980cb7380ec857c4c59555cb370b7643de228f/openvino-2025.4.1-20426-cp310-cp310-manylinux_2_35_aarch64.whl", hash = "sha256:ee82dd3c0ed408cb1d93fea15e143948daafba276b53ad56f437d5a15354fb8c", size = 28250730, upload-time = "2025-12-17T16:17:46.949Z" }, - { url = "https://files.pythonhosted.org/packages/18/b5/67a40ffd6504b2c7a7dec8fa5b6e235d17364f1354e50929e6909e3b6438/openvino-2025.4.1-20426-cp310-cp310-win_amd64.whl", hash = "sha256:1147b86c96535fbc362ac1980bfe726272c4ae3952280fbb55f7de8a9cef4b7a", size = 41792159, upload-time = "2025-12-17T16:17:49.902Z" }, - { url = "https://files.pythonhosted.org/packages/21/13/5e75a1ff33473e2c59502068cd3997b70dcc5f5c0e227de136394c5c7a74/openvino-2025.4.1-20426-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:ee8ce8ebf22d407ce3b50f7926ee9b2fb9b17d131bae4bee68eba3bb5bbee203", size = 37647388, upload-time = "2025-12-17T16:17:52.78Z" }, - { url = "https://files.pythonhosted.org/packages/b3/80/8f0682271baef15e5baf469b2d1400fefbbc23a963f0dbcded5400c7b60b/openvino-2025.4.1-20426-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:12c482011835d72341f038021129036089c6571f8d713810caaeba88750062e8", size = 32847644, upload-time = "2025-12-17T16:17:56.28Z" }, - { url = "https://files.pythonhosted.org/packages/38/86/084a1d7e69c309e1e6a2c48a374cd78c99bed5acd74b9a3fb5653b151a71/openvino-2025.4.1-20426-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:c552a68c094b0d75f48b7c19cbd3482c44e4e267821897dcb7c9f7c36ba5f88b", size = 50270056, upload-time = "2025-12-17T16:17:59.424Z" }, - { url = "https://files.pythonhosted.org/packages/bd/dc/797b7874184d7c0b54cceef8c5a9066ef681e0235df6e8f496a1338dd4a6/openvino-2025.4.1-20426-cp311-cp311-manylinux_2_35_aarch64.whl", hash = "sha256:86d2d7c94cd3d29d4080cd105a3af50d3497a348b0e3414c2c04a2532feb4c12", size = 28261416, upload-time = "2025-12-17T16:18:01.898Z" }, - { url = "https://files.pythonhosted.org/packages/37/a5/4fcef1515b893b503f4ac54d7b17668fde9cdbed1c06cd8b2f798833cab4/openvino-2025.4.1-20426-cp311-cp311-win_amd64.whl", hash = "sha256:695f9b5cdb1bc6315383548517e9836b7580220b711ca9417a034ce55028bf85", size = 41798606, upload-time = "2025-12-17T16:18:04.753Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/77da5039032063747dcf39434662f31d914fd515de86a20a405eea315c53/openvino-2025.4.1-20426-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:8994fcc9082fe4aed1ed2a6e531280de38d7293943c00284560b854945d5af9b", size = 37709218, upload-time = "2025-12-17T16:18:07.829Z" }, - { url = "https://files.pythonhosted.org/packages/a0/79/57b35b05875e9155d8802815ad2c93bdc46e7c8883ce53109b7ba95f9d8d/openvino-2025.4.1-20426-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d082e73af653a40b97efaa8219adf62c60f32060b9929ebcb60d7f14e79e4f1", size = 32880775, upload-time = "2025-12-17T16:18:10.792Z" }, - { url = "https://files.pythonhosted.org/packages/8a/91/807f4e288969bc696dee2e56d7269abffb56626249642effb8ec2ab7d424/openvino-2025.4.1-20426-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:88f074286d420c1a1a95e7f2ba11109a899f2f3b3fd818cfe1e47ead22cc7e45", size = 50278348, upload-time = "2025-12-17T16:18:13.894Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b4/6c8f68db079b4a140c301c00f9c361df011b4d1205bbdb4cff93f9192348/openvino-2025.4.1-20426-cp312-cp312-manylinux_2_35_aarch64.whl", hash = "sha256:9fb7d45c8bb6c1ea9f90a18b6c9e18c4d3ce0d249198b6d9544b446285a33d3b", size = 28257849, upload-time = "2025-12-17T16:18:16.514Z" }, - { url = "https://files.pythonhosted.org/packages/64/c2/582bd6d01fc6588bfe35c0f363d294a54daa4587cafe30e932fa51420d04/openvino-2025.4.1-20426-cp312-cp312-win_amd64.whl", hash = "sha256:c50293d1463698012eaa526dcc83f841b85a3f4952eea4c9445c83e0346f8e80", size = 41791284, upload-time = "2025-12-17T16:18:19.673Z" }, - { url = "https://files.pythonhosted.org/packages/66/13/b00fa1dc7c6829b10c595031ad9cf883ba0f3af0ebbb4f0c39eec74587b1/openvino-2025.4.1-20426-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:526578080e4f593361b2beb03c3549a6a4446b7acfad19ff8b43b27837fa0fc7", size = 37709495, upload-time = "2025-12-17T16:18:22.596Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b9/2a53eb9f0e9854a9be5f7cd4938c60a8cc7c5683f0fc08aa6ff7c87f5221/openvino-2025.4.1-20426-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5dd7947a63c89a4b7133a0cecb7b641f05e5ba22133b99241542884ab59117ef", size = 32880891, upload-time = "2025-12-17T16:18:25.159Z" }, - { url = "https://files.pythonhosted.org/packages/d7/76/099c34ac7563a350325efe6dbc91b5cc20f0aa2331a6e036f2da262bab57/openvino-2025.4.1-20426-cp313-cp313-manylinux2014_x86_64.whl", hash = "sha256:68f8d6cfd74c7a74d68a62c8156830ddaa5b9f1f782d3643def83f659c0a6671", size = 50280569, upload-time = "2025-12-17T16:18:28.621Z" }, - { url = "https://files.pythonhosted.org/packages/67/84/8b3e5d5599ec093b92f3b7d80323862fd33dbe309267b71df30b932cba85/openvino-2025.4.1-20426-cp313-cp313-manylinux_2_35_aarch64.whl", hash = "sha256:94c80dfd144eb2b5ea075e7127d59ec7160c567ce1d9a68167aa147a4aa50e0e", size = 28257839, upload-time = "2025-12-17T16:18:31.165Z" }, - { url = "https://files.pythonhosted.org/packages/3c/e5/da52a86cc5f1c86871002712429cdcca0c0dbff12dfbce730b05db60340b/openvino-2025.4.1-20426-cp313-cp313-win_amd64.whl", hash = "sha256:a28eef35e3ed497c3238eb8f3d1ee90647c449707a8b0a7630758cd15555d8dd", size = 41791079, upload-time = "2025-12-17T16:18:34.307Z" }, - { url = "https://files.pythonhosted.org/packages/36/cb/8fbf8bac4d7a217905410bb98be22db7c9a738b4674bcb32d576905cf9cb/openvino-2025.4.1-20426-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ea79341a1a4f9215de6f5052addadc724b7789c5c23be2815876675bf9e6d1a9", size = 37693208, upload-time = "2025-12-17T16:18:36.859Z" }, - { url = "https://files.pythonhosted.org/packages/05/56/ab685085a4a0e8321b0c64ed67fb3f7ea995d90e0d38c5d11d382c627bdc/openvino-2025.4.1-20426-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:87e3451ea9590b181020ec7fdb2c6e8a5700fd679d834b017433dab577d7538a", size = 32883027, upload-time = "2025-12-17T16:18:40.024Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3a/641acacdcbd4ad440592d3caf11e1ecc90e653d0b82ed1571ea16e14d8df/openvino-2025.4.1-20426-cp314-cp314-manylinux2014_x86_64.whl", hash = "sha256:35498cb7fdae04bcb255637ed1162aa05afd266268effc6fb5b1acb3d56fd0a4", size = 50283186, upload-time = "2025-12-17T16:18:42.831Z" }, - { url = "https://files.pythonhosted.org/packages/11/62/c23fdd85bfa1d5aae890cfbfd355f2539c181e79bdfeb8d3e506a06977a2/openvino-2025.4.1-20426-cp314-cp314-win_amd64.whl", hash = "sha256:922ab6a53cc832fca07f7da40511ad89dfe5572df596a3944990777147f8fbdd", size = 41797514, upload-time = "2025-12-17T16:18:45.874Z" }, - { url = "https://files.pythonhosted.org/packages/fe/44/ba24b4b1c9f0dc9e3474c532452d8777da198e820b7d6770f1af77f62fb8/openvino-2025.4.1-20426-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f95086869c276fca0a819acc0dd483a90450541be9d4432b01a4efd07e0e2b53", size = 37889115, upload-time = "2025-12-17T16:18:48.556Z" }, - { url = "https://files.pythonhosted.org/packages/20/6f/1326055d48b4e7447149cb07158dbf8d3812a85af5826f59a2f51aab1b73/openvino-2025.4.1-20426-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:facd552e978926e5f084ee49d90b44746e5d90abc00ec237d9a50b1144cd9a51", size = 33210907, upload-time = "2025-12-17T16:18:51.854Z" }, - { url = "https://files.pythonhosted.org/packages/49/ed/194a559f77893c7208ce6168890726cea04707114c8eaa6e090f343a4ae0/openvino-2025.4.1-20426-cp314-cp314t-manylinux2014_x86_64.whl", hash = "sha256:840a853c3879879fe465caca41e8bdc21a4e5eda51fb2347f2a7d450f9a5de2f", size = 50332115, upload-time = "2025-12-17T16:18:54.955Z" }, - { url = "https://files.pythonhosted.org/packages/66/34/6a4e0e89f49f08e90020e6aa9df283bbd4b0311efcad30097decc43624f2/openvino-2025.4.1-20426-cp314-cp314t-win_amd64.whl", hash = "sha256:1f4b38357a88c81a0976525821240dc3e21aeaccee94590d97d62fd5a70836da", size = 41970516, upload-time = "2025-12-17T16:18:57.85Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b5/e9252e1c90fd2041a938a83f6fe125ac6215bf85781b249fcd9f1234c319/openvino-2026.1.0-21367-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfe04e262aabbe8d7c376aaac083a9219d3c0503a681972de70704f9df01d369", size = 30836418, upload-time = "2026-04-07T14:17:52.417Z" }, + { url = "https://files.pythonhosted.org/packages/1e/94/7c6fc960dea3e96d8b14f6d87a8a985b205343cc964581662594e91ecfb1/openvino-2026.1.0-21367-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:baa596cad53398045887395d8539a303d18fbe3bb4865c1568878c66437fe295", size = 56801158, upload-time = "2026-04-07T14:17:57.58Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/d8a6ad25e0fd4362c1647b140060682cde3d06d56460495876acedd796c9/openvino-2026.1.0-21367-cp310-cp310-manylinux_2_35_aarch64.whl", hash = "sha256:a30f83e92234ffd018d47c41e03257c3919c88e082f97046643af318e9d9f694", size = 26852667, upload-time = "2026-04-07T14:18:01.036Z" }, + { url = "https://files.pythonhosted.org/packages/4d/36/2564301ebb224039ee81cec6f58bdd6621dd66bf01f3548dd8a929f91c5c/openvino-2026.1.0-21367-cp310-cp310-win_amd64.whl", hash = "sha256:bf46c0adbbc250b098acab0ac25a463a98c0d5cb975d7e0ca5e3771f5521d5bd", size = 71164298, upload-time = "2026-04-07T14:18:06.114Z" }, + { url = "https://files.pythonhosted.org/packages/9b/6d/f7c1a43419498aba1398abefa67777c1a744f6500d066cacb1d1fefeab17/openvino-2026.1.0-21367-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:713618d0c345473f8cc446997977650a579ac74baaec3dc8fdebd8d3886bc13e", size = 30842985, upload-time = "2026-04-07T14:18:09.879Z" }, + { url = "https://files.pythonhosted.org/packages/f0/82/8987572ac5acec9f85f4ca26b723f35a0dbad33fc3eddad7fd3da76c34d9/openvino-2026.1.0-21367-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:117bae89a1869488ae51e38633e6b370fb52733a52635e4e4690a92b2bed73c4", size = 56808892, upload-time = "2026-04-07T14:18:14.019Z" }, + { url = "https://files.pythonhosted.org/packages/28/a3/65f78e9e04f4155ea98e30ed24838138ee34e73c19ca1d88a4737fc83dea/openvino-2026.1.0-21367-cp311-cp311-manylinux_2_35_aarch64.whl", hash = "sha256:6755efe9259f1de0e9cd3d36dcff9eeb7c26df5fd6d4d2ddf16bacc7f03f32f2", size = 26860001, upload-time = "2026-04-07T14:18:17.591Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3a/0083a5a04d1a4a5b5ff756701394bb97659e101d0a2c0a3c1a0edc271c32/openvino-2026.1.0-21367-cp311-cp311-win_amd64.whl", hash = "sha256:b11217af27490f55e45a471bbfb4fcfb34358eaf70a512e09473e02a1842ee05", size = 71168987, upload-time = "2026-04-07T14:18:22.695Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ee/9efdb99429a01f3f9705a62a93149b8f5ef34405d5840e2c48fcebde9a4a/openvino-2026.1.0-21367-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d4e8389590b4419adfc4b060a621a20471961624c4f36b05396054389518678e", size = 30887535, upload-time = "2026-04-07T14:18:26.804Z" }, + { url = "https://files.pythonhosted.org/packages/c6/6a/e71fdc9d07668a149c7dc9dcbfe87d121b329e8297da080201c3ea2abb7e/openvino-2026.1.0-21367-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4b0559cafdc6ebd96544c7e4a50700cf46c608b7189a947e3a496d5a38badf3a", size = 56819721, upload-time = "2026-04-07T14:18:31.333Z" }, + { url = "https://files.pythonhosted.org/packages/db/9e/24497251b2ae226d7e9ce5beea3b667169cf0287203a4d138d58e3944736/openvino-2026.1.0-21367-cp312-cp312-manylinux_2_35_aarch64.whl", hash = "sha256:12e3ecb96950173cd3e17a48763f47744f1f048bae7dd8f7bc416f0c665c24e3", size = 26852687, upload-time = "2026-04-07T14:18:34.95Z" }, + { url = "https://files.pythonhosted.org/packages/73/cb/07035dcbf60347c0706c4f8d3ffb003c34fe8205e4041699a6655cc858c3/openvino-2026.1.0-21367-cp312-cp312-win_amd64.whl", hash = "sha256:21fbc8f9aa765d9ded024311f4e48e38118643cda0f0139dcfa5422c0c457eb6", size = 71174500, upload-time = "2026-04-07T14:18:41.069Z" }, + { url = "https://files.pythonhosted.org/packages/36/7b/721bd8e5cd18c31e73ab0ae5143ff222aa7af639fbde9276059e408dcae9/openvino-2026.1.0-21367-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e19cf36e0d65d2905492d1465af2481315a055fb1224e3ba65c94def943b3ee9", size = 30887829, upload-time = "2026-04-07T14:18:44.628Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/6edb62a43cc206d8227da0b570f15a64d5ea122e002e299b733203f4fdfe/openvino-2026.1.0-21367-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8c066dcd0f9f901759d8d69fa3a01eb97f3274497ec77341f1802654e6c5e1ad", size = 56819471, upload-time = "2026-04-07T14:18:48.957Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4d/5d6dea187afba680b9c0ac18e42cd2c9188f4ff1d2bb93e47c81fb404ab8/openvino-2026.1.0-21367-cp313-cp313-manylinux_2_35_aarch64.whl", hash = "sha256:0ba1a760423d6f61d45927df84eb7a5c4bca34c8a0018256bce528d167495914", size = 26852804, upload-time = "2026-04-07T14:18:52.867Z" }, + { url = "https://files.pythonhosted.org/packages/ab/09/32b2b6a394bb0347b66497eb521ad6cc516b11aecdcb18755b7e886b6efd/openvino-2026.1.0-21367-cp313-cp313-win_amd64.whl", hash = "sha256:b413b92fa9340c4fee586b9272b3a7a7dc06324c0fb4885ea7c24f258348d433", size = 71174470, upload-time = "2026-04-07T14:18:58.292Z" }, + { url = "https://files.pythonhosted.org/packages/8d/09/b586842336070e864d2b805a5876d5b23110c45133f6a1e99c9acd471fb4/openvino-2026.1.0-21367-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:abf4347c9f9206b5abfab9c2163e7b8abab7e506525b1178117b4a1a712feca6", size = 30867454, upload-time = "2026-04-07T14:19:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/13/2d/f847cdc25113515510927229960bdbfaff53ed5eb1e768bb4fc191229976/openvino-2026.1.0-21367-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:727c5c7e74634d8bc8f736e6b26704fbcc7899a1b591a045819defff7da4f358", size = 56823210, upload-time = "2026-04-07T14:19:07.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/c917105e370ae75a49e925a90ce3dc787716e3d9011ac8d13d027a0cb60b/openvino-2026.1.0-21367-cp314-cp314-win_amd64.whl", hash = "sha256:592b0b9708ae3ad93dc2d2994d87a355874861245ac01f9ebceabe046267d2d2", size = 71178943, upload-time = "2026-04-07T14:19:12.337Z" }, + { url = "https://files.pythonhosted.org/packages/84/28/6d10e4f1c255d4a1d1c760e688e4ed03f305903c682a07cef21dd3e49626/openvino-2026.1.0-21367-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8ab9630707d2abaffc046a1858f2f1f074322bf79170cde1b58c88482d7f81fc", size = 31094589, upload-time = "2026-04-07T14:19:16.286Z" }, + { url = "https://files.pythonhosted.org/packages/da/61/4825f80dd1e4bceddad950f6426766df9574215c383adb8fc8fa9bed9a3f/openvino-2026.1.0-21367-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:cb4d6906ed2f8dff8355e68321f2c9a70ea043020666caa38d2989e1d6c70b38", size = 56867904, upload-time = "2026-04-07T14:19:21.275Z" }, + { url = "https://files.pythonhosted.org/packages/30/6f/dd9495d36f46bd90193c4f1db2fb27807730add7ebde1b9c6488a37c878d/openvino-2026.1.0-21367-cp314-cp314t-win_amd64.whl", hash = "sha256:6518fc55c95d161ca5a48518cb35504717121470a7e11b71a3fbb32109cd5c3d", size = 71344883, upload-time = "2026-04-07T14:19:26.367Z" }, ] [[package]] @@ -215,12 +206,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/71/8a/89d82f1a9d913fb26 wheels = [ { url = "https://files.pythonhosted.org/packages/3b/ac/5ab0ca0aa269ad3c73f7bfc3801b10e5f56f75a31bf68c1ae8bd51cf70a4/openvino_telemetry-2025.2.0-py3-none-any.whl", hash = "sha256:bcb667e83a44f202ecf4cfa49281715c6d7e21499daec04ff853b7f964833599", size = 25227, upload-time = "2025-07-07T10:29:50.189Z" }, ] - -[[package]] -name = "packaging" -version = "26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, -] diff --git a/WebUI/build/build-config.json b/WebUI/build/build-config.json index 36608bcd9..20dc313fc 100644 --- a/WebUI/build/build-config.json +++ b/WebUI/build/build-config.json @@ -15,12 +15,8 @@ "filter": ["*.py", "pyproject.toml", "uv.lock"] }, { - "from": "external/presets", - "to": "presets" - }, - { - "from": "external/presets_demo", - "to": "presets_demo" + "from": "../modes", + "to": "modes" }, { "from": "../device-service", @@ -54,6 +50,10 @@ "from": "build/settings.json", "to": "settings.json" }, + { + "from": "external/hardware-recommendations.json", + "to": "hardware-recommendations.json" + }, { "from": "../service/static/assets/", "to": "service/static/assets/" diff --git a/WebUI/build/scripts/build-paths.mts b/WebUI/build/scripts/build-paths.mts index a12424fea..dbef3d0f9 100644 --- a/WebUI/build/scripts/build-paths.mts +++ b/WebUI/build/scripts/build-paths.mts @@ -57,10 +57,13 @@ export const GET_PIP_SCRIPT_URL = 'https://bootstrap.pypa.io/get-pip.py' export const SEVEN_ZR_EXE_URL = { win32: 'https://github.com/ip7z/7zip/releases/download/25.01/7zr.exe', darwin: 'https://github.com/ip7z/7zip/releases/download/25.01/7z2501-mac.tar.xz', + linux: 'https://github.com/ip7z/7zip/releases/download/25.01/7z2501-linux-x64.tar.xz', } export const UV_URL = { - win32: 'https://github.com/astral-sh/uv/releases/download/0.9.5/uv-x86_64-pc-windows-msvc.zip', - darwin: 'https://github.com/astral-sh/uv/releases/download/0.9.5/uv-aarch64-apple-darwin.tar.gz', + win32: 'https://github.com/astral-sh/uv/releases/download/0.11.4/uv-x86_64-pc-windows-msvc.zip', + darwin: 'https://github.com/astral-sh/uv/releases/download/0.11.4/uv-aarch64-apple-darwin.tar.gz', + linux: + 'https://github.com/astral-sh/uv/releases/download/0.11.4/uv-x86_64-unknown-linux-gnu.tar.gz', } /** @@ -97,7 +100,7 @@ export interface BuildPaths { /** * Get complete build paths configuration */ -export function getBuildPaths(target: 'win32' | 'darwin'): BuildPaths { +export function getBuildPaths(target: 'win32' | 'darwin' | 'linux'): BuildPaths { return { repoRoot: REPO_ROOT, buildDir: BUILD_DIR, @@ -132,7 +135,7 @@ export function getBuildPaths(target: 'win32' | 'darwin'): BuildPaths { */ export function logBuildPaths(): void { const target = z - .enum(['win32', 'darwin']) + .enum(['win32', 'darwin', 'linux']) .safeParse(process.env.TARGET_PLATFORM || process.platform) if (!target.success) { console.error(`❌ Unsupported TARGET_PLATFORM: ${target}`) diff --git a/WebUI/build/scripts/fetch-external-resources.mts b/WebUI/build/scripts/fetch-external-resources.mts index 2fbd1904a..5c834dc4c 100644 --- a/WebUI/build/scripts/fetch-external-resources.mts +++ b/WebUI/build/scripts/fetch-external-resources.mts @@ -14,7 +14,7 @@ import { execSync } from 'child_process' import AdmZip from 'adm-zip' const target = z - .enum(['win32', 'darwin']) + .enum(['win32', 'darwin', 'linux']) .safeParse(process.env.TARGET_PLATFORM || process.platform) if (!target.success) { console.error(`❌ Unsupported TARGET_PLATFORM: ${target}`) @@ -134,10 +134,10 @@ async function main(): Promise { // extract uv binary from downloaded archive and move to - // extract downloads if packed - handle tar.gz, tar.xz on darwin, zip on win32 + // extract downloads if packed - handle tar.gz, tar.xz on darwin/linux, zip on win32 for (const download of downloads) { if ( - target.data === 'darwin' && + (target.data === 'darwin' || target.data === 'linux') && (download.filePath.endsWith('.tar.gz') || download.filePath.endsWith('.tar.xz')) ) { console.log(`📦 Extracting ${download.filePath}...`) @@ -162,9 +162,13 @@ async function main(): Promise { } } - // move uv-aarch64-apple-darwin/uv to resourcesDir/uv.exe on darwin - if (target.data === 'darwin') { - const uvBinaryPath = path.join(buildPaths.tmpDir, 'uv-aarch64-apple-darwin', 'uv') + // move uv binary to resourcesDir/uv.exe (all platforms use uv.exe name for consistency) + const uvSourcePaths: Record = { + darwin: path.join(buildPaths.tmpDir, 'uv-aarch64-apple-darwin', 'uv'), + linux: path.join(buildPaths.tmpDir, 'uv-x86_64-unknown-linux-gnu', 'uv'), + } + if (target.data in uvSourcePaths) { + const uvBinaryPath = uvSourcePaths[target.data] const destinationPath = path.join(buildPaths.resourcesDir, 'uv.exe') if (existsSync(uvBinaryPath)) { renameSync(uvBinaryPath, destinationPath) @@ -174,21 +178,14 @@ async function main(): Promise { } } - // move 7zz to resourcesDir/7zr.exe on darwin - if (target.data === 'darwin') { - const sevenZrPath = path.join(buildPaths.tmpDir, '7zz') - const destinationPath = path.join(buildPaths.resourcesDir, '7zr.exe') - if (existsSync(sevenZrPath)) { - renameSync(sevenZrPath, destinationPath) - console.log(`✅ Moved ${sevenZrPath} to ${destinationPath}`) - } else { - console.error(`❌ 7zr binary not found: ${sevenZrPath}`) - } + // move 7zip binary to resourcesDir/7zr.exe (all platforms use 7zr.exe name for consistency) + const sevenZipSourcePaths: Record = { + darwin: path.join(buildPaths.tmpDir, '7zz'), + linux: path.join(buildPaths.tmpDir, '7zz'), + win32: path.join(buildPaths.tmpDir, '7zr.exe'), } - - // move 7zr.exe to resourcesDir/7zr.exe on win32 - if (target.data === 'win32') { - const sevenZrPath = path.join(buildPaths.tmpDir, '7zr.exe') + { + const sevenZrPath = sevenZipSourcePaths[target.data] const destinationPath = path.join(buildPaths.resourcesDir, '7zr.exe') if (existsSync(sevenZrPath)) { renameSync(sevenZrPath, destinationPath) diff --git a/WebUI/electron/main.ts b/WebUI/electron/main.ts index 8c2ee7dad..910758c8f 100644 --- a/WebUI/electron/main.ts +++ b/WebUI/electron/main.ts @@ -53,6 +53,7 @@ import { COMFYUI_DEFAULT_PARAMETERS, } from './subprocesses/comfyUIBackendService' import { LLAMACPP_DEFAULT_PARAMETERS } from './subprocesses/llamaCppBackendService' +import { AiBackendService } from './subprocesses/aiBackendService' import { filterPartnerPresets, updateIntelPresets } from './subprocesses/updateIntelPresets.ts' import { getGitHubRepoUrl, resolveBackendVersion, resolveModels } from './remoteUpdates.ts' import * as comfyuiTools from './subprocesses/comfyuiTools' @@ -79,6 +80,12 @@ process.env.VITE_PUBLIC = path.join(__dirname, app.isPackaged ? '../..' : '../.. const externalRes = path.resolve( app.isPackaged ? process.resourcesPath : path.join(__dirname, '../../external/'), ) + +const modesDir = path.resolve( + app.isPackaged + ? path.join(process.resourcesPath, 'modes') + : path.join(__dirname, '../../../modes/'), +) const singleInstanceLock = app.requestSingleInstanceLock() const appLogger = appLoggerInstance @@ -103,18 +110,16 @@ const appSize = { maxChatContentHeight: 0, } const ThemeSchema = z.enum(['dark', 'lnl', 'bmg', 'light']) -const ProductModeSchema = z.enum(['professional', 'essentials']) +const ProductModeSchema = z.enum(['studio', 'essentials']) const LocalSettingsSchema = z.object({ debug: z.boolean().default(false), deviceArchOverride: z.enum(['bmg', 'acm', 'arl_h', 'lnl', 'mtl']).nullable().default(null), - enablePreviewFeatures: z.boolean().default(false), isAdminExec: z.boolean().default(false), availableThemes: z.array(ThemeSchema).default(['dark', 'lnl', 'bmg', 'light']), currentTheme: ThemeSchema.default('bmg'), - productMode: ProductModeSchema.default('professional'), + productMode: ProductModeSchema.optional(), isDemoModeEnabled: z.boolean().default(false), demoModeResetInSeconds: z.number().min(1).nullable().default(null), - demoModePresetsDir: z.string().optional(), demoModePasscode: z.string().optional(), languageOverride: z.string().nullable().default(null), remoteRepository: z.string().default('intel/ai-playground'), @@ -123,27 +128,51 @@ const LocalSettingsSchema = z.object({ export type LocalSettings = z.infer export type ProductMode = z.infer -/** - * Resolves the preset directory name based on product mode and demo mode. - * - * When demo mode is enabled and a custom `demoModePresetsDir` is set, that value - * takes precedence (backward-compatible override). Otherwise: - * - * professional + non-demo → presets - * professional + demo → presets_demo - * essentials + non-demo → presets_essentials - * essentials + demo → presets_essentials_demo - */ -function getPresetsDirName(s: LocalSettings): string { - if (s.isDemoModeEnabled && s.demoModePresetsDir) { - return s.demoModePresetsDir - } - const base = s.productMode === 'essentials' ? 'presets_essentials' : 'presets' - return s.isDemoModeEnabled ? `${base}_demo` : base +function getPresetsDir(s: LocalSettings): string { + const mode = s.productMode === 'essentials' ? 'essentials' : 'studio' + const variant = s.isDemoModeEnabled ? 'demo' : 'presets' + return path.join(modesDir, mode, variant) } let settings = LocalSettingsSchema.parse({}) let demoProfile: DemoProfile | null = null + +/** Packaged app: single JSON next to resources. Dev: never write here (Vite watches the repo). */ +function getPackagedSettingsPath(): string { + return path.join(process.resourcesPath, 'settings.json') +} + +/** Dev-only defaults shipped in the repo (read-only for the app). */ +function getDevSettingsDefaultsPath(): string { + return path.join(__dirname, '../../external/settings-dev.json') +} + +/** Writable path: packaged = resources settings; dev = userData overlay (avoids Vite reload loops). */ +function getWritableSettingsPath(): string { + if (app.isPackaged) { + return getPackagedSettingsPath() + } + return path.join(app.getPath('userData'), 'ai-playground-local-settings.json') +} + +function persistLocalSettingsToDisk(): void { + const settingPath = getWritableSettingsPath() + const serialized = JSON.stringify(LocalSettingsSchema.parse(settings), null, 2) + const tmpPath = `${settingPath}.${randomUUID()}.tmp` + try { + fs.mkdirSync(path.dirname(settingPath), { recursive: true }) + fs.writeFileSync(tmpPath, serialized, { encoding: 'utf8' }) + fs.renameSync(tmpPath, settingPath) + } catch (e) { + try { + fs.unlinkSync(tmpPath) + } catch { + // ignore cleanup failure + } + appLogger.error(`failed to persist local settings: ${e}`, 'electron-backend') + } +} + protocol.registerSchemesAsPrivileged([ { scheme: 'aipg-media', @@ -158,24 +187,46 @@ protocol.registerSchemesAsPrivileged([ ]) async function loadSettings() { - const settingPath = app.isPackaged - ? path.join(process.resourcesPath, 'settings.json') - : path.join(__dirname, '../../external/settings-dev.json') + settings = LocalSettingsSchema.parse({}) - appLogger.info(`loading settings from ${settingPath}`, 'electron-backend') - if (fs.existsSync(settingPath)) { - try { - settings = LocalSettingsSchema.parse( - JSON.parse(fs.readFileSync(settingPath, { encoding: 'utf8' })), - ) - } catch (e) { - appLogger.error(`failed to load settings: ${e}`, 'electron-backend') + if (app.isPackaged) { + const packagedPath = getPackagedSettingsPath() + appLogger.info(`loading packaged settings from ${packagedPath}`, 'electron-backend') + if (fs.existsSync(packagedPath)) { + try { + const raw = JSON.parse(fs.readFileSync(packagedPath, { encoding: 'utf8' })) + settings = LocalSettingsSchema.parse({ ...settings, ...raw }) + } catch (e) { + appLogger.error(`failed to load settings: ${e}`, 'electron-backend') + } + } + } else { + const defaultsPath = getDevSettingsDefaultsPath() + appLogger.info(`loading dev defaults from ${defaultsPath}`, 'electron-backend') + if (fs.existsSync(defaultsPath)) { + try { + const raw = JSON.parse(fs.readFileSync(defaultsPath, { encoding: 'utf8' })) + settings = LocalSettingsSchema.parse({ ...settings, ...raw }) + } catch (e) { + appLogger.error(`failed to load dev defaults: ${e}`, 'electron-backend') + } + } + const userPath = getWritableSettingsPath() + appLogger.info(`loading dev user settings from ${userPath}`, 'electron-backend') + if (fs.existsSync(userPath)) { + try { + const raw = JSON.parse(fs.readFileSync(userPath, { encoding: 'utf8' })) + settings = LocalSettingsSchema.parse({ ...settings, ...raw }) + } catch (e) { + appLogger.error(`failed to load dev user settings: ${e}`, 'electron-backend') + } } } + appLogger.info(`settings loaded: ${JSON.stringify({ settings })}`, 'electron-backend') if (settings.isDemoModeEnabled) { - const presetsDir = path.join(externalRes, getPresetsDirName(settings)) + const presetsDir = getPresetsDir(settings) try { demoProfile = loadDemoProfile(presetsDir, appLogger) } catch (e) { @@ -460,12 +511,83 @@ function initEventHandle() { } }) + ipcMain.handle('getLocalSettings', () => { + return LocalSettingsSchema.parse(settings) + }) + ipcMain.handle('updateLocalSettings', (_event, updates: Partial) => { Object.assign(settings, updates) + if ('productMode' in updates && settings.isDemoModeEnabled) { + const presetsDir = getPresetsDir(settings) + try { + demoProfile = loadDemoProfile(presetsDir, appLogger) + } catch (e) { + appLogger.error( + `Failed to reload demo profile after product mode change: ${e}`, + 'demo-profile', + ) + } + } + persistLocalSettingsToDisk() appLogger.info(`Updated local settings: ${JSON.stringify(updates)}`, 'electron-backend') return { success: true } }) + ipcMain.handle('detectHardwareForModeRecommendation', async () => { + if (!serviceRegistry) { + return { + success: false, + error: 'Service registry not ready', + recommendedMode: 'studio' as const, + detectedDevices: [], + } + } + const service = serviceRegistry.getService('ai-backend') + if (!service || !(service instanceof AiBackendService)) { + return { + success: false, + error: 'ai-backend service not found', + recommendedMode: 'studio' as const, + detectedDevices: [], + } + } + + const hwResult = await service.detectHardwareDevices() + + const recommendationsPath = path.join(externalRes, 'hardware-recommendations.json') + let essentialsIds: string[] = [] + let defaultRec: ProductMode = 'studio' + try { + const raw = fs.readFileSync(recommendationsPath, 'utf-8') + const config = JSON.parse(raw) + essentialsIds = (config.essentialsGpuDeviceIds ?? []).map((id: string) => id.toLowerCase()) + defaultRec = config.defaultRecommendation ?? 'studio' + } catch (e) { + appLogger.warn(`Failed to read hardware-recommendations.json: ${e}`, 'electron-backend') + } + + let recommendedMode: ProductMode = defaultRec + if (hwResult.success) { + const gpuIds = hwResult.gpuDevices + .map((d) => d.gpuDeviceId) + .filter((id): id is string => id !== null) + .map((id) => id.toLowerCase()) + + if (gpuIds.length === 0 || gpuIds.every((id) => essentialsIds.includes(id))) { + recommendedMode = 'essentials' + } else { + recommendedMode = 'studio' + } + } + + return { + success: hwResult.success, + recommendedMode, + detectedDevices: hwResult.gpuDevices, + error: hwResult.error, + } + }) + ipcMain.handle('getWinSize', () => { return appSize }) @@ -593,7 +715,6 @@ function initEventHandle() { isDemoModeEnabled: settings.isDemoModeEnabled, demoModeResetInSeconds: settings.demoModeResetInSeconds, demoModePasscode: settings.demoModePasscode, - productMode: settings.productMode, profile: demoProfile, } }) @@ -1061,12 +1182,14 @@ function initEventHandle() { }) ipcMain.handle('updatePresetsFromIntelRepo', () => { - return updateIntelPresets(settings.remoteRepository, getPresetsDirName(settings)) + const mode = settings.productMode === 'essentials' ? 'essentials' : 'studio' + const variant = settings.isDemoModeEnabled ? 'demo' : 'presets' + return updateIntelPresets(settings.remoteRepository, mode, variant, getPresetsDir(settings)) }) // Preset management IPC handlers ipcMain.handle('reloadPresets', async () => { - const presetsDir = path.join(externalRes, getPresetsDirName(settings)) + const presetsDir = getPresetsDir(settings) try { await filterPartnerPresets(presetsDir) } catch (error) { diff --git a/WebUI/electron/preload.ts b/WebUI/electron/preload.ts index da34073a5..ed85411ef 100644 --- a/WebUI/electron/preload.ts +++ b/WebUI/electron/preload.ts @@ -41,6 +41,9 @@ contextBridge.exposeInMainWorld('electronAPI', { getThemeSettings: () => ipcRenderer.invoke('getThemeSettings'), updateLocalSettings: (updates: Partial) => ipcRenderer.invoke('updateLocalSettings', updates), + getLocalSettings: () => ipcRenderer.invoke('getLocalSettings'), + detectHardwareForModeRecommendation: () => + ipcRenderer.invoke('detectHardwareForModeRecommendation'), getWinSize: () => ipcRenderer.invoke('getWinSize'), setWinSize: (width: number, height: number) => ipcRenderer.invoke('setWinSize', width, height), showSaveDialog: (options: Electron.SaveDialogOptions) => diff --git a/WebUI/electron/remoteUpdates.ts b/WebUI/electron/remoteUpdates.ts index 6c141c1f7..f77109ae6 100644 --- a/WebUI/electron/remoteUpdates.ts +++ b/WebUI/electron/remoteUpdates.ts @@ -14,7 +14,6 @@ const BackendVersionsSchema = z.object({ 'comfyui-backend': BackendVersionSchema, 'llamacpp-backend': BackendVersionSchema, 'openvino-backend': BackendVersionSchema, - 'ollama-backend': BackendVersionSchema, }) type BackendVersions = z.infer diff --git a/WebUI/electron/subprocesses/aiBackendService.ts b/WebUI/electron/subprocesses/aiBackendService.ts index ff7e38798..2101f50a9 100644 --- a/WebUI/electron/subprocesses/aiBackendService.ts +++ b/WebUI/electron/subprocesses/aiBackendService.ts @@ -2,10 +2,22 @@ import * as filesystem from 'fs-extra' import { ChildProcess, spawn } from 'node:child_process' import path from 'node:path' import { GitService, LongLivedPythonApiService, createEnhancedErrorDetails } from './service.ts' -import { aipgBaseDir, checkBackend, installBackend, installWheel } from './uvBasedBackends/uv.ts' +import { aipgBaseDir, checkBackend, installBackend } from './uvBasedBackends/uv.ts' import { BrowserWindow } from 'electron' import { LocalSettings } from '../main.ts' +export type GpuHardwareDevice = { + device: string + name: string + gpuDeviceId: string | null +} + +export type HardwareDetectionResult = { + success: boolean + gpuDevices: GpuHardwareDevice[] + error?: string +} + export class AiBackendService extends LongLivedPythonApiService { isSetUp: boolean = false constructor(name: BackendServiceName, port: number, win: BrowserWindow, settings: LocalSettings) { @@ -39,6 +51,78 @@ export class AiBackendService extends LongLivedPythonApiService { async detectDevices() {} + async detectHardwareDevices(): Promise { + const pythonExe = path.join( + this.pythonEnvDir, + process.platform === 'win32' ? 'Scripts/python.exe' : 'bin/python', + ) + const detectScript = path.join(this.serviceDir, 'detect_hardware.py') + + if (!filesystem.existsSync(pythonExe) || !filesystem.existsSync(detectScript)) { + this.appLogger.info('Python environment or detect_hardware.py not available', this.name) + return { success: false, gpuDevices: [], error: 'Detection script not available' } + } + + this.appLogger.info('Detecting GPU hardware using OpenVINO', this.name) + + return new Promise((resolve) => { + const childProcess = spawn(pythonExe, [detectScript], { + cwd: this.serviceDir, + windowsHide: true, + env: { + ...process.env, + VIRTUAL_ENV: this.pythonEnvDir, + PATH: `${path.join(this.pythonEnvDir, 'Scripts')};${path.join(this.pythonEnvDir, 'bin')};${process.env.PATH}`, + PYTHONNOUSERSITE: 'true', + }, + }) + + let stdout = '' + let stderr = '' + + childProcess.stdout?.on('data', (data: Buffer) => { + stdout += data.toString() + }) + childProcess.stderr?.on('data', (data: Buffer) => { + stderr += data.toString() + }) + + childProcess.on('error', (error: Error) => { + this.appLogger.error(`Hardware detection process error: ${error}`, this.name) + resolve({ success: false, gpuDevices: [], error: error.message }) + }) + + childProcess.on('exit', (code: number | null) => { + if (code === 0) { + try { + const result = JSON.parse(stdout.trim()) + if (result.success && Array.isArray(result.gpuDevices)) { + this.appLogger.info( + `Hardware detection found GPUs: ${JSON.stringify(result.gpuDevices)}`, + this.name, + ) + resolve({ success: true, gpuDevices: result.gpuDevices }) + } else { + this.appLogger.warn(`Hardware detection script error: ${result.error}`, this.name) + resolve({ success: false, gpuDevices: [], error: result.error }) + } + } catch (_parseError) { + this.appLogger.error(`Failed to parse hardware detection output: ${stdout}`, this.name) + resolve({ success: false, gpuDevices: [], error: 'Failed to parse output' }) + } + } else { + this.appLogger.warn(`Hardware detection exited with code ${code}: ${stderr}`, this.name) + resolve({ success: false, gpuDevices: [], error: `Process exited with code ${code}` }) + } + }) + + setTimeout(() => { + childProcess.kill('SIGTERM') + resolve({ success: false, gpuDevices: [], error: 'Hardware detection timed out' }) + }, 30000) + }) + } + async *set_up(): AsyncIterable { this.setStatus('installing') this.appLogger.info('setting up service', this.name) @@ -66,13 +150,6 @@ export class AiBackendService extends LongLivedPythonApiService { } await installBackend(this.serviceFolder) - this.appLogger.info('scanning for extra wheels', this.name) - const wheelFiles = (await filesystem.readdir(this.wheelDir)).filter((e) => e.endsWith('.whl')) - this.appLogger.info(`found extra wheels: ${JSON.stringify(wheelFiles)}`, this.name) - for (const wheelFile of wheelFiles) { - await installWheel(this.serviceFolder, path.join(this.wheelDir, wheelFile)) - } - yield { serviceName: this.name, step: currentStep, @@ -109,9 +186,16 @@ export class AiBackendService extends LongLivedPythonApiService { process: ChildProcess didProcessExitEarlyTracker: Promise }> { + const pathSep = process.platform === 'win32' ? ';' : ':' const additionalEnvVariables = { VIRTUAL_ENV: this.pythonEnvDir, - PATH: `${path.join(this.pythonEnvDir, 'bin')};${path.join(this.pythonEnvDir, 'Scripts')};${path.join(this.pythonEnvDir, 'Library', 'bin')};${process.env.PATH};${path.join(this.git.dir, 'cmd')}`, + PATH: [ + path.join(this.pythonEnvDir, 'bin'), + path.join(this.pythonEnvDir, 'Scripts'), + path.join(this.pythonEnvDir, 'Library', 'bin'), + process.env.PATH, + path.join(this.git.dir, 'cmd'), + ].join(pathSep), PYTHONNOUSERSITE: 'true', PYTHONIOENCODING: 'utf-8', HF_ENDPOINT: this.settings.huggingfaceEndpoint, diff --git a/WebUI/electron/subprocesses/apiServiceRegistry.ts b/WebUI/electron/subprocesses/apiServiceRegistry.ts index f649f3019..502d1a7e6 100644 --- a/WebUI/electron/subprocesses/apiServiceRegistry.ts +++ b/WebUI/electron/subprocesses/apiServiceRegistry.ts @@ -6,10 +6,9 @@ import { appLoggerInstance } from '../logging/logger.ts' import getPort, { portNumbers } from 'get-port' import { LlamaCppBackendService } from './llamaCppBackendService.ts' import { OpenVINOBackendService } from './openVINOBackendService.ts' -import { OllamaBackendService } from './ollamaBackendService.ts' import { LocalSettings } from '../main.ts' -export type backend = 'ai-backend' | 'comfyui-backend' | 'ollama-backend' +export type backend = 'ai-backend' | 'openvino-backend' | 'comfyui-backend' | 'llamacpp-backend' export interface ApiServiceRegistry { register(apiService: ApiService): void @@ -187,16 +186,6 @@ export async function aiplaygroundApiServiceRegistry( settings, ), ) - if (settings.enablePreviewFeatures) { - instance.register( - new OllamaBackendService( - 'ollama-backend', - await getPort({ port: portNumbers(40000, 41000) }), - win, - settings, - ), - ) - } // Automatically start all set-up services in the background // This happens regardless of frontend state, making it more reliable diff --git a/WebUI/electron/subprocesses/comfyUIBackendService.ts b/WebUI/electron/subprocesses/comfyUIBackendService.ts index 3a9ecf160..bcf267572 100644 --- a/WebUI/electron/subprocesses/comfyUIBackendService.ts +++ b/WebUI/electron/subprocesses/comfyUIBackendService.ts @@ -16,6 +16,7 @@ import { checkBackendWithDetails, ensureBackendVenv, installBackend, + installExtraWheels, pipInstallRequirementsFromFile, } from './uvBasedBackends/uv.ts' import { @@ -635,6 +636,8 @@ export class ComfyUiBackendService extends LongLivedPythonApiService { debugMessage: `installing comfyUI base repo`, } await setupComfyUiBaseService() + await installExtraWheels(this.serviceFolder) + yield { serviceName: this.name, step: currentStep, diff --git a/WebUI/electron/subprocesses/comfyuiTools.ts b/WebUI/electron/subprocesses/comfyuiTools.ts index 2e6e7e3a4..7a6ed6314 100644 --- a/WebUI/electron/subprocesses/comfyuiTools.ts +++ b/WebUI/electron/subprocesses/comfyuiTools.ts @@ -7,6 +7,7 @@ import { isPackageInstalled as uvIsPackageInstalled, installPypiPackage as uvInstallPackage, installRequirementsTxt, + installExtraWheels, aipgBaseDir, } from './uvBasedBackends/uv' @@ -258,6 +259,8 @@ export async function downloadCustomNode( nodeRepoData: ComfyUICustomNodeRepoId, comfyUiRootPath: string, ): Promise { + const expectedCustomNodePath = path.join(comfyUiRootPath, 'custom_nodes', nodeRepoData.repoName) + if (isCustomNodeInstalled(nodeRepoData, comfyUiRootPath)) { appLoggerInstance.info( `Node repo ${JSON.stringify(nodeRepoData)} already exists. Omitting`, @@ -268,7 +271,6 @@ export async function downloadCustomNode( try { const expectedGitUrl = `https://github.com/${nodeRepoData.username}/${nodeRepoData.repoName}` - const expectedCustomNodePath = path.join(comfyUiRootPath, 'custom_nodes', nodeRepoData.repoName) const potentialNodeRequirements = path.join(expectedCustomNodePath, 'requirements.txt') // Install the git repo @@ -283,12 +285,15 @@ export async function downloadCustomNode( // Install pip requirements using uv await installPipRequirements(potentialNodeRequirements) + await installExtraWheels(COMFYUI_BACKEND) + appLoggerInstance.info( `Successfully installed custom node ${nodeRepoData.username}/${nodeRepoData.repoName}`, 'comfyui-tools', ) return true } catch (error) { + removeExistingResource(expectedCustomNodePath) appLoggerInstance.error( `Failed to install custom comfy node ${nodeRepoData.username}/${nodeRepoData.repoName} due to: ${error}`, 'comfyui-tools', diff --git a/WebUI/electron/subprocesses/llamaCppBackendService.ts b/WebUI/electron/subprocesses/llamaCppBackendService.ts index 9df0cc9cf..414985e87 100644 --- a/WebUI/electron/subprocesses/llamaCppBackendService.ts +++ b/WebUI/electron/subprocesses/llamaCppBackendService.ts @@ -14,6 +14,7 @@ import { binary, extract } from './tools.ts' const execAsync = promisify(exec) export const LLAMACPP_DEFAULT_PARAMETERS = '--gpu-layers 999 --log-prefix --jinja --no-mmap -fa off' +const platformExtension = process.platform === 'win32' ? 'zip' : 'tar.gz' interface LlamaServerProcess { process: ChildProcess @@ -88,7 +89,7 @@ export class LlamaCppBackendService implements ApiService { this.serviceDir = path.resolve(path.join(this.baseDir, 'LlamaCPP')) this.llamaCppDir = path.resolve(path.join(this.serviceDir, 'llama-cpp')) this.llamaCppExePath = path.resolve(path.join(this.llamaCppDir, binary('llama-server'))) - this.zipPath = path.resolve(path.join(this.serviceDir, 'llama-cpp.zip')) + this.zipPath = path.resolve(path.join(this.serviceDir, `llama-cpp.${platformExtension}`)) // Check if already set up this.isSetUp = this.serviceIsSetUp() @@ -438,8 +439,13 @@ export class LlamaCppBackendService implements ApiService { } private async downloadLlamacpp(): Promise { - const platformArch = process.platform === 'darwin' ? 'macos-arm64' : 'win-vulkan-x64' - const downloadUrl = `https://github.com/ggml-org/llama.cpp/releases/download/${this.version}/llama-${this.version}-bin-${platformArch}.zip` + const platformArchMap: Record = { + darwin: 'macos-arm64', + linux: 'ubuntu-x64', + win32: 'win-vulkan-x64', + } + const platformArch = platformArchMap[process.platform] ?? 'win-vulkan-x64' + const downloadUrl = `https://github.com/ggml-org/llama.cpp/releases/download/${this.version}/llama-${this.version}-bin-${platformArch}.${platformExtension}` this.appLogger.info(`Downloading Llamacpp from ${downloadUrl}`, this.name) // Delete existing zip if it exists @@ -476,12 +482,16 @@ export class LlamaCppBackendService implements ApiService { try { await extract(this.zipPath, this.llamaCppDir) if (process.platform !== 'win32') { - filesystem.readdirSync(path.join(this.llamaCppDir, 'build/bin')).forEach((file) => { - filesystem.renameSync( - path.join(this.llamaCppDir, 'build/bin', file), - path.join(this.llamaCppDir, file), - ) - }) + const llamaServerBinary = binary('llama-server') + if (!filesystem.existsSync(path.join(this.llamaCppDir, llamaServerBinary))) { + const sourceDir = this.findParentOfBinary(this.llamaCppDir, llamaServerBinary) + if (!sourceDir) { + throw new Error(`Could not find ${llamaServerBinary} in extracted LlamaCPP archive`) + } + for (const file of filesystem.readdirSync(sourceDir)) { + filesystem.renameSync(path.join(sourceDir, file), path.join(this.llamaCppDir, file)) + } + } } this.appLogger.info(`LlamaCPP extracted successfully`, this.name) @@ -491,6 +501,18 @@ export class LlamaCppBackendService implements ApiService { } } + private findParentOfBinary(dir: string, binaryName: string): string | undefined { + for (const entry of filesystem.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name) + if (entry.isFile() && entry.name === binaryName) return dir + if (entry.isDirectory()) { + const found = this.findParentOfBinary(fullPath, binaryName) + if (found) return found + } + } + return undefined + } + async start(): Promise { // In this architecture, model servers are started on-demand via ensureBackendReadiness // This method is kept for ApiService interface compatibility diff --git a/WebUI/electron/subprocesses/ollamaBackendService.ts b/WebUI/electron/subprocesses/ollamaBackendService.ts deleted file mode 100644 index 00c08bae6..000000000 --- a/WebUI/electron/subprocesses/ollamaBackendService.ts +++ /dev/null @@ -1,542 +0,0 @@ -import { ChildProcess, spawn } from 'node:child_process' -import path from 'node:path' -import * as filesystem from 'fs-extra' -import { app, BrowserWindow, net } from 'electron' -import { appLoggerInstance } from '../logging/logger.ts' -import { ApiService, DeviceService, createEnhancedErrorDetails, ErrorDetails } from './service.ts' -import { promisify } from 'util' -import { exec } from 'child_process' -import { LocalSettings } from '../main.ts' - -const execAsync = promisify(exec) - -export class OllamaBackendService implements ApiService { - readonly name = 'ollama-backend' as BackendServiceName - readonly baseUrl: string - readonly port: number - readonly isRequired: boolean = false - readonly win: BrowserWindow - readonly settings: LocalSettings - - // Service directories - readonly baseDir = app.isPackaged ? process.resourcesPath : path.join(__dirname, '../../../') - readonly serviceDir: string - readonly ollamaDir: string - readonly ollamaExePath: string - - readonly zipPath: string - readonly deviceService = new DeviceService() - devices: InferenceDevice[] = [{ id: '*', name: 'Auto select device', selected: true }] - - // Health endpoint - healthEndpointUrl: string - - // Status tracking - currentStatus: BackendStatus = 'notInstalled' - isSetUp: boolean = false - - // Process management - encapsulatedProcess: ChildProcess | null = null - desiredStatus: BackendStatus = 'uninitializedStatus' - - // Store last startup error details for persistence - private lastStartupErrorDetails: ErrorDetails | null = null - - // Cached installed version for inclusion in service info updates - private cachedInstalledVersion: { version: string; releaseTag?: string } | undefined = undefined - - // Logger - readonly appLogger = appLoggerInstance - - private releaseTag = 'v2.3.0-nightly' - private version = '2.3.0b20250630' - - constructor(name: BackendServiceName, port: number, win: BrowserWindow, settings: LocalSettings) { - this.name = name - this.port = port - this.win = win - this.settings = settings - this.baseUrl = `http://127.0.0.1:${port}` - this.healthEndpointUrl = `${this.baseUrl}/api/version` - - // Set up paths - this.serviceDir = path.resolve(path.join(this.baseDir, 'ollama-service')) - this.ollamaDir = path.resolve(path.join(this.serviceDir, 'ollama')) - this.ollamaExePath = path.resolve(path.join(this.ollamaDir, 'ollama-lib.exe')) - this.zipPath = path.resolve(path.join(this.serviceDir, 'ollama.zip')) - - // Check if already set up - this.isSetUp = this.serviceIsSetUp() - - // Cache version on startup if already set up - if (this.isSetUp) { - this.updateCachedVersion().then(() => { - this.updateStatus() - }) - } - } - - async ensureBackendReadiness(llmModelName: string, embeddingModelName?: string): Promise { - this.appLogger.info( - `ensureBackendReadiness called for LLM: ${llmModelName}, Embedding: ${embeddingModelName ?? 'none'}`, - this.name, - ) - } - - async detectDevices() { - // Device detection temporarily disabled - PythonService removed - // TODO: Re-implement device detection using uv-managed Python environment if needed - this.devices = [{ id: '*', name: 'Auto select device', selected: true }] - this.appLogger.info(`Device detection disabled - using default device`, this.name) - this.updateStatus() - } - - async selectDevice(deviceId: string): Promise { - if (!this.devices.find((d) => d.id === deviceId)) return - this.devices = this.devices.map((d) => ({ ...d, selected: d.id === deviceId })) - this.updateStatus() - } - - serviceIsSetUp(): boolean { - return filesystem.existsSync(this.ollamaExePath) - } - - get_info(): ApiServiceInformation { - if (this.currentStatus === 'uninitializedStatus') { - this.currentStatus = this.isSetUp ? 'notYetStarted' : 'notInstalled' - } - return { - serviceName: this.name, - status: this.currentStatus, - baseUrl: this.baseUrl, - port: this.port, - isSetUp: this.isSetUp, - isRequired: this.isRequired, - devices: this.devices, - errorDetails: this.lastStartupErrorDetails, - installedVersion: this.cachedInstalledVersion, - } - } - - async getInstalledVersion(): Promise<{ version?: string; releaseTag?: string } | undefined> { - if (!this.isSetUp) return undefined - // Ollama uses the stored version and releaseTag - return { version: this.version, releaseTag: this.releaseTag } - } - - /** - * Updates the cached installed version for inclusion in service info updates. - */ - private async updateCachedVersion(): Promise { - try { - const version = await this.getInstalledVersion() - if (version && version.version) { - this.cachedInstalledVersion = { - version: version.version, - ...(version.releaseTag && { releaseTag: version.releaseTag }), - } - } else { - this.cachedInstalledVersion = undefined - } - } catch (error) { - this.appLogger.warn(`Failed to get installed version: ${error}`, this.name) - this.cachedInstalledVersion = undefined - } - } - - setStatus(status: BackendStatus) { - this.currentStatus = status - this.updateStatus() - } - - updateStatus() { - this.win.webContents.send('serviceInfoUpdate', this.get_info()) - } - - async updateSettings(settings: ServiceSettings): Promise { - if (settings.releaseTag) { - this.releaseTag = settings.releaseTag - this.appLogger.info(`applied new Ollama release tag ${this.releaseTag}`, this.name) - } - if (settings.version) { - this.version = settings.version - this.appLogger.info(`applied new Ollama version ${this.version}`, this.name) - } - } - - async *set_up(): AsyncIterable { - this.setStatus('installing') - this.appLogger.info('setting up service', this.name) - - let currentStep = 'start' - - try { - currentStep = 'start' - yield { - serviceName: this.name, - step: currentStep, - status: 'executing', - debugMessage: 'starting to set up Ollama service', - } - - // Create service directory if it doesn't exist - if (!filesystem.existsSync(this.serviceDir)) { - filesystem.mkdirSync(this.serviceDir, { recursive: true }) - } - - // Download Ollama ZIP file - currentStep = 'download' - yield { - serviceName: this.name, - step: currentStep, - status: 'executing', - debugMessage: `downloading Ollama`, - } - - await this.downloadOllama() - - yield { - serviceName: this.name, - step: currentStep, - status: 'executing', - debugMessage: 'download complete', - } - - // Extract Ollama ZIP file - currentStep = 'extract' - yield { - serviceName: this.name, - step: currentStep, - status: 'executing', - debugMessage: 'extracting Ollama', - } - - await this.extractOllama() - - yield { - serviceName: this.name, - step: currentStep, - status: 'executing', - debugMessage: 'extraction complete', - } - - this.isSetUp = true - await this.updateCachedVersion() - this.setStatus('notYetStarted') - - currentStep = 'end' - yield { - serviceName: this.name, - step: currentStep, - status: 'success', - debugMessage: 'service set up completely', - } - } catch (e) { - this.appLogger.warn(`Set up of service failed due to ${e}`, this.name, true) - this.setStatus('installationFailed') - - // Create detailed error information for any type of error - const errorDetails = await createEnhancedErrorDetails(e, `${currentStep} operation`) - - yield { - serviceName: this.name, - step: currentStep, - status: 'failed', - debugMessage: `Failed to setup Ollama service due to ${e}`, - errorDetails, - } - } - } - - private async downloadOllama(): Promise { - const downloadUrl = `https://github.com/ipex-llm/ipex-llm/releases/download/${this.releaseTag}/ollama-ipex-llm-${this.version}-win.zip` - this.appLogger.info(`Downloading Ollama from ${downloadUrl}`, this.name) - - // Delete existing zip if it exists - if (filesystem.existsSync(this.zipPath)) { - this.appLogger.info(`Removing existing Ollama zip file`, this.name) - filesystem.removeSync(this.zipPath) - } - - // Using electron net for better proxy support - const response = await net.fetch(downloadUrl) - if (!response.ok || response.status !== 200 || !response.body) { - throw new Error(`Failed to download Ollama: ${response.statusText}`) - } - - const buffer = await response.arrayBuffer() - await filesystem.writeFile(this.zipPath, Buffer.from(buffer)) - - this.appLogger.info(`Ollama zip file downloaded successfully`, this.name) - } - - private async extractOllama(): Promise { - this.appLogger.info(`Extracting Ollama to ${this.ollamaDir}`, this.name) - - // Delete existing ollama directory if it exists - if (filesystem.existsSync(this.ollamaDir)) { - this.appLogger.info(`Removing existing Ollama directory`, this.name) - filesystem.removeSync(this.ollamaDir) - } - - // Create ollama directory - filesystem.mkdirSync(this.ollamaDir, { recursive: true }) - - // Extract zip file using PowerShell's Expand-Archive - try { - const command = `powershell -Command "Expand-Archive -Path '${this.zipPath}' -DestinationPath '${this.ollamaDir}' -Force"` - await execAsync(command) - - this.appLogger.info(`Ollama extracted successfully`, this.name) - } catch (error) { - this.appLogger.error(`Failed to extract Ollama: ${error}`, this.name) - throw error - } - } - - async spawnAPIProcess(): Promise<{ - process: ChildProcess - didProcessExitEarlyTracker: Promise - }> { - const additionalEnvVariables = { - // Any environment variables needed by Ollama - OLLAMA_HOST: `127.0.0.1:${this.port}`, - OLLAMA_ORIGINS: '*', - } - - this.appLogger.info(`Starting Ollama service from ${this.ollamaExePath}`, this.name) - - const apiProcess = spawn( - this.ollamaExePath, - ['serve'], // Start Ollama in server mode - { - cwd: this.ollamaDir, - windowsHide: true, - env: Object.assign(process.env, additionalEnvVariables), - }, - ) - - // Track process exit - const didProcessExitEarlyTracker = new Promise((resolve, _reject) => { - apiProcess.on('error', (error) => { - this.appLogger.error(`encountered error of process in ${this.name} : ${error}`, this.name) - resolve(true) - }) - apiProcess.on('exit', () => { - this.appLogger.error(`encountered unexpected exit in ${this.name}.`, this.name) - resolve(true) - }) - }) - - return { - process: apiProcess, - didProcessExitEarlyTracker: didProcessExitEarlyTracker, - } - } - - async start(): Promise { - if ( - this.desiredStatus === 'stopped' && - !(this.currentStatus === 'stopped' || this.currentStatus === 'notYetStarted') - ) { - throw new Error('Server currently stopping. Cannot start it.') - } - if (this.currentStatus === 'running') { - // Clear error on successful running status - this.clearLastStartupError() - return 'running' - } - if (this.desiredStatus === 'running') { - throw new Error('Server startup already requested') - } - - this.desiredStatus = 'running' - this.setStatus('starting') - try { - this.appLogger.info(`trying to start ${this.name} service`, this.name) - const trackedProcess = await this.spawnAPIProcess() - this.encapsulatedProcess = trackedProcess.process - this.pipeProcessLogs(trackedProcess.process) - if (await this.listenServerReady(trackedProcess.didProcessExitEarlyTracker)) { - this.currentStatus = 'running' - this.appLogger.info(`started server ${this.name} on ${this.baseUrl}`, this.name) - this.isSetUp = true - // Clear error on successful startup - this.clearLastStartupError() - } else { - this.currentStatus = 'failed' - this.desiredStatus = 'failed' - this.isSetUp = false - this.appLogger.error(`server ${this.name} failed to boot`, this.name) - this.encapsulatedProcess?.kill() - - // Capture detailed error information for startup failure - const startupError = new Error( - `Server ${this.name} failed to boot - health check timeout or early process exit`, - ) - const errorDetails = await createEnhancedErrorDetails(startupError, 'service startup') - this.setLastStartupError(errorDetails) - } - } catch (error) { - this.appLogger.error(`failed to start server due to ${error}`, this.name) - this.currentStatus = 'failed' - this.desiredStatus = 'failed' - this.isSetUp = false - this.encapsulatedProcess?.kill() - this.encapsulatedProcess = null - // Capture detailed error information for startup exception - const errorDetails = await createEnhancedErrorDetails(error, 'service startup') - this.setLastStartupError(errorDetails) - } finally { - this.win.webContents.send('serviceInfoUpdate', this.get_info()) - } - return this.currentStatus - } - - async stop(): Promise { - this.appLogger.info( - `Stopping backend ${this.name}. It was in state ${this.currentStatus}`, - this.name, - ) - this.desiredStatus = 'stopped' - this.setStatus('stopping') - this.encapsulatedProcess?.kill() - await new Promise((resolve) => { - setTimeout(() => { - resolve('killedprocess (hopefully)') - }, 1000) - }) - - this.encapsulatedProcess = null - this.setStatus('stopped') - return 'stopped' - } - - // Error management methods for startup failures - setLastStartupError(errorDetails: ErrorDetails): void { - this.lastStartupErrorDetails = errorDetails - } - - getLastStartupError(): ErrorDetails | null { - return this.lastStartupErrorDetails - } - - clearLastStartupError(): void { - this.lastStartupErrorDetails = null - } - - async uninstall(): Promise { - await this.stop() - this.appLogger.info(`removing Ollama service directory`, this.name) - await filesystem.remove(this.serviceDir) - this.appLogger.info(`removed Ollama service directory`, this.name) - this.setStatus('notInstalled') - this.isSetUp = false - // Clear startup errors when uninstalling - this.clearLastStartupError() - } - - pipeProcessLogs(process: ChildProcess) { - process.stdout!.on('data', (message) => { - if (message.toString().startsWith('INFO')) { - this.appLogger.info(`${message}`, this.name) - } else if (message.toString().startsWith('WARN')) { - this.appLogger.warn(`${message}`, this.name) - } else { - this.appLogger.info(`${message}`, this.name) - } - }) - - process.stderr!.on('data', (message) => { - this.appLogger.error(`${message}`, this.name) - }) - process.on('error', (message) => { - this.appLogger.error( - `backend process ${this.name} exited abruptly due to : ${message}`, - this.name, - ) - }) - } - - async listenServerReady(didProcessExitEarlyTracker: Promise): Promise { - const startTime = performance.now() - const processStartupCompletePromise = new Promise(async (resolve) => { - const queryIntervalMs = 250 - const startupPeriodMaxMs = 300000 - while (performance.now() < startTime + startupPeriodMaxMs) { - // Check if process has exited before attempting health check - const hasExitedEarly = await Promise.race([ - didProcessExitEarlyTracker, - new Promise((resolve) => setTimeout(() => resolve(false), 0)), - ]) - if (hasExitedEarly) { - this.appLogger.warn( - `Process for ${this.name} exited early, aborting health check`, - this.name, - ) - resolve(false) - return - } - - // Verify process is still alive before health check - if (!this.encapsulatedProcess || this.encapsulatedProcess.killed) { - this.appLogger.warn( - `Process for ${this.name} is not alive, aborting health check`, - this.name, - ) - resolve(false) - return - } - - try { - const serviceHealthResponse = await fetch(this.healthEndpointUrl) - this.appLogger.info(`received response: ${serviceHealthResponse.status}`, this.name) - if (serviceHealthResponse.status === 200) { - // Double-check process is still alive before accepting success - if (!this.encapsulatedProcess || this.encapsulatedProcess.killed) { - this.appLogger.warn( - `Process for ${this.name} exited after health check succeeded, marking as failed`, - this.name, - ) - resolve(false) - return - } - const endTime = performance.now() - this.appLogger.info( - `${this.name} server startup complete after ${(endTime - startTime) / 1000} seconds`, - this.name, - ) - resolve(true) - break - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - } catch (e: unknown) { - //fetch will simply fail while server not up - } - await new Promise((resolve) => setTimeout(resolve, queryIntervalMs)) - } - if (performance.now() >= startTime + startupPeriodMaxMs) { - this.appLogger.warn( - `Server ${this.name} did not return healthy response within ${startupPeriodMaxMs / 1000} seconds`, - this.name, - ) - resolve(false) - } - }) - - // If process exits early, immediately resolve to false (not ready) - // We create a promise that resolves to false immediately if process exits early - const processStartupFailedDueToEarlyExit = new Promise((resolve) => { - didProcessExitEarlyTracker.then((earlyExit) => { - if (earlyExit) { - this.appLogger.error(`Process for ${this.name} exited early during startup`, this.name) - resolve(false) - } - // If process didn't exit early, this promise never resolves - // allowing the health check promise to win the race - }) - }) - - return await Promise.race([processStartupFailedDueToEarlyExit, processStartupCompletePromise]) - } -} diff --git a/WebUI/electron/subprocesses/openVINOBackendService.ts b/WebUI/electron/subprocesses/openVINOBackendService.ts index daf068e2a..15371e34b 100644 --- a/WebUI/electron/subprocesses/openVINOBackendService.ts +++ b/WebUI/electron/subprocesses/openVINOBackendService.ts @@ -68,7 +68,8 @@ export class OpenVINOBackendService implements ApiService { // Logger readonly appLogger = appLoggerInstance - private version = '2025.3' + private version = '2026.1.0' + private releaseTag: string | undefined = '72cc0624' constructor(name: BackendServiceName, port: number, win: BrowserWindow, settings: LocalSettings) { this.name = name @@ -476,6 +477,13 @@ export class OpenVINOBackendService implements ApiService { } async updateSettings(settings: ServiceSettings): Promise { + if (settings.releaseTag !== undefined) { + this.releaseTag = settings.releaseTag || undefined + this.appLogger.info( + `applied new OpenVINO Model Server release tag ${this.releaseTag ?? '(none)'}`, + this.name, + ) + } if (settings.version) { this.version = settings.version this.appLogger.info(`applied new OpenVINO Model Server version ${this.version}`, this.name) @@ -629,7 +637,10 @@ export class OpenVINOBackendService implements ApiService { } private async downloadOvms(): Promise { - const downloadUrl = `https://storage.openvinotoolkit.org/repositories/openvino_model_server/packages/weekly/2026.1.0.fb0bdbd1/ovms_windows_python_on.zip` + const baseUrl = + 'https://storage.openvinotoolkit.org/repositories/openvino_model_server/packages' + const versionPath = this.releaseTag ? `weekly/${this.version}.${this.releaseTag}` : this.version + const downloadUrl = `${baseUrl}/${versionPath}/ovms_windows_python_on.zip` this.appLogger.info(`Downloading OVMS from ${downloadUrl}`, this.name) // Delete existing zip if it exists diff --git a/WebUI/electron/subprocesses/updateIntelPresets.ts b/WebUI/electron/subprocesses/updateIntelPresets.ts index f407e2aed..b0480f2f4 100644 --- a/WebUI/electron/subprocesses/updateIntelPresets.ts +++ b/WebUI/electron/subprocesses/updateIntelPresets.ts @@ -12,28 +12,26 @@ const processLogHandler = (data: string) => { const logSourceName = 'updateIntelPresets' const resourcesBaseDir = app.isPackaged ? process.resourcesPath : path.join(__dirname, '../../../') -const externalRes = path.resolve( - app.isPackaged ? process.resourcesPath : path.join(__dirname, '../../external/'), +const modesBaseDir = path.resolve( + app.isPackaged + ? path.join(process.resourcesPath, 'modes') + : path.join(__dirname, '../../../modes/'), ) const gitExePath = path.join(resourcesBaseDir, 'portable-git', 'cmd', 'git.exe') -const presetDirSpareGitRepoPath = path.join(externalRes, 'presets_intel') +const presetDirSpareGitRepoPath = path.join(modesBaseDir, '..', 'presets_intel') const gitRef = app.getVersion() export async function updateIntelPresets( remoteRepository: string, - presetDirName: string = 'presets', + mode: string, + variant: string, + presetDirTargetPath: string, ): Promise { - const presetDirTargetPath = path.join(externalRes, presetDirName) - const intelPresetDirPath = path.join( - presetDirSpareGitRepoPath, - 'WebUI', - 'external', - presetDirName, - ) - const presetDirBakTargetPath = path.join(externalRes, `${presetDirName}_bak`) - const sparseCheckoutPattern = `WebUI/external/${presetDirName}/*` + const intelPresetDirPath = path.join(presetDirSpareGitRepoPath, 'modes', mode, variant) + const presetDirBakTargetPath = `${presetDirTargetPath}_bak` + const sparseCheckoutPattern = `modes/${mode}/${variant}/*` try { await fetchNewIntelPresets(remoteRepository, sparseCheckoutPattern) await backUpCurrentPresets(presetDirTargetPath, presetDirBakTargetPath) @@ -60,7 +58,7 @@ export async function updateIntelPresets( logger.error(`updating intel presets failed due to ${e}`, logSourceName, true) if (!fs.existsSync(presetDirTargetPath)) { logger.info(`restoring previous presets from ${presetDirBakTargetPath}`, logSourceName, true) - await copyFileWithDirs(intelPresetDirPath, presetDirTargetPath) + await copyFileWithDirs(presetDirBakTargetPath, presetDirTargetPath) } return { result: 'error', diff --git a/WebUI/electron/subprocesses/uvBasedBackends/uv.ts b/WebUI/electron/subprocesses/uvBasedBackends/uv.ts index 071c30977..143265d01 100644 --- a/WebUI/electron/subprocesses/uvBasedBackends/uv.ts +++ b/WebUI/electron/subprocesses/uvBasedBackends/uv.ts @@ -341,12 +341,40 @@ export const checkBackendWithDetails = async ( export const installWheel = async (backend: string, wheelPath: string) => { const logger = loggerFor(`uv.wheel.${backend}`) await assertUv(logger) - const uvCommand = ['pip', 'install', '--directory', path.join(aipgBaseDir, backend), wheelPath] + const uvCommand = [ + 'pip', + 'install', + '--no-deps', + '--directory', + path.join(aipgBaseDir, backend), + wheelPath, + ] logger.info(`Installing wheel: ${wheelPath} with ${JSON.stringify(uvCommand)}`) return uv(uvCommand, logger) } +export const installExtraWheels = async (backend: string) => { + const logger = loggerFor(`uv.wheels.${backend}`) + const wheelDir = app.isPackaged ? aipgBaseDir : path.join(aipgBaseDir, 'WebUI', 'external') + logger.info(`Scanning for extra wheels in ${wheelDir}`) + let entries: string[] + try { + entries = await fs.promises.readdir(wheelDir) + } catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + logger.info(`No extra wheels directory found at ${wheelDir}`) + return + } + throw error + } + const wheelFiles = entries.filter((e) => e.endsWith('.whl')) + logger.info(`Found extra wheels: ${JSON.stringify(wheelFiles)}`) + for (const whl of wheelFiles) { + await installWheel(backend, path.join(wheelDir, whl)) + } +} + /** * Check if a Python package is installed in a backend's environment */ diff --git a/WebUI/electron/types.d.ts b/WebUI/electron/types.d.ts index 3f37d1192..ef7ff263f 100644 --- a/WebUI/electron/types.d.ts +++ b/WebUI/electron/types.d.ts @@ -1,12 +1,10 @@ // Type declarations for the WebUI project -// Extend BackendServiceName to include 'ollama-backend' declare type BackendServiceName = | 'ai-backend' | 'comfyui-backend' | 'llamacpp-backend' | 'openvino-backend' - | 'ollama-backend' // Declare BackendStatus type declare type BackendStatus = diff --git a/WebUI/external/backend-versions.json b/WebUI/external/backend-versions.json index 01acf8612..85767493e 100644 --- a/WebUI/external/backend-versions.json +++ b/WebUI/external/backend-versions.json @@ -1,9 +1,5 @@ { "comfyui-backend": { "version": "v0.17.0" }, - "llamacpp-backend": { "version": "b8429" }, - "openvino-backend": { "version": "2026.1.0" }, - "ollama-backend": { - "releaseTag": "v2.3.0-nightly", - "version": "2.3.0b20250630" - } + "llamacpp-backend": { "version": "b8555" }, + "openvino-backend": { "version": "2026.1.0", "releaseTag": "72cc0624" } } diff --git a/WebUI/external/hardware-recommendations.json b/WebUI/external/hardware-recommendations.json new file mode 100644 index 000000000..8dde80dbc --- /dev/null +++ b/WebUI/external/hardware-recommendations.json @@ -0,0 +1,4 @@ +{ + "essentialsGpuDeviceIds": ["0xFD80", "0xFD81"], + "defaultRecommendation": "studio" +} diff --git a/WebUI/external/models.json b/WebUI/external/models.json index 2cc58c5ed..fc71e39d1 100644 --- a/WebUI/external/models.json +++ b/WebUI/external/models.json @@ -1,4 +1,12 @@ [ + { + "name": "LiquidAI/LFM2.5-350M-GGUF/LFM2.5-350M-Q4_K_M.gguf", + "type": "llamaCPP", + "supportsToolCalling": true, + "supportsVision": false, + "supportsReasoning": false, + "maxContextSize": 1024 + }, { "name": "bartowski/Llama-3.2-3B-Instruct-GGUF/Llama-3.2-3B-Instruct-Q4_K_S.gguf", "type": "llamaCPP", @@ -138,14 +146,6 @@ "supportsReasoning": true, "maxContextSize": 131072 }, - { - "name": "OpenVINO/Mistral-7B-Instruct-v0.2-int4-ov", - "type": "openVINO", - "supportsToolCalling": false, - "supportsVision": false, - "supportsReasoning": false, - "maxContextSize": 32768 - }, { "name": "OpenVINO/TinyLlama-1.1B-Chat-v1.0-int4-ov", "type": "openVINO", @@ -212,15 +212,6 @@ "supportsReasoning": false, "maxContextSize": 32768 }, - { - "name": "OpenVINO/Phi-3-mini-4k-instruct-int4-gq-ov", - "type": "openVINO", - "supportsToolCalling": false, - "supportsVision": false, - "supportsReasoning": false, - "maxContextSize": 4096, - "npuSupport": true - }, { "name": "OpenVINO/Phi-3.5-mini-instruct-int4-gq-ov", "type": "openVINO", @@ -280,37 +271,5 @@ "type": "embedding", "backend": "llamaCPP", "maxContextSize": 32768 - }, - { - "name": "deepseek-r1:1.5b", - "type": "ollama", - "supportsToolCalling": true, - "supportsVision": false, - "supportsReasoning": true, - "maxContextSize": 8192 - }, - { - "name": "gemma3:4b", - "type": "ollama", - "supportsToolCalling": true, - "supportsVision": true, - "supportsReasoning": false, - "maxContextSize": 128000 - }, - { - "name": "gemma3n:e2b", - "type": "ollama", - "supportsToolCalling": true, - "supportsVision": true, - "supportsReasoning": false, - "maxContextSize": 128000 - }, - { - "name": "qwen3:8b", - "type": "ollama", - "supportsToolCalling": true, - "supportsVision": false, - "supportsReasoning": true, - "maxContextSize": 128000 } ] diff --git a/WebUI/external/presets/AcerVisionArt_fluxQ4.png b/WebUI/external/presets/AcerVisionArt_fluxQ4.png deleted file mode 100644 index 86bd48949..000000000 Binary files a/WebUI/external/presets/AcerVisionArt_fluxQ4.png and /dev/null differ diff --git a/WebUI/external/presets_essentials_demo/_profile.json b/WebUI/external/presets_essentials_demo/_profile.json deleted file mode 100644 index f0a7dde3b..000000000 --- a/WebUI/external/presets_essentials_demo/_profile.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "defaults": { - "chatPreset": "Basic Chat", - "chatModel": "unsloth/Qwen3-4B-Instruct-2507-GGUF/Qwen3-4B-Instruct-2507-Q5_K_S.gguf", - "imageGenPreset": "Draft Image", - "imageEditPreset": "Upscale" - }, - "inputImage": "demo_cat.png", - "samplePrompts": [ - { - "title": "Image Generation Example", - "description": "Create an image from a text prompt:", - "prompt": "cute kitten", - "mode": "imageGen" - }, - { - "title": "Image Upscale Example", - "description": "Upscale an image by 4x. An image is already given:", - "prompt": "Upscale an image by 4x", - "mode": "imageEdit" - } - ], - "enabledModes": ["imageGen", "imageEdit"], - "notificationDotButtons": [ - "mode-button-imageGen", - "mode-button-imageEdit", - "app-settings-button", - "advanced-settings-button" - ] -} diff --git a/WebUI/external/settings-dev.json b/WebUI/external/settings-dev.json index ca9489a8d..15b1de51e 100644 --- a/WebUI/external/settings-dev.json +++ b/WebUI/external/settings-dev.json @@ -1,12 +1,13 @@ { "debug": true, + "deviceArchOverride": null, + "isAdminExec": false, "availableThemes": ["dark", "lnl", "bmg", "light"], "currentTheme": "light", - "enablePreviewFeatures": true, "isDemoModeEnabled": false, "demoModeResetInSeconds": 60, - "demoModePresetsDir": "presets_demo", "demoModePasscode": "0451", "languageOverride": null, - "remoteRepository": "asdf/ai-playground" + "remoteRepository": "asdf/ai-playground", + "huggingfaceEndpoint": "https://huggingface.co" } diff --git a/WebUI/package-lock.json b/WebUI/package-lock.json index 237471c0a..2f3e0bf5d 100644 --- a/WebUI/package-lock.json +++ b/WebUI/package-lock.json @@ -11,7 +11,7 @@ "@ai-sdk/openai": "^3.0.41", "@ai-sdk/openai-compatible": "^2.0.35", "@ai-sdk/vue": "^3.0.116", - "@google/model-viewer": "^4.1.0", + "@google/model-viewer": "^4.2.0", "@heroicons/vue": "^2.2.0", "@langchain/classic": "^1.0.22", "@langchain/community": "^1.1.22", @@ -29,14 +29,14 @@ "dompurify": "^3.3.3", "driver.js": "^1.4.0", "extract-zip": "^2.0.1", - "get-port": "^7.1.0", - "koffi": "^2.15.2", + "get-port": "^7.2.0", + "highlight.js": "^11.11.1", + "koffi": "^2.15.6", "langchain": "^1.2.30", "lucide-vue-next": "^0.577.0", - "mammoth": "^1.11.0", - "marked": "^17.0.4", - "marked-shiki": "^1.2.1", - "ollama": "^0.6.3", + "mammoth": "^1.12.0", + "marked": "^17.0.6", + "marked-highlight": "^2.2.4", "partysocket": "^1.1.16", "pdf-parse": "1.1.4", "pinia": "^3.0.4", @@ -44,7 +44,6 @@ "radix-vue": "^1.9.17", "reka-ui": "^2.9.1", "remove": "^0.1.5", - "shiki": "^4.0.2", "sudo-prompt": "^9.2.1", "tailwind-merge": "^3.5.0", "three": "^0.183.2", @@ -60,13 +59,12 @@ "@types/dompurify": "^3.2.0", "@types/exif": "^0.6.5", "@types/minimist": "^1.2.5", - "@types/node": "^24.12.0", + "@types/node": "^24.12.2", "@vitejs/plugin-vue": "^6.0.4", - "@vue/devtools": "^8.0.7", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.7.0", - "adm-zip": "^0.5.16", - "electron": "^40.8.0", + "adm-zip": "^0.5.17", + "electron": "^40.8.5", "electron-builder": "^26.8.1", "electron-builder-squirrel-windows": "^26.8.1", "eslint": "^10.0.3", @@ -76,7 +74,7 @@ "tailwindcss": "^4.2.1", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^7.3.1", + "vite": "^8.0.7", "vite-plugin-electron": "^0.29.0", "vite-plugin-electron-renderer": "^0.14.6", "vitest": "^4.0.18", @@ -230,36 +228,6 @@ "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.27.3", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.27.3.tgz", - "integrity": "sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==", - "license": "MIT", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -306,65 +274,6 @@ "node": ">=6.9.0" } }, - "node_modules/@borewit/text-codec": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", - "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@browserbasehq/sdk": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@browserbasehq/sdk/-/sdk-2.7.0.tgz", - "integrity": "sha512-1iwuj3fChplMq+S66M9tGb9ZXA4e7Vi8MjqQQ6/T6rzoAWLGfDnEAPbgTOU479o+Mi3of5/6YXk1oIHKTw0NBw==", - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@browserbasehq/sdk/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@browserbasehq/sdk/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/@browserbasehq/stagehand": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@browserbasehq/stagehand/-/stagehand-1.14.0.tgz", - "integrity": "sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@anthropic-ai/sdk": "^0.27.3", - "@browserbasehq/sdk": "^2.0.0", - "ws": "^8.18.0", - "zod-to-json-schema": "^3.23.5" - }, - "peerDependencies": { - "@playwright/test": "^1.42.1", - "deepmerge": "^4.3.1", - "dotenv": "^16.4.5", - "openai": "^4.62.1", - "zod": "^3.23.8" - } - }, "node_modules/@cfworker/json-schema": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", @@ -415,9 +324,9 @@ "license": "MIT" }, "node_modules/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -706,9 +615,9 @@ "license": "MIT" }, "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -831,6 +740,37 @@ "node": ">= 10.0.0" } }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@epic-web/invariant": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", @@ -844,6 +784,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -860,6 +801,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -876,6 +818,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -892,6 +835,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -908,6 +852,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -924,6 +869,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -940,6 +886,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -956,6 +903,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -972,6 +920,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -988,6 +937,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1004,6 +954,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1020,6 +971,7 @@ "cpu": [ "loong64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1036,6 +988,7 @@ "cpu": [ "mips64el" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1052,6 +1005,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1068,6 +1022,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1084,6 +1039,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1100,6 +1056,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1116,6 +1073,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1132,6 +1090,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1148,6 +1107,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1164,6 +1124,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1180,6 +1141,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1196,6 +1158,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1212,6 +1175,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1228,6 +1192,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1244,6 +1209,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1410,9 +1376,9 @@ } }, "node_modules/@google/model-viewer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@google/model-viewer/-/model-viewer-4.1.0.tgz", - "integrity": "sha512-7WB/jS6wfBfRl/tWhsUUvDMKFE1KlKME97coDLlZQfvJD0nCwjhES1lJ+k7wnmf7T3zMvCfn9mIjM/mgZapuig==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@google/model-viewer/-/model-viewer-4.2.0.tgz", + "integrity": "sha512-RjpAI5cLs9CdvPcMRsOs8Bea/lNmGTTyaPyl16o9Fv6Qn8VSpgBMmXFr/11yb0hTrsojp2dOACEcY77R8hVUVA==", "license": "Apache-2.0", "dependencies": { "@monogrid/gainmap-js": "^3.1.0", @@ -1422,7 +1388,7 @@ "node": ">=6.0.0" }, "peerDependencies": { - "three": "^0.172.0" + "three": "^0.182.0" } }, "node_modules/@heroicons/vue": { @@ -1486,36 +1452,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@ibm-cloud/watsonx-ai": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/@ibm-cloud/watsonx-ai/-/watsonx-ai-1.7.9.tgz", - "integrity": "sha512-farwTW1ffFt3NVvqZQIcd0VBKByLK6ctnfn4XM7Rf9Mf5JJbNwVPV1Wll046E/MlKAaZEM6sFDGAh+JCnnmqyQ==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.0.0", - "extend": "3.0.2", - "form-data": "^4.0.4", - "ibm-cloud-sdk-core": "^5.4.5" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@ibm-cloud/watsonx-ai/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@ibm-cloud/watsonx-ai/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, "node_modules/@internationalized/date": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.0.tgz", @@ -2233,7 +2169,6 @@ "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.31.tgz", "integrity": "sha512-FxsgIUONjKaRpjx59sISgmb0OMCbAetPGyhzjGa2kX0y1f8LZ5xm9VB2db7W9HYWyLvzRWcMA51Uu4OSTJmtZQ==", "license": "MIT", - "peer": true, "dependencies": { "@cfworker/json-schema": "^4.0.2", "@standard-schema/spec": "^1.1.0", @@ -2549,6 +2484,24 @@ "three": ">= 0.159.0" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.3.tgz", + "integrity": "sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2633,6 +2586,16 @@ "node": ">=8.0.0" } }, + "node_modules/@oxc-project/types": { + "version": "0.123.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.123.0.tgz", + "integrity": "sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2657,22 +2620,6 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@playwright/test": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", - "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "playwright": "1.58.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@radix-icons/vue": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@radix-icons/vue/-/vue-1.0.0.tgz", @@ -2682,215 +2629,488 @@ "vue": ">= 3" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", - "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.13.tgz", + "integrity": "sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.13.tgz", + "integrity": "sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.13.tgz", + "integrity": "sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.13.tgz", + "integrity": "sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.13.tgz", + "integrity": "sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==", "cpu": [ "arm" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.13.tgz", + "integrity": "sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==", "cpu": [ - "arm" + "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.13.tgz", + "integrity": "sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.13.tgz", + "integrity": "sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==", "cpu": [ - "arm64" + "ppc64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.13.tgz", + "integrity": "sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==", "cpu": [ - "loong64" + "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.13.tgz", + "integrity": "sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==", "cpu": [ - "loong64" + "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.13.tgz", + "integrity": "sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==", "cpu": [ - "ppc64" + "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.13.tgz", + "integrity": "sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==", "cpu": [ - "ppc64" + "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ - "linux" - ] + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.13.tgz", + "integrity": "sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==", "cpu": [ - "riscv64" + "wasm32" ], + "dev": true, "license": "MIT", "optional": true, - "os": [ - "linux" - ] + "dependencies": { + "@emnapi/core": "1.9.1", + "@emnapi/runtime": "1.9.1", + "@napi-rs/wasm-runtime": "^1.1.2" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.13.tgz", + "integrity": "sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==", "cpu": [ - "riscv64" + "arm64" ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.13.tgz", + "integrity": "sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2898,12 +3118,13 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", "cpu": [ "s390x" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2911,12 +3132,13 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2924,12 +3146,13 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2937,12 +3160,13 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2950,12 +3174,13 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2963,12 +3188,13 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2976,12 +3202,13 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2989,12 +3216,13 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3002,118 +3230,19 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, - "node_modules/@shikijs/core": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", - "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", - "license": "MIT", - "dependencies": { - "@shikijs/primitive": "4.0.2", - "@shikijs/types": "4.0.2", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.5" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", - "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.0.2", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", - "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.0.2", - "@shikijs/vscode-textmate": "^10.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/langs": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", - "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/primitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", - "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.0.2", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/themes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", - "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "4.0.2" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/types": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", - "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -3127,13 +3256,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -3445,29 +3567,16 @@ "vue": "^2.7.0 || ^3.0.0" } }, - "node_modules/@tokenizer/inflate": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "license": "MIT", + "optional": true, "dependencies": { - "debug": "^4.4.3", - "token-types": "^6.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "tslib": "^2.4.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT" - }, "node_modules/@types/adm-zip": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz", @@ -3502,20 +3611,11 @@ "assertion-error": "^2.0.1" } }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/ms": "*" @@ -3572,15 +3672,6 @@ "@types/node": "*" } }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -3604,15 +3695,6 @@ "@types/node": "*" } }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -3624,27 +3706,19 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "24.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", - "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "devOptional": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, "node_modules/@types/plist": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", @@ -3667,24 +3741,12 @@ "@types/node": "*" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "license": "MIT" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT" }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, "node_modules/@types/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", @@ -3705,16 +3767,6 @@ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -3760,7 +3812,6 @@ "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", @@ -3959,12 +4010,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, "node_modules/@vee-validate/zod": { "version": "4.15.1", "resolved": "https://registry.npmjs.org/@vee-validate/zod/-/zod-4.15.1.tgz", @@ -4022,33 +4067,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/mocker": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", - "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.18", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, "node_modules/@vitest/pretty-format": { "version": "4.0.18", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.18.tgz", @@ -4206,20 +4224,6 @@ "@vue/shared": "3.5.30" } }, - "node_modules/@vue/devtools": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@vue/devtools/-/devtools-8.0.7.tgz", - "integrity": "sha512-vtjlz6gcTrGdjWVlbnofLyGIlrsy2aE85X77MU8FAzOoBbRACXC1DdXDQO1OUIQCKgWIom6HHB4rKZM/Jmjd/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-electron": "^8.0.7", - "@vue/devtools-kit": "^8.0.7" - }, - "bin": { - "vue-devtools": "cli.mjs" - } - }, "node_modules/@vue/devtools-api": { "version": "7.7.9", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", @@ -4259,93 +4263,6 @@ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "license": "MIT" }, - "node_modules/@vue/devtools-core": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-8.0.7.tgz", - "integrity": "sha512-PmpiPxvg3Of80ODHVvyckxwEW1Z02VIAvARIZS1xegINn3VuNQLm9iHUmKD+o6cLkMNWV8OG8x7zo0kgydZgdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^8.0.7", - "@vue/devtools-shared": "^8.0.7" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/@vue/devtools-electron": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-electron/-/devtools-electron-8.0.7.tgz", - "integrity": "sha512-iElrwO22VfouH55xxIsUg0/vrgGIC7IOWponcSnkP+XX3LeAlhxHMLN7T8AlR1nKhTwFeC4223tstJvm5OwVpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-core": "^8.0.7", - "@vue/devtools-kit": "^8.0.7", - "@vue/devtools-shared": "^8.0.7", - "electron": "^36.9.4", - "h3": "^1.15.4", - "pathe": "^2.0.3", - "socket.io": "^4.8.1", - "socket.io-client": "^4.8.1" - } - }, - "node_modules/@vue/devtools-electron/node_modules/@types/node": { - "version": "22.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz", - "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@vue/devtools-electron/node_modules/electron": { - "version": "36.9.5", - "resolved": "https://registry.npmjs.org/electron/-/electron-36.9.5.tgz", - "integrity": "sha512-1UCss2IqxqujSzg/2jkRjuiT3G+EEXgd6UKB5kUekwQW1LJ6d4QCr8YItfC3Rr9VIGRDJ29eOERmnRNO1Eh+NA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^22.7.7", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/@vue/devtools-electron/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/devtools-kit": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.0.7.tgz", - "integrity": "sha512-H6esJGHGl5q0E9iV3m2EoBQHJ+V83WMW83A0/+Fn95eZ2iIvdsq4+UCS6yT/Fdd4cGZSchx/MdWDreM3WqMsDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^8.0.7", - "birpc": "^2.6.1", - "hookable": "^5.5.3", - "perfect-debounce": "^2.0.0" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.0.7.tgz", - "integrity": "sha512-CgAb9oJH5NUmbQRdYDj/1zMiaICYSLtm+B1kxcP72LBrifGAjUmt8bx52dDH1gWRPlQgxGPqpAMKavzVirAEhA==", - "dev": true, - "license": "MIT" - }, "node_modules/@vue/eslint-config-prettier": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz", @@ -4404,9 +4321,9 @@ } }, "node_modules/@vue/language-core/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -4505,65 +4422,29 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "version": "0.8.12", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz", + "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==", "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, "engines": { - "node": ">= 0.6" + "node": ">=10.0.0" } }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/acorn": { @@ -4571,7 +4452,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4590,9 +4470,9 @@ } }, "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", "dev": true, "license": "MIT", "engines": { @@ -4609,18 +4489,6 @@ "node": ">= 14" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/ai": { "version": "6.0.111", "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.111.tgz", @@ -4662,7 +4530,6 @@ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4970,6 +4837,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, "license": "MIT" }, "node_modules/at-least-node": { @@ -5018,18 +4886,6 @@ "postcss": "^8.1.0" } }, - "node_modules/axios": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", - "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -5060,16 +4916,6 @@ ], "license": "MIT" }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", @@ -5153,9 +4999,9 @@ "optional": true }, "node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5197,7 +5043,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5246,12 +5091,6 @@ "node": "*" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5368,9 +5207,9 @@ "license": "MIT" }, "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -5455,6 +5294,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5496,16 +5336,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", @@ -5561,26 +5391,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -5741,6 +5551,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -5749,16 +5560,6 @@ "node": ">= 0.8" } }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -5801,23 +5602,6 @@ "simple-wcswidth": "^1.1.2" } }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", - "dev": true, - "license": "MIT" - }, "node_modules/copy-anything": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", @@ -5839,24 +5623,6 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/crc": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", @@ -5907,16 +5673,6 @@ "node": ">= 8" } }, - "node_modules/crossws": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", - "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "uncrypto": "^0.1.3" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -5998,16 +5754,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -6070,36 +5816,21 @@ } }, "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "dev": true, - "license": "MIT" - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -6117,19 +5848,6 @@ "license": "MIT", "optional": true }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/dingbat-to-unicode": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz", @@ -6155,9 +5873,9 @@ "license": "MIT" }, "node_modules/dir-compare/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -6273,8 +5991,8 @@ "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=12" }, @@ -6317,6 +6035,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -6334,15 +6053,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -6360,9 +6070,9 @@ } }, "node_modules/electron": { - "version": "40.8.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-40.8.0.tgz", - "integrity": "sha512-WoPq0Nr9Yx3g7T6VnJXdwa/rr2+VRyH3a+K+ezfMKBlf6WjxE/LmhMQabKbb6yjm9RbZhJBRcYyoLph421O2mQ==", + "version": "40.8.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-40.8.5.tgz", + "integrity": "sha512-pgTY/VPQKaiU4sTjfU96iyxCXrFm4htVPCMRT4b7q9ijNTRgtLmLvcmzp2G4e7xDrq9p7OLHSmu1rBKFf6Y1/A==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6410,7 +6120,6 @@ "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "app-builder-lib": "26.8.1", "builder-util": "26.8.1", @@ -6568,96 +6277,6 @@ "once": "^1.4.0" } }, - "node_modules/engine.io": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.6.tgz", - "integrity": "sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "@types/ws": "^8.5.12", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.18.3" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", - "integrity": "sha512-+kjUJnZGwzewFDw951CDWcwj35vMNf2fcj7xQWOctq1F2i1jkDdVvdFG9kM/BEChymCH36KgjnW0NsL58JYRxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.18.3", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/enhanced-resolve": { "version": "5.20.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", @@ -6704,6 +6323,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6713,6 +6333,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6729,6 +6350,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -6741,6 +6363,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -6764,6 +6387,7 @@ "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -6829,7 +6453,6 @@ "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", @@ -6886,7 +6509,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6944,7 +6566,6 @@ "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", @@ -7118,15 +6739,6 @@ "integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==", "license": "MIT" }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -7165,12 +6777,6 @@ "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", "license": "MIT" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -7291,24 +6897,6 @@ "node": ">=16.0.0" } }, - "node_modules/file-type": { - "version": "21.3.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.3.tgz", - "integrity": "sha512-pNwbwz8c3aZ+GvbJnIsCnDjKvgCZLHxkFWLEFxU3RMa+Ey++ZSEfisvsWQMcdys6PpxQjWUOIDi1fifXsW3YRg==", - "license": "MIT", - "dependencies": { - "@tokenizer/inflate": "^0.4.1", - "strtok3": "^10.3.4", - "token-types": "^6.1.1", - "uint8array-extras": "^1.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, "node_modules/filelist": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", @@ -7327,9 +6915,9 @@ "license": "MIT" }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -7409,26 +6997,6 @@ "dev": true, "license": "ISC" }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -7463,6 +7031,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -7475,25 +7044,6 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", - "license": "MIT" - }, - "node_modules/formdata-node": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", - "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", - "license": "MIT", - "dependencies": { - "node-domexception": "1.0.0", - "web-streams-polyfill": "4.0.0-beta.3" - }, - "engines": { - "node": ">= 12.20" - } - }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -7546,6 +7096,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -7560,6 +7111,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7579,6 +7131,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -7600,9 +7153,9 @@ } }, "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.2.0.tgz", + "integrity": "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==", "license": "MIT", "engines": { "node": ">=16" @@ -7615,6 +7168,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -7682,9 +7236,9 @@ "license": "MIT" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -7746,6 +7300,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7786,28 +7341,10 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/h3": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.6.tgz", - "integrity": "sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cookie-es": "^1.2.2", - "crossws": "^0.3.5", - "defu": "^6.1.4", - "destr": "^2.0.5", - "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.4", - "radix3": "^1.1.2", - "ufo": "^1.6.3", - "uncrypto": "^0.1.3" - } - }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "license": "MIT", "dependencies": { "minimist": "^1.2.5", @@ -7853,6 +7390,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7865,6 +7403,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -7892,48 +7431,22 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" } }, "node_modules/hookable": { @@ -7955,16 +7468,6 @@ "node": ">=10" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -8014,56 +7517,6 @@ "node": ">= 14" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/ibm-cloud-sdk-core": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/ibm-cloud-sdk-core/-/ibm-cloud-sdk-core-5.4.8.tgz", - "integrity": "sha512-tLMlZv13cV6S1UPj/bhv8XfV9Z1BDDs/4DxHKWnCw7QlJMzmGdHLPX386x9nrFMQMPZ48eAH+Thsa06tzUZkaA==", - "license": "Apache-2.0", - "dependencies": { - "@types/debug": "^4.1.12", - "@types/node": "^18.19.80", - "@types/tough-cookie": "^4.0.0", - "axios": "^1.13.5", - "camelcase": "^6.3.0", - "debug": "^4.3.4", - "dotenv": "^16.4.5", - "extend": "3.0.2", - "file-type": "16.5.4", - "form-data": "^4.0.4", - "isstream": "0.1.2", - "jsonwebtoken": "^9.0.3", - "mime-types": "2.1.35", - "retry-axios": "^2.6.0", - "tough-cookie": "^4.1.3" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/ibm-cloud-sdk-core/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/ibm-cloud-sdk-core/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", @@ -8086,7 +7539,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8099,6 +7552,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -8119,9 +7573,8 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "devOptional": true, + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -8170,16 +7623,6 @@ "node": ">= 12" } }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -8301,12 +7744,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -8451,28 +7888,6 @@ "node": ">=0.10.0" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -8485,27 +7900,6 @@ "setimmediate": "^1.0.5" } }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8517,9 +7911,9 @@ } }, "node_modules/koffi": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.15.2.tgz", - "integrity": "sha512-r9tjJLVRSOhCRWdVyQlF3/Ugzeg13jlzS4czS82MAgLff4W+BcYOW7g8Y62t9O5JYjYOLAjAovAZDNlDfZNu+g==", + "version": "2.15.6", + "resolved": "https://registry.npmjs.org/koffi/-/koffi-2.15.6.tgz", + "integrity": "sha512-WQBpM5uo74UQ17UpsFN+PUOrQQg4/nYdey4SGVluQun2drYYfePziLLWdSmFb4wSdWlJC1aimXQnjhPCheRKuw==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -8948,53 +8342,10 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "devOptional": true, - "license": "MIT", - "peer": true - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, "license": "MIT" }, "node_modules/log-symbols": { @@ -9090,11 +8441,10 @@ } }, "node_modules/mammoth": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.11.0.tgz", - "integrity": "sha512-BcEqqY/BOwIcI1iR5tqyVlqc3KIaMRa4egSoK83YAVrBf6+yqdAAbtUcFDCWX8Zef8/fgNZ6rl4VUv+vVX8ddQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.12.0.tgz", + "integrity": "sha512-cwnK1RIcRdDMi2HRx2EXGYlxqIEh0Oo3bLhorgnsVJi2UkbX1+jKxuBNR9PC5+JaX7EkmJxFPmo6mjLpqShI2w==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@xmldom/xmldom": "^0.8.6", "argparse": "~1.0.3", @@ -9139,11 +8489,10 @@ } }, "node_modules/marked": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz", - "integrity": "sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==", + "version": "17.0.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.6.tgz", + "integrity": "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA==", "license": "MIT", - "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -9151,14 +8500,13 @@ "node": ">= 20" } }, - "node_modules/marked-shiki": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/marked-shiki/-/marked-shiki-1.2.1.tgz", - "integrity": "sha512-yHxYQhPY5oYaIRnROn98foKhuClark7M373/VpLxiy5TrDu9Jd/LsMwo8w+U91Up4oDb9IXFrP0N1MFRz8W/DQ==", + "node_modules/marked-highlight": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.2.4.tgz", + "integrity": "sha512-PZxisNMJDduSjc0q6uvjsnqqHCXc9s0eyzxDO9sB1eNGJnd/H1/Fu+z6g/liC1dfJdFW4SftMwMlLvsBhUPrqQ==", "license": "MIT", "peerDependencies": { - "marked": ">=7.0.0", - "shiki": ">=1.0.0" + "marked": ">=4 <19" } }, "node_modules/matcher": { @@ -9185,32 +8533,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9221,95 +8549,6 @@ "node": ">= 8" } }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9341,6 +8580,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9350,6 +8590,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -9677,52 +8918,12 @@ "semver": "^7.3.5" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, "node_modules/node-ensure": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/node-ensure/-/node-ensure-0.0.0.tgz", "integrity": "sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==", "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-gyp": { "version": "11.5.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", @@ -9774,13 +8975,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/node-mock-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", - "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", - "dev": true, - "license": "MIT" - }, "node_modules/node-releases": { "version": "2.0.36", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", @@ -9829,16 +9023,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -9867,15 +9051,6 @@ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, - "node_modules/ollama": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.6.3.tgz", - "integrity": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==", - "license": "MIT", - "dependencies": { - "whatwg-fetch": "^3.6.20" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -9901,69 +9076,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", - "license": "MIT", - "dependencies": { - "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/openai": { - "version": "4.104.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", - "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/node": "^18.11.18", - "@types/node-fetch": "^2.6.4", - "abort-controller": "^3.0.0", - "agentkeepalive": "^4.2.1", - "form-data-encoder": "1.7.2", - "formdata-node": "^4.3.2", - "node-fetch": "^2.6.7" - }, - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/openai/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/openai/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, "node_modules/openapi-types": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", @@ -10225,7 +9337,6 @@ "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.4.tgz", "integrity": "sha512-XRIRcLgk6ZnUbsHsYXExMw+krrPE81hJ6FQPLdBNhhBefqIQKXu/WeTgNBGSwPrfU0v+UCEwn7AoAUOsVKHFvQ==", "license": "MIT", - "peer": true, "dependencies": { "node-ensure": "^0.0.0" }, @@ -10258,13 +9369,6 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, - "node_modules/perfect-debounce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", - "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -10272,9 +9376,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -10289,7 +9393,6 @@ "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", "license": "MIT", - "peer": true, "dependencies": { "@vue/devtools-api": "^7.7.7" }, @@ -10328,48 +9431,18 @@ }, "pinia": { "optional": true - } - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/playwright": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.58.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, "node_modules/plist": { @@ -10406,7 +9479,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -10480,7 +9552,6 @@ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -10566,34 +9637,6 @@ "signal-exit": "^3.0.2" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, "node_modules/pump": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", @@ -10608,6 +9651,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -10629,12 +9673,6 @@ ], "license": "MIT" }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10803,13 +9841,6 @@ "node": "^18 || >=20" } }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", - "dev": true, - "license": "MIT" - }, "node_modules/read-binary-file-arch": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", @@ -10844,30 +9875,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, - "node_modules/regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", - "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, "node_modules/reka-ui": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.1.tgz", @@ -10912,12 +9919,6 @@ "node": ">=0.10.0" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT" - }, "node_modules/resedit": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", @@ -10980,18 +9981,6 @@ "node": ">= 4" } }, - "node_modules/retry-axios": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz", - "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.7.0" - }, - "peerDependencies": { - "axios": "*" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -11042,10 +10031,52 @@ "node": ">=8.0" } }, + "node_modules/rolldown": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.13.tgz", + "integrity": "sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.123.0", + "@rolldown/pluginutils": "1.0.0-rc.13" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.13", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.13", + "@rolldown/binding-darwin-x64": "1.0.0-rc.13", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.13", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.13", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.13", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.13", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.13", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.13", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.13", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.13", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.13", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.13", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.13", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.13" + } + }, + "node_modules/rolldown/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.13", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.13.tgz", + "integrity": "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -11058,31 +10089,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", "fsevents": "~2.3.2" } }, @@ -11110,31 +10141,11 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/sanitize-filename": { @@ -11266,26 +10277,6 @@ "node": ">=8" } }, - "node_modules/shiki": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", - "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@shikijs/core": "4.0.2", - "@shikijs/engine-javascript": "4.0.2", - "@shikijs/engine-oniguruma": "4.0.2", - "@shikijs/langs": "4.0.2", - "@shikijs/themes": "4.0.2", - "@shikijs/types": "4.0.2", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - }, - "engines": { - "node": ">=20" - } - }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -11363,88 +10354,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socket.io": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", - "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.4.1", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", - "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.4.1", - "ws": "~8.18.3" - } - }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/socket.io-client": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", - "integrity": "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", - "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.4.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -11504,16 +10413,6 @@ "source-map": "^0.6.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/speakingurl": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", @@ -11614,20 +10513,6 @@ "node": ">=8" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -11667,22 +10552,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/strtok3": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", - "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/sudo-prompt": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", @@ -11876,8 +10745,7 @@ "version": "0.183.2", "resolved": "https://registry.npmjs.org/three/-/three-0.183.2.tgz", "integrity": "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tiny-async-pool": { "version": "1.3.0", @@ -11950,11 +10818,10 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12005,54 +10872,6 @@ "node": ">=8.0" } }, - "node_modules/token-types": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", - "license": "MIT", - "dependencies": { - "@borewit/text-codec": "^0.2.1", - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/traverse": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", @@ -12062,16 +10881,6 @@ "node": "*" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -12140,9 +10949,8 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -12206,13 +11014,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", - "dev": true, - "license": "MIT" - }, "node_modules/underscore": { "version": "1.13.8", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", @@ -12223,6 +11024,7 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "devOptional": true, "license": "MIT" }, "node_modules/unimport": { @@ -12263,109 +11065,41 @@ } }, "node_modules/unimport/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "license": "MIT", + "node_modules/unique-filename": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", + "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", + "dev": true, + "license": "ISC", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "unique-slug": "^5.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", + "node_modules/unique-slug": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", + "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", + "dev": true, + "license": "ISC", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" + "imurmurhash": "^0.1.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/universalify": { @@ -12426,9 +11160,9 @@ } }, "node_modules/unplugin-auto-import/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -12454,9 +11188,9 @@ } }, "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -12466,9 +11200,9 @@ } }, "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -12517,16 +11251,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/utf8-byte-length": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", @@ -12553,16 +11277,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/vee-validate": { "version": "4.15.1", "resolved": "https://registry.npmjs.org/vee-validate/-/vee-validate-4.15.1.tgz", @@ -12600,46 +11314,17 @@ "license": "MIT", "optional": true }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vite": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", - "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.7.tgz", + "integrity": "sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.13", "tinyglobby": "^0.2.15" }, "bin": { @@ -12656,9 +11341,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -12671,13 +11357,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -12703,66 +11392,310 @@ } } }, - "node_modules/vite-plugin-electron": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-0.29.0.tgz", - "integrity": "sha512-HP0DI9Shg41hzt55IKYVnbrChWXHX95QtsEQfM+szQBpWjVhVGMlqRjVco6ebfQjWNr+Ga+PeoBjMIl8zMaufw==", + "node_modules/vite-plugin-electron": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/vite-plugin-electron/-/vite-plugin-electron-0.29.0.tgz", + "integrity": "sha512-HP0DI9Shg41hzt55IKYVnbrChWXHX95QtsEQfM+szQBpWjVhVGMlqRjVco6ebfQjWNr+Ga+PeoBjMIl8zMaufw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vite-plugin-electron-renderer": "*" + }, + "peerDependenciesMeta": { + "vite-plugin-electron-renderer": { + "optional": true + } + } + }, + "node_modules/vite-plugin-electron-renderer": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.14.6.tgz", + "integrity": "sha512-oqkWFa7kQIkvHXG7+Mnl1RTroA4sP0yesKatmAy0gjZC4VwUqlvF9IvOpHd1fpLWsqYX/eZlVxlhULNtaQ78Jw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "peerDependencies": { - "vite-plugin-electron-renderer": "*" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "vite-plugin-electron-renderer": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite-plugin-electron-renderer": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.14.6.tgz", - "integrity": "sha512-oqkWFa7kQIkvHXG7+Mnl1RTroA4sP0yesKatmAy0gjZC4VwUqlvF9IvOpHd1fpLWsqYX/eZlVxlhULNtaQ78Jw==", + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "node": ">= 12.0.0" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12848,10 +11781,70 @@ } } }, + "node_modules/vitest/node_modules/@vitest/mocker": { + "version": "4.0.18", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.18.tgz", + "integrity": "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.18", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -12861,6 +11854,81 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vitest/node_modules/vite": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", @@ -12873,7 +11941,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.30", "@vue/compiler-sfc": "3.5.30", @@ -12954,43 +12021,12 @@ "defaults": "^1.0.3" } }, - "node_modules/web-streams-polyfill": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", - "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "license": "MIT" }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -13028,7 +12064,6 @@ "resolved": "https://registry.npmjs.org/word-extractor/-/word-extractor-1.0.4.tgz", "integrity": "sha512-PyAGZQ2gjnVA5kcZAOAxoYciCMaAvu0dbVlw/zxHphhy+3be8cDeYKHJPO8iedIM3Sx0arA/ugKTJyXhZNgo6g==", "license": "MIT", - "peer": true, "dependencies": { "saxes": "^5.0.1", "yauzl": "^2.10.0" @@ -13125,27 +12160,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -13172,15 +12186,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", - "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13199,9 +12204,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -13270,29 +12275,9 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/WebUI/package.json b/WebUI/package.json index db0cb1c38..b9762e3b3 100644 --- a/WebUI/package.json +++ b/WebUI/package.json @@ -22,7 +22,7 @@ "@ai-sdk/openai": "^3.0.41", "@ai-sdk/openai-compatible": "^2.0.35", "@ai-sdk/vue": "^3.0.116", - "@google/model-viewer": "^4.1.0", + "@google/model-viewer": "^4.2.0", "@heroicons/vue": "^2.2.0", "@langchain/classic": "^1.0.22", "@langchain/community": "^1.1.22", @@ -40,14 +40,14 @@ "dompurify": "^3.3.3", "driver.js": "^1.4.0", "extract-zip": "^2.0.1", - "get-port": "^7.1.0", - "koffi": "^2.15.2", + "get-port": "^7.2.0", + "highlight.js": "^11.11.1", + "koffi": "^2.15.6", "langchain": "^1.2.30", "lucide-vue-next": "^0.577.0", - "mammoth": "^1.11.0", - "marked": "^17.0.4", - "marked-shiki": "^1.2.1", - "ollama": "^0.6.3", + "mammoth": "^1.12.0", + "marked": "^17.0.6", + "marked-highlight": "^2.2.4", "partysocket": "^1.1.16", "pdf-parse": "1.1.4", "pinia": "^3.0.4", @@ -55,7 +55,6 @@ "radix-vue": "^1.9.17", "reka-ui": "^2.9.1", "remove": "^0.1.5", - "shiki": "^4.0.2", "sudo-prompt": "^9.2.1", "tailwind-merge": "^3.5.0", "three": "^0.183.2", @@ -71,13 +70,12 @@ "@types/dompurify": "^3.2.0", "@types/exif": "^0.6.5", "@types/minimist": "^1.2.5", - "@types/node": "^24.12.0", + "@types/node": "^24.12.2", "@vitejs/plugin-vue": "^6.0.4", - "@vue/devtools": "^8.0.7", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.7.0", - "adm-zip": "^0.5.16", - "electron": "^40.8.0", + "adm-zip": "^0.5.17", + "electron": "^40.8.5", "electron-builder": "^26.8.1", "electron-builder-squirrel-windows": "^26.8.1", "eslint": "^10.0.3", @@ -87,7 +85,7 @@ "tailwindcss": "^4.2.1", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^7.3.1", + "vite": "^8.0.7", "vite-plugin-electron": "^0.29.0", "vite-plugin-electron-renderer": "^0.14.6", "vitest": "^4.0.18", @@ -95,8 +93,7 @@ }, "overrides": { "pdf-parse": "1.1.4", - "three": "^0.183.2", - "file-type": "^21.3.1" + "file-type": "^21.3.4" }, "debug": { "env": { diff --git a/WebUI/src/App.vue b/WebUI/src/App.vue index e3ed8a403..350c8ef8a 100644 --- a/WebUI/src/App.vue +++ b/WebUI/src/App.vue @@ -18,9 +18,9 @@

AI PLAYGROUND - essentials + {{ + productModeStore.productMode === 'essentials' ? 'essentials' : 'studio' + }} {{ platformTitle }}

@@ -80,15 +80,32 @@
+
+ +
import LoadingBar from './components/LoadingBar.vue' import InstallationManagement from './components/InstallationManagement.vue' +import ProductModeSelector from './components/ProductModeSelector.vue' import PromptArea from '@/views/PromptArea.vue' import './assets/css/index.css' import { useGlobalSetup } from './assets/js/store/globalSetup' +import { useProductMode } from './assets/js/store/productMode' import DownloadDialog from '@/components/DownloadDialog.vue' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import { useTheme } from './assets/js/store/theme.ts' @@ -312,7 +331,7 @@ import { useColorMode } from '@vueuse/core' import { useDemoMode } from './assets/js/store/demoMode.ts' import WorkflowResult from '@/views/WorkflowResult.vue' import Chat from '@/views/Chat.vue' -import { computed, ref } from 'vue' +import { computed, ref, watch } from 'vue' import SideModalHistory from '@/components/SideModalHistory.vue' import SideModalAppSettings from '@/components/SideModalAppSettings.vue' import { useDialogStore } from '@/assets/js/store/dialogs.ts' @@ -320,6 +339,8 @@ import { usePromptStore } from '@/assets/js/store/promptArea.ts' import SideModalSpecificSettings from '@/components/SideModalSpecificSettings.vue' import { useUIStore } from '@/assets/js/store/ui.ts' import { useSpeechToText } from '@/assets/js/store/speechToText' +import { usePresets } from '@/assets/js/store/presets' +import { usePresetSwitching } from '@/assets/js/store/presetSwitching' import * as toast from '@/assets/js/toast' import DemoModeOverlayDriverJsRef from './components/DemoModeOverlayDriverJs.vue' import DemoModeBlocker from '@/components/DemoModeBlocker.vue' @@ -329,11 +350,14 @@ import DemoModeAutoresetDialog from '@/components/DemoModeAutoresetDialog.vue' const backendServices = useBackendServices() const theme = useTheme() const globalSetup = useGlobalSetup() +const productModeStore = useProductMode() const demoMode = useDemoMode() const dialogStore = useDialogStore() const promptStore = usePromptStore() const uiStore = useUIStore() const speechToText = useSpeechToText() +const presetsStore = usePresets() +const presetSwitching = usePresetSwitching() const addLLMCompt = ref>() const demoModeOverlayDriverJs = ref>() @@ -365,6 +389,20 @@ const licenseUrl = computed(() => `${gitHubRepoUrl.value}LICENSE`) const mode = useColorMode() mode.value = 'dark' +/** Only one pending poll for backend readiness (avoids stacked timers if onBeforeMount runs twice). */ +let initialLoadingPollHandle: ReturnType | null = null + +/** Remount mode selector whenever the screen is shown so selection syncs with committed `productMode`. */ +const productModeSelectorKey = ref(0) +watch( + () => globalSetup.loadingState, + (state, prev) => { + if (state === 'selectProductMode' && prev !== 'selectProductMode') { + productModeSelectorKey.value += 1 + } + }, +) + const zoomIn = (event: KeyboardEvent) => { if (event.ctrlKey && event.code === 'Equal') window.electronAPI.zoomIn() } @@ -403,7 +441,7 @@ onBeforeMount(async () => { e.preventDefault() } }) - await setInitalLoadingState() + await setInitialLoadingState() }) onMounted(async () => { @@ -439,26 +477,70 @@ onMounted(async () => { }) }) -async function setInitalLoadingState() { +async function setInitialLoadingState() { console.log('setting loading state') - // Wait for service info (non-blocking check) if (!backendServices.serviceInfoUpdateReceived) { globalSetup.loadingState = 'verifyBackend' - setTimeout(setInitalLoadingState, 1000) + if (initialLoadingPollHandle !== null) { + clearTimeout(initialLoadingPollHandle) + } + initialLoadingPollHandle = setTimeout(() => { + initialLoadingPollHandle = null + void setInitialLoadingState() + }, 1000) + return + } + + if (initialLoadingPollHandle !== null) { + clearTimeout(initialLoadingPollHandle) + initialLoadingPollHandle = null + } + + const result = await productModeStore.ensureReady() + + if (result === 'installFailed') { + if (!productModeStore.productMode) { + globalSetup.loadingState = 'selectProductMode' + return + } + await proceedAfterModeSelection() + return + } + + if (result === 'needsSelection') { + globalSetup.loadingState = 'selectProductMode' return } - // Check if installation dialog is needed - // Wait for setup checks to complete before deciding + await proceedAfterModeSelection() +} + +async function onProductModeSelected(mode: ProductMode) { + await productModeStore.selectMode(mode) + await proceedAfterModeSelection() +} + +/** + * Presets store loads from main on first import, before ensureReady() syncs Pinia productMode + * to Electron — so we always re-fetch after main knows the real mode. + */ +async function syncPresetsForCurrentProductMode() { + await productModeStore.syncToMain() + await presetsStore.reloadAfterProductModeChange() + await presetSwitching.reconcileActivePresetAfterCatalogReload() + if (demoMode.enabled) { + await demoMode.refreshFromMainConfig() + } +} + +async function proceedAfterModeSelection() { + await syncPresetsForCurrentProductMode() const needsInstallation = await backendServices.shouldShowInstallationDialog() if (needsInstallation) { globalSetup.loadingState = 'manageInstallations' - // Note: Backends are now started automatically by the service registry - // This call is kept as a fallback for manual restarts backendServices.startAllSetUpServicesInBackground() return } - await concludeLoadingState() } diff --git a/WebUI/src/assets/i18n/de.json b/WebUI/src/assets/i18n/de.json index b813e3b66..eb5675dc2 100644 --- a/WebUI/src/assets/i18n/de.json +++ b/WebUI/src/assets/i18n/de.json @@ -260,6 +260,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Dieses Modell erfordert viel VRAM. Reduzieren Sie bei Leistungsproblemen die Auflösung und/oder starten Sie das ComfyUI-Backend neu.", "WORKFLOW_HIGH_VRAM_WARNING": "Viel VRAM nötig", "LOADING_VERIFYING_BACKENDS": "Backends überprüfen", + "LOADING_AUTO_INSTALLING": "AI-Playground wird eingerichtet...", "LOADING_AI_PLAYGROUND_LOADING": "AI-Playground lädt", "COM_CLEAR_HISTORY": "Verlauf löschen", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/en-US.json b/WebUI/src/assets/i18n/en-US.json index 259192f4a..7e7870c48 100644 --- a/WebUI/src/assets/i18n/en-US.json +++ b/WebUI/src/assets/i18n/en-US.json @@ -270,6 +270,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "This model requires a lot of VRAM. Reduce the resolution and/or restart the ComfyUI backend when in case you experience a poor performance.", "WORKFLOW_HIGH_VRAM_WARNING": "high VRAM required", "LOADING_VERIFYING_BACKENDS": "Verifying backends", + "LOADING_AUTO_INSTALLING": "Setting up AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground Loading", "COM_CLEAR_HISTORY": "Clear History", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/es.json b/WebUI/src/assets/i18n/es.json index b0c3c2aa5..ca7265352 100644 --- a/WebUI/src/assets/i18n/es.json +++ b/WebUI/src/assets/i18n/es.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Este modelo requiere mucha VRAM. Reduce la resolución y/o reinicia el backend de ComfyUI si experimentas bajo rendimiento", "WORKFLOW_HIGH_VRAM_WARNING": "alta VRAM requerida", "LOADING_VERIFYING_BACKENDS": "Verificando backends", + "LOADING_AUTO_INSTALLING": "Configurando AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "Cargando AI Playground", "COM_CLEAR_HISTORY": "Borrar historial", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/id.json b/WebUI/src/assets/i18n/id.json index 054edd5d4..0bb6ffa66 100644 --- a/WebUI/src/assets/i18n/id.json +++ b/WebUI/src/assets/i18n/id.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Model ini memerlukan banyak VRAM. Kurangi resolusi dan/atau mulai ulang backend ComfyUI jika Anda mengalami masalah kinerja.", "WORKFLOW_HIGH_VRAM_WARNING": "VRAM tinggi diperlukan", "LOADING_VERIFYING_BACKENDS": "Memverifikasi backend", + "LOADING_AUTO_INSTALLING": "Menyiapkan AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground Sedang Memuat", "COM_CLEAR_HISTORY": "Hapus Riwayat", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/it.json b/WebUI/src/assets/i18n/it.json index 731411860..616d30248 100644 --- a/WebUI/src/assets/i18n/it.json +++ b/WebUI/src/assets/i18n/it.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Questo modello richiede molta VRAM. Riduci la risoluzione e/o riavvia il backend ComfyUI in caso di prestazioni ridotte", "WORKFLOW_HIGH_VRAM_WARNING": "alta VRAM richiesta", "LOADING_VERIFYING_BACKENDS": "Verifica backend", + "LOADING_AUTO_INSTALLING": "Configurazione di AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "Caricamento AI Playground", "COM_CLEAR_HISTORY": "Cancella cronologia", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/ja.json b/WebUI/src/assets/i18n/ja.json index bd9cb01cc..7c919f752 100644 --- a/WebUI/src/assets/i18n/ja.json +++ b/WebUI/src/assets/i18n/ja.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "このモデルは大量のビデオメモリ(VRAM)を必要とします。パフォーマンスが低下する場合は、解像度を下げるか、ComfyUIバックエンドを再起動してください。", "WORKFLOW_HIGH_VRAM_WARNING": "大量のビデオメモリが必要", "LOADING_VERIFYING_BACKENDS": "バックエンドを確認中", + "LOADING_AUTO_INSTALLING": "AI Playground をセットアップ中...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground 読み込み中", "COM_CLEAR_HISTORY": "履歴を消去", "INPUT_PROMPT": "プロンプト", diff --git a/WebUI/src/assets/i18n/ko.json b/WebUI/src/assets/i18n/ko.json index 9ab13df48..59b552d01 100644 --- a/WebUI/src/assets/i18n/ko.json +++ b/WebUI/src/assets/i18n/ko.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "이 모델은 많은 VRAM이 필요합니다. 성능이 저하되면 해상도를 낮추거나 ComfyUI Backend를 다시 시작하세요.", "WORKFLOW_HIGH_VRAM_WARNING": "많은 VRAM 필요", "LOADING_VERIFYING_BACKENDS": "Backend 확인 중", + "LOADING_AUTO_INSTALLING": "AI Playground 설정 중...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground 로딩 중", "COM_CLEAR_HISTORY": "기록 지우기", "INPUT_PROMPT": "프롬프트", diff --git a/WebUI/src/assets/i18n/pl.json b/WebUI/src/assets/i18n/pl.json index 7b4cf4a75..c2c85e352 100644 --- a/WebUI/src/assets/i18n/pl.json +++ b/WebUI/src/assets/i18n/pl.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Ten model wymaga dużo pamięci VRAM. Zmniejsz rozdzielczość i/lub uruchom ponownie backend ComfyUI w przypadku problemów z wydajnością.", "WORKFLOW_HIGH_VRAM_WARNING": "wymagana duża ilość VRAM", "LOADING_VERIFYING_BACKENDS": "Weryfikacja backendów", + "LOADING_AUTO_INSTALLING": "Konfigurowanie AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "Ładowanie AI Playground", "COM_CLEAR_HISTORY": "Wyczyść historię", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/th.json b/WebUI/src/assets/i18n/th.json index 95b76a46a..654db7c9f 100644 --- a/WebUI/src/assets/i18n/th.json +++ b/WebUI/src/assets/i18n/th.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "โมเดลนี้ต้องการ VRAM จำนวนมาก ลดความละเอียดและ/หรือรีสตาร์ทแบ็กเอนด์ ComfyUI เมื่อประสบปัญหาประสิทธิภาพการทำงานที่ไม่ดี", "WORKFLOW_HIGH_VRAM_WARNING": "ต้องการ VRAM สูง", "LOADING_VERIFYING_BACKENDS": "กำลังตรวจสอบแบ็กเอนด์", + "LOADING_AUTO_INSTALLING": "กำลังตั้งค่า AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "กำลังโหลด AI Playground", "COM_CLEAR_HISTORY": "ล้างประวัติ", "INPUT_PROMPT": "พรอมต์", diff --git a/WebUI/src/assets/i18n/tr.json b/WebUI/src/assets/i18n/tr.json index 03daa94b6..70b5cf03d 100644 --- a/WebUI/src/assets/i18n/tr.json +++ b/WebUI/src/assets/i18n/tr.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Bu model çok fazla VRAM gerektiriyor. Düşük performans yaşarsanız çözünürlüğü düşürün ve/veya ComfyUI backend'ini yeniden başlatın", "WORKFLOW_HIGH_VRAM_WARNING": "yüksek VRAM gerekli", "LOADING_VERIFYING_BACKENDS": "Backend'ler doğrulanıyor", + "LOADING_AUTO_INSTALLING": "AI Playground kuruluyor...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground Yükleniyor", "COM_CLEAR_HISTORY": "Geçmişi Temizle", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/vi.json b/WebUI/src/assets/i18n/vi.json index 8cc4b6d35..eb4ff75d5 100644 --- a/WebUI/src/assets/i18n/vi.json +++ b/WebUI/src/assets/i18n/vi.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "Mô hình này yêu cầu nhiều VRAM. Giảm độ phân giải và/hoặc khởi động lại backend ComfyUI khi gặp hiệu suất kém.", "WORKFLOW_HIGH_VRAM_WARNING": "yêu cầu VRAM cao", "LOADING_VERIFYING_BACKENDS": "Đang xác minh backends", + "LOADING_AUTO_INSTALLING": "Đang thiết lập AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "Đang tải AI Playground", "COM_CLEAR_HISTORY": "Xóa lịch sử", "INPUT_PROMPT": "Prompt", diff --git a/WebUI/src/assets/i18n/zh-CN.json b/WebUI/src/assets/i18n/zh-CN.json index 16acf3ace..1eefa950a 100644 --- a/WebUI/src/assets/i18n/zh-CN.json +++ b/WebUI/src/assets/i18n/zh-CN.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "此模型需要大量显存。如果遇到性能问题,请降低分辨率或重启ComfyUI后端", "WORKFLOW_HIGH_VRAM_WARNING": "需要大量显存", "LOADING_VERIFYING_BACKENDS": "验证后端", + "LOADING_AUTO_INSTALLING": "正在设置 AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground 加载中", "COM_CLEAR_HISTORY": "清除历史", "INPUT_PROMPT": "提示", diff --git a/WebUI/src/assets/i18n/zh-TW.json b/WebUI/src/assets/i18n/zh-TW.json index ce3e0080e..dbc0e7e93 100644 --- a/WebUI/src/assets/i18n/zh-TW.json +++ b/WebUI/src/assets/i18n/zh-TW.json @@ -245,6 +245,7 @@ "WORKFLOW_HIGH_VRAM_INFO": "此模型需要大量顯示記憶體。如果遇到效能問題,請降低解析度或重啟ComfyUI後端", "WORKFLOW_HIGH_VRAM_WARNING": "需要大量顯示記憶體", "LOADING_VERIFYING_BACKENDS": "驗證後端", + "LOADING_AUTO_INSTALLING": "正在設定 AI Playground...", "LOADING_AI_PLAYGROUND_LOADING": "AI Playground 載入中", "COM_CLEAR_HISTORY": "清除歷史", "INPUT_PROMPT": "提示", diff --git a/WebUI/src/assets/js/markdownParser.ts b/WebUI/src/assets/js/markdownParser.ts index 658a6ceef..fe054a206 100644 --- a/WebUI/src/assets/js/markdownParser.ts +++ b/WebUI/src/assets/js/markdownParser.ts @@ -1,45 +1,33 @@ -import { Marked, Token } from 'marked' -import { bundledLanguagesAlias, bundledLanguages, createHighlighter } from 'shiki' +import { Marked, Token, Tokens } from 'marked' +import hljs from 'highlight.js' import { stringToBase64 } from 'uint8array-extras' -import { markedShiki } from './markedShikiSync' -const langs = Object.keys(bundledLanguages).concat(Object.keys(bundledLanguagesAlias)) +import 'highlight.js/styles/github-dark-dimmed.css' const startMarker = '===ORIGINALCODE' const endMarker = 'ENDOFORIGINALCODE===' const replaceRegex = new RegExp(`${startMarker}(.*?)${endMarker}`, 'gs') -let highlighter: Awaited> | null = null -createHighlighter({ - langs, - themes: ['github-dark-dimmed'], -}).then((h) => { - highlighter = h -}) - -const highlight = (code: string, lang: string, props: string[]) => { - const highlighted = highlighter - ? highlighter.codeToHtml(code, { - lang: langs.includes(lang) ? lang : 'text', - theme: 'github-dark-dimmed', - meta: { __raw: props.join(' ') }, // required by `transformerMeta*` - }) - : code - return highlighted -} +const codeRenderer = { + renderer: { + code(token: Tokens.Code) { + const lang = token.lang || 'plaintext' + const code = token.text + const language = hljs.getLanguage(lang) ? lang : 'plaintext' + const highlighted = hljs.highlight(code, { language }).value -const codeRenderer = markedShiki({ - highlight, - container: `
+ return `
- %l -
- %s -
`, -}) +
${highlighted}
+
` + }, + }, +} const htmlEscaper = { walkTokens: (token: Token) => { diff --git a/WebUI/src/assets/js/markedShikiSync.ts b/WebUI/src/assets/js/markedShikiSync.ts deleted file mode 100644 index 7b286fbbc..000000000 --- a/WebUI/src/assets/js/markedShikiSync.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { MarkedExtension } from 'marked' - -/** - * A [marked](https://marked.js.org/) extension for integrating [Shiki](https://shiki.style/) syntax highlighting. - -From https://github.com/bent10/marked-extensions/blob/1fb8194ef93359c1158f386bdf4d696c0ecfce32/packages/shiki/src/index.ts -Modified for synchronous usage - -LICENSE -======= -the MIT License (MIT) - -Copyright (c) 2023-2024 Stilearning (https://stilearning.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - */ -type Options = { - /** - * Formats and highlights the code according to a specific coding style or - * convention. - * - * @param code - The code to highlight. - * @param lang - The language of the code. - * @param props - Additional properties for code highlighting. - * @returns A string representing the highlighted code. - */ - highlight?: (code: string, lang: string, props: string[]) => string - - /** - * The container template for the highlighted code. - * - * @default '%s' - */ - container?: string -} -export function markedShiki(options: Options = {}): MarkedExtension { - const { highlight, container } = options - - return { - async: false, - walkTokens(token) { - if (token.type !== 'code' || typeof highlight !== 'function') return - - const [lang = 'text', ...props] = token.lang?.split(' ') ?? [] - - const { text } = token - const highlightedText = highlight(text, lang, props) - const htmlText = !container - ? highlightedText - : container - .replace('%l', String(lang).toUpperCase()) - .replace('%s', highlightedText) - .replace('%t', text) - - // transforms token to html - Object.assign(token, { - type: 'html', - block: true, - text: `${htmlText}\n`, - }) - }, - } -} diff --git a/WebUI/src/assets/js/store/backendServices.ts b/WebUI/src/assets/js/store/backendServices.ts index 184e25065..9eabb1ce3 100644 --- a/WebUI/src/assets/js/store/backendServices.ts +++ b/WebUI/src/assets/js/store/backendServices.ts @@ -3,13 +3,7 @@ import { ref, computed, watch } from 'vue' import z from 'zod' import { demoAwareStorage } from '../demoAwareStorage' -const backends = [ - 'openvino-backend', - 'ai-backend', - 'comfyui-backend', - 'llamacpp-backend', - 'ollama-backend', -] as const +const backends = ['openvino-backend', 'ai-backend', 'comfyui-backend', 'llamacpp-backend'] as const export type BackendServiceName = (typeof backends)[number] @@ -39,7 +33,6 @@ export const useBackendServices = defineStore( 'ai-backend': null, 'comfyui-backend': null, 'llamacpp-backend': null, - 'ollama-backend': null, 'openvino-backend': null, }) @@ -79,7 +72,6 @@ export const useBackendServices = defineStore( 'ai-backend': {}, 'comfyui-backend': {}, 'llamacpp-backend': {}, - 'ollama-backend': {}, 'openvino-backend': {}, }) diff --git a/WebUI/src/assets/js/store/demoMode.ts b/WebUI/src/assets/js/store/demoMode.ts index ac45c0f41..e0d0ab254 100644 --- a/WebUI/src/assets/js/store/demoMode.ts +++ b/WebUI/src/assets/js/store/demoMode.ts @@ -60,7 +60,6 @@ export const useDemoMode = defineStore('demoMode', () => { // Existing DEMO_* keys in en-US.json are legacy and unused by the current driver.js tour. const enabled = ref(false) const profile = ref(null) - const productMode = ref('professional') const explicitDefaultsState = ref('idle') const visitedButtons = ref>( createInitialVisitedState(FALLBACK_NOTIFICATION_DOT_BUTTONS, FALLBACK_ENABLED_MODES), @@ -114,18 +113,26 @@ export const useDemoMode = defineStore('demoMode', () => { const resetInSeconds = ref(null) const passcode = ref('') const hasPasscode = computed(() => passcode.value.length > 0) - window.electronAPI.getDemoModeSettings().then((res) => { + + function applyDemoSettingsPayload(res: DemoModeSettings) { enabled.value = res.isDemoModeEnabled profile.value = res.profile ?? null - productMode.value = res.productMode ?? 'professional' resetInSeconds.value = res.demoModeResetInSeconds passcode.value = res.demoModePasscode ?? '' - // Re-initialize visited state with profile data (or fallbacks) const dotButtons = (profile.value?.notificationDotButtons as DemoButtonId[]) ?? FALLBACK_NOTIFICATION_DOT_BUTTONS const enabledModes = profile.value?.enabledModes ?? FALLBACK_ENABLED_MODES visitedButtons.value = createInitialVisitedState(dotButtons, enabledModes) + } + + async function refreshFromMainConfig() { + const res = await window.electronAPI.getDemoModeSettings() + applyDemoSettingsPayload(res) + } + + window.electronAPI.getDemoModeSettings().then((res) => { + applyDemoSettingsPayload(res) if (res.isDemoModeEnabled && res.demoModeResetInSeconds) { const markInteracted = (e: Event) => { @@ -224,7 +231,6 @@ export const useDemoMode = defineStore('demoMode', () => { return { enabled, profile, - productMode, notificationDotButtonIds, showDemoToggle, showResetDialog, @@ -236,6 +242,7 @@ export const useDemoMode = defineStore('demoMode', () => { setEnabled, cancelReset, resetDemo, + refreshFromMainConfig, } }) diff --git a/WebUI/src/assets/js/store/globalSetup.ts b/WebUI/src/assets/js/store/globalSetup.ts index 5047c0dc8..8aa08a0ba 100644 --- a/WebUI/src/assets/js/store/globalSetup.ts +++ b/WebUI/src/assets/js/store/globalSetup.ts @@ -1,8 +1,15 @@ -import { defineStore } from 'pinia' +import { acceptHMRUpdate, defineStore } from 'pinia' import { ModelLists } from './models' import { useModels } from './models' -type GlobalSetupState = 'running' | 'verifyBackend' | 'manageInstallations' | 'loading' | 'failed' +type GlobalSetupState = + | 'running' + | 'verifyBackend' + | 'autoInstalling' + | 'selectProductMode' + | 'manageInstallations' + | 'loading' + | 'failed' export const useGlobalSetup = defineStore('globalSetup', () => { const state = reactive({ @@ -24,7 +31,6 @@ export const useGlobalSetup = defineStore('globalSetup', () => { const setupData = await window.electronAPI.getInitSetting() const apiServiceInformation = await window.electronAPI.getServices() - // Initialize model paths in models store const modelsStore = useModels() modelsStore.initPaths(setupData.modelPaths) models.value = setupData.modelLists @@ -47,3 +53,7 @@ export const useGlobalSetup = defineStore('globalSetup', () => { initSetup, } }) + +if (import.meta.hot) { + import.meta.hot.accept(acceptHMRUpdate(useGlobalSetup, import.meta.hot)) +} diff --git a/WebUI/src/assets/js/store/ollama.ts b/WebUI/src/assets/js/store/ollama.ts deleted file mode 100644 index 1626cb0ea..000000000 --- a/WebUI/src/assets/js/store/ollama.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { acceptHMRUpdate, defineStore } from 'pinia' -import { Ollama } from 'ollama/browser' -import { demoAwareStorage } from '../demoAwareStorage' -import { useTextInference } from './textInference' - -export const useOllama = defineStore( - 'ollama', - () => { - const textInference = useTextInference() - const ollamaDlProgress = ref<{ - status: 'idle' | 'pulling' - totalBytes?: number - completedBytes?: number - }>({ status: 'idle' }) - const pullOllamaModel = async () => { - const ollama = new Ollama({ host: textInference.currentBackendUrl }) - const ollamaDl = await ollama.pull({ - model: textInference.activeModel ?? 'asdf', - stream: true, - }) - for await (const progress of ollamaDl) { - ollamaDlProgress.value = { - status: 'pulling', - totalBytes: progress.total, - completedBytes: progress.completed, - } - } - ollamaDlProgress.value = { - status: 'idle', - } - return - } - - return { - ollamaDlProgress, - pullOllamaModel, - } - }, - { - persist: { - storage: demoAwareStorage, - pick: [], - }, - }, -) - -if (import.meta.hot) { - import.meta.hot.accept(acceptHMRUpdate(useOllama, import.meta.hot)) -} diff --git a/WebUI/src/assets/js/store/presetSwitching.ts b/WebUI/src/assets/js/store/presetSwitching.ts index 8a67b3ec7..ed59bd6f5 100644 --- a/WebUI/src/assets/js/store/presetSwitching.ts +++ b/WebUI/src/assets/js/store/presetSwitching.ts @@ -38,11 +38,25 @@ function presetToMode(preset: Preset): ModeType { const backendToService = { llamaCPP: 'llamacpp-backend', openVINO: 'openvino-backend', - ollama: 'ollama-backend', } as const type LlmBackend = keyof typeof backendToService +/** Duplicated from promptArea to avoid pulling presetSwitching into that module's import graph. */ +const MODE_TO_CATEGORIES: Record = { + chat: ['chat'], + imageGen: ['create-images'], + imageEdit: ['edit-images'], + video: ['create-videos'], +} + +const MODE_TO_PRESET_TYPE: Record = { + chat: 'chat', + imageGen: 'comfy', + imageEdit: 'comfy', + video: 'comfy', +} + /** Presets that require high system/GPU memory (24GB system or 16GB GPU) */ const HIGH_MEMORY_PRESETS = new Set([ 'Pro Image', @@ -104,6 +118,10 @@ export const usePresetSwitching = defineStore('presetSwitching', () => { * Check if a chat backend is available (running or can be started) */ function isBackendAvailable(backend: LlmBackend): boolean { + // During startup, the renderer may reconcile presets before service info arrives from main. + // Treat "unknown" as available to avoid showing spurious requirements warnings on boot. + if (!backendServices.serviceInfoUpdateReceived) return true + const serviceName = backendToService[backend] const backendInfo = backendServices.info.find((s) => s.serviceName === serviceName) return backendInfo @@ -272,6 +290,29 @@ export const usePresetSwitching = defineStore('presetSwitching', () => { return presetToMode(preset) } + /** + * After built-in preset files change (e.g. product mode), keep or replace the active preset + * for the current UI mode without memory-alert dialogs. + */ + async function reconcileActivePresetAfterCatalogReload(): Promise { + const mode = promptStore.currentMode + const categories = MODE_TO_CATEGORIES[mode] + const presetType = MODE_TO_PRESET_TYPE[mode] + const name = presets.activePresetName + if (name) { + const preset = presets.presets.find((p) => p.name === name) + if (preset && presetToMode(preset) === mode) { + if (preset.type === 'chat') { + useTextInference().loadSettingsForActivePreset() + } else { + useImageGenerationPresets().loadSettingsForActivePreset() + } + return + } + } + await switchToLastUsedForCategory(categories, presetType, { skipModeSwitch: true }) + } + return { // State isSwitching: computed(() => isSwitching.value), @@ -282,6 +323,7 @@ export const usePresetSwitching = defineStore('presetSwitching', () => { switchPreset, switchVariant, switchToLastUsedForCategory, + reconcileActivePresetAfterCatalogReload, // Utilities getModeForPreset, diff --git a/WebUI/src/assets/js/store/presets.ts b/WebUI/src/assets/js/store/presets.ts index 2939e4e90..dd01fc652 100644 --- a/WebUI/src/assets/js/store/presets.ts +++ b/WebUI/src/assets/js/store/presets.ts @@ -112,9 +112,7 @@ const BasePresetFieldsSchema = z.object({ name: z.string(), description: z.string().optional(), /** Optional how-to instructions shown in PresetSelector tooltip; string or variant name -> text */ - extendedDescription: z - .union([z.string(), z.record(z.string(), z.string())]) - .optional(), + extendedDescription: z.union([z.string(), z.record(z.string(), z.string())]).optional(), image: z.string().optional(), // base64 encoded image category: z.string().optional(), displayPriority: z.number().default(0), @@ -152,7 +150,7 @@ const ComfyUiPresetSchema = BasePresetFieldsSchema.extend({ }) // LLM Backend enum for chat presets -const LlmBackendEnum = z.enum(['llamaCPP', 'openVINO', 'ollama']) +const LlmBackendEnum = z.enum(['llamaCPP', 'openVINO']) // Chat Preset Schema - uses 'backends' array instead of single 'backend' const ChatPresetSchema = BasePresetFieldsSchema.omit({ backend: true }).extend({ @@ -401,6 +399,12 @@ export const usePresets = defineStore( } } + /** Reload built-in + user presets after product mode changes (main IPC uses updated settings). */ + async function reloadAfterProductModeChange(): Promise { + await loadPresetsFromFiles() + await loadUserPresets() + } + async function loadUserPresets(): Promise { try { const userPresetFiles = await window.electronAPI.loadUserPresets() @@ -617,12 +621,7 @@ export const usePresets = defineStore( }) const chatPresets = computed(() => { - // Get backend services to check availability const backendServices = useBackendServices() - const ollamaServiceExists = backendServices.info.some( - (s) => s.serviceName === 'ollama-backend', - ) - // Check if NPU device is available const hasNpuDevice = backendServices.info .find((s) => s.serviceName === 'openvino-backend') ?.devices?.some((d) => d.id.includes('NPU')) @@ -630,15 +629,6 @@ export const usePresets = defineStore( return presets.value.filter((p) => { if (p.type !== 'chat') return false const chatPreset = p as ChatPreset - // Filter out ollama-only presets if ollama service doesn't exist - if ( - chatPreset.backends.length === 1 && - chatPreset.backends[0] === 'ollama' && - !ollamaServiceExists - ) { - return false - } - // Filter out NPU preset if no NPU device available if (chatPreset.requiresNpuSupport && !hasNpuDevice) { return false } @@ -698,6 +688,7 @@ export const usePresets = defineStore( getFirstVariantName, loadPresetsFromFiles, loadUserPresets, + reloadAfterProductModeChange, loadPresetsFromIntel, addPreset, saveSettingsForPreset, diff --git a/WebUI/src/assets/js/store/productMode.ts b/WebUI/src/assets/js/store/productMode.ts new file mode 100644 index 000000000..e556c5065 --- /dev/null +++ b/WebUI/src/assets/js/store/productMode.ts @@ -0,0 +1,84 @@ +import { acceptHMRUpdate, defineStore } from 'pinia' +import { useBackendServices } from './backendServices' +import { useGlobalSetup } from './globalSetup' + +export const useProductMode = defineStore('productMode', () => { + const productMode = ref(null) + const hardwareRecommendation = ref(null) + + async function hydrateFromMain() { + try { + const s = await window.electronAPI.getLocalSettings() + productMode.value = s.productMode ?? null + } catch (e) { + console.error('Failed to hydrate product mode from main:', e) + productMode.value = null + } + } + + async function syncToMain() { + if (productMode.value) { + await window.electronAPI.updateLocalSettings({ productMode: productMode.value }) + } + } + + async function detectRecommendation() { + try { + hardwareRecommendation.value = await window.electronAPI.detectHardwareForModeRecommendation() + } catch (e) { + console.warn('Hardware detection failed, defaulting to studio recommendation:', e) + hardwareRecommendation.value = { + success: false, + recommendedMode: 'studio', + detectedDevices: [], + } + } + } + + async function selectMode(mode: ProductMode) { + productMode.value = mode + await syncToMain() + } + + async function ensureReady(): Promise<'ready' | 'needsSelection' | 'installFailed'> { + const globalSetup = useGlobalSetup() + const backendServices = useBackendServices() + + await hydrateFromMain() + + const aiBackend = backendServices.info.find((s) => s.serviceName === 'ai-backend') + if (aiBackend && !aiBackend.isSetUp) { + globalSetup.loadingState = 'autoInstalling' + console.log('Auto-installing ai-backend service') + const result = await backendServices.setUpService('ai-backend') + if (!result.success) { + console.error('Failed to auto-install ai-backend:', result.errorDetails) + return 'installFailed' + } + await backendServices.startService('ai-backend') + } + + if (!productMode.value) { + globalSetup.loadingState = 'autoInstalling' + await detectRecommendation() + return 'needsSelection' + } + + await syncToMain() + return 'ready' + } + + return { + productMode, + hardwareRecommendation, + hydrateFromMain, + syncToMain, + detectRecommendation, + selectMode, + ensureReady, + } +}) + +if (import.meta.hot) { + import.meta.hot.accept(acceptHMRUpdate(useProductMode, import.meta.hot)) +} diff --git a/WebUI/src/assets/js/store/textInference.ts b/WebUI/src/assets/js/store/textInference.ts index aadc4dc8a..05fc420a2 100644 --- a/WebUI/src/assets/js/store/textInference.ts +++ b/WebUI/src/assets/js/store/textInference.ts @@ -13,10 +13,8 @@ export type LlmBackend = z.infer type LlmBackendKV = { [key in LlmBackend]: string | null } export const backendToService = { - ipexLLM: 'ai-backend', llamaCPP: 'llamacpp-backend', openVINO: 'openvino-backend', - ollama: 'ollama-backend', } as const export type LlmModel = { @@ -77,7 +75,6 @@ export const thinkingModels: Record = { export const textInferenceBackendDisplayName: Record = { llamaCPP: 'llamaCPP - GGUF', openVINO: 'OpenVINO', - ollama: 'Ollama', } export const textInferenceBackendDescription: Record = { @@ -85,13 +82,11 @@ export const textInferenceBackendDescription: Record = { 'Utilizes Llama.cpp for lightweight and portable AI solutions. Ideal for low-resource environments.', openVINO: 'Optimized for Intel hardware with OpenVINO framework. Provides efficient and fast AI processing.', - ollama: 'potato', } export const textInferenceBackendTags: Record = { llamaCPP: ['Lightweight', 'Portable'], openVINO: ['Intel', 'Optimized', 'Fast'], - ollama: ['Integrated', 'CLI'], } export const useTextInference = defineStore( @@ -110,13 +105,11 @@ export const useTextInference = defineStore( const selectedModels = ref({ llamaCPP: null, openVINO: null, - ollama: null, }) const selectedEmbeddingModels = ref({ llamaCPP: null, openVINO: null, - ollama: null, }) // Backend readiness state tracking @@ -124,12 +117,10 @@ export const useTextInference = defineStore( lastUsedModel: { llamaCPP: null, openVINO: null, - ollama: null, } as LlmBackendKV, lastUsedContextSize: { llamaCPP: null, openVINO: null, - ollama: null, } as Record, isPreparingBackend: false, }) @@ -138,7 +129,7 @@ export const useTextInference = defineStore( const llmModels: Ref = computed(() => { const llmTypeModels = models.models.filter((m) => - ['llamaCPP', 'openVINO', 'ollama'].includes(m.type), + (llmBackendTypes as readonly string[]).includes(m.type), ) // Find first model for each type (already in priority order from models.json) @@ -202,16 +193,6 @@ export const useTextInference = defineStore( } }) - // Add Ollama embedding models - if (backend.value === 'ollama') { - newEmbeddingModels.push({ - name: 'ollama-embedding', - type: 'ollama', - downloaded: true, - active: true, - }) - } - console.log('llmEmbeddingModels changed', newEmbeddingModels) return newEmbeddingModels }) @@ -242,13 +223,11 @@ export const useTextInference = defineStore( const backendToAipgBackendName = { openVINO: 'openvino', llamaCPP: 'llama_cpp', - ollama: 'ollama', } as const const backendToAipgModelType = { openVINO: 'openvinoLLM', llamaCPP: 'ggufLLM', - ollama: 'llm', // Using LLM type for Ollama } as const const activeModel: Ref = computed(() => { @@ -385,11 +364,6 @@ export const useTextInference = defineStore( ) async function getDownloadParamsForCurrentModelIfRequired(type: 'llm' | 'embedding') { - // For Ollama backend, we don't need to download models from a repository - if (backend.value === 'ollama') { - return [] - } - let model: string | undefined if (type === 'llm') { model = activeModel.value @@ -945,14 +919,11 @@ export const useTextInference = defineStore( throw error } } - // Ollama manages its own model loading and doesn't need ensureBackendReadiness - const backendToInferenceService = { + const backendToInferenceService: Record = { llamaCPP: 'llamacpp-backend', openVINO: 'openvino-backend', - ipexLLM: 'ai-backend', - ollama: 'ollama-backend' as BackendServiceName, - } as const + } const inferenceBackendService = backendToInferenceService[backend.value] await backendServices.resetLastUsedInferenceBackend(inferenceBackendService) backendServices.updateLastUsedBackend(inferenceBackendService) diff --git a/WebUI/src/assets/js/tools/chatBackends.ts b/WebUI/src/assets/js/tools/chatBackends.ts new file mode 100644 index 000000000..63592261a --- /dev/null +++ b/WebUI/src/assets/js/tools/chatBackends.ts @@ -0,0 +1,3 @@ +import type { BackendServiceName } from '@/assets/js/store/backendServices' + +export const chatBackends: BackendServiceName[] = ['llamacpp-backend', 'openvino-backend'] diff --git a/WebUI/src/assets/js/tools/comfyUi.ts b/WebUI/src/assets/js/tools/comfyUi.ts index e4e4d4a58..77d06e695 100644 --- a/WebUI/src/assets/js/tools/comfyUi.ts +++ b/WebUI/src/assets/js/tools/comfyUi.ts @@ -2,11 +2,12 @@ import { z } from 'zod' import { watch } from 'vue' import { useImageGenerationPresets, type MediaItem } from '../store/imageGenerationPresets' import { useComfyUiPresets } from '../store/comfyUiPresets' -import { useBackendServices, type BackendServiceName } from '../store/backendServices' +import { useBackendServices } from '../store/backendServices' import { usePresets, type Preset, type ComfyUiPreset } from '../store/presets' import { usePresetSwitching } from '../store/presetSwitching' import { usePromptStore } from '../store/promptArea' import { useDeveloperSettings } from '../store/developerSettings' +import { chatBackends } from './chatBackends' import { DEFAULT_RESOLUTION_CONFIG, getResolutionsFromConfig, @@ -27,13 +28,6 @@ const globalDefaultSettings = { negativePrompt: 'nsfw', } -// Chat backends to be stopped to free resources for image generation -const chatBackends: BackendServiceName[] = [ - 'llamacpp-backend', - 'openvino-backend', - 'ollama-backend', -] - async function stopChatBackend(): Promise { console.log('[ComfyUI Tool] Stopping chat backend to free resources for image generation') const backendServices = useBackendServices() diff --git a/WebUI/src/assets/js/tools/comfyUiImageEdit.ts b/WebUI/src/assets/js/tools/comfyUiImageEdit.ts index 584182084..41c6b8f47 100644 --- a/WebUI/src/assets/js/tools/comfyUiImageEdit.ts +++ b/WebUI/src/assets/js/tools/comfyUiImageEdit.ts @@ -3,11 +3,12 @@ import { watch } from 'vue' import { FilePart, ModelMessage, tool } from 'ai' import { useImageGenerationPresets, type MediaItem } from '../store/imageGenerationPresets' import { useComfyUiPresets } from '../store/comfyUiPresets' -import { useBackendServices, type BackendServiceName } from '../store/backendServices' +import { useBackendServices } from '../store/backendServices' import { usePresets, type Preset } from '../store/presets' import { usePresetSwitching } from '../store/presetSwitching' import { usePromptStore } from '../store/promptArea' import { useDeveloperSettings } from '../store/developerSettings' +import { chatBackends } from './chatBackends' const ImageEditOutputSchema = z.object({ id: z.string(), @@ -165,13 +166,6 @@ function getPresetDefault(preset: Preset, settingName: string): unknown { ?.defaultValue } -// Chat backends to be stopped to free resources for image editing -const chatBackends: BackendServiceName[] = [ - 'llamacpp-backend', - 'openvino-backend', - 'ollama-backend', -] - async function stopChatBackend(): Promise { console.log('[ComfyUIImageEdit Tool] Stopping chat backend to free resources for image editing') const backendServices = useBackendServices() diff --git a/WebUI/src/components/AspectRatioPicker.vue b/WebUI/src/components/AspectRatioPicker.vue index fac2028b0..04eb42e5a 100644 --- a/WebUI/src/components/AspectRatioPicker.vue +++ b/WebUI/src/components/AspectRatioPicker.vue @@ -14,16 +14,16 @@ + :title="'Megapixels'" + :value="megaPixelsIndex.toString()" + :items="megaPixelsDropdownItems" + :disabled="props.disabled || demoMode.enabled" + @change=" + (value) => { + megaPixelsIndex = parseInt(value) + } + " + />
@@ -39,53 +39,53 @@
-
- - {{ res.aspectRatio }} - -
+
+ + {{ res.aspectRatio }} + +
@@ -102,21 +102,21 @@
- - × - + + × +
diff --git a/WebUI/src/components/BackendOptions.vue b/WebUI/src/components/BackendOptions.vue index 4d21a6c9c..d6a998403 100644 --- a/WebUI/src/components/BackendOptions.vue +++ b/WebUI/src/components/BackendOptions.vue @@ -90,28 +90,18 @@ const getFormSchema = (backend: BackendServiceName) => { ) case 'openvino-backend': - // OpenVINO: package versions like 2025.2.0 or 2025.2.0.1 + // OpenVINO: version like 2025.2.0, optional releaseTag (hex hash) for weekly builds return toTypedSchema( z .object({ version: z .string() .regex(/^\d+\.\d+\.\d+(\.\d+)?$/, 'Must be a valid version number (e.g. 2025.2.0)'), - }) - .passthrough(), - ) - - case 'ollama-backend': - // Ollama: two fields - release tag and version - return toTypedSchema( - z - .object({ releaseTag: z .string() - .regex(/^v\d+\.\d+\.\d+-\w+$/, 'Must be a valid release tag (e.g. v2.3.0-nightly)'), - version: z - .string() - .regex(/^\d+\.\d+\.\d+[a-z]\d{8}$/, 'Must be a valid version (e.g. 2.3.0b20250630)'), + .regex(/^[0-9a-f]{6,40}$/, 'Must be a hex commit hash (6-40 characters)') + .optional() + .or(z.literal('')), }) .passthrough(), ) @@ -133,9 +123,7 @@ const showReinstall = computed(() => { return backendStatus.value !== 'installing' && backendStatus.value !== 'notInstalled' }) const showSettings = computed(() => { - return ['comfyui-backend', 'llamacpp-backend', 'openvino-backend', 'ollama-backend'].includes( - props.backend, - ) + return ['comfyui-backend', 'llamacpp-backend', 'openvino-backend'].includes(props.backend) }) // Get backend-specific placeholders and descriptions @@ -146,9 +134,7 @@ const getVersionPlaceholder = (backend: BackendServiceName) => { case 'llamacpp-backend': return 'b6048' case 'openvino-backend': - return '2025.2.0' - case 'ollama-backend': - return 'v2.3.0-nightly' + return '2026.1.0' default: return '' } @@ -164,10 +150,9 @@ const getVersionDescription = (backend: BackendServiceName) => { return i18nState.BACKEND_VERSION_DESCRIPTION_LLAMACPP || 'Enter a build number (e.g. b6048)' case 'openvino-backend': return ( - i18nState.BACKEND_VERSION_DESCRIPTION_OPENVINO || 'Enter a version number (e.g. 2025.2.0)' + i18nState.BACKEND_VERSION_DESCRIPTION_OPENVINO || + 'Enter a version number (e.g. 2026.1.0). Add a release tag below for weekly builds.' ) - case 'ollama-backend': - return i18nState.BACKEND_VERSION_DESCRIPTION_OLLAMA || 'Enter release tag and version' default: return i18nState.BACKEND_VERSION_DESCRIPTION || 'Enter version information' } @@ -272,11 +257,16 @@ function hasVersionChange(serviceName: BackendServiceName): boolean { const effectiveTarget = getEffectiveTarget(serviceName) if (!effectiveTarget || !versionState.installed) return false - if (serviceName === 'ollama-backend') { - return ( - versionState.installed.version !== effectiveTarget.version || - versionState.installed.releaseTag !== effectiveTarget.releaseTag + if (serviceName === 'openvino-backend') { + const installedNorm = normalizeVersionForComparison( + serviceName, + versionState.installed.version || '', ) + const targetNorm = normalizeVersionForComparison(serviceName, effectiveTarget.version || '') + const installedReleaseTag = versionState.installed.releaseTag || '' + const targetReleaseTag = effectiveTarget.releaseTag || '' + + return installedNorm !== targetNorm || installedReleaseTag !== targetReleaseTag } // Normalize versions for comparison (handles OpenVINO subversions) @@ -304,6 +294,30 @@ function isUpgrade(serviceName: BackendServiceName): boolean | null { return null } +function getVersionActionType(serviceName: BackendServiceName): 'update' | 'downgrade' | 'apply' { + if (serviceName === 'openvino-backend') { + const versionState = backendServices.versionState[serviceName] + const effectiveTarget = getEffectiveTarget(serviceName) + if (!effectiveTarget?.version || !versionState.installed?.version) return 'apply' + + const installedNorm = normalizeVersionForComparison(serviceName, versionState.installed.version) + const targetNorm = normalizeVersionForComparison(serviceName, effectiveTarget.version) + const versionCmp = compareVersions(installedNorm, targetNorm) + + if (versionCmp < 0) return 'update' + if (versionCmp > 0) return 'downgrade' + + const installedReleaseTag = versionState.installed.releaseTag || '' + const targetReleaseTag = effectiveTarget.releaseTag || '' + if (installedReleaseTag !== targetReleaseTag) return 'apply' + } + + const upgrading = isUpgrade(serviceName) + if (upgrading === true) return 'update' + if (upgrading === false) return 'downgrade' + return 'apply' +} + // Format version for display function formatVersion( version: { version?: string; releaseTag?: string } | null | undefined, @@ -326,11 +340,19 @@ const showVersionAction = computed(() => { // Dynamic label: "Update to X" or "Downgrade to X" const versionActionLabel = computed(() => { const effectiveTarget = getEffectiveTarget(props.backend) - const upgrading = isUpgrade(props.backend) - const action = upgrading === true ? 'Update' : 'Downgrade' + const actionType = getVersionActionType(props.backend) + const action = + actionType === 'update' ? 'Update' : actionType === 'downgrade' ? 'Downgrade' : 'Apply change' return `${action} to ${formatVersion(effectiveTarget)}` }) +const versionActionClass = computed(() => { + const actionType = getVersionActionType(props.backend) + if (actionType === 'update') return 'text-green-500' + if (actionType === 'downgrade') return 'text-amber-500' + return 'text-blue-500' +}) + // Handler for version action - clears override and reinstalls const handleVersionAction = async () => { menuOpen.value = false @@ -385,7 +407,7 @@ const showMenuButton = computed( {{ versionActionLabel }} @@ -495,118 +517,98 @@ const showMenuButton = computed( }) " > - - - - - + + + + {{ i18nState.BACKEND_VERSION }} + + + + + {{ getVersionDescription(backend) }} + + + + + + + + + {{ i18nState.BACKEND_RELEASE_TAG || 'Release Tag' }} + + + + + {{ + i18nState.BACKEND_OPENVINO_RELEASE_TAG_DESCRIPTION || + 'Hex commit hash for weekly builds. Leave empty to use a regular release.' + }} + + + + + + + + + {{ + i18nState.BACKEND_COMFYUI_PARAMETERS_LABEL || 'Startup Parameters' + }} + + + + + {{ + i18nState.BACKEND_COMFYUI_PARAMETERS_DESCRIPTION || + 'Command-line arguments passed to ComfyUI on startup. Restart required to apply changes.' + }} + + + + + + + + + {{ + i18nState.BACKEND_LLAMACPP_PARAMETERS_LABEL || 'Startup Parameters' + }} + + + + + {{ + i18nState.BACKEND_LLAMACPP_PARAMETERS_DESCRIPTION || + 'Command-line arguments passed to llama-server on startup. Applied on next model load.' + }} + + + + diff --git a/WebUI/src/components/InstallationManagement.vue b/WebUI/src/components/InstallationManagement.vue index 7957826b2..c880c04d2 100644 --- a/WebUI/src/components/InstallationManagement.vue +++ b/WebUI/src/components/InstallationManagement.vue @@ -3,7 +3,7 @@

{{ - demoMode.productMode === 'essentials' + productModeStore.productMode === 'essentials' ? languages.BACKEND_MANAGE_ESSENTIALS : languages.BACKEND_MANAGE }} @@ -288,7 +288,7 @@ import ErrorDetailsModal from '@/components/ErrorDetailsModal.vue' import { Checkbox } from '@/components/ui/checkbox' import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from '@/components/ui/tooltip' import type { ErrorDetails } from '../../electron/subprocesses/service' -import { useDemoMode } from '@/assets/js/store/demoMode' +import { useProductMode } from '@/assets/js/store/productMode' const emits = defineEmits<{ (e: 'close'): void @@ -300,7 +300,7 @@ type ExtendedApiServiceInformation = ApiServiceInformation & { } const backendServices = useBackendServices() -const demoMode = useDemoMode() +const productModeStore = useProductMode() // App version for AI Backend display (fetched directly to avoid timing issues with globalSetup.initSetup) const appVersion = ref('...') @@ -550,14 +550,6 @@ function hasVersionChange(serviceName: BackendServiceName): boolean { const effectiveTarget = getEffectiveTarget(serviceName) if (!effectiveTarget || !versionState.installed) return false - // For Ollama, compare both version and releaseTag - if (serviceName === 'ollama-backend') { - return ( - versionState.installed.version !== effectiveTarget.version || - versionState.installed.releaseTag !== effectiveTarget.releaseTag - ) - } - // Normalize versions for comparison (handles OpenVINO subversions) const installedNorm = normalizeVersionForComparison( serviceName, diff --git a/WebUI/src/components/MarkdownRenderer.vue b/WebUI/src/components/MarkdownRenderer.vue new file mode 100644 index 000000000..6dcb494e3 --- /dev/null +++ b/WebUI/src/components/MarkdownRenderer.vue @@ -0,0 +1,82 @@ + + + diff --git a/WebUI/src/components/OllamaPoC.vue b/WebUI/src/components/OllamaPoC.vue deleted file mode 100644 index 1fd68f7f2..000000000 --- a/WebUI/src/components/OllamaPoC.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - diff --git a/WebUI/src/components/PresetSelector.vue b/WebUI/src/components/PresetSelector.vue index fbd1f0c90..fdfc3808d 100644 --- a/WebUI/src/components/PresetSelector.vue +++ b/WebUI/src/components/PresetSelector.vue @@ -36,13 +36,18 @@ - + - + {{ extendedDescription }} - +

+
+
+

AI Playground Installation Manager

+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + diff --git a/WebUI/src/components/SettingsBasic.vue b/WebUI/src/components/SettingsBasic.vue index a4a9511e8..de3b2b289 100644 --- a/WebUI/src/components/SettingsBasic.vue +++ b/WebUI/src/components/SettingsBasic.vue @@ -171,6 +171,18 @@
+ + +
diff --git a/WebUI/src/components/WarningDialog.vue b/WebUI/src/components/WarningDialog.vue index 18770ef02..10d424f47 100644 --- a/WebUI/src/components/WarningDialog.vue +++ b/WebUI/src/components/WarningDialog.vue @@ -8,10 +8,7 @@ :class="{ 'animate-scale-in': animate }" >

-
+
{ if (newValue) { diff --git a/WebUI/src/env.d.ts b/WebUI/src/env.d.ts index ef6035894..6938f745a 100644 --- a/WebUI/src/env.d.ts +++ b/WebUI/src/env.d.ts @@ -43,13 +43,41 @@ type DemoProfile = { notificationDotButtons: string[] } -type ProductMode = 'professional' | 'essentials' +type ProductMode = 'studio' | 'essentials' + +/** Mirrors electron/main LocalSettingsSchema (renderer copy for IPC typing). */ +type LocalSettings = { + debug: boolean + deviceArchOverride: 'bmg' | 'acm' | 'arl_h' | 'lnl' | 'mtl' | null + isAdminExec: boolean + availableThemes: Array<'dark' | 'lnl' | 'bmg' | 'light'> + currentTheme: 'dark' | 'lnl' | 'bmg' | 'light' + productMode?: ProductMode + isDemoModeEnabled: boolean + demoModeResetInSeconds: number | null + demoModePasscode?: string + languageOverride: string | null + remoteRepository: string + huggingfaceEndpoint: string +} + +type GpuHardwareDevice = { + device: string + name: string + gpuDeviceId: string | null +} + +type HardwareRecommendationResult = { + success: boolean + recommendedMode: ProductMode + detectedDevices: GpuHardwareDevice[] + error?: string +} type DemoModeSettings = { isDemoModeEnabled: boolean demoModeResetInSeconds: null | number demoModePasscode?: string - productMode: ProductMode profile?: DemoProfile | null } @@ -86,6 +114,8 @@ type electronAPI = { getLocaleSettings(): Promise getThemeSettings(): Promise updateLocalSettings(updates: Partial): Promise<{ success: boolean }> + getLocalSettings(): Promise + detectHardwareForModeRecommendation(): Promise setWinSize(width: number, height: number): Promise showSaveDialog(options: Electron.SaveDialogOptions): Promise showMessageBox(options: Electron.MessageBoxOptions): Promise @@ -453,12 +483,7 @@ type CheckModelAlreadyLoadedResult = { already_loaded: boolean } & CheckModelAlreadyLoadedParameters -type BackendServiceName = - | 'ai-backend' - | 'comfyui-backend' - | 'llamacpp-backend' - | 'openvino-backend' - | 'ollama-backend' +type BackendServiceName = 'ai-backend' | 'comfyui-backend' | 'llamacpp-backend' | 'openvino-backend' type InferenceDevice = { id: string @@ -491,10 +516,10 @@ type ApiServiceInformation = { type Model = { name: string - type: 'undefined' | 'embedding' | 'openVINO' | 'llamaCPP' | 'ollama' + type: 'undefined' | 'embedding' | 'openVINO' | 'llamaCPP' default: boolean downloaded?: boolean | undefined - backend?: 'openVINO' | 'llamaCPP' | 'ollama' | undefined + backend?: 'openVINO' | 'llamaCPP' | undefined supportsToolCalling?: boolean supportsVision?: boolean maxContextSize?: number diff --git a/WebUI/src/lib/utils.ts b/WebUI/src/lib/utils.ts index 7f99501ff..be070a5a2 100644 --- a/WebUI/src/lib/utils.ts +++ b/WebUI/src/lib/utils.ts @@ -98,8 +98,6 @@ export function mapServiceNameToDisplayName(serviceName: string) { return 'Llama.cpp - GGUF' case 'openvino-backend': return 'OpenVINO' - case 'ollama-backend': - return 'Ollama' default: return serviceName } diff --git a/WebUI/src/types/shared.ts b/WebUI/src/types/shared.ts index 410c699bc..925b1625b 100644 --- a/WebUI/src/types/shared.ts +++ b/WebUI/src/types/shared.ts @@ -1,6 +1,6 @@ import z from 'zod' -export const llmBackendTypes = ['openVINO', 'llamaCPP', 'ollama'] as const +export const llmBackendTypes = ['openVINO', 'llamaCPP'] as const export const ModelSchema = z.object({ name: z.string(), diff --git a/WebUI/src/views/Chat.vue b/WebUI/src/views/Chat.vue index d8f35fa1d..e70a8e22e 100644 --- a/WebUI/src/views/Chat.vue +++ b/WebUI/src/views/Chat.vue @@ -54,14 +54,11 @@ " alt="Generated Image" /> -
+ :content="message.parts.find((part) => part.type === 'text')?.text ?? ''" + :on-copy="copyText" + />
-
+ :content="message.parts.find((part) => part.type === 'reasoning')?.text ?? ''" + :on-copy="copyText" + /> -
+